Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
4-1078821958
EXE7
2004-03-09 11:45
2004.05.02
второе окно на API-очереди,сделать окно


1-1081927015
Viktor
2004-04-14 11:16
2004.05.02
exit;


4-1078770825
Labert
2004-03-08 21:33
2004.05.02
WM_DRAWITEM и WM_PAINT


1-1082284384
Igrok_
2004-04-18 14:33
2004.05.02
рисование


14-1081836347
Nous Mellon
2004-04-13 10:05
2004.05.02
О клонах





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский