Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Форма создана or нет [D7, WinXP]


Страницы:   1 2

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 ?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо