Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
14-74973
romychk
2002-12-01 20:57
2002.12.23
Мобильный телефон


3-74589
Gaber
2002-12-04 12:48
2002.12.23
EXEL & DB


1-74655
u96
2002-12-12 22:23
2002.12.23
TOpenPictureDialog


3-74555
NONAME00
2002-12-04 12:04
2002.12.23
Ошибка с ADO


14-74886
Smithson
2002-12-04 12:14
2002.12.23
HTML parser





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский