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

Вниз

Syntaxis Delphi   Найти похожие ветки 

 
Alex44   (2003-02-21 20:03) [0]

Zaranee izvinyayus", esli eto napisano v pervoj stranitse help"a. Beglyj prosmotr nichego ne dal...
Vnimanie, vopros: mozhno li peredat" kak parameter/hranit" v peremennoj virtual"nyj method? Ya NE imeyu v vidu procedure of object; ya hochu TOL"KO smeshenie v VMT! Naprimer, takoj code:

type TMyClass = class
public
procedure DoTheJob; virtual;
end;

type TDoTheJob = procedure; virtual; // Zdes" kak-raz i problema!

procedure Go(Proc: TDoTheJob; Obj: TMyClass);
begin
Obj.Proc;
end;


Kazalos" by, constructiya imeet smysl i mozhet byt" poleznoj. A tak prihoditsya dlya KAZHDOGO takogo method"a sozdavat" obolochku typa


procedure ObjDoTheJob(Obj: TMyClass);
begin
Obj.DoTheJob;
end;


i peredavat" ee vmesto TDoTheJob ...


 
Романов Р.В. ©   (2003-02-21 21:47) [1]

Сделай базовйе класс с абстрактным методом DoTheJob и создавай от потомков от него. Вызов метода сделай так

procedure Go(Obj: TMyBaseClass);
begin
Obj.DoTheJob;
end;


 
Alex44   (2003-02-21 22:35) [2]

Nu, eto---prosto virtual"nyj method! Ya hochu PARAMETER!

type TMyClass = class
procedure DoJob1; virtual;
procedure DoJob2; virtual;
end;

class TMyAdvancedClass = class(TMyClass)
procedure DoJob2; override;
end;

MyObject := TMyClass.Create;
MyAdvancedObject := TMyAdvancedClass.Create;

Go(MyObject, DoJob1);
Go(MyAdvancedObject, DoJob2);


Eto vse abstractnye primery, ya pytayus" ob"yasnit" ideyu: v otlichie of procedure of object, ya hochu hranit" OTDEL"NO object i smeshenie methoda. Naprimer,


procedure GoList(Proc: ???; ObjList: TList);
var I: Integer;
begin
with ObjList do
for I := 0 to Count - 1 do
TMyObject(List^[I]).Proc;
end;


T.e., zaranee ne izvesten ni exemplare, ni method; tol"ko soglashenie o vyzove i smeshenie v VMT. V nastoyashee vremya ya vynuzhden ispol"zovat" obolochku


procedure ObjDoJob1(Obj: TMyClass);
begin
Obj.DoJob1
end;


i t.d., no eto kak-to glupovato, t.k. DoJob1 ved" kak raz i prinimaet svoy Object v cachestve parametera! T.e., lishnij code, lishnij stack, lishnee vremya...


 
Романов Р.В. ©   (2003-02-21 23:08) [3]

А чем такой вариант не устраивает
type TDoTheJob = procedure of object;

procedure Go(Proc: TDoTheJob);
begin
Proc;
end;

MyObject := TMyClass.Create;
MyAdvancedObject := TMyAdvancedClass.Create;
Go(MyObject.DoJob1);
Go(MyAdvancedObject.DoJob2);


 
Alex44   (2003-02-21 23:35) [4]

Eshe raz: procedure of object = procedure + object.
A ya hochu procedure BEZ object. Eshe raz primer:


procedure ApplyToList(List: TList; Proc: ???);
var I: Integer;
begin
for I := 0 to List.Count-1 do
TMyObject(List[I]).Proc;
end;


Kak ETO realizovat"?


 
Владислав ©   (2003-02-22 10:44) [5]

Привет!
Подумай еще раз. Такое ощущение, что твоя задача реализуется простым способом. Это - тому подтверждение:
...
TMyObject(List[I]).Proc;
...


 
euru ©   (2003-02-22 11:22) [6]

Может такой вариант подойдет:

unit Unit1;

interface

type
TMyClass = class
published // <--- обязательно published
procedure DoJob1(); virtual;
procedure DoJob2(); virtual;
end;

TMyAdvancedClass = class(TMyClass)
published
procedure DoJob2(); override;
end;

procedure Go(aObj: TObject; const aMethod: String);

implementation

uses
SysUtils, Dialogs;

procedure TMyClass.DoJob1();
begin
ShowMessage(ClassName() + ".DoJob1");
end;

procedure TMyClass.DoJob2();
begin
ShowMessage(ClassName() + ".DoJob2");
end;

procedure TMyAdvancedClass.DoJob2();
begin
ShowMessage(ClassName() + ".DoJob2; ooverride;");
end;

procedure Go(aObj: TObject; const aMethod: String);
type TProc = procedure(aObj: TObject);
var p: Pointer;
begin
p := aObj.MethodAddress(aMethod);
if p <> nil then TProc(p)(aObj);
end;

end.

unit Unit2;

...

implementation

procedure TForm2.Button2Click(Sender: TObject);
begin
Go(FMyClass, "DoJob1");
Go(FMyClass, "DoJob2");
Go(FMyAdvClass, "DoJob1");
Go(FMyAdvClass, "DoJob2");
end;



 
Alex44   (2003-02-22 20:42) [7]

Nu, muzhiki... Spasibo, conechno, no eto uzhe perebor. Moj vopros byl skoree philosophskij (sm. sunj): realizovana li takaya option v syntaxise Delphi. Tak to, v principe, mozhno i wrapper napisat". Glupo, conechno, no vse zh bystree, chem iskat" address po imeni...


> Владислав


Hmm... Poprobujte. Glavnoe, chto Vy postavite vmesto ??? v declaration?



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

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

Наверх




Память: 0.48 MB
Время: 0.013 c
14-17275
Ketmar
2003-02-19 11:59
2003.03.06
что делать с головой?


3-16905
Rom@n
2003-02-15 07:30
2003.03.06
переносимая база данных


3-16920
roadrunner
2003-02-15 10:11
2003.03.06
Access и несколько пользователей..


14-17324
jen_bond
2003-02-17 08:07
2003.03.06
Автозапуск при вставлении cd-диска


1-17197
Андрусь
2003-02-24 14:59
2003.03.06
разделение модуля