Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как правильно определить, открыто ли уже такая форма? [D6]


Sergy ©   (2002-12-11 10:27:00) 

Нажимая на кнопку в приложении хочу определить не загружена ли уже эта форма. Код который приведен ниже мне не очень нравится:
var
act:boolean;
n:byte;
begin
if mainfm.ActiveMDIChild <> nil then begin
act:=False;
for n:=0 to MainFm.MDIChildCount -1 do
if MainFm.MDIChildren[n].Caption = "Форма №1" then
act:=true;
if act then begin
ShowMessage("Форма №1 уже есть!");
exit;
end;
end;


han_malign   (2002-12-11 12:13:00) [1]

И форма физически уничтожается, и память освобождается, а вот указатель на освобоженный блок памяти оcтается в статической переменной Form1.
После Form1.Free, Form1<>nil, но Form1^ - Access Violation
З.Ы. stone - выше написал, как нужно делать(Form1:=nil), правда это пройдет только если переменная Form1 глобальная.


han_malign   (2002-12-11 11:56:00) [2]

есессссно, переменную-то(Form1) кто обнулять будет??? Класс ничего не может знать о той ячейке памяти в которой лежит указатель на его экземпляр.


Sergy   (2002-12-11 11:56:00) [3]

Тогда получается, что кода мы пишем Action := caFree;, то сама форма физически не уничтожается и память не освобождается? Если так, то я сильно заблуждался.


stone   (2002-12-11 11:53:00) [4]

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
Form1 := nil;
end;


stone   (2002-12-11 11:50:00) [5]

Странно, должно работать, щас проверю.


Sergy   (2002-12-11 11:44:00) [6]

Написано, конечно. Не работает точно на MDI дочерней форме. Можешь проверить.


stone   (2002-12-11 11:39:00) [7]

на OnClose формы напиши, Action := caFree;


Sergy   (2002-12-11 11:36:00) [8]

>stone

Пример
if not Assigned(Form1) then
Form1 := TForm1.Create(Application)
else
if not Form1.Showing then
Form1.Show;


работает некорректно, если Form1 сначала открыть, затем закрыть и потом опять попытаться открыть. Оператор Assigned(Form1)возращает true. Что это, указатель на форму физически не уничтожается? Как обойти?


Sergy   (2002-12-11 11:00:00) [9]

>stone
вполне устраивает, немного переработал под себя и все ок.


han_malign   (2002-12-11 10:51:00) [10]

ну - могу только предложить:
n:=0;act:=false;while((n<MainFm.MDIChildCount) and not act)do begin act:=(MainFm.MDIChildren[n].Caption = "Форма №1");inc(n);end;
if(act)then ShowMessage("Форма №1 уже есть!");
- в принципе больше ничего не надо (MainFm.MDIChildCount=0 ==> act=false, после 1-й проверки, иначе до первого совпадения, самое длительное если форма не открыта)
З.Ы. Можно завести глобальный(boolean поле в MainFm) флаг, устанавливать его при открытии целевой формы и сбрасывать при закрытии(или поле типа - set of byte, у Children-а поле номера, и соответственно устанавливать/сбрасывать нужный флаг при открытии/закрытии, только нужен однозначный алгоритм нумерации).


stone   (2002-12-11 10:51:00) [11]


> загружена ли такаяформа у пользователя?


А выше приведенный пример не устраивает? Тогда что значит такая форма?


Sergy   (2002-12-11 10:50:00) [12]

За пример спасибо.


Sergy   (2002-12-11 10:47:00) [13]

Вот именно мне и не нравится поиск по Caption. Мне нужно просто узнать загружена ли такая форма у пользователя? Может можно как-то без Caption?


stone   (2002-12-11 10:40:00) [14]

Здесь идет поиск формы по Caption.

Не совсем ясен вопрос, возможно Вам нужно было следующее:

if not Assigned(Form1) then
Form1 := TForm1.Create(Application)
else
if not Form1.Showing then
Form1.Show;


Наверх

Титульная страница Поиск, карта сайта Написать письмо