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

Вниз

окна.....окна....окна...   Найти похожие ветки 

 
Koks ©   (2002-01-29 17:18) [0]

Необходимо запретить пользователю открывать более одного
экземпляра формы MyForm.

Код:

procedure OnButtonClick;
begin
if assigned(MyFrorm) then
begin
MessageDlg("... форма уже открыта....");
Exit;
end
else
begin
Application.CreateForm(TMyForm, MyForm);
MyForm.Show;
end;
end;
--------------
procedure TMyForm.OnClose(...)
begin
Action := caFree;
end;

МуForm - MDIChild-форма

Сначала все OK. форма креатиться и показывается.
Если в этот момент попытаться открыть еще одну MyForm - все правильно - высвечивается мессадж "форма уже открыта".

Далее - закрываю форму MyForm. (при этом по caFree она должна убираться из памяти...). Все в порядке...

Теперь вновь пытаюсь открыть MyForm.
Результат - "форма уже открыта"...... ПОЧЕМУ !!!!
Подскажите...


 
Юрий Зотов ©   (2002-01-29 17:21) [1]

procedure TMyForm.OnClose(...)
begin
Action := caFree;
MyForm := nil;
end;

И все.



 
Johnmen ©   (2002-01-29 17:44) [2]

А я всегда пользовался Application.FindComponent("MyForm")<>nil
и все железно работает... :)


 
Юрий Зотов ©   (2002-01-29 17:47) [3]

> Johnmen © (29.01.02 17:44)

... только раз в 100 медленнее, чем могло бы.


 
Anatoly Podgoretsky ©   (2002-01-29 21:54) [4]

Правильнее запретить кнопку при создании (что бы пользователю неповадно было) и разрешить при закрытии. Этим достигается обратная связь.


 
Johnmen ©   (2002-01-30 09:38) [5]

>>>Юрий Зотов © :
медленнее - это типа вместо 0.1 мкс будет 10 мкс ?
:o)))))))))


 
Koks ©   (2002-01-30 12:40) [6]

Друзья ! Спасибо большое за ответы - все заработало. Воспользовался способом Юрия Зотова....
Но в догонку возник дополнительный вопрос.
В дальнейшем (когда кончательно отлажу алгоритм) мне нужно будет разрешать пользователям открывать одновременно несколько экземпляров MyForm одновременно, которые будут креатиться и уничтожаться динамически. Причем количество этих экземпляров будет ограничиваться только ресурсами системы.
Читал в документации по Delphi, что для каждого экземпляра формы необходима отдельная переменная, иначе формы "теряются" - т.е. открываем одну MyForm - все нормально - ссылка на нее в переменной var MyForm: TMyForm. Открываем вторую (при открытой первой) ссылка на нее туда же, а ссылка на первую в этот момент "теряется"
Вопрос: в какой структуре хранить ссылки. Напрашиваестя TList...
т.е. Каждый раз:

var
PointToForm: TForm;
FormList: TList;
....

New(PointToForm);
Application.CreateForm(TMyForm, MyForm);
PointToForm := MyForm;
FormList.Add(PointToForm);

прежде чем кодить хочк спросить совета - может я на ложном пути....
может кто решал такую проблему по-другому...



 
Юрий Зотов ©   (2002-01-30 13:55) [7]

Можно и TList, только не так, а проще:

FormList.Add(TMyForm.Create(Application));

А в обработчике TMyForm.OnDestroy пишем:
FormList.Remove(Self); // Автоматическое самоудаление из списка


Еще вариант - динамический массив.
var
FormArray: array of TMyForm;

function CreateMyForm: TMyForm;
begin
Result := TMyForm.Create(Application);
try
SetLength(FormArray, Length(FormArray) + 1);
FormArray[High(FormArray)] := Result
except
Result.Release;
raise
end
end;



Страницы: 1 вся ветка

Текущий архив: 2002.02.14;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.009 c
6-42828
Дремучий
2001-11-21 19:24
2002.02.14
Файловая структура веб-узла


1-42766
Ura
2002-01-31 12:44
2002.02.14
Создание INI файла по имение exe файла


1-42747
perov
2002-01-30 09:48
2002.02.14
работа с объектами в TStringList


7-42885
hp1100
2001-11-08 23:18
2002.02.14
Как использовать звуковую карту в кач-ве АЦП медленно меняющегося сигнала 0-1,0 V ?


1-42777
Yuraz
2002-01-31 14:46
2002.02.14
Подскажите, как загрузить картинку в Image не с самого начала координат (0,0; лево-вверх)