Форум: "Основная";
Текущий архив: 2003.03.06;
Скачать: [xml.tar.bz2];
Вниз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 viduprocedure 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 ofprocedure 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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.01 c