Форум: "Начинающим";
Текущий архив: 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