-
> сделал бы статичное свойство в классе самой формы, кто то умный давно сказал - "не плодите сущности"
> и все довольны.)) у меня нет цели сделать всех довольными... работа другая.
-
Где вы тут сущность увидели? тут как бы наоборот, инкапсуляция - привет ооп, нет гл. переменных - привет LVT и нет доп. нотификашн и т.п. - вам привет, итого все довольны.
> счастье, когда оно происходит, а не молча портит память. так а отчего тогда спасали отцы? )) в том то и дело имеем тоже и костыль
-
> Где вы тут сущность увидели? переменная в переменной это не сущность? лишняя.
она сама по себе показатель, нет смысла относится к переменной по другому только из-за того что там форма... а если нет? если указатель, простой объект, интерфейс... и что каждый по своему, как то по особому проверять? (согласен если есть объективные причины, но их нет!)
xml разбирал? мелкософтским iдомдокументом. там на отсутствующие ноды nil возвращает вместо обьекта... и никого не парит, что единственный способ проверить что вернулось, это сравнить с nil. почему с формами должно быть по другому? с чего им такая честь? и тут кстати мысль образовалась... у вас извиняюсь за личностные вопросы сколько типов ложек для супа? ну в смысле одна для борща, другая для рассольника третья для ухи и тд...? ;) т.к. если вы их не градуируете по содержимому, то советовать раздельное для каждого типа объектов сравнение попросту не имеете морального права... это батюшка называется лицемерием.
-
Вы мкня пугаете, в какой переменной? ))
-
Удалено модератором
-
> в какой переменной? )) из примера выше, например во в этой > procedure TForm1.Button2Click(Sender: TObject); > var > form: TForm; form - переменная, ты предлагаешь статику в описании типа, т.е. TForm - в итоге получается переменная в переменной, или если буквально с доступом "через переменную-тип". в общем излишние сложности, т.к. она сама показатель, ничего более не нужно.
-
> Eraser © (17.12.18 03:50) [79] > > > > ухты © (17.12.18 00:20) [78] > > > > АВ происходит ничуть не реже. )) > > счастье, когда оно происходит, а не молча портит память. >
Вот истинно 100500 да ещё и плюс. И вот очень многие "нетроешники" почему-то до сих пор этой простой истины не понимают!
-
> sniknik © (17.12.18 14:41) [85]
> > в какой переменной? )) > из примера выше, например во в этой
Поле, дельфийское поле. Вот, кстати, простой пример для формы должной жить в одном экз. http://delphimaster.net/view/2-1177420765/57Громоздко, да. Но такой уж он феньшуй. -- Regards, LVT.
-
> Но такой уж он феньшуй. https://ru.wikipedia.org/wiki/ФэншуйНет каких-либо научных доказательств того, что мистические требования фэншуй реальны; научное сообщество относит фэншуй к лженауке.что в общем то подтверждается по ссылке. http://delphimaster.net/view/2-1177420765/57procedure TForm1.Notification; begin inherited; if AComponent = FForm2 then if Operation = opRemove then FForm2 := nil; end;оппа... а с чем же это ты тогда "борешься"? под "капотом" то то же самое... все так же опираешься на обниление переменной формы. просто принцип в действии - "никогда не делать банальным и простым то, что можно сделать сложным и прекрасным..." все ясно.
-
> 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]
> навязывание своего мнения оппоненту. о чем вас кстати никто > не просил.
Ну, извини меня, Коля.
-- Regards, LVT.
-
> 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: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.
|