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

Вниз

Форма создана 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;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.098 c
1-1120059052
Radgar
2005-06-29 19:30
2005.07.18
OnMouseDown в Timage


1-1120063382
Radgar
2005-06-29 20:43
2005.07.18
"Сквозной" Image


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


14-1119434628
Ilya__
2005-06-22 14:03
2005.07.18
Какие системы поддерживают формат WMA.


14-1119425225
nik90210
2005-06-22 11:27
2005.07.18
Не найдется ли доброго человека, который подарит мне песню?