Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-7501
фтщв
2003-06-20 23:34
2003.07.03
Двусторонняя печать


4-7769
Clamat
2003-05-01 09:25
2003.07.03
Правильное завершение системы


1-7504
Mishenka
2003-06-20 23:06
2003.07.03
Можно ли в MessageBox вставлять названия кнопок на русском языке?


1-7531
Ilg
2003-06-22 13:11
2003.07.03
Имя компонента


1-7511
A
2003-06-21 16:54
2003.07.03
Свойство компонента ListBox





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский