Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как правильно передать саму процедуру 
V
    Опции темы
Ak47black
  Дата 30.7.2007, 20:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

Репутация: 1
Всего: 0



Здравствуйте.
Меня интересует как в Delphi можно передать процедуру как параметр функции.
А если подробней то вот такой код для примера.

Объявляю тип
Код

  TWndProc = procedure(var message: TMessage)of object;

и делаю саму процедуру куда буду передавать
Код

procedure TestProc(var WndProc: TWndProc);
begin

end;

При нажатии кнопки например делаю так
Код

  TestProc(WndProc);

Так вот как видно мне нужно передать не сам адрес по которому находиться функция(WndProc) ,а адрес переменной отвечающий за эту функцию.
При выполнение выше приведенного кода у меня эррор 
Цитата

Types of actual and formal var parameters must be identical

Как на Delphi это правильно сделать?
PM MAIL   Вверх
Romikgy
Дата 30.7.2007, 21:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



Цитата(Ak47black @  30.7.2007,  19:46 Найти цитируемый пост)
TWndProc = procedure(var message: TMessage)of object;

зачем of object ?


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Ak47black
Дата 30.7.2007, 21:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

Репутация: 1
Всего: 0



Romikgy, ну так пишется вроде.
А что он означает?
PM MAIL   Вверх
Yanis
Дата 30.7.2007, 21:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 72
Всего: 111



Забыл. Надо @@ вместо @ использовать, что бы получить адрес переменной-процедуры/функции. И всего делов.


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Ak47black
Дата 30.7.2007, 21:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

Репутация: 1
Всего: 0



Ну например так
Код

var
  P: Pointer;
begin
  P:= Pointer(@@WndProc);

и так
Код

var
  P: Pointer;
begin
  P:= @@WndProc;

Не работает.
PM MAIL   Вверх
Romikgy
Дата 30.7.2007, 21:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



Цитата(Ak47black @  30.7.2007,  20:33 Найти цитируемый пост)
А что он означает? 

ИМХО это говорит о том что эта процедура является частью объекта


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Ak47black
Дата 30.7.2007, 22:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

Репутация: 1
Всего: 0



Мм так как-тут бы сделать тогда?
PM MAIL   Вверх
Rennigth
Дата 31.7.2007, 10:19 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 49
Всего: 76



Ak47black, я так и не понял проблемы...  smile 

Так не катит?
Код

type
  TWndProc = procedure (var VMessage: TMessage) of object;

  TForm10 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form10: TForm10;

implementation

{$R *.dfm}

procedure TestProc(AWndProc: TWndProc);
begin
  if Assigned(AWndProc) then
  begin
    //парам-пам-пам
  end;
end;

procedure TForm10.FormCreate(Sender: TObject);
var
  lWndProc: TWndProc;
begin
  lWndProc := WindowProc;
  TestProc(lWndProc);
end;



--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
Alexeis
Дата 31.7.2007, 10:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Цитата(Romikgy @  30.7.2007,  21:54 Найти цитируемый пост)
ИМХО это говорит о том что эта процедура является частью объекта 

  Это говорит о том что процедура является методом объекта я является записью из двух указателей, указателя на функцию и указателя на экземпляр объекта. Такой тип несовместим с обычным процедурным типом, потому при передаче обычной функции "of Object" нужно опускать.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Bose
Дата 31.7.2007, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1458
Регистрация: 5.3.2005
Где: Riga, Latvia

Репутация: 23
Всего: 51



Ak47black, определись что тебе надо передавать как параметр
метод класса 
Код

 TWndProc = procedure(var message: TMessage)of object;

или процедуру
Код

 TWndProc = procedure(var message: TMessage);

PM MAIL WWW Skype   Вверх
Ak47black
Дата 1.8.2007, 03:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

Репутация: 1
Всего: 0



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

Bose, тут метод класса как я вижу.
PM MAIL   Вверх
Alexeis
Дата 1.8.2007, 09:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Ak47black, так писать неправильно, адрес функции должен оставаться адресом функции, зачем же его приводить к типу Pointer? 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Yanis
Дата 1.8.2007, 09:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 72
Всего: 111



Цитата(Ak47black @  1.8.2007,  04:38 Найти цитируемый пост)
Rennigth, ты передаёшь адрес функции ,а мне нужно передать адрес переменной в которой храниться адрес функции в этот проблема и заключается.

Цитата
To get the memory address of a procedural variable (rather than the address stored in it), use @@. For example, @@F returns the address of F.



--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Bose
Дата 1.8.2007, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1458
Регистрация: 5.3.2005
Где: Riga, Latvia

Репутация: 23
Всего: 51



Цитата(Ak47black @  1.8.2007,  03:38 Найти цитируемый пост)
Bose, тут метод класса как я вижу.

да =)


По-моему вы тут всё перемудрили с этими адресами. 

Вот простейший 100% работающий код из моего проекта(упрощённый вариант):
Код

//объявляем Тип 
  TComponentProcedure = procedure(aComp: TComponent) of object;

// код процедуры. Именно эта процедура будет вызывать процедуру-параметр
procedure ForEachComponent(aParent: TComponent; aActionProcedure: TComponentProcedure);
var i:integer;
    tmpCtrlList:TList;
begin
    for i := 0 to aParent.ComponentCount-1 do
    begin
      aActionProcedure(aParent.Components[i]); // вот вызов процедуры-параметра
    end;
end;


ForEachComponent вызывает процедуру-параметр aActionProcedure для каждого дочернего компонента aParent. 

А вот так вот этим всем пользуюсь:
Код

type 
  TForm1 = class(TForm)
  protected
     // Callback procedure(TComponentProcedure) for ForEachComponent
     procedure cpCheckAndFillImageList(aComp: TComponent); 
  public
     procedure TestCallbackRun; // пример вызова
  end;

procedure TForm1.cpCheckAndFillImageList(aComp: TComponent);
begin
  if aComp.InheritsFrom(TImageList) then
  begin
     // какие-то действия над (aComp as TimageList)
  end;

procedure TForm1.TestCallbackRun;
begin
  // для каждого компонента формы запустить процедуру cpCheckAndFillImageList
  ForEachComponent(self, cpCheckAndFillImageList);
end;



И никаких явных манипуляций с адресами!  smile 

Это сообщение отредактировал(а) Bose - 1.8.2007, 18:31
PM MAIL WWW Skype   Вверх
MetalFan
Дата 1.8.2007, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



Цитата(Ak47black @  30.7.2007,  20:46 Найти цитируемый пост)
procedure TestProc(var WndProc: TWndProc);

а на кой ляд тут var-параметр?


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1013 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.