Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.01 c
14-17323
Дмитрий К.К.
2003-02-17 09:04
2003.03.06
Глоссарий компьютерных терминов на английском языке


1-17009
iusup
2003-02-24 23:30
2003.03.06
Почему выдает ошибку...? Где не правильно...?


3-16980
VIB
2003-02-17 17:38
2003.03.06
Клавиши Left Right в DBGride


1-17004
mmmh
2003-02-24 20:21
2003.03.06
Сразу два вопроса 1 как отсортировать String grid чтод сначала шл


14-17263
Ketmar
2003-02-19 10:58
2003.03.06
где спереть то, о чем здесь нельзя писать к BlackBox-шаровара?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский