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

Вниз

Как правильно определить, открыто ли уже такая форма?   Найти похожие ветки 

 
Sergy   (2002-12-11 10:27) [0]

Нажимая на кнопку в приложении хочу определить не загружена ли уже эта форма. Код который приведен ниже мне не очень нравится:
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;


 
stone ©   (2002-12-11 10:40) [1]

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

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

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



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

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


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

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


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

ну - могу только предложить:
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) [5]


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


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


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

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


 
Sergy   (2002-12-11 11:36) [7]

>stone

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


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


 
stone ©   (2002-12-11 11:39) [8]

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


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

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


 
stone ©   (2002-12-11 11:50) [10]

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


 
stone ©   (2002-12-11 11:53) [11]

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


 
han_malign ©   (2002-12-11 11:56) [12]

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


 
Sergy   (2002-12-11 11:56) [13]

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


 
han_malign ©   (2002-12-11 12:13) [14]

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



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

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

Наверх




Память: 0.5 MB
Время: 0.02 c
14-74983
Ketmar
2002-12-03 17:40
2002.12.23
где взять исходники для Q2 BSP Builder и сопутствующих tools?


4-75051
v0land
2002-11-08 13:16
2002.12.23
Память занимаемая программой?


14-74932
Tihas
2002-11-24 02:22
2002.12.23
Кто нибудь знает попуярную игру написаную с помощью дельфи?


1-74766
JC
2002-12-06 12:42
2002.12.23
Как приостановить выполнение процедуры, чтоб все остальные


14-74890
France
2002-12-04 12:40
2002.12.23
TStringList и Drag&Drop