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

Вниз

Incompatible types: regular procedure and method pointer   Найти похожие ветки 

 
CyberFreak ©   (2004-01-24 22:23) [0]

Доброго времени суток, Мастера!

Как побороть сабж? Вот примерчик даже смоделировал на сокрую руку:



//...

type
TProc = procedure(A, B: Integer);

TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
procedure Proc2(A, B: Integer);
public
{ Public declarations }
end;

//...

procedure Proc3(Param: TProc);
begin
Param(3, 2);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Proc3(Proc2); // Вот тут еррор выскакивает
end;

//...


 
Stilgar ©   (2004-01-24 22:30) [1]

TProc = procedure(A, B: Integer) of object;
Объяснять?


 
CyberFreak ©   (2004-01-24 22:36) [2]

> Stilgar © (24.01.04 22:30)

Да не, не надо. И на том спасибо.


 
CyberFreak ©   (2004-01-24 22:50) [3]

Хм... а если мне мой method pointer надо передать как pointer, например в функцию EnumWindows, как тогда быть?


//...

type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
function EnumWindowsProc(hWnd: HWND; lParam: LPARAM): BOOL; stdcall;
public
{ Public declarations }
end;

//...

procedure TForm1.FormCreate(Sender: TObject);
begin
EnumWindows(EnumWindowsProc, 0); // Not enough actual parameters
EnumWindows(@EnumWindowsProc, 0); // Variable required
end;

//...


 
Stilgar ©   (2004-01-24 22:53) [4]

Не мучатся, а объявить процедуру вместо метода.


 
CyberFreak ©   (2004-01-24 23:05) [5]

> Не мучатся, а объявить процедуру вместо метода.

Это-то понятно, но хотелось бы именно так. Просто планируется в моем этом метод поинтере обращаться к полям формы, а делать это например как Form1.ListBox1 ИНХО неправильно, хотя бы потому что если я создам другой объект, скажем Form2: TForm1, то в все обращения будут направлены к Form1.


 
CyberFreak ©   (2004-01-24 23:08) [6]

Еще я знаю, что в данном примере можно передавать указатель на ListBox1 через параметр lParam функции EnumWindowsProc... так что такое решение просьба не предлагать.


 
Palladin ©   (2004-01-24 23:09) [7]

ну так сделай параметр у процедуры УхТы_АВедьМожноИТак:TForm


 
CyberFreak ©   (2004-01-24 23:20) [8]

Чо-то не догнал... у какой процедуры? У EnumWindows что ли? Да я бы рад, тока это WinApi функция...


 
Palladin ©   (2004-01-24 23:22) [9]

а... ну да... ну тогда используй LParam учитывая то что идентификатор объекта есть указатель и его размер совпадает с размером LParam... а то ведь он у тебя совсем без дела зерует...


 
CyberFreak ©   (2004-01-24 23:24) [10]

А если меня не один объект интересует, а много объектов...


 
Palladin ©   (2004-01-24 23:27) [11]

в смысле? несколько форм чтоли?
тогда

var
lForms:TList; // или TObjectList но мне больше TList нравится

lForms:=TList.Create;
lForms.Add(Pointer(Form1));
lForms.Add(Pointer(Form2));
lForms.Add(Pointer(сколько хочешь форм));

EnumWindows(EnumWindowsProc,integer(lForms));

соответсвенно из своей cb функции приводишь integer обратно к TList


 
Stilgar ©   (2004-01-24 23:28) [12]

Так указатель на форму.


 
CyberFreak ©   (2004-01-24 23:31) [13]

Елы-палы... как же я боялся этого ответа... =)

Короче, вот просто для общего развития: можно ли передать method pointer в функцию, которая просит одним из параметров указатель на другую функцию. Насколько я понимаю method pointer - это что-то такое нематериальное, посему передать ее указатель во что бы то ни было невозможно. Можно ли ее как нить материализовать?


 
Palladin ©   (2004-01-24 23:40) [14]

нет, ибо функция требующая указатель на другую функцию требует так же и соблюдения соглашения о вызовах, в том числе и точное описание параметров у передаваемой функции...

проблема method pointer в том что он имеет один скрытый параметр который передается самым первым это есть указатель на объект владелец, тоесть

TForm1.Button1Click(Sender:TObject) вызывается как

Button11Click(Form1:TForm;Sender:TObject);
тоже и с остальными методами любых объектов... всегда в начале передается ссылка на объкт, так что сам понимаешь, это то все и портит


 
Stilgar ©   (2004-01-24 23:43) [15]

method pointer - это два указателя, на объект и на метод. Если мне не изменяет склероз, то это не материализуется.
P.S.Так мой последний вариант работает?


 
Юрий Зотов ©   (2004-01-25 09:12) [16]

Интересно тут у вас...

[1]:
Объяснять?

[2]:
Да не, не надо.

И через 14 минут:
[3]:
Хм... а если ... как как тогда быть?

=====================================================

Ладно, раз человек ЗНАТЬ не хочет, я тоже не буду тратить время на объяснения.

type
TUpdateCaptionProc = procedure(Wnd: HWND) of object;
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure UpdateCaption(Wnd: HWND);
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

type
PMethod = ^TMethod;

function EnumWindowsProc(Wnd: HWND; Method: PMethod): BOOL; stdcall;
begin
TUpdateCaptionProc(Method^)(Wnd);
Result := True
end;

procedure TForm1.Button1Click(Sender: TObject);
var
M: TMethod;
begin
M.Code := MethodAddress("UpdateCaption");
M.Data := Self;
EnumWindows(@EnumWindowsProc, Integer(@M));
Caption := Caption + " - that""s all"
end;

procedure TForm1.UpdateCaption(Wnd: HWND);
begin
Caption := IntToStr(Wnd);
Sleep(40)
end;



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

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

Наверх




Память: 0.51 MB
Время: 0.019 c
6-16570
h0use
2003-12-01 17:37
2004.02.06
Как через инди компоненты работать с базами данных


4-16827
Reanimator
2003-11-30 23:28
2004.02.06
Как по хендлу окна получить путь к екзешнику


14-16645
Rouse_
2004-01-14 01:49
2004.02.06
Возвращение к старому проекту...


3-16068
Cerber
2004-01-10 20:15
2004.02.06
Локалки против Клиент серверов


1-16501
Sergioly
2004-01-27 14:30
2004.02.06
Как запустить дос-прогу без вывода ее окна в Delphi