-
> Sha © (12.12.18 10:02) [51] > > > Германн © (12.12.18 02:21) [50] > > И GOTO, и FreeAndNil обычно не требуются программисту. > > Но в тех редких случаях, когда их применение действительно > имеет смысл, > они способны существенно упростить алгоритм или повысить > скорость.
Не в службу, а в дружбу. А не затруднит-ли вас, Александр написать простой рабочий пример, где применение FreeAndNil хоть чем-то оправдано?
-
> где применение FreeAndNil хоть чем-то оправдано? часто использую для редко используемых форм, т.е. вот есть форма в проге которая используется редко, и после использования надолго не нужна, логично ее создавать перед использованием, и уничтожать после. nil в ее переменной это как индикатор, что нужно ее создать перед показом, что не висит она в данный момент в "фоне". конечно можно было бы ввести какой другой индикатор, но это было бы как то нелогично.
-
+ я выше не про саму функцию FreeAndNil, а про принцип, "занилять" формы проще просто присваиванием в деструкторе.
-
> sniknik © (13.12.18 10:19) [61]
> что нужно ее создать перед показом, что не висит она в > данный момент в "фоне".
Валидность ссылки легко проверяется по Screen.Forms.
FAN - MD ;)
-- Regards, LVT.
-
> Германн © (13.12.18 02:12) [60]
Обычно это массивы, списки, пулы, очереди и т.п. объектов, из которых долго или неудобно исключать адреса по одному, а гораздо удобнее обнилить или каким-то образом пометить адрес данных. А впоследствии перепаковать или освободить целиком весь контейнер.
В качестве второго примера - многоэтажные этажерки из вложенных try.
-
> Валидность ссылки легко проверяется по Screen.Forms. перебором массива сравнивая с несуществующей переменной формы, или по отсутствию текста с именем формы в существующих? вместо простого сравнения if ххх <> nil ... не не думаю, что это легко. оно конечно все относительно, и для "бешеной собаки 10 верст не крюк", но вот не хочется менять 2 строки кода, на ... да хотя бы на 3, хотя их явно будет побольше.
-
-
> Sha © (13.12.18 10:50) [64] > > > Германн © (13.12.18 02:12) [60] > > Обычно это массивы, списки, пулы, очереди и т.п. объектов
Примерно так я и думал. Задач, в которых нужны "массивы, списки, пулы, очереди и т.п. объектов у меня лично не было.
> sniknik © (13.12.18 16:35) [65] > > > Валидность ссылки легко проверяется по Screen.Forms. > перебором массива сравнивая с несуществующей переменной > формы А почему бы и нет? Ну не миллионы же у вас в списке Forms!
-
> sniknik © (13.12.18 16:35) [65]
> не не думаю, что это легко.
Ну, считай, что оно уже есть.
function AssignedFormVar(fv: TForm): Boolean; var i: Longint; begin Result := Assigned(fv); if Result then with Screen do for i := 0 to Screen.FormCount-1 do begin Result := (fv = Forms[i]); if Result then Break; end; end;
-- Regards, LVT.
-
> А почему бы и нет? а смысл? менять простое сравнение целочисленной переменной на цикл? ... > Ну не миллионы же у вас в списке Forms! а вот это тут совсем не причем.
> Ну, считай, что оно уже есть. круто.. весь проникся мудростью... сарказм. но в общем то функция ниуть не лечит ту болезнь от которой спасает/ремендуют использовать FreeAndNil. в итоге тот же вопрос - а смысл?
procedure TForm1.Button2Click(Sender: TObject); var form: TForm;
function AssignedFormVar(fv: TForm): Boolean; var i: Longint; begin Result := Assigned(fv); if Result then with Screen do for i := 0 to Screen.FormCount-1 do begin Result := (fv = Forms[i]); if Result then Break; end; end;
begin form:= TForm.Create(self); try //test - error if AssignedFormVar(form) then Edit1.Text:= 'Assigned' else Edit1.Text:= 'not Assigned';
form.Free; //FreeAndNil(form); if AssignedFormVar(form) then Edit2.Text:= 'Assigned' else Edit2.Text:= 'not Assigned'; finally form.Free; end; end;
-
> sniknik © (14.12.18 10:14) [69]
> но в общем то функция ниуть не лечит ту болезнь от которой > спасает/ремендуют использовать FreeAndNil.
Не совсем понял пример, но, видимо, д.б.
finally if AssignedFormVar(form) then form.Free; end;
-- Regards, LVT.
-
> Не совсем понял пример одно из того почему рекомендуют FreeAndNil вместо Free, как раз такая ситуация, не нужно доп.проверок. а тут от чего уходим к тому и пришли, только из-за желания использовать "крутой" метод проверки.
-
>только из-за желания использовать "крутой" метод проверки Но ведь других средств нет. Только проверка на nil. После FreeInstance образуется адресное пространство, которое может быть в зоне AV. Неудобная недоработка.
-
> Но ведь других средств нет. Только проверка на nil. она есть во Free которым уже все надрессированы пользоваться, "на автомате". осталось "передрессироваться" на использование FreeAndNil, и проблема "уйдет". пример вон выше, скопируй получи ошибку, а после раскоментарь/замени Free на FreeAndNil.
> Неудобная недоработка. эта, даже не знаю что сказать... вот прямо перед вами доработанное средство... или как говорил классик "разруха она в головах".
-
> sniknik © (14.12.18 15:55) [71]
> одно из того почему рекомендуют FreeAndNil вместо Free
FAN - MD. Костыль при кривом проектировании.
Особенно для форм, кои есть компоненты и, в случае удержания ссылок на оные, должно пользовать механизм Notification. Ну, или, на худой конец, массивом Forms, для отыскания утерянной формы.
Бо, и глобальные переменные - MD.
-- Regards, LVT.
-
> FAN - MD. Костыль при кривом проектировании. и че ты не консультант борланда был когда он и функцию безопасного обниления делал да проверку на нил во фри сувал, чуть ли не изначально при появлении генофонда... уж объяснил бы им ужо.
> должно пользовать механизм Notification. ага, особенно когда из потока к форме обращаешься т.е. нотификейшн перед нотификейшном, первый проверка есть ли она (только куда что посылать) второе собственно рабочее событие... ну очень удобно.
> Бо, и глобальные переменные - MD. вообще чего мелочится? программирование - MD. (аппликатион если чё тоже глобальная переменная)
з.ы. весь пост - сарказм. уже почему то по другому не получается. ведь все просто - есть возможность у языка, пользуйся, если к месту, удобно, нет "скрытых багов". нет же куча народу с догмами, того нельзя сего нельзя, и хоть бы что аргументированно... но нет, за аргументы выдают что-то по заковыристые, скоро 2 + 2 будут советовать не просто операцию использовать а что-то через COM-обьекты, микросервисы и т.д. еже с ними.
-
Фри реально костыль. )
-
и давно ты кошерный деструктор использовал? который не костыль. а вот была бы ява там подобное синтаксическим сахаром называют, ... а баги фичами...
-
Ну нет, синтаксический сахар это другое. Например тернарная операция или типа того. Кстати, буквально вот http://pda.delphimaster.net/?id=1542948910&n=3, в делфи ввели возможность объявление переменной "по месту" + определение типа в компайл тайм, вот это тоже сахар. А фри это немного из другой оперы. И как на мой взгляд, особо ничего не давшая. АВ происходит ничуть не реже. )) А что касается механизм Notification для вашей формы, то я согласен с вами, оно тут никчему. Вместо класической глобальной переменной, сделал бы статичное свойство в классе самой формы, и все довольны.))
-
> ухты © (17.12.18 00:20) [78]
> АВ происходит ничуть не реже. ))
счастье, когда оно происходит, а не молча портит память.
|