Форум: "Основная";
Текущий архив: 2002.12.23;
Скачать: [xml.tar.bz2];
ВнизКак правильно определить, открыто ли уже такая форма? Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.008 c