![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как убить объект из его же метода? [D7]
Ega23 © (2007-10-12 13:17:00)Собственно, сабж.
Есть идея с PostMesage WM_DESTROY, но возникает вопрос - а если это не "оеонный" класс?
Dmitry S (2007-10-16 14:37:00) [1]Чтото я не пойму вопроса. В методе 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:". Смысл скрывать?:)
Leonid Troyanovsky (2007-10-16 14:28:00) [2]
> Игорь Шевченко © (16.10.07 13:54) [99]
> Уважаемый Ega23 так и не озвучил, зачем ему сабж понадобился.
Ему, видимо, поручили сопровождать группу трудящихся
освобожденного Востока :)
> в трех местах из проекта на миллион
Ладно уж, считай, что свои три строки ты отстоял :)
--
Regards, LVT.
Игорь Шевченко (2007-10-16 14:24:00) [3]
> вот ты говоришь, что пишешь понятный код, Юра говорит. а
> код то понятный где?
В проектах вестимо - где ж ему еще быть. Выкладывать сюда куски проектов ? Так места мало...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.
Сусл (2007-10-16 14:02:00) [4]
> [100] Игорь Шевченко © (16.10.07 13:56)
> Сусл © (16.10.07 12:09) [97]
>
> А какой тебе код привести ? Просто не понимаю. Выкладывать
> куски коммерческих проектов не хочется, старый мой код можно
> по тырнету найти, с тех пор форма написания слегка изменилась
> (надеюсь, в лучшую сторону).
куски кода, которые бы демонстрирвоали, что такое понятный код. я нисколько не сомневаюсь в твоих способностях писать понятный код. но, согласись, что это толко слухи - вот ты говоришь, что пишешь понятный код, Юра говорит. а код то понятный где? может это самообман? так лучше разоблачить этот самообман как можно раньше. А? если не самообман и понятный код есть, то многие тебе спасибо скажут.
Игорь Шевченко (2007-10-16 13:56:00) [5]Сусл © (16.10.07 12:09) [97]
А какой тебе код привести ? Просто не понимаю. Выкладывать куски коммерческих проектов не хочется, старый мой код можно по тырнету найти, с тех пор форма написания слегка изменилась (надеюсь, в лучшую сторону).
Игорь Шевченко (2007-10-16 13:54:00) [6]Leonid Troyanovsky © (16.10.07 12:43) [98]
Уважаемый Ega23 так и не озвучил, зачем ему сабж понадобился. Или я что-то пропустил ? :)
> Надеюсь, что когда ты будешь нечто подобное перепроектировать,
>
> то попробуешь и обсуждаемый подход instead Release :)
Я органически не могу писать лишний код :) До сих пор обходился Release для форм (в трех местах из проекта на миллион строк - специально только что поискал), а объекты не уничтожал внутри их методов.
Leonid Troyanovsky (2007-10-16 12:43:00) [7]
> Игорь Шевченко © (16.10.07 09:49) [89]
> очевидно, что решение не типовое, и лучше (и понятней) будет,
> если перепроектировав я найду подходящее типовое решение
Надеюсь, что когда ты будешь нечто подобное перепроектировать,
то попробуешь и обсуждаемый подход instead Release :)
А вот, кста, у уважаемого Ega23 и форм никаких не было,
ему б в самый раз он пригодился.
--
Regards, LVT.
Сусл (2007-10-16 12:09:00) [8]
> [96] Игорь Шевченко © (16.10.07 11:44)
> > поделись понятным кодом
> printf("Hello, world\n");
а без сарказму? :) Действительно хочется поучится написанию понятного кода (к Макконелу не отсылай, ибо то книга, а тут жизнь).
или это намек, что код будет на си?
Игорь Шевченко (2007-10-16 11:44:00) [9]
> поделись понятным кодом
printf("Hello, world\n");
Ins (2007-10-16 11:30:00) [10]Я не имею в виду ничего конкретного. Я имею в виду целый класс задач, где это может быть востребовано.
homm (2007-10-16 11:23:00) [11]> [93] Ins © (16.10.07 11:19)
> Есть очень коварное место (обработчик событий) в котором
> может понадобится уничтожить Sender, но так как класс может
> быть сторонний, ты не контролируешь то, что будет после
> этого уничтожения вызвано.
Ты имеешь ввиду ?
TForm1.Button1Click(Sender);
begin
Sender.Free;
end
Ins (2007-10-16 11:19:00) [12]
> Я тебя не могу понять, что за ветряные мельницы?
А это и не требуется, кому надо - тот смог. Даже Borland это поняли, вот и ввели метод Release, правда, как справедливо заметил г-н Leonid Troyanovsky ©, не обговорив всех НО его применения.
> Если ты вызвал метод, который уничтожит объект, ты и не
> работай с ним больше, а если нужно работать, то и не вызывай.
Есть очень коварное место (обработчик событий) в котором может понадобится уничтожить Sender, но так как класс может быть сторонний, ты не контролируешь то, что будет после этого уничтожения вызвано.
homm (2007-10-16 11:15:00) [13]… или уж тогда доказывай, что вызывать Free не безопасно нигде, и этого нельзя делать.
homm (2007-10-16 11:13:00) [14]> [28] Ins © (12.10.07 14:40)
> Безопасно? Ну пошлите это сообщение (CM_RELEASE) через SendMessage
> или Perform где-то из глубины кода метода, который потом
> еще что-то делает с self-ом.
Я тебя не могу понять, что за ветряные мельницы? Как будто после вызова Free не из метода можно обращатся к полям, или работать из другово потока? Если ты вызвал метод, который уничтожит объект, ты и не работай с ним больше, а если нужно работать, то и не вызывай.
Суслик (2007-10-16 10:47:00) [15]
> В последние несколько лет я стал истинным адептом понятного
> кода :)
поделись понятным кодом, может он только тебе понятен.
чессо слово приведи пример. всем полезней будет.
Игорь Шевченко (2007-10-16 09:49:00) [16]Leonid Troyanovsky © (15.10.07 17:49) [71]
> Например, если после вызова Free произойдет _неявный_
> вызов еще чего-либо и в, конечном счете, к обращению
> к уже несуществующему объекту.
> Ну, не можем мы гарантировать, что вызов Free - последнее,
>
> что выполняется в методе. Например, Release & ProcessMessages.
>
Все равно не согласен с необходимостью огорода :) Вот честно, положа руку на сердце, скажу - пользуюсь Release в ряде случаев, но редко, не возникает у меня необходимости убивать самое себя. Раз что-то используется крайне редко, для меня очевидно, что решение не типовое, и лучше (и понятней) будет, если перепроектировав я найду подходящее типовое решение. В последние несколько лет я стал истинным адептом понятного кода :)
Leonid Troyanovsky (2007-10-15 21:43:00) [17]
> 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.
Ins (2007-10-15 21:27:00) [18]
> Меня привела ;)
Так может поделитесь! :)
Leonid Troyanovsky (2007-10-15 21:17:00) [19]
> oxffff © (15.10.07 20:37) [85]
> Прошу вас сюда
> http://www.delphimaster.ru/cgi-bin/forum.pl?id=1192464844&n=3
Честно говоря, мне там нечего сказать, бо, непонятно.
Наверное, устарел :)
Хотя, конечно, я с детства не любил ассемблер,
я с детства уважал фортран.
Sorry.
--
Regards, LVT.
oxffff (2007-10-15 20:37:00) [20]
> Leonid Troyanovsky © (15.10.07 20:12) [83]
Да я собственно хотел бы знать ваше мнение насчет Yield.
А пока дождался вашего ответа создал тему.
Был бы рад услышать аргументированное мнение мастеров.
Прошу вас сюда
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1192464844&n=3
Заранее благодарен