Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.11.11;
Скачать: CL | DM;

Вниз

Как убить объект из его же метода?   Найти похожие ветки 

 
Leonid Troyanovsky ©   (2007-10-15 19:31) [80]


> Ins ©   (15.10.07 19:19) [76]

> Вот менее очевидный пример:

Эх, жаль, что он не более очевиден :)

Но, в любом случае, думаю, что все желающие сумели
сделать правильные выводы о надлежащем проектировании.

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2007-10-15 19:36) [81]


> oxffff ©   (15.10.07 19:28) [78]

> Тогда каждый объект убивает себя сам.
> Destroy, FreeInstance чьи методы? :)

Наши методы.

А речь-то была о не наших.
Т.е., о том, чтоб не рядили методы в белые одежды деструктора, f.e.
Тем более, что они могут сработать через раз.

--
Regards, LVT.


 
oxffff ©   (2007-10-15 19:39) [82]


> Leonid Troyanovsky ©   (15.10.07 19:36) [81]


Да я то понял, что вся наша дискуссия как всегда ни к чему не привела.
Точнее привела конечно же.
К тому, что в .NET таких вопросов в managed коде нет.


 
Leonid Troyanovsky ©   (2007-10-15 20:12) [83]


> oxffff ©   (15.10.07 19:29) [79]

lv.t[&]rambler.ru

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2007-10-15 20:14) [84]


> oxffff ©   (15.10.07 19:39) [82]

> Да я то понял, что вся наша дискуссия как всегда ни к чему
> не привела.

Меня привела ;)

--
Regards, LVT.


 
oxffff ©   (2007-10-15 20:37) [85]


> Leonid Troyanovsky ©   (15.10.07 20:12) [83]


Да я собственно хотел бы знать ваше мнение насчет Yield.
А пока дождался вашего ответа создал тему.
Был бы рад услышать аргументированное мнение мастеров.

Прошу вас сюда
http://delphimaster.net/view/15-1192464844/
Заранее благодарен


 
Leonid Troyanovsky ©   (2007-10-15 21:17) [86]


> oxffff ©   (15.10.07 20:37) [85]

> Прошу вас сюда
> http://delphimaster.net/view/15-1192464844/

Честно говоря, мне там нечего сказать, бо, непонятно.
Наверное, устарел :)

Хотя, конечно, я с детства не любил ассемблер,
я с детства уважал фортран.
Sorry.

--
Regards, LVT.


 
Ins ©   (2007-10-15 21:27) [87]


> Меня привела ;)

Так может поделитесь! :)


 
Leonid Troyanovsky ©   (2007-10-15 21:43) [88]


> Ins ©   (15.10.07 21:27) [87]

> Так может поделитесь! :)

Да я, вообще-то, не скрывал :)

К [61] я ж не сразу пришел, была и некая эволюция,
т.е., ступень за ступенью.

Если добавить, скажем, нулевую ступень
http://groups.google.com/group/fido7.ru.delphi/msg/68eb8ca030e0bdce?dmode=source&output=gplain
(KOI8-R) {блин, как неудобно стало, как и в msdn.microsoft.com}
то все встанет на свои места, т.е. надо делать не как "лучше",
а как положено, т.е., через возбуждение исключения.

Ну, а неспешность подобного вывода смело спишу на
не особую актуальность подобных задач :)

--
Regards, LVT.


 
Игорь Шевченко ©   (2007-10-16 09:49) [89]

Leonid Troyanovsky ©   (15.10.07 17:49) [71]


> Например, если после вызова Free произойдет _неявный_
> вызов еще чего-либо и в, конечном счете, к обращению
> к уже несуществующему объекту.
> Ну, не можем мы гарантировать, что вызов Free - последнее,
>
> что выполняется в методе. Например, Release & ProcessMessages.
>


Все равно не согласен с необходимостью огорода :) Вот честно, положа руку на сердце, скажу - пользуюсь Release в ряде случаев, но редко, не возникает у меня необходимости убивать самое себя. Раз что-то используется крайне редко, для меня очевидно, что решение не типовое, и лучше (и понятней) будет, если перепроектировав я найду подходящее типовое решение. В последние несколько лет я стал истинным адептом понятного кода :)


 
Суслик   (2007-10-16 10:47) [90]


>  В последние несколько лет я стал истинным адептом понятного
> кода :)

поделись понятным кодом, может он только тебе понятен.
чессо слово приведи пример. всем полезней будет.


 
homm ©   (2007-10-16 11:13) [91]

> [28] Ins ©   (12.10.07 14:40)
> Безопасно? Ну пошлите это сообщение (CM_RELEASE) через SendMessage
> или Perform где-то из глубины кода метода, который потом
> еще что-то делает с self-ом.

