![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Форма создана or нет [D7, WinXP]
Kot Andrei © (2005-07-01 09:19:00)Вообщем-то сабж...
Грубо говоря по нажатию на Button1 происходит FormCreat, по нажатию на Button2 - FormFree. Так вот при нажатии на Button1 нужно проверить данная форма уже создана или нет (чтоб не создавать 2-ой раз).
Подскажите плиз как! С уважением!
Игорь Шевченко (2005-07-01 14:54:00) [1]-=XP=- © (01.07.05 14:05) [28]
Ms Money погляди.
Или статью про интуитивный интерфейс прочитай. На RSDN была.
> Это я не к тому, чтобы дискуссию затевать, а к тому, что
> каждый работает так, как ему захочется, а программе (программисту)
> рекомендуется обеспечивать максимум удобства для пользователя.
Это безусловно да, каждый работает так, как ему захочется, в рамках, предоставленных программой. Просто одни и те же действия пользователя можно обеспечить так, что они будут менее затратны с точки зрения эргономики или более затратны.
msguns (2005-07-01 14:16:00) [2]>Игорь Шевченко © (01.07.05 12:50) [27]
>А можно сделать режим сравнения в программе, а не заставлять пользователей выписывать на бумажку различия.
Если б знать, ЧТО именно сравнивать..
А в общем, все сказано Димой в [28]
-=XP=- (2005-07-01 14:05:00) [3]Я к тому, что не вижу смысла показывать одновременно два набора данных с разной фильтрацией или там, сортировкой.
В принципе, пользователю решать.
У меня вот, три проводника открыто в одной папке. В разных проводниках выделены разные файлы (по одному). Мне удобнее переключиться между проводниками, чем искать нужный файл в списке из 60 файлов.
К слову: Зачем Borland сделал в Delphi IDE команду меню "New Edit Window"? В Word'е, например, сплиттер для разбиения окна на две области для просмотра одного документа. Это, Document/View, опять же.
Это я не к тому, чтобы дискуссию затевать, а к тому, что каждый работает так, как ему захочется, а программе (программисту) рекомендуется обеспечивать максимум удобства для пользователя.
Игорь Шевченко (2005-07-01 12:50:00) [4]msguns © (01.07.05 12:43) [26]
> Как пример: тел.справочник на нескольких формах, отсортированных
> (отфильтрованных) по-разному
У тебя сколько пар глаз, дружище, чтобы смотреть во все справочники сразу ? :) Я к тому, что не вижу смысла показывать одновременно два набора данных с разной фильтрацией или там, сортировкой.
Кстати, очень рекомедую, посмотри на интерфейс Microsoft Money, там все очень, на мой взгляд, оптимально организовано.
> Также можно открыть два экземпляра формы с разными документами,
> например, для сравнения фактур (опять будешь ругать "бухгалтеров"
> ?).
А можно сделать режим сравнения в программе, а не заставлять пользователей выписывать на бумажку различия.
msguns (2005-07-01 12:43:00) [5]>Игорь Шевченко © (01.07.05 12:07) [22]
>Ваще-то датасеты рекомендуется в датамодулях держать...
Особенно если одна и та же форма существует в нескольких экземплярах. Как пример: тел.справочник на нескольких формах, отсортированных (отфильтрованных) по-разному. Также можно открыть два экземпляра формы с разными документами, например, для сравнения фактур (опять будешь ругать "бухгалтеров" ?).
На то и есть правила, чтобы были исключения
begin...end (2005-07-01 12:35:00) [6]> -=XP=- © (01.07.05 12:34) [24]
Self не является полем объекта.
-=XP=- (2005-07-01 12:34:00) [7]Что такое FList.Self -- я не знаю
Это вот это:
procedure TObject.Free;
begin
if Self <> nil then
Destroy;
end;
begin...end (2005-07-01 12:30:00) [8]> -=XP=- © (01.07.05 11:17) [20]
> Пока конструктор еще не отработал, какие ресурсы
> выделены под экземпляр класса?
К моменту начала исполнения собственно кода конструктора под экземпляр класса выделяется и инициализируется память в размере, соответствующем InstanceSize. Б ольшая часть этой памяти (выделенная для полей) обнуляется, а первые 4 байта экземпляра настраиваются на нужную VMT.
> В методе Free идет проверка на неравенство nil, но
> будет ли в таком случае FList.Self = nil?
Что такое FList.Self -- я не знаю, а вот само поле FList изначально (при выделении памяти под поля) было обнулено. Так что проблемы не вижу.
Игорь Шевченко (2005-07-01 12:07:00) [9]msguns © (01.07.05 10:57) [17]
> Кроме того, формы могуть содержать гриды с открытыми датасетами
> (если приложение работает с БД), а это дополнительная нагрузка
> и на сервер и на ресурсы ОС (память дисковая и оперативная),
> и на само приложение (кэши, массивы, списки и вообще)
Ваще-то датасеты рекомендуется в датамодулях держать...
kot andrei (2005-07-01 11:33:00) [10]>>-=XP=- © (01.07.05 10:28) [8]
>>А чего тут критиковать? Если автор задает такой вопрос, то он
>>не совсем понимает, что на самом деле происходит. Поэтому, не
>>исключена ситуация:
исключена!
>>Digitman © (01.07.05 10:24) [7]
>>он плох тем что форма м.б. уничтожена в т.ч. и интерактивно,
>>самим юзером, щелчком на "крестике"
в моем случае никакого "крестика" :о) на форме нет (border=none)
хотя понятно что вы этого не знали...
>>-=XP=- © (01.07.05 10:32) [12]
>>Предусмотреть все варианты невозможно. Тем более, не зная, что
>>думает, знает и понимает по этой теме автор вопроса.
с этим всегда согласен ... просто выходил на время из офиса и упустил весь диалог (((
-----
вообщем всем большое спасибо... понял!
-=XP=- (2005-07-01 11:17:00) [11]Вот такой еще вариант возможен:
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. Как такое соотносится с "синглтоном"? А то я "слышал звон, да не знаю, где он". Велосипед изобретаю, поди...
msguns (2005-07-01 11:14:00) [12]>Tor © (01.07.05 11:02) [18]
>Тогда все зависит от концепции приложения. Я тоже так делаю если формы не нужны, то просто создаю и уничтожаю, но приэтом я стараюсь их показывать модальными, это тоже с одной стороны выход.
От концепции не зависит. Зависит от мозгов и опыта.
Причем здесь модальность ? Если в MDI-приложении юзер открывает один справочник пять раз, а потом закрывает его, то что, вся пять экземпляров одной и той же формы должны "висеть на шее" приложения ? Да и не в MDI та же картина..
Важно не то, "кто на ком сидит", а то, что не должно существовать объектов, в данный момент не нужных пользователю. Если не следовать этому принципу, то в конце-концов когда-нибудь приложение начнет вываливаться с какой нибудь мессагой типа нехватки памяти.
Tor (2005-07-01 11:02:00) [13]> msguns ©
Тогда все зависит от концепции приложения. Я тоже так делаю если формы не нужны, то просто создаю и уничтожаю, но приэтом я стараюсь их показывать модальными, это тоже с одной стороны выход.
msguns (2005-07-01 10:57:00) [14]>Tor © (01.07.05 10:35) [14]
>А спрашивается, нафиг создавать форму в ручную, может стоит просто ее показывать и скрывать.
Для неглавных форм это есть нехорошо. Не говоря о возможных глюках, просто неверно в плане концепции построения приложения.
Зачем держать кучу форм, если они не нужны пользователю ? Просто потому чтобы их "не создавать вручную" ? Кроме того, формы могуть содержать гриды с открытыми датасетами (если приложение работает с БД), а это дополнительная нагрузка и на сервер и на ресурсы ОС (память дисковая и оперативная), и на само приложение (кэши, массивы, списки и вообще)
Dimous (2005-07-01 10:43:00) [15]>> Digitman © (01.07.05 10:36) [15]
Согласен. Опять же все зависит от того, для чего все эти формы нужны. Если они должны еще и взаимодействовать между собой и с другими, то не очень то удобно пробегать по Screen.Forms, проверять класс, приводить типы.
А вообще >> -=XP=- © (01.07.05 10:32) [12]
Digitman (2005-07-01 10:36:00) [16]
> Ну тогда массив указателей
на кой ляд он сдался, если уже естьготовый список существующих форм ? см.[1]
Tor (2005-07-01 10:35:00) [17]А спрашивается, нафиг создавать форму в ручную, может стоит просто ее показывать и скрывать. Все зависит от приложения насколько оно большое, причем если еще и форма тяжелая, тогда долго будет создавать да причем не один раз. А от кривизны рук многое че зависит. :)
Dimous (2005-07-01 10:35:00) [18]>> Digitman © (01.07.05 10:32) [11]
Ну тогда массив указателей, а в Destroy - поиск Self и его удаление...
-=XP=- (2005-07-01 10:32:00) [19]Предусмотреть все варианты невозможно. Тем более, не зная, что думает, знает и понимает по этой теме автор вопроса.
Digitman (2005-07-01 10:32:00) [20]
> Dimous (01.07.05 10:30) [10]
а если требуется держать под контролем более чем одну форму класса TMyForm ?