Форум: "Основная";
Текущий архив: 2003.07.03;
Скачать: [xml.tar.bz2];
ВнизГлюки с именем формы Найти похожие ветки
← →
TsvIlya (2003-06-23 16:20) [0]Привет всем!
Есть 3 формы: "frmMain" (Главная - Создается первой и автоматически), "frmTable" (Создается вручную, когда надо) и "frmFieldType" (Создается вручную, когда надо). Также есть следующая проседура:
procedure LoadFormStrings(Sender: TForm);
var
...
sFName: String;
...
begin
sFName := Sender.Name + ".ini";
...
end;
На неком событии создается и показывается "frmTable" (через доп. процедуру):
frmTable := nil;
try
frmTable := TfrmTable.Create(Table);
LoadFormStrings(frmTable);
frmTable.ShowModal;
finally
if Assigned(frmTable) then
frmTable.Release;
end;
В свою очередь по событию на форме "frmTable" создается и показывается "frmFieldType" (через доп. "Boolean" функцию):
frmFieldType := nil;
try
frmFieldType := TfrmFieldType.Create(Application);
LoadFormStrings(frmFieldType);
Result := frmFieldType.ShowModal;
finally
if Assigned(frmFieldType) then
frmFieldType.Release;
end;
Но, вместо "frmFieldType", Sender.Name в LoadFormStrings равняется "frmFieldType_1", хотя в первом случае (с "frmTable") все нормально. Помогите кто-нибудь разобраться, в чем дело, а то уже целый день мучаюсь...
Заранее благодарен, TsvIlya.
← →
Skier (2003-06-23 16:27) [1]>TsvIlya (23.06.03 16:20)
> Но, вместо "frmFieldType", Sender.Name в LoadFormStrings
> равняется "frmFieldType_1", хотя в первом случае (с "frmTable")
> все нормально. Помогите кто-нибудь разобраться, в чем дело,
> а то уже целый день мучаюсь...
Всё правильно.
Дело в том что ты не задаёшь имени для формы frmFieldType
(после создания) и Delphi именует твою форму по своему,
т.е. "frmFieldType_1", "frmFieldType_2", и т.д.
Задавай имя формы явно и проблемы рассосуться...
← →
Семен Сорокин (2003-06-23 16:33) [2]Вместо задания имени можешь воспользоваться ClassName
← →
TsvIlya (2003-06-23 16:35) [3]
> Skier © (23.06.03 16:27)
Т.е. ты хочешь сказать, что нужно указать:
frmFieldType.Name = "frmFieldType";
Но почему же тогда с frmTable все работает нормально? (Уже даже просто интересно стало)
← →
Johnmen (2003-06-23 16:43) [4]На момент создания формы frmFieldType форма с именем "frmFieldType" уже существует. См. свой код...
← →
Skier (2003-06-23 16:47) [5]>TsvIlya (23.06.03 16:35)
И вот эти куски прокомментируй :
1)
frmTable := nil;
try
frmTable := TfrmTable.Create(Table);
2)
frmFieldType := nil;
try
frmFieldType := TfrmFieldType.Create(Application);
Зачем сие ?
← →
TsvIlya (2003-06-23 16:56) [6]
> Skier © (23.06.03 16:47)
frmTable := nil; // Это, чтобы точно ничего не осталось от прошлого создания (формы могут создаваться и освобождаться несколько раз)
try
frmTable := TfrmTable.Create(Table); // Конструктор переписан, см. код ниже...
constructor TfrmTable.Create(Table: TITable);
...
begin
inherited Create(frmMain);
FTable := Table;
...
end;
Далее...
frmFieldType := nil; // То же
try
frmFieldType := TfrmFieldType.Create(Application); // Вместо Application может быть nil или др. форма - мне кажется нет особой разницы
> Johnmen © (23.06.03 16:43)
А что именно смотреть-то, ведь frmFieldType - всего лишь переменная...
← →
Skier (2003-06-23 17:02) [7]
> ; // Это, чтобы точно ничего не осталось от прошлого создания
> (формы могут создаваться и освобождаться несколько раз)
Логика отсутствует !
← →
Семен Сорокин (2003-06-23 17:03) [8]frmFieldType := TfrmFieldType.Create(Application); // Вместо Application может быть nil или др. форма - мне кажется нет особой разницы
Разница есть, здесь указывается объект, по уничтоженнии которого автоматом уничтожится твой создаваемый объект. Если ты укажешь nil то тебе надо уничтожать самому этот объект, чтобы не было утечки памяти.
← →
TsvIlya (2003-06-23 17:09) [9]
> Семен Сорокин © (23.06.03 17:03)
Большое спасибо за совет. А что указывать лучше: главную форму или все-таки Application?
> Skier © (23.06.03 17:02)
Убрать эту строку нетрудно, но от этого нет пользы. Темболее мы отклонились от темы:
> Но почему же тогда с frmTable все работает нормально?
← →
Семен Сорокин (2003-06-23 17:15) [10]TsvIlya (23.06.03 17:09)
В данном случае разницы нет (хоть nil) - ты же сам ее уничтожаешь.
Убрать эту строку нетрудно, но от этого нет пользы
От этой строки нет пользы :))
Но почему же тогда с frmTable все работает нормально?
Могу предположить что форма frmTable создавалась только единожды с нужным именем.
← →
Skier (2003-06-23 17:20) [11]>TsvIlya
Советую переписать :
1)
try
frmTable := TfrmTable.Create(Table);
frmTable.Name := "frmTable";
LoadFormStrings(frmTable);
frmTable.ShowModal;
finally
frmTable.Free;
frmTable := nil; //???
end;
2)
try
frmFieldType := TfrmFieldType.Create(Application);
frmFieldType.Name := "frmFieldType";
LoadFormStrings(frmFieldType);
Result := frmFieldType.ShowModal;
finally
frmFieldType.Free;
frmFieldType := nil; //???
end;
← →
Skier (2003-06-23 17:20) [12]Oops...
И создание формы вынеси из try-блока.
← →
TsvIlya (2003-06-23 17:21) [13]Хорошо, строчку уберем.
Но обе эти формы создаются пока (на момент, когда происходит это загадочное изменение) только один раз... Ладно, буду устанавливать имя в runtime...
Всем СПАСИБО, за советы...
← →
reonid (2003-06-23 19:00) [14]Имена компонент подчиняются следующему правилу -
у одного Owner"a не может быть двух компонент с одним именем.
Ты создаёшь две формы типа TfrmFieldType с владельцем
Application, и вторая автоматически переименовывается.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.07.03;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.008 c