Я тебя не могу понять, что за ветряные мельницы? Как будто после вызова Free  не из метода можно обращатся к полям, или работать из другово потока? Если ты вызвал метод, который уничтожит объект, ты и не работай с ним больше, а если нужно работать, то и не вызывай.


 
homm ©   (2007-10-16 11:15) [92]

… или уж тогда  доказывай, что вызывать Free не безопасно нигде, и этого нельзя делать.


 
Ins ©   (2007-10-16 11:19) [93]


> Я тебя не могу понять, что за ветряные мельницы?

А это и не требуется, кому надо - тот смог. Даже Borland это поняли, вот и ввели метод Release, правда, как справедливо заметил г-н Leonid Troyanovsky ©, не обговорив всех НО его применения.

> Если ты вызвал метод, который уничтожит объект, ты и не
> работай с ним больше, а если нужно работать, то и не вызывай.

Есть очень коварное место (обработчик событий) в котором может понадобится уничтожить Sender, но так как класс может быть сторонний, ты не контролируешь то, что будет после этого уничтожения вызвано.


 
homm ©   (2007-10-16 11:23) [94]

> [93] Ins ©   (16.10.07 11:19)
> Есть очень коварное место (обработчик событий) в котором
> может понадобится уничтожить Sender, но так как класс может
> быть сторонний, ты не контролируешь то, что будет после
> этого уничтожения вызвано.

Ты имеешь ввиду ?
TForm1.Button1Click(Sender);
begin
 Sender.Free;
end


 
Ins ©   (2007-10-16 11:30) [95]

Я не имею в виду ничего конкретного. Я имею в виду целый класс задач, где это может быть востребовано.


 
Игорь Шевченко ©   (2007-10-16 11:44) [96]


> поделись понятным кодом


printf("Hello, world\n");


 
Сусл ©   (2007-10-16 12:09) [97]


>  [96] Игорь Шевченко ©   (16.10.07 11:44)
> > поделись понятным кодом
> printf("Hello, world\n");


а без сарказму? :) Действительно хочется поучится написанию понятного кода (к Макконелу не отсылай, ибо то книга, а тут жизнь).

или это намек, что код будет на си?


 
Leonid Troyanovsky ©   (2007-10-16 12:43) [98]


> Игорь Шевченко ©   (16.10.07 09:49) [89]

> очевидно, что решение не типовое, и лучше (и понятней) будет,
>  если перепроектировав я найду подходящее типовое решение

Надеюсь, что когда ты будешь нечто подобное перепроектировать,
то попробуешь и обсуждаемый подход instead Release :)

А вот, кста, у уважаемого Ega23 и форм никаких не было,
ему б в самый раз он пригодился.

--
Regards, LVT.


 
Игорь Шевченко ©   (2007-10-16 13:54) [99]

Leonid Troyanovsky ©   (16.10.07 12:43) [98]

Уважаемый Ega23 так и не озвучил, зачем ему сабж понадобился. Или я что-то пропустил ? :)


> Надеюсь, что когда ты будешь нечто подобное перепроектировать,
>
> то попробуешь и обсуждаемый подход instead Release :)


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


 
Игорь Шевченко ©   (2007-10-16 13:56) [100]

Сусл ©   (16.10.07 12:09) [97]

А какой тебе код привести ? Просто не понимаю. Выкладывать куски коммерческих проектов не хочется, старый мой код можно по тырнету найти, с тех пор форма написания слегка изменилась (надеюсь, в лучшую сторону).


 
Сусл ©   (2007-10-16 14:02) [101]


>  [100] Игорь Шевченко ©   (16.10.07 13:56)
> Сусл ©   (16.10.07 12:09) [97]
>
> А какой тебе код привести ? Просто не понимаю. Выкладывать
> куски коммерческих проектов не хочется, старый мой код можно
> по тырнету найти, с тех пор форма написания слегка изменилась
> (надеюсь, в лучшую сторону).

куски кода, которые бы демонстрирвоали, что такое понятный код. я нисколько не сомневаюсь в твоих способностях писать понятный код. но, согласись, что это толко слухи - вот ты говоришь, что пишешь понятный код, Юра говорит. а код то понятный где? может это самообман? так лучше разоблачить этот самообман как можно раньше. А? если не самообман и понятный код есть, то многие тебе спасибо скажут.


 
Игорь Шевченко ©   (2007-10-16 14:24) [102]


> вот ты говоришь, что пишешь понятный код, Юра говорит. а
> код то понятный где?


В проектах вестимо - где ж ему еще быть. Выкладывать сюда куски проектов ? Так места мало...Hello, world тебя не устраивает.

Давай такой кусок выложу:

unit MemberQBEResultView;

interface
uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, DataViewTemplate, ActnList, Menus, DB, Grids, DBGridEh, ExtCtrls,
 StdCtrls;

