Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.07.18;
Скачать: [xml.tar.bz2];

Вниз

Форма создана or нет   Найти похожие ветки 

 
Kot Andrei ©   (2005-07-01 09:19) [0]

Вообщем-то сабж...
Грубо говоря по нажатию на Button1 происходит FormCreat, по нажатию на Button2 - FormFree. Так вот при нажатии на Button1 нужно проверить данная форма уже создана или нет (чтоб не создавать 2-ой раз).

Подскажите плиз как! С уважением!


 
Anatoly Podgoretsky ©   (2005-07-01 09:21) [1]

Screen.Forms


 
stone ©   (2005-07-01 09:49) [2]

Assigned ?


 
Anatoly Podgoretsky ©   (2005-07-01 10:11) [3]

stone ©   (01.07.05 09:49) [2]
Глупость


 
Tor ©   (2005-07-01 10:17) [4]

if form1 <> nil then
form1.Show
else form1 := TForm.Create(Application);


 
Чапаев ©   (2005-07-01 10:20) [5]


procedure B1Click();
begin
 if not Assigned(MyForm) then
   MyForm:=TMyForm.Create();
end;
procedure B2Click();
begin
 if Assigned(MyForm) then
   FreeAndNil(MyForm);
end;

А такой вариант чем плох? Покритикуйте.


 
-=XP=- ©   (2005-07-01 10:24) [6]

Вариант 1. Assigned? > Глупость
Зависит от реализации.

Вариант 2. Screen.Forms
Зависит от реализации.

Минусы:

Вариант 1. Можно "забыть" присвоить nil переменной, хранящей ссылку на форму. Соответсвенно, может быть AV.

Вариант 2. Можно "забыть" проверить существование формы, и создать еще одну. Тогда в Screen.Forms будет несколько "одинаковых форм". Так как "забыли" проверить существование формы - то и ситуацию дубликатов обрабатывать, скорее всего, не будут.

Плюсы (с точностью до "наоборот"):

Вариант 1. В переменной формы может хранится ссылка только на одну форму, поэтому нет ситуации с дубликатами. Хотя, можно и "потерять" форму.

Вариант 2. А тут все формы будут присутствовать, по любому.

Вывод: Вопрос не в алгоритме, а в его реализации. Точнее - в кривизне рук.


 
Digitman ©   (2005-07-01 10:24) [7]


> Чапаев ©   (01.07.05 10:20) [5]


он плох тем что форма м.б. уничтожена в т.ч. и интерактивно, самим юзером, щелчком на "крестике"

при этом переменная MyForm, о которой уничтожаемая форма ничего не знает, останется <> nil


 
-=XP=- ©   (2005-07-01 10:28) [8]

А такой вариант чем плох? Покритикуйте.

А чего тут критиковать? Если автор задает такой вопрос, то он не совсем понимает, что на самом деле происходит. Поэтому, не исключена ситуация:

procedure TMyForm.OnFormClose(Sender: TObject; var Action: TCloseAction);
begin
 Action := caFree;
end;


Ваш код в нокдауне.


 
-=XP=- ©   (2005-07-01 10:28) [9]

Сорри за повтор.


 
Dimous   (2005-07-01 10:30) [10]

>> Digitman ©   (01.07.05 10:24) [7]
Можно добавить

procedure TMyForm.FormDestroy(Sender: TObject);
begin
 MyForm := nil;
end;


 
Digitman ©   (2005-07-01 10:32) [11]


> Dimous   (01.07.05 10:30) [10]


а если требуется держать под контролем более чем одну форму класса TMyForm ?


 
-=XP=- ©   (2005-07-01 10:32) [12]

Предусмотреть все варианты невозможно. Тем более, не зная, что думает, знает и понимает по этой теме автор вопроса.


 
Dimous   (2005-07-01 10:35) [13]

>> Digitman ©   (01.07.05 10:32) [11]
Ну тогда массив указателей, а в Destroy - поиск Self и его удаление...


 
Tor ©   (2005-07-01 10:35) [14]

А спрашивается, нафиг создавать форму в ручную, может стоит просто ее показывать и скрывать. Все зависит от приложения насколько оно большое, причем если еще и форма тяжелая, тогда долго будет создавать да причем не один раз. А от кривизны рук многое че зависит. :)


 
Digitman ©   (2005-07-01 10:36) [15]


> Ну тогда массив указателей


на кой ляд он сдался, если уже есть готовый список существующих форм ? см.[1]


 
Dimous   (2005-07-01 10:43) [16]

>> Digitman ©   (01.07.05 10:36) [15]
Согласен. Опять же все зависит от того, для чего все эти формы нужны. Если они должны еще и взаимодействовать между собой и с другими, то не очень то удобно пробегать по Screen.Forms, проверять класс, приводить типы.
А вообще >> -=XP=- ©   (01.07.05 10:32) [12]


 
msguns ©   (2005-07-01 10:57) [17]

