Форум: "Основная";
Текущий архив: 2004.02.10;
Скачать: [xml.tar.bz2];
ВнизГоспода мастера! Помогите с указателями на процедуры! Найти похожие ветки
← →
ламер (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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.008 c