type
 TfMemberQBEResultView = class(TfDataViewTemplate)
   actDetailView: TAction;
   Detailview1: TMenuItem;
   N1: TMenuItem;
   procedure FormCreate(Sender: TObject);
   procedure FormDestroy(Sender: TObject);
   procedure actDetailViewExecute(Sender: TObject);
   procedure GridDblClick(Sender: TObject);
   function  GetRecordCount: Integer;
 private
   SRecordCountCaption: string;
 protected
   procedure LocalizeInterface; override;
   property RecordCount: Integer read GetRecordCount;
 public
   procedure UpdateRecordCount;
 end;

var
 fMemberQBEResultView: TfMemberQBEResultView;

implementation
uses
 ArgoConsts, Language, ResourceManager,
 MemberData, MemberModel, MemberDetailView, Main;

{$R *.dfm}

procedure TfMemberQBEResultView.actDetailViewExecute(Sender: TObject);
var
 Member: TMemberModel;
 Mapper: IMemberModelMapper;
begin
 Mapper := dmMember.GetMapper;
 Member := TMemberModel.Create;
 Mapper.LoadObject(DataSet["MEMBER_ID"], Member);
 if not Assigned(fMemberDetailView) then
   fMemberDetailView := TfMemberDetailView.Create(Application, fMain.pnlClient);
 fMemberDetailView.SetData(Member, false);
 fMemberDetailView.Show;
 GCurrentView := fMemberDetailView;
end;

procedure TfMemberQBEResultView.FormCreate(Sender: TObject);
begin
 DataSet := dmMember.qQBE;
 inherited;
end;

procedure TfMemberQBEResultView.FormDestroy(Sender: TObject);
begin
 fMemberQBEResultView := nil;
 inherited;
end;

function TfMemberQBEResultView.GetRecordCount: Integer;
var
 BM: TBookmark;
begin
 with DataSet do
 begin
   DisableControls;
   BM := GetBookmark;
   try
     Last;
     Result := DataSet.RecordCount;
     GotoBookmark(BM);
   finally
     FreeBookmark(BM);
     EnableControls;
   end;
 end;
end;

procedure TfMemberQBEResultView.GridDblClick(Sender: TObject);
begin
 actDetailView.Execute;
end;

procedure TfMemberQBEResultView.LocalizeInterface;
begin
 inherited;
 CustomCaption.Caption := GetResourceString (SViewQBEResults,
   "Query by example results");
 SRecordCountCaption := GetResourceString(SQBEResultCaption,
   "%d member(s) match specified criteria");
end;

procedure TfMemberQBEResultView.UpdateRecordCount;
begin
 BriefDescription.Caption := Format(SRecordCountCaption, [RecordCount]);
end;

end.


 
Leonid Troyanovsky ©   (2007-10-16 14:28) [103]


> Игорь Шевченко ©   (16.10.07 13:54) [99]

> Уважаемый Ega23 так и не озвучил, зачем ему сабж понадобился.

Ему, видимо, поручили сопровождать группу трудящихся
освобожденного Востока :)

> в трех местах из проекта на миллион

Ладно уж, считай, что свои три строки ты отстоял :)

--
Regards, LVT.


 
Dmitry S ©   (2007-10-16 14:37) [104]

Чтото я не пойму вопроса. В методе Free выполняется как раз самостоятельное убийство объекта, т.к. Free вызывает деструктор, являясь методом. Значит аналогичным образом и можно убить объект.

Вот пример где это может понадобится:
Пусть есть какойто класс TItem, и класс TList, где организуется список этих самых TItem. Добавим к условию, что, по какимто причинам, удобнее делать так: List[n].delete, чем List.delete(n).
Тогда потребуется описать метод TItem.delete, который должен "вычеркнуть себя из списка" и убить сам себя.

Оффтоп:
> Leonid Troyanovsky ©   (15.10.07 20:12) [83]
> lv.t[&]rambler.ru

Чуть выше ваше мыло оформленно по форме, даже с "mailto:". Смысл скрывать?:)



Страницы: 1 2 3 вся ветка

Текущий архив: 2007.11.11;
Скачать: CL | DM;

Наверх




Память: 0.67 MB
Время: 0.024 c
11-1176036483
Bmouradov
2007-04-08 16:48
2007.11.11
FontOrientation или текст под углом


2-1192895025
StanislavLZ
2007-10-20 19:43
2007.11.11
Два вопроса по TMemo


15-1192012733
Tifon
2007-10-10 14:38
2007.11.11
Подскажите литературу


10-1139905588
nastya
2006-02-14 11:26
2007.11.11
EIntfCastError


2-1191676736
Jiku
2007-10-06 17:18
2007.11.11
Как определить адрес в строке активного окна проводника