Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-16398
DimaK
2004-01-15 21:05
2004.02.06
Печать графического буфера


14-16617
Думкин
2004-01-15 06:14
2004.02.06
С днем рождения! 15 января.


1-16402
baataar
2004-01-28 13:23
2004.02.06
где иконка от проекта хранится? не могу сменить иконку


3-16108
gs
2004-01-16 02:17
2004.02.06
почему в DBGRID есть FixedColor и нет FixedCols, и как можно их


8-16535
vev
2003-10-07 09:59
2004.02.06
Работа с цифровой фотокамерой





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