Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.11.11;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.65 MB
Время: 0.045 c
8-1168924619
Kuzma
2007-01-16 08:16
2007.11.11
VST плагины и Delphi ...


2-1192937610
San1712
2007-10-21 07:33
2007.11.11
Как воспользоваться алгоритмом MD5 в Delphi7 ?


15-1192060844
ЮЮ
2007-10-11 04:00
2007.11.11
Запись в реестр из reg-файла


11-1176983639
restar82
2007-04-19 15:53
2007.11.11
ошибка при компиляции


15-1191838328
Ega23
2007-10-08 14:12
2007.11.11
Кто тут про рабочее время и личную почту говорил?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский