Странная ошибка «Компонент с именем TFrm1 уже существует»


Я хочу позволить пользователю создавать несколько экземпляров одной и той же формы (назовем ее Form1, которая является дочерней формой MDI). Итак, у меня есть две подобные процедуры, в которых я создаю формы.

procedure MyProcedure1;           // procedure 2 is similar. it also has a var called MyFrm
var MyFrm: TFrm1;
begin
  ... 
  MyFrm:= TFrm1.create(MainForm);
  MyFrm.BringToFront;
  MyFrm.LoadFromFile(someFile);
end;

Как видите, MyFrm - это локальная переменная. Это нормально для меня, поскольку мне не нужно программно обращаться к форме после ее создания. Другой глобальной переменной с именем Frm1 не существует. В событии OnClose MyFrm у меня есть Action: = caFree;

Что могло вызвать указанную выше ошибку? s назовите его Form1, который является дочерней формой MDI). Итак, у меня есть две подобные процедуры, в которых я создаю формы. процедура ...


Я хочу позволить пользователю создавать несколько экземпляров одной и той же формы (назовем ее Form1, которая является дочерней формой MDI). Итак, у меня есть две подобные процедуры, в которых я создаю формы.

procedure MyProcedure1;           // procedure 2 is similar. it also has a var called MyFrm
var MyFrm: TFrm1;
begin
  ... 
  MyFrm:= TFrm1.create(MainForm);
  MyFrm.BringToFront;
  MyFrm.LoadFromFile(someFile);
end;

Как видите, MyFrm - это локальная переменная. Для меня это нормально, поскольку мне не нужно программно получать доступ к форме после ее создания. Другой глобальной переменной с именем Frm1 не существует. В событии OnClose MyFrm у меня есть Action: = caFree;

Что могло вызвать указанную выше ошибку? s назовите его Form1, который является дочерней формой MDI). Итак, у меня есть две подобные процедуры, в которых я создаю формы. процедура ...


Я хочу позволить пользователю создавать несколько экземпляров одной и той же формы (назовем ее Form1, которая является дочерней формой MDI). Итак, у меня есть две подобные процедуры, в которых я создаю формы.

procedure MyProcedure1;           // procedure 2 is similar. it also has a var called MyFrm
var MyFrm: TFrm1;
begin
  ... 
  MyFrm:= TFrm1.create(MainForm);
  MyFrm.BringToFront;
  MyFrm.LoadFromFile(someFile);
end;

Как видите, MyFrm - это локальная переменная. Это нормально для меня, поскольку мне не нужно программно обращаться к форме после ее создания. Другой глобальной переменной с именем Frm1 не существует. В событии OnClose MyFrm у меня есть Action: = caFree;

Что могло вызвать указанную выше ошибку?

procedure MyProcedure1;           // procedure 2 is similar. it also has a var called MyFrm
var MyFrm: TFrm1;
begin
  ... 
  MyFrm:= TFrm1.create(MainForm);
  MyFrm.BringToFront;
  MyFrm.LoadFromFile(someFile);
end;

Как видите, MyFrm - это локальная переменная. Для меня это нормально, поскольку мне не нужно программно получать доступ к форме после ее создания. Другой глобальной переменной с именем Frm1 не существует. В событии OnClose MyFrm у меня есть Action: = caFree;

Что могло вызвать указанную выше ошибку?

procedure MyProcedure1;           // procedure 2 is similar. it also has a var called MyFrm
var MyFrm: TFrm1;
begin
  ... 
  MyFrm:= TFrm1.create(MainForm);
  MyFrm.BringToFront;
  MyFrm.LoadFromFile(someFile);
end;

Как видите, MyFrm - это локальная переменная. Для меня это нормально, поскольку мне не нужно программно получать доступ к форме после ее создания. Другой глобальной переменной с именем Frm1 не существует. В событии OnClose MyFrm у меня есть Action: = caFree;

Что могло вызвать указанную выше ошибку? Пользователь отправил эту ошибку. Это случилось всего один раз, и я не могу воспроизвести это.


Изменить:

  1. Ошибка появляется в строке «MyFrm: = TFrm1.create».

  2. Некоторые люди предположили, что мне нужно программно присвоить уникальные имена моим динамически создаваемым формам. Я также задавался вопросом, какое имя принимает форма при ее создании, поэтому я вошел в код при вызове процедуры MyProcedure1.
    Delphi автоматически дает уникальные имена, например
    MyFrm.name = MyFrm, затем
    MyFrm.name = MyFrm_1,
    MyFrm.name = MyFrm_2,
    MyFrm.name = MyFrm_3 и т. Д.

  3. MyFrm.Name не изменяется в LoadFromFile. Я проверил (точку останова) значение MyFrm.Name в конце процедуры MyProcedure1; после LoadFromFile. Имя уникальное.

  4. Как предлагали некоторые, я переопределил процедуру SetName и проверил имя TMyFrm. Действительно, каждая форма получает уникальное имя.

    procedure TMyFrm.SetName (const Value: TComponentName);
    начало
    ShowMessage (Значение);
    унаследованный;
    конец;

  5. У меня много форм в этом приложении, но автоматически создается только MainForm.

  6. Я не использую потоки. В любом случае это не будет иметь значения, поскольку формы создаются пользователем (поэтому многопоточность не имеет значения, если пользователь не может создавать 2 формы одновременно).

5
задан Ultralisk 1 February 2011 в 13:42
поделиться