Конференция "Прочее" » 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.
 
Конференция "Прочее" » FreeAndNil
Есть новые Нет новых   [118667   +39][b:0][p:0.001]