Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-29452
Evgeny78
2004-01-30 13:35
2004.02.10
Рисование


1-29434
MM
2004-01-30 15:59
2004.02.10
Ошибка при выводе отчета в Excel.


3-29220
Innokenty
2004-01-20 07:08
2004.02.10
Соединение 4-х баз по дате и сортировка


1-29337
EMIL
2004-01-29 16:03
2004.02.10
TreeView копировать узелок


3-29208
fag2000
2004-01-20 10:34
2004.02.10
Как узнать права пользователя на объект с помощью запроса?





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