Мастера DELPHI, Delphi programming community Рейтинг@Mail.ru Титульная страница Поиск, карта сайта Написать письмо 
| Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|
| Форумы
Здесь вы можете задать свой вопрос и наверняка получите ответ
| ЧАТ |
Место для общения :)
Орешник |
Коллекция курьезных вопросов из форумов
KOL и MCK |
KOL и MCK - Компактные программы на Delphi
Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / rsdn.org

 
Чтобы не потерять эту дискуссию, сделайте закладку « предыдущая ветвь | форум | следующая ветвь »
Страницы: 1 2 3 4 5

FreeAndNil


sniknik ©   (17.12.18 10:26[80]

> сделал бы статичное свойство в классе самой формы,
кто то умный давно сказал - "не плодите сущности"

> и все довольны.))
у меня нет цели сделать всех довольными... работа другая.


ухты ©   (17.12.18 10:41[81]

Где вы тут сущность увидели? тут как бы наоборот, инкапсуляция - привет ооп, нет гл. переменных - привет LVT и нет доп. нотификашн и т.п. - вам привет, итого все довольны.

> счастье, когда оно происходит, а не молча портит память.
так а отчего тогда спасали отцы? )) в том то и дело имеем тоже и костыль


sniknik ©   (17.12.18 12:09[82]

> Где вы тут сущность увидели?
переменная в переменной это не сущность? лишняя.

она сама по себе показатель, нет смысла относится к переменной по другому только из-за того что там форма... а если нет? если указатель, простой объект, интерфейс... и что каждый по своему, как то по особому проверять? (согласен если есть объективные причины, но их нет!)

xml разбирал? мелкософтским iдомдокументом. там на отсутствующие ноды nil возвращает вместо обьекта... и никого не парит, что единственный способ проверить что вернулось, это сравнить с nil. почему с формами должно быть по другому? с чего им такая честь?
и тут кстати мысль образовалась... у вас извиняюсь за личностные вопросы сколько типов ложек для супа? ну в смысле одна для борща, другая для рассольника третья для ухи и тд...? ;) т.к. если вы их не градуируете по содержимому, то советовать раздельное для каждого типа объектов сравнение попросту не имеете морального права...  это батюшка называется лицемерием.


ухты ©   (17.12.18 12:30[83]

Вы мкня пугаете, в какой переменной? ))


имя   (17.12.18 12:43[84]

Удалено модератором


sniknik ©   (17.12.18 14:41[85]

> в какой переменной? ))
из примера выше, например во в этой
> procedure TForm1.Button2Click(Sender: TObject);
> var
>   form: TForm;
form - переменная, ты предлагаешь статику в описании типа, т.е. TForm - в итоге получается переменная в переменной, или если буквально с доступом "через переменную-тип".  в общем излишние сложности, т.к. она сама показатель, ничего более не нужно.


Германн ©   (18.12.18 02:10[86]


> Eraser ©   (17.12.18 03:50) [79]
>
>
> > ухты ©   (17.12.18 00:20) [78]
>
>
> > АВ происходит ничуть не реже. ))
>
> счастье, когда оно происходит, а не молча портит память.
>

Вот истинно 100500 да ещё и плюс. И вот очень многие "нетроешники" почему-то до сих пор этой простой истины не понимают!


Leonid Troyanovsky ©   (18.12.18 10:50[87]


> sniknik ©   (17.12.18 14:41) [85]

> > в какой переменной? ))
> из примера выше, например во в этой

Поле, дельфийское поле.

Вот, кстати, простой пример для формы должной жить в одном экз.
http://delphimaster.net/view/2-1177420765/57

Громоздко, да. Но такой уж он феньшуй.

--
Regards, LVT.


