Форум: "Основная";
Текущий архив: 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