Главная страница
    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.47 MB
Время: 0.008 c
4-29672
Chris
2003-12-03 18:54
2004.02.10
Передать русккий текст в Excel


1-29395
SnapIn
2004-02-02 06:14
2004.02.10
Удалить объект


7-29644
KyRo
2003-11-24 23:19
2004.02.10
Поиск по реестру


14-29552
Mike B.
2004-01-20 16:24
2004.02.10
Крик души


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