sniknik ©   (18.12.18 11:59[88]

> Но такой уж он феньшуй.
https://ru.wikipedia.org/wiki/Фэншуй
Нет каких-либо научных доказательств того, что мистические требования фэншуй реальны; научное сообщество относит фэншуй к лженауке.

что в общем то подтверждается по ссылке.
http://delphimaster.net/view/2-1177420765/57
procedure TForm1.Notification;
begin
inherited;
if AComponent = FForm2 then
  if Operation = opRemove then
    FForm2 := nil;
end;

оппа... а с чем же это ты тогда "борешься"? под "капотом" то то же самое... все так же опираешься на обниление переменной формы.

просто принцип в действии - "никогда не делать банальным и простым то, что можно сделать сложным и прекрасным..."
все ясно.


Leonid Troyanovsky ©   (18.12.18 12:07[89]


> sniknik ©   (18.12.18 11:59) [88]

> procedure TForm1.Notification;
> begin
> inherited;
> if AComponent = FForm2 then
>   if Operation = opRemove then
>     FForm2 := nil;
> end;
> оппа... а с чем же это ты тогда "борешься"? под "капотом"
> то то же самое... все так же опираешься на обниление переменной
> формы.

Поле. Его зовут полем.
А опираемся на Notification.

Жаль, что ты не захотел понять.

--
Regards, LVT.


sniknik ©   (18.12.18 14:10[90]

> Поле. Его зовут полем.
это переменная, что определенная в форме, что локально в процедуре (как у меня в примере выше) что глобально. плевать. поле чисто формальное название для переменных в форме. использовать только "поля" - ограничивать себя же. что делать в моем, что выше примере? или когда нет главной формы в которой делать  "поле" (или их описано несколько, в зависимости от каких то критериев выбирается на старте одно)? сложность "нотификации" возрастет многократно.

или для разных случаев у вас тоже разные варианты сравнений? ... а у вас сколько типов ложек для супов?

> Жаль, что ты не захотел понять.
понимание это обоюдный процесс, когда "в одну сторону" это навязывание своего мнения оппоненту. о чем вас кстати никто не просил.


ухты ©   (18.12.18 17:00[91]

ооп зло


Leonid Troyanovsky ©   (19.12.18 10:20[92]


> sniknik ©   (18.12.18 14:10) [90]

> навязывание своего мнения оппоненту. о чем вас кстати никто
> не просил.

Ну, извини меня, Коля.

--
Regards, LVT.


Leonid Troyanovsky ©   (07.01.19 15:18[93]


> Leonid Troyanovsky ©   (18.12.18 10:50) [87]

> Громоздко, да. Но такой уж он феньшуй.

Вот юнит, призванный упростить дело:

unit AutoNil;

interface

uses
 classes, Forms;

type
 PComponent = ^TComponent;

 TMApplication = class(TApplication)
 private
   FCompVars: TList;
 protected
   procedure Notification(AComponent: TComponent; Operation: TOperation); override;
   procedure AutoNilVarRegister(anv: PComponent); virtual;
 end;

procedure NilAfterDestroy (pc: PComponent);

implementation

procedure NilAfterDestroy;
begin
 TMApplication(Application).AutoNilVarRegister(pc);
end;

procedure TMApplication.Notification;
var
 i: Longint;
begin
 inherited;
 if (Operation = opRemove) then
   for i := FCompVars.Count-1 downto 0  do
     if (PComponent(FCompVars[i])^ = AComponent) then
       begin
         PComponent(FCompVars[i])^ := nil;
         RemoveFreeNotification(AComponent);
         FCompVars.Delete(i);
       end;
end;

procedure TMApplication.AutoNilVarRegister;
begin
 if not Assigned(FCompVars) then
   FCompVars := TList.Create;
 FreeNotification(anv^);
 FCompVars.Add(anv);
end;

initialization
 Application.Free;
 Application := TMApplication.Create(nil);

end.

А вот пример использования:

type
 TForm1 = class(TForm)
   Button1: TButton;
   Button2: TButton;
   procedure Button1Click(Sender: TObject);
   procedure Button2Click(Sender: TObject);
 private
   { Private declarations }
   f2, f3: TForm;
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

uses
 AutoNil;

type
 TForm2 = class(TForm)
   procedure DoClose(var Action: TCloseAction); override;
 end;

procedure TForm2.DoClose;
begin
 inherited;
 Action := caFree;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 if not Assigned(f2) then
   begin
     f2 := TForm2.CreateNew(nil);
     f3 := f2;
     NilAfterDestroy(@f2); // теперь после разрушения формы ссылка обнилится
     NilAfterDestroy(@f3);
   end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 if Assigned(f2) then
   f2.Show;
end;

--
Regards, LVT.


Leonid Troyanovsky ©   (07.01.19 15:30[94]


> Leonid Troyanovsky ©   (07.01.19 15:18) [93]

Решил сэкономить на конструкторе и попал на грабли.
Создавать список  нужно в initialization (ну, или, дейс-но, в конструкторе).
Т.е.

procedure TMApplication.AutoNilVarRegister;
begin
 FreeNotification(anv^);
 FCompVars.Add(anv);
end;

initialization
 Application.Free;
 Application := TMApplication.Create(nil);
 TMApplication(Application).FCompVars := TList.Create;

end.

--
Regards, LVT.


Страницы: 1 2 3 4 5 версия для печати

Написать ответ

Ваше имя (регистрация  E-mail 







Разрешается использование тегов форматирования текста:
<b>жирный</b> <i>наклонный</i> <u>подчеркнутый</u>,
а для выделения текста программ, используйте <code> ... </code>
и не забывайте закрывать теги! </b></i></u></code> :)


Наверх

  Рейтинг@Mail.ru     Титульная страница Поиск, карта сайта Написать письмо