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

Вниз

Господа мастера! Помогите с указателями на процедуры!   Найти похожие ветки 

 
ламер   (2004-01-30 16:11) [0]

Вот никак не могу понять, почему не работает такой код.
Подскажите, пожалуйста!

unit main;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Config, StdCtrls, Spin;

type
proc = procedure(s :string);
TMainForm = class(TForm)
Button1: TButton;
procedure fuck(s:string);
procedure fuck1(a:proc);
procedure Button1Click(Sender: TObject);
private
public
end;

var
MainForm: TMainForm;

implementation
{$R *.dfm}

procedure TMainForm.fuck(s:string);
begin
ShowMessage(s);
end;

procedure TMainForm.fuck1(a:proc);
begin
a("fuck");
end;

procedure TMainForm.Button1Click(Sender: TObject);
begin
fuck1(@fuck);
end;

end.


 
Reindeer Moss Eater ©   (2004-01-30 16:14) [1]

Потому что fuck - procedure(s:string) of object
А не обычный процедурный тип


 
Тимохов ©   (2004-01-30 16:16) [2]

Не работает это как?
Слово "б..." пишет?
Или что еще?
Нельзя ли конкретизировать термин "не работает"?


 
alex_*** ©   (2004-01-30 16:19) [3]

компилятор делфи не дает выполняться процедурам, в названии которых есть нецензурные выражения.


 
ламер   (2004-01-30 16:25) [4]

Чего издеваетесь, я для тестов привык так писать, а это для тестов было, чтоб проверить возможность создания такой штуки.

Ругается на строчку
fuck1(@fuck);
говорит - Variable required


 
dmtr ©   (2004-01-30 16:27) [5]

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TMyProc = procedure (s: string);
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
procedure Proc2(a: TMyProc);
end;

procedure Proc1(s: string);

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
p: TMyProc;
begin
p := Proc1;
Proc2(Proc1);
end;

procedure Proc1(s: string);
begin
ShowMessage(s);
end;

procedure TForm1.Proc2(a: TMyProc);
begin
a("dsdsd");
end;

end.


 
alex_*** ©   (2004-01-30 16:28) [6]

разных типов.
Сделай сначала proc = procedure(s :string) of object;


 
Тимохов ©   (2004-01-30 16:29) [7]

См либо 1 либо 5
Все верно, только по-разному сделано.


 
Reindeer Moss Eater ©   (2004-01-30 16:29) [8]

fuck1 требует параметр типа proc.

fuck не является типом proc.


 
ламер   (2004-01-30 16:31) [9]

Хммм.. на самом деле задача изначально не такая была,
мне нужно в зависимости от некоторых условий вызывать методы, имена которых заданы stringом - это как-нибудь можно реализовать?


 
Тимохов ©   (2004-01-30 16:33) [10]

В общем случае, нельзя.


 
alex_*** ©   (2004-01-30 16:36) [11]

Ну сделать константный cross-table.... с записями типа {Name;Proc}


 
ламер   (2004-01-30 16:36) [12]

то есть?


 
Тимохов ©   (2004-01-30 16:40) [13]

Можно и так.

> alex_*** © (30.01.04 16:36) [11]


Если нужно методы классов так хранить, то нужно будет воспользоватсья типов TMethod для запуска метода.


 
alex_*** ©   (2004-01-30 16:42) [14]

массив записей где указателю на метод сопоставляется название этого метода.
Кстати с константным я погорячился. Это только с процедурами, которые не входят в класс или отмечены как class function():...


 
Тимохов ©   (2004-01-30 16:51) [15]

Можно так
tproc = record
name: string;
p: pointer;
end;

a: array or tproc;

procedure addproc(const aName: String; const aP: pointer);
begin
setlength(a, length(a)+1)
a[high(a)].name := aname;
a[high(a)].p := ap;
end;

// добавление процедур

addproс("fuck", @TYourClass.Fuck);

// вызов
type
TFuckProc = procedure() of object;
var
i: integer;
m: TFuckProc;
begin
i := индекс массива, найденный по имени
TMethod(m).Code := объект класса TYourClass, метод которого ты хочешь вызвать;
TMethod(m).Data := a[i].p;
m();
end;

Замечание, ясно, что в этом случае все методы должны быть однотипны, т.е. быть процедурами или функциями и обладать одинаковым количесвом параметров.

Можешь усовершенствовать механизм, так, чтобы он тебе возволял таким образом вызвать разнотипные методы.



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

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

Наверх




Память: 0.5 MB
Время: 0.013 c
9-29182
VitGun
2003-07-26 15:56
2004.02.10
Collisions в GLScene


1-29367
baataar
2004-01-28 16:45
2004.02.10
DDE сервер - как законектится и чем?


7-29637
Hermit
2003-11-15 23:00
2004.02.10
Реестр


8-29481
Darlock
2003-10-06 12:12
2004.02.10
Графический формат EPS


14-29567
HermitAlex
2004-01-20 13:36
2004.02.10
Обучение игры в бильярд