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

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

заNILить форму после Close;


Страницы:   1 2 3 4 5 6 7 8 9 10

ничтожная козявка ©   (2008-08-21 12:37:00) 

В некой dll есть функция, показывающая форму. Перед созданием формы, она проверяет ее на NIL:

 if not Assigned(Form1) then Form1 := TForm1.Create(AOwner);


также требуется, что бы после закрытия (Close) форма была уничтожена:

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 ...
 Action := caFree;
 ...
end;


ВОПРОС: как сделать так, чтоб она была не только уничтожена, но и переменная Form1 приняла значение NIL. Т.к. поскольку эта переменная не NIL, при повторной попытке создать форму, ее конструктор
  if not Assigned(Form1) then Form1 := TForm1.Create(AOwner);
не вызывается, и в последствии сыпятся AV.


Leonid Troyanovsky   (2008-08-23 11:34:00) [61]


> Loginov Dmitry ©   (23.08.08 11:27) [128]

> Я так и понял, что предлагаемый Вами код для практических
> задач не годится.

Зависит от задач.


Loginov Dmitry   (2008-08-23 11:27:00) [62]

> Все в твоих руках, и показ исключений в том числе.
> А что ты собирался Show, если форма не создана?


Я так и понял, что предлагаемый Вами код для практических задач не годится.

собственно можно сделать классовый метод и описать создание формы в нем:

class function TBaseForm.GetForm(AOwner: TComponent): TMyForm;
var
 i: Integer;
begin  
 for i := 0 to Screen.FormCount - 1 do
   if Screen.Forms[i].ClassType = Self then
   begin
     Result := Screen.Forms[i] as Self;
     Exit;
   end;

 Result := Self.Create(AOwner);
end;


@!!ex   (2008-08-23 11:23:00) [63]

> как нам вообще удается на дельфи что-то программировать?

Так и не удается... ПОэтому здесь половина народу пишет на С++, Шарпе и Яве.


DVM   (2008-08-23 11:19:00) [64]


> И еще, секция инициализации - это тоже не самая хорошая
> задумка борландов.

Для эстетов:

unit WinVer;

interface
var
WinVersion: string;

procedure InitializeModule;  
function GetWinVersion: string;  

implementation

....

procedure InitializeModule;
begin  
 WinVersion := GetWinVersion;
end;

end;


DVM   (2008-08-23 11:17:00) [65]


> И еще, секция инициализации - это тоже не самая хорошая
> задумка борландов.

давайте не отвлекаться от сути, так в какие проблемы с повторным использованием кода [120]?


DVM   (2008-08-23 11:16:00) [66]


> А что ты собирался использовать?

А неужели не видно? Я собрался использовать во различных программах этот модуль, а точнее его глобальную переменную WinVersion для получения текущей версии Windows в текстовом представлении, например. На месте версии Windows могло быть что угодно, это не важно.


Loginov Dmitry   (2008-08-23 11:16:00) [67]

глобальные переменные - MD
DLL - лажа
секция инициализации - г..но

как нам вообще удается на дельфи что-то программировать?


Leonid Troyanovsky   (2008-08-23 11:09:00) [68]


> DVM ©   (23.08.08 11:00) [120]

> Как препятствует повторному использованию этого кода переменная
> WinVersion ?

А что ты собирался использовать?
И еще, секция инициализации - это тоже не самая хорошая
задумка борландов.

--
Regards, LVT.


Leonid Troyanovsky   (2008-08-23 11:03:00) [69]


> Loginov Dmitry ©   (23.08.08 10:57) [118]

> А поизвращеннее ничего нельзя было придумать? Нормально,
>  я тихо мирно хочу показать форму на экране и продолжить
> дальше свою обработку. Вызываю TMyForm.Create().Show. Так
> мало того что Show второй раз не сработает, так и дальнейная
> обработка не выполнится, и я даже не увижу причину. Ужас!

Все в твоих руках, и показ исключений в том числе.
А что ты собирался Show, если форма не создана?

--
Regards, LVT.


