Форум: "Основная";
Текущий архив: 2004.05.02;
Скачать: [xml.tar.bz2];
ВнизMDI Form is closed ? Найти похожие ветки
← →
WebErr © (2004-04-16 15:48) [0]1. Открываю MDI Child форму NumForm
2. Закрываю её
3. Потом снова открываю её:
procedure NumProc;
begin
if not Assigned(NumForm) then
NumForm := TNumForm.Create(Application);
...
end;
Проблема:
форма, после её закрытия как MDI Child не хочет становиться non assigned, т.е. я просто не знаю куда воткнутьSelf := nil;
Пожалуйста помогите!
← →
Reindeer Moss Eater © (2004-04-16 15:51) [1]Воткни её в OnClose
← →
Семен Сорокин © (2004-04-16 15:54) [2]используй FreeAndNil вместо Free
← →
Семен Сорокин © (2004-04-16 15:55) [3]WebErr © (16.04.04 15:48)
сорри, не в тему там Action := caFree?
← →
Reindeer Moss Eater © (2004-04-16 15:56) [4]используй FreeAndNil вместо Free
А он и Free не использует
сорри, не в тему там Action := caFree?
Какая разница какое там Action?
← →
Семен Сорокин © (2004-04-16 15:57) [5]на OnDestroy TNumForm присваивай NumForm := nil;
← →
WebErr © (2004-04-16 15:58) [6]
> Reindeer Moss Eater © (16.04.04 15:51) [1]
Куда?
procedure TNumForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
end;
Что первой строчкой, что последней - неудачно!
Я уже пробовал!
И OnDestroy выполняется после закрытия Parent MDI Form.
> Семен Сорокин © (16.04.04 15:54) [2]
В каком месте?
У меня Free нигде не вызывается, если я пробую вставить FreeAndNil в OnClose, то получаю Access Violation!!!
← →
Mim1 (2004-04-16 15:58) [7]Влепи в ondestroy NumForm := nil;
а Self := nil; делу не поможет
← →
Семен Сорокин © (2004-04-16 15:58) [8]Reindeer Moss Eater © (16.04.04 15:56) [4]
А он и Free не использует
эт я понял когда запостил :))
← →
Reindeer Moss Eater © (2004-04-16 16:00) [9]procedure NumProc;
begin
if not Assigned(NumForm) then
NumForm := TNumForm.Create(Application);
...
end;
procedure TNumForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
NumForm := nil;
end;
← →
WebErr © (2004-04-16 16:00) [10]
> Семен Сорокин © (16.04.04 15:57) [5]
Смотри:
> WebErr © (16.04.04 15:58) [6]
> OnDestroy выполняется после закрытия Parent MDI Form.
> Mim1 (16.04.04 15:58) [7]
То же самое!
Какая разница между Self и NumForm внутри NumForm???
← →
Reindeer Moss Eater © (2004-04-16 16:02) [11]Какая разница между Self и NumForm внутри NumForm???
Такая, что он в другом месте проверяет
if not Assigned(NumForm) then
← →
WebErr © (2004-04-16 16:03) [12]Ага, а
Self := nil
иNumForm := nil
в OnClose выполнят разные действия?!
← →
WebErr © (2004-04-16 16:05) [13]А если NumForm - это предок какой-то ещё формы, то тут никого уже не спасёт
NumForm := nil;
!!!!
← →
Reindeer Moss Eater © (2004-04-16 16:06) [14]NumForm это переменная модуля.
Одна на весь модуль
Разницу ощущаешь?
← →
WebErr © (2004-04-16 16:11) [15]Попробовал [9] - всё получилось, но теперь меня терзают смутные сомнения, что будет если я:
- закрою наследника TNumForm
- проверю его на assigned
???
← →
Reindeer Moss Eater © (2004-04-16 16:11) [16]закрой.
проверь.
← →
ASMiD (2004-04-16 16:13) [17]Если весь сыр-бор горит из-за того, чтобы определить, создана форма или нет, то можно ввести флаг
NumForm := TNumForm.Create(Application);
flNumForm:=TRUE;
...
procedure TNumForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
flNumForm:=FALSE;
end;
или капитально проверять через MDIChildren
← →
Reindeer Moss Eater © (2004-04-16 16:15) [18]Масло маслянное
← →
WebErr © (2004-04-16 16:31) [19]
> ASMiD (16.04.04 16:13) [17]
Мдя! :))))
← →
WebErr © (2004-04-16 16:32) [20]
> Reindeer Moss Eater © (16.04.04 16:11) [16]
Только что разобрался с наследниками! :))))
Намудрил, но всё работает! Спасибо! :))))
← →
Silver Alex © (2004-04-16 16:36) [21]
> WebErr © (16.04.04 16:31) [19]
странно вы все это делаете, попробуй так вызывать форму.
Ну и конечно на OnClose надо Action:=caFree;
function IsFormFoundEx(AFormClass :TFormClass) : boolean;
var
i:integer;
begin
Result:=False;
for i:=0 to Screen.FormCount - 1 do
if (Screen.Forms[i] is AFormClass) then begin
(Screen.Forms[i] as TForm).BringToFront;
Result:=True;
break;
end;
if not Result then
AFormClass.Create(Application);
end;
← →
Reindeer Moss Eater © (2004-04-16 16:42) [22]Прекрасный образец программерской мысли.
MDI приложение с единственно возможным экземпляром окна одного класса.
← →
WebErr © (2004-04-16 16:51) [23]
> странно вы все это делаете
мда! похоже это все мы ЭТО делаем странно (на клавиатуре, д ещё и руками!!!) - вот такие вот мы все (почти) странные! :))))
← →
Silver Alex © (2004-04-16 16:55) [24]
> Reindeer Moss Eater © (16.04.04 16:42) [22]
Я так понимаю это ко мне, даже не сомневался что ты что-то ответишь :)
Только не пойму чем не подходит мой пример.Обьясни, если сможешь :)
← →
Silver Alex © (2004-04-16 16:58) [25]
> WebErr © (16.04.04 16:51) [23]
Да, я считаю странным писать "не знаю куда воткнуть
Self := nil", а ты?
← →
Reindeer Moss Eater © (2004-04-16 17:01) [26]Silver Alex ©
Я же во второй строчке поста № 22 все сказал уже.
Не понятно выразился?
Ну уж как могу.
чем не подходит мой пример
А я сказал что он не подходит?
← →
WebErr © (2004-04-16 17:08) [27]
> Reindeer Moss Eater © (16.04.04 17:01) [26]
Так там в общем-то и надо не более одного окна класса TNumForm, от этого и все беды по поводу непонимания разницы Self и NumForm! :))))
← →
Silver Alex © (2004-04-16 17:18) [28]
> А я сказал что он не подходит?
ТЫ не можешь что бы не язвить
> Не понятно выразился?
> Ну уж как могу.
Не можешь?А нафиг тогда плетешь? Нравится портить людям настроение? Или как обычно пытаешься показывать свою суперквалификацию и неординарный образ мышления?
← →
WebErr © (2004-04-16 17:21) [29]Девочки не ссорьтесь, а то я скажу дядям-модераторам и они закроют ветку к чертям собачьим!!! :))))
← →
Reindeer Moss Eater © (2004-04-16 17:21) [30]Или как обычно пытаешься показывать свою суперквалификацию и неординарный образ мышления?
Тебе это портит настроение? Так фикли в эту ветку полез?
← →
Silver Alex © (2004-04-16 17:34) [31]
> Так фикли в эту ветку полез?
Давно на форум не заходил, работы много было.А тут гляжу, твой ник.Думаю, интересно ты такой же зловредный как был или может попустило тебя.Теперь вижу, что нифига тебя не попустило :)
← →
Reindeer Moss Eater © (2004-04-16 17:38) [32]Иди укрепляй психику.
← →
WebErr © (2004-04-16 17:40) [33]Боже! Закройте это!!! :))))
← →
Silver Alex © (2004-04-16 17:53) [34]
> WebErr © (16.04.04 17:40) [33]
Ты так улыбаешся потому что радостно тебе или просто зубы жмут?
> Reindeer Moss Eater © (16.04.04 17:38) [32]
Наверное так и сделаю, пятница все же :)
Может и тебе не мешало бы расслабиться?
Ну ладно, ребята, не подумайте что я тут сорился с кем-то :)
Пойду укреплять психику
← →
WebErr © (2004-04-16 18:12) [35]Шутник наверное! :))))
← →
Mim1 (2004-04-16 19:35) [36]WebErr ©
Всетаки я бы посоветовал событие ondestroy [7] а не onclose.
Что касается разницы [10], то она в том, что между этими переменными ничего общего окромя типа нет.
← →
Игорь Шевченко © (2004-04-16 21:15) [37]
> function IsFormFoundEx(AFormClass :TFormClass) : boolean;
> var
> i:integer;
> begin
> Result:=False;
>
> for i:=0 to Screen.FormCount - 1 do
> if (Screen.Forms[i] is AFormClass) then begin
> (Screen.Forms[i] as TForm).BringToFront;
> Result:=True;
> break;
> end;
>
> if not Result then
> AFormClass.Create(Application);
> end;
Можно я две копейки вставлю ?
Не стоит смешивать в одной функции проверку и действия, так как название функции не отражает ее поведения.
Я бы разбил эту функцию на две - одна проверяет и возвращает результат найденного экземпляра объекта или nil, а вторая вызвает BringToFront или Create, соотвественно.
Еще в подобных конструкциях можно вставлять строки для восстановления формы, если она минимизирована, но это уже на вкус.
С уважением,
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.05.02;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.035 c