>Tor ©   (01.07.05 10:35) [14]
>А спрашивается, нафиг создавать форму в ручную, может стоит просто ее показывать и скрывать.

Для неглавных форм это есть нехорошо. Не говоря о возможных глюках, просто неверно в плане концепции построения приложения.
Зачем держать кучу форм, если они не нужны пользователю ? Просто потому чтобы их "не создавать вручную" ? Кроме того, формы могуть содержать гриды с открытыми датасетами (если приложение работает с БД), а это дополнительная нагрузка и на сервер и на ресурсы ОС (память дисковая и оперативная), и на само приложение (кэши, массивы, списки и вообще)


 
Tor ©   (2005-07-01 11:02) [18]

> msguns ©
Тогда все зависит от концепции приложения. Я тоже так делаю если формы не нужны, то просто создаю и уничтожаю, но приэтом я стараюсь  их показывать модальными, это тоже с одной стороны выход.


 
msguns ©   (2005-07-01 11:14) [19]

>Tor ©   (01.07.05 11:02) [18]
>Тогда все зависит от концепции приложения. Я тоже так делаю если формы не нужны, то просто создаю и уничтожаю, но приэтом я стараюсь  их показывать модальными, это тоже с одной стороны выход.

От концепции не зависит. Зависит от мозгов и опыта.
Причем здесь модальность ? Если в MDI-приложении юзер открывает один справочник пять раз, а потом закрывает его, то что, вся пять экземпляров одной и той же формы должны "висеть на шее" приложения ? Да и не в MDI та же картина..
Важно не то, "кто на ком сидит", а то, что не должно существовать объектов, в данный момент не нужных пользователю. Если не следовать этому принципу, то в конце-концов когда-нибудь приложение начнет вываливаться с какой нибудь мессагой типа нехватки памяти.


 
-=XP=- ©   (2005-07-01 11:17) [20]

Вот такой еще вариант возможен:

constructor TMyForm.Create(AOwner: TComponent);
var
 i: integer;
 F: TForm;
begin
 for i := 0 to Screen.FormCount - 1 do
 begin
   F := Screen.Forms[i];
   if (F is TMyForm) then
   begin
     Self.Free;
     Self := TMyForm(F);
     Exit;
   end;
 end;
 inherited Create(AOwner);
end;


Только у меня есть сомнения по поводу:
1. Пока конструктор еще не отработал, какие ресурсы выделены под экземпляр класса? Они-то, конечно, уничтожаются (Self.Free), но каковы затраты на выделение/освобождение ресурсов?
2. Если в конструкторе, по причине отработки такого кода, не инициализируются какие-то поля данных, а именно - не создаются "внутренние" экземпляры классов (Например, FList := TList.Create), то что произойдет в деструкторе, если там явно прописано FList.Free;? В методе Free идет проверка на неравенство nil, но будет ли в таком случае FList.Self = nil?
3. Переписать бы это все, а то явное приведение к TMyForm мне не нравится - в наследниках работать будет коряво.
4. Как такое соотносится с "синглтоном"? А то я "слышал звон, да не знаю, где он". Велосипед изобретаю, поди...


 
kot andrei ©   (2005-07-01 11:33) [21]

>>-=XP=- ©   (01.07.05 10:28) [8]
>>А чего тут критиковать? Если автор задает такой вопрос, то он
>>не совсем понимает, что на самом деле происходит. Поэтому, не
>>исключена ситуация:

исключена!

>>Digitman ©   (01.07.05 10:24) [7]
>>он плох тем что форма м.б. уничтожена в т.ч. и интерактивно,
>>самим юзером, щелчком на "крестике"

в моем случае никакого "крестика" :о) на форме нет (border=none)
хотя понятно что вы этого не знали...

>>-=XP=- ©   (01.07.05 10:32) [12]
>>Предусмотреть все варианты невозможно. Тем более, не зная, что
>>думает, знает и понимает по этой теме автор вопроса.

