![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как правильно определить, открыто ли уже такая форма? [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;