Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.07.03;
Скачать: CL | DM;

Вниз

Глюки с именем формы   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.02 c
1-7379
Tayfun
2003-06-20 11:50
2003.07.03
Подскажите пожалуйста как добавить в EXУ файл текстовый ресурс?


3-7344
Anics
2003-06-10 12:27
2003.07.03
Знатоки, кто-нибудь добился нормальной работы TDBCheckBox


3-7353
???
2003-06-10 16:26
2003.07.03
как нибудь можно синхронзировать 2 грида? обращение к одной базе


9-7284
K@zzel
2003-01-21 16:54
2003.07.03
Просто вопрос


14-7600
Weare
2003-06-17 16:18
2003.07.03
Работа с почтовой программой