с этим всегда согласен ... просто выходил на время из офиса и упустил весь диалог (((

-----

вообщем всем большое спасибо... понял!


 
Игорь Шевченко ©   (2005-07-01 12:07) [22]

msguns ©   (01.07.05 10:57) [17]


> Кроме того, формы могуть содержать гриды с открытыми датасетами
> (если приложение работает с БД), а это дополнительная нагрузка
> и на сервер и на ресурсы ОС (память дисковая и оперативная),
> и на само приложение (кэши, массивы, списки и вообще)


Ваще-то датасеты рекомендуется в датамодулях держать...


 
begin...end ©   (2005-07-01 12:30) [23]

> -=XP=- ©   (01.07.05 11:17) [20]

> Пока конструктор еще не отработал, какие ресурсы
> выделены под экземпляр класса?

К моменту начала исполнения собственно кода конструктора под экземпляр класса выделяется и инициализируется память в размере, соответствующем InstanceSize. Большая часть этой памяти (выделенная для полей) обнуляется, а первые 4 байта экземпляра настраиваются на нужную VMT.

> В методе Free идет проверка на неравенство nil, но
> будет ли в таком случае FList.Self = nil?

Что такое FList.Self -- я не знаю, а вот само поле FList изначально (при выделении памяти под поля) было обнулено. Так что проблемы не вижу.


 
-=XP=- ©   (2005-07-01 12:34) [24]

Что такое FList.Self -- я не знаю

Это вот это:

procedure TObject.Free;
begin
 if Self <> nil then
   Destroy;
end;


 
begin...end ©   (2005-07-01 12:35) [25]

> -=XP=- ©   (01.07.05 12:34) [24]

Self не является полем объекта.


 
msguns ©   (2005-07-01 12:43) [26]

>Игорь Шевченко ©   (01.07.05 12:07) [22]
>Ваще-то датасеты рекомендуется в датамодулях держать...

Особенно если одна и та же форма существует в нескольких экземплярах. Как пример: тел.справочник на нескольких формах, отсортированных (отфильтрованных) по-разному. Также можно открыть два экземпляра формы с разными документами, например, для сравнения фактур (опять будешь ругать "бухгалтеров" ?).

На то и есть правила, чтобы были исключения


 
Игорь Шевченко ©   (2005-07-01 12:50) [27]

msguns ©   (01.07.05 12:43) [26]


> Как пример: тел.справочник на нескольких формах, отсортированных
> (отфильтрованных) по-разному


У тебя сколько пар глаз, дружище, чтобы смотреть во все справочники сразу ? :) Я к тому, что не вижу смысла показывать одновременно два набора данных с разной фильтрацией или там, сортировкой.

Кстати, очень рекомедую, посмотри на интерфейс Microsoft Money, там все очень, на мой взгляд, оптимально организовано.


> Также можно открыть два экземпляра формы с разными документами,
> например, для сравнения фактур (опять будешь ругать "бухгалтеров"
> ?).


А можно сделать режим сравнения в программе, а не заставлять пользователей выписывать на бумажку различия.


 
-=XP=- ©   (2005-07-01 14:05) [28]

Я к тому, что не вижу смысла показывать одновременно два набора данных с разной фильтрацией или там, сортировкой.

В принципе, пользователю решать.
У меня вот, три проводника открыто в одной папке. В разных проводниках выделены разные файлы (по одному). Мне удобнее переключиться между проводниками, чем искать нужный файл в списке из 60 файлов.

К слову: Зачем Borland сделал в Delphi IDE команду меню "New Edit Window"? В Word"е, например, сплиттер для разбиения окна на две области для просмотра одного документа. Это, Document/View, опять же.

Это я не к тому, чтобы дискуссию затевать, а к тому, что каждый работает так, как ему захочется, а программе (программисту) рекомендуется обеспечивать максимум удобства для пользователя.


 
msguns ©   (2005-07-01 14:16) [29]

>Игорь Шевченко ©   (01.07.05 12:50) [27]
>А можно сделать режим сравнения в программе, а не заставлять пользователей выписывать на бумажку различия.

Если б знать, ЧТО именно сравнивать..

А в общем, все сказано Димой в [28]


 
Игорь Шевченко ©   (2005-07-01 14:54) [30]

-=XP=- ©   (01.07.05 14:05) [28]

Ms Money погляди.
Или статью про интуитивный интерфейс прочитай. На RSDN была.


> Это я не к тому, чтобы дискуссию затевать, а к тому, что
> каждый работает так, как ему захочется, а программе (программисту)
> рекомендуется обеспечивать максимум удобства для пользователя.


Это безусловно да, каждый работает так, как ему захочется, в рамках, предоставленных программой. Просто одни и те же действия пользователя можно обеспечить так, что они будут менее затратны с точки зрения эргономики или более затратны.



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

Форум: "Основная";
Текущий архив: 2005.07.18;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.53 MB
Время: 0.045 c
1-1119964706
Radgar
2005-06-28 17:18
2005.07.18
OnMouseDown в массиве Timage


10-1096276742
Татьяна
2004-09-27 13:19
2005.07.18
Com+ и Win2003 Server - проблема


1-1119868243
kot andrei
2005-06-27 14:30
2005.07.18
Надо подумать...


4-1116429235
AlexaB
2005-05-18 19:13
2005.07.18
Как программно изменить текущий пароль


14-1119365736
Зеленая Майка
2005-06-21 18:55
2005.07.18
Предлагаю отметить выход из клинической смерти любимого форума





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский