![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
заNILить форму после Close;
ничтожная козявка © (2008-08-21 12:37:00)
Страницы: < 1 2 3 4 5 6 7 8 9 10 >
В некой 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.