DVM   (2008-08-23 11:00:00) [70]


> А ты еще поразмышляй.


допустим, опять же, есть такой модуль:

unit WinVersion;

interface
var
 WinVersion: string;

function GetWinVersion: string;  

implementation

....

initialization

WinVersion := GetWinVersion;

end;


Как препятствует повторному использованию этого кода переменная WinVersion ?


Leonid Troyanovsky   (2008-08-23 10:59:00) [71]


> DVM ©   (23.08.08 10:56) [117]

> Иногда, но не всегда.

А ты еще поразмышляй.

--
Regards, LVT.


Loginov Dmitry   (2008-08-23 10:57:00) [72]

> constructor TFormX.Create(AOwner: TComponent); // override;
>
> var
> i: Longint;
> begin
> for i := 0 to Screen.FormCount - 1 do
>   if ClassType = Screen.Forms[i].ClassType then
>     Abort;
> inherited;
> end;


А поизвращеннее ничего нельзя было придумать? Нормально, я тихо мирно хочу показать форму на экране и продолжить дальше свою обработку. Вызываю TMyForm.Create().Show. Так мало того что Show второй раз не сработает, так и дальнейная обработка не выполнится, и я даже не увижу причину. Ужас!


DVM   (2008-08-23 10:56:00) [73]


> Глобальные переменные, кроме всего прочего, создают большие
> препятствия повторному использованию кода

Иногда, но не всегда.


Leonid Troyanovsky   (2008-08-23 10:51:00) [74]


> DVM ©   (23.08.08 10:02) [112]

>  Конечно это уже изврат - избавление от глобальных переменных
> ради избавления.

Смею заметить, что размышления на эту тему бывают весьма полезны.
Глобальные переменные, кроме всего прочего, создают большие
препятствия повторному использованию кода, это место где
между модульной и объектной моделью образуется разрыв.

--
Regards, LVT.


Leonid Troyanovsky   (2008-08-23 10:44:00) [75]


> Юрий Зотов ©   (22.08.08 14:54) [73]

> Пресловутые "советы" предназначены для совсем уж начинающих

Самое удивительное то, что далеко не начинающие с азартом
их атакуют, забывая и про место и про время.

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

--
Regards, LVT.


Leonid Troyanovsky   (2008-08-23 10:32:00) [76]


> Германн ©   (23.08.08 00:53) [108]

> Если нужно хранить список таких объектов, то - облом!

Сделай его полем того объекта, который заведомо
переживет списочные объекты, например, MainForm or Application.

--
Regards, LVT.


Leonid Troyanovsky   (2008-08-23 10:28:00) [77]


> Loginov Dmitry ©   (22.08.08 23:58) [106]

> Единственный правильный и надежный путь это Screen? А для
> поиска в Screen необходим перебор по Forms с постоянной
> проверкой типа if SameText(Screen.Forms[I].Name, 'ИмяФормы')
> then, и не дай бог я случайно изменю имя формы и забуду
> его указать в SameText().


constructor TFormX.Create(AOwner: TComponent); // override;
var
 i: Longint;
begin
 for i := 0 to Screen.FormCount - 1 do
   if ClassType = Screen.Forms[i].ClassType then
     Abort;
 inherited;
end;

--
Regards, LVT.


DVM   (2008-08-23 10:02:00) [78]


> Германн ©   (23.08.08 00:53) [108]


> Всё бы хорошо. Но!
> Если нужно хранить список таких объектов, то - облом! Приходится
> таки вводить совершенно ненужную переменную.

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


Германн   (2008-08-23 02:55:00) [79]


> сопровождаться


Германн   (2008-08-23 02:36:00) [80]


> Тын-Дын ©   (23.08.08 02:02) [109]
>
>
> > Palladin ©   (22.08.08 20:35) [105]
>
>
> Хорошо сказано.
>
> Добавлю, что нужно быть очень осторожным и не скатываться
> к догматизму во всём.
>

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


Страницы:   1 2 3 4 5 6 7 8 9 10

Наверх

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