Форум: "Основная";
Текущий архив: 2004.02.06;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.034 c