Модераторы: 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   Вверх
Bose
Дата 1.8.2007, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(MetalFan @  1.8.2007,  16:18 Найти цитируемый пост)
а на кой ляд тут var-параметр?

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


Эксперт
****


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

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



Yanis, ты можешь привести пример с WndProc ,ато я тут попробовал и невыход.

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

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


Эксперт
***


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

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



Цитата(Ak47black @  1.8.2007,  17:17 Найти цитируемый пост)
Ну надеюсь вы поняли что я хочу передать WndProc - главная процедура обработки сообщений окна, так вот я хочу передать в компонент чтобы он перенаправил её на свою процедура ,а та вызывала-бы настояшию, конечно я могу сделать это и на прямую(через присвоение), но ради спортивного интереса хочу научиться передавать переменную-процедуру.


Ak47black, убери у себя var и посмотри мой пример.
PM MAIL WWW Skype   Вверх
Rennigth
Дата 1.8.2007, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Ak47black @  1.8.2007,  17:17 Найти цитируемый пост)
переменную-процедуру

эт как?  smile 
Как я понимаю то, что ты подразумеваешь под этим есть не что иною как адресс на точку входа в процедуру. И вот скажи мне какая разница, будешь ты передавать через дополнительну переменную на эту процедуру или сразу указывать @Someproc.

Цитата(Ak47black @  1.8.2007,  17:17 Найти цитируемый пост)
но ради спортивного интереса хочу научиться передавать переменную-процедуру.

Чесслово, себе и другим морочишь мозги.
 
А на счет var параметра как Bose тебе правильно уже сказал, убери его. Просто компилятор немного боиться таких маневров smile


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


Эксперт
****


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

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



Цитата

Как я понимаю то, что ты подразумеваешь под этим есть не что иною как адресс на точку входа в процедуру. И вот скажи мне какая разница, будешь ты передавать через дополнительну переменную на эту процедуру или сразу указывать @Someproc.

Неа.
У каждой формы есть переменная в которой храниться адрес процедуры обработки сообщений, вот я эту переменную и хочу передать.   smile 

Это сообщение отредактировал(а) Ak47black - 1.8.2007, 17:59
PM MAIL   Вверх
Rennigth
Дата 1.8.2007, 18:11 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Ak47black @  1.8.2007,  17:56 Найти цитируемый пост)
вот я эту переменную и хочу передать.

Ну а что тебя останавлявает?
Код

unit Unit11;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

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


  TSomeWndMethodManager = class(TObject)
  private
    FItems: TList;
  public
    function AddItem(AWndProc: TWndMethod): Integer;
    procedure Delete(AIndex: Integer);
    constructor Create; virtual;
    destructor Destroy; override;
  end;

var
  Form11: TForm11;

implementation

{$R *.dfm}

procedure TForm11.FormCreate(Sender: TObject);
var
  lSWMM: TSomeWndMethodManager;
begin
  lSWMM := TSomeWndMethodManager.Create;
  lSWMM.AddItem(WindowProc);
  lSWMM.Free;
end;

{ TSomeWndMethodManager }

function TSomeWndMethodManager.AddItem(AWndProc: TWndMethod): Integer;
begin
  FItems.Add(@AWndProc);
end;

constructor TSomeWndMethodManager.Create;
begin
  FItems := TList.Create;
end;

procedure TSomeWndMethodManager.Delete(AIndex: Integer);
begin
  if (AIndex >= 0) and (AIndex < FItems.Count) then
    FItems.Delete(AIndex);
end;

destructor TSomeWndMethodManager.Destroy;
begin
  FItems.Free;
  inherited;
end;





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


Эксперт
****


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

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



Была в своё время задачка на интерес:
Код
procedure Test(const str: string);
begin
  ShowMessage('test : ' + str);
end;

type
  TProc = procedure (const str: string);
var
  proc : TProc;
  addr : Pointer;
begin
  proc := Test;
  proc('begin');
  addr := <censored>;
  TProc(addr^)('passed');
end.


Отгадайте как она решалась?


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


Эксперт
****


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

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



Rennigth, не мне навороты не нужны.
Я могу тогда просто прямым способом присвоить, я просто хочу узнать как передать переменную в которой храниться адрес обработки сообщений окна.
Тут Yanis писал чтото близкое к ответу.
Цитата

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

Только мне не адрес нужен ,а переменную, хотя можно приравнять адрес к переменной.

Я надеюсь чётко написал что я хочу сделать, если нет то извиняюсь, скажите если что.
PM MAIL   Вверх
EvilsInterrupt
Дата 1.8.2007, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: 3
Всего: 9



Ak47black
Читал усиленно всю тему. Но так и не понял, что в конце концов ты хочешь?!

Но то что я понял, это CALLBACK ф-ция при регистрации окна. Если  это так, то рекомендую обрабратиться к DRKB или DelphiWorld и поглядеть, как же там реализовано создание и отображение окна на чистом WinAPI. Да думаю ради увеличения знаний стоит туда глянуть
очень даже стоит.

ЗЫ:
Я вероятно не понял темы, прошу выразить задачу более отчетливо!
PM MAIL WWW ICQ Jabber   Вверх
Bose
Дата 1.8.2007, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Ak47black @  1.8.2007,  19:42 Найти цитируемый пост)
Только мне не адрес нужен ,а переменную, хотя можно приравнять адрес к переменной.Я надеюсь чётко написал что я хочу сделать, если нет то извиняюсь, скажите если что.

Я так и не понял, в чем проблема. Примеров приведено достаточно.

Так или иначе вот ещё один вариант:
Код

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

var 
  VariableWndProc: TWndProc;

// где-нибудь в коде инициализируем эту переменную...
  VariableWndProc:=WndProc;

 // вызываем тестувую процедуру с переменной
 TestProc(VariableWndProc);


Я только одного не понимаю: на хрена тебе именно переменная-то сдалась.

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


Эксперт
****


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

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



Цитата(Bose @  1.8.2007,  21:15 Найти цитируемый пост)
Я так и не понял, в чем проблема.

Реши мою задачу. Ответ будет там.


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


Эксперт
****


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

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



Ну попробую так объяснить проблему, ок. на простых данных сначала.

Есть вот такой код
Код

procedure TForm1.SomeProc(var Int: Integer);
begin
  Int:= 5;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
begin
  SomeProc(i);
  ShowMessage(IntToStr(i));
end;

Этот код передаёт переменную в процедуру SomeProc там её приравниваем 5.
Это надеюсь все поймут.

Теперь тоже самое с переменной которая содержит процедуру обработки окон.
Код

procedure TForm1.TestProc(var WndProc: TWndProc);
begin
//тут чтото делаем с переменой WndProc
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
  TestProc(WndProc); //Вот тут ошибка 'Types of actual and formal var parameters must be identical'
end;

Вот так надеюсь понятно   smile

Добавлено через 2 минуты и 7 секунд
Yanis
Код

@Test

Так чтоли.
PM MAIL   Вверх
Bose
Дата 1.8.2007, 20:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Ak47black @  1.8.2007,  20:29 Найти цитируемый пост)
TestProc(WndProc); //Вот тут ошибка 'Types of actual and formal var parameters must be identical'

Ну да. Потому что WndProc - это не переменная, которую мы могли бы изменить, а процедура. 

Ясно. Насколько я понял ты хочешь заменить стандартную оконную процедуру WndProc. Единственный способ который мне приходит в голову:

Это создать наследника у которого перекрыт(overriden) метод WndProc.



Цитата(Yanis @  1.8.2007,  20:20 Найти цитируемый пост)
Реши мою задачу. Ответ будет там.

Всегда убивают такие постановки задачи. Тут прежде чем найти решенить задачу, нужно найти что именно решать. Ребус в ребусе... 
PM MAIL WWW Skype   Вверх
Yanis
Дата 1.8.2007, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Ak47black @  1.8.2007,  21:29 Найти цитируемый пост)
Так чтоли. 

Ну ты попробуй этот код запусти ;)
Надо добиться, что бы мой код работал -- два раза показал MessageBox.

Добавлено @ 20:50
Цитата(Bose @  1.8.2007,  21:47 Найти цитируемый пост)
Тут прежде чем найти решенить задачу, нужно найти что именно решать.

Как мне кажется я понял, что хочет Ak47black и моя задачка является самым ярким примером.
Гипотетически Ak47black именно её и надо решить.

Это сообщение отредактировал(а) Yanis - 1.8.2007, 20:50


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


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


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

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



Цитата(Yanis @  1.8.2007,  19:28 Найти цитируемый пост)
Отгадайте как она решалась? 

Код

  addr := @Test;//<censored>;

ну еще шляпу снять нафиг
Код

  TProc(addr)('passed');


Это сообщение отредактировал(а) MetalFan - 1.8.2007, 20:58


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Bose
Дата 1.8.2007, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Yanis @  1.8.2007,  20:49 Найти цитируемый пост)
Как мне кажется я понял, что хочет Ak47black и моя задачка является самым ярким примером.Гипотетически Ak47black именно её и надо решить.

Насколько я понял решение ты сам и приводил сегодня тут

Цитата(Yanis @  1.8.2007,  20:49 Найти цитируемый пост)
Как мне кажется я понял, что хочет Ak47black и моя задачка является самым ярким примером.

Хммм... посмотрим

Мне больше интересно понимает ли Ak47black сам чего хочет и как он это всё-таки реализует smile 
PM MAIL WWW Skype   Вверх
Yanis
Дата 1.8.2007, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(MetalFan @  1.8.2007,  21:56 Найти цитируемый пост)
ну еще шляпу снять нафиг

А ты не снимай ;) Так же интересней.

Добавлено через 1 минуту и 18 секунд
Ak47black
Мож забьёшь на задачу? smile


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


Эксперт
****


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

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



Yanis, ну к этому дело идёт  smile .
Наверно тут нереально сделать так.
Но просто интересно.

Цитата

Мне больше интересно понимает ли Ak47black сам чего хочет и как он это всё-таки реализует smile 

Сохраняю старую процедуру->приравниваю свою которая процеживает сообшения->вызываю старую
Только это всё хочу в классе сделать.

Это сообщение отредактировал(а) Ak47black - 1.8.2007, 21:40
PM MAIL   Вверх
MetalFan
Дата 1.8.2007, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Yanis @  1.8.2007,  20:59 Найти цитируемый пост)
А ты не снимай ;)

две собаки не катят. компилятор ругаецца. если только еще одну переменную вводить. иначе - никак


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Ak47black
Дата 1.8.2007, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата

две собаки не катят. компилятор ругаецца.

Ну да некатит  smile . Странно почему такое нельзя сделать.
По логике если можно передать Integer переменную, то почему нельзя переменную в которой храниться адрес процедуры. Они вроде даже и по размеру одинаковые.

Это сообщение отредактировал(а) Ak47black - 1.8.2007, 21:36
PM MAIL   Вверх
Yanis
Дата 1.8.2007, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



MetalFanAk47black
addr := @@proc;


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


Эксперт
****


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

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



Yanis, блин извращения  smile 
Я что на Test процедуру посмотрел  smile .
PM MAIL   Вверх
Bose
Дата 1.8.2007, 21:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Ak47black @  1.8.2007,  21:07 Найти цитируемый пост)
Сохраняю старую процедуру->приравниваю свою которая процеживает сообшения->вызываю старую

Занудно: Не приравниваю а присваиваю. 
Нельзя так просто взять и присвоить что-то процедуре. Присваивать можно только переменным. В данном топике все мои примеры касались переменных процедурного типа. Чтобы решить твою задачу через попу, можно попробовать поковыряцца с таблицей адресов методов( не помню как она называется), может быть можно повесить хук(в них я вообще ничего не понимаю). 

А идеальный и верный с моей точки зрения вариант - это написать наследника который перекрывает WndProc и фильтрует сообщения. 

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

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


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


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

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



Цитата(Yanis @  1.8.2007,  21:43 Найти цитируемый пост)
addr := @@proc;

Цитата(Ak47black @  1.8.2007,  21:53 Найти цитируемый пост)
Я что на Test процедуру посмотрел

мда) аналогично)
ну да, я просто "пропустил" первую строку





--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Ak47black
Дата 1.8.2007, 22:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Bose, лан я тут просто могу напрямую присвоить.
Просто хотел убедиться что так нельзя.
PM MAIL   Вверх
Bose
Дата 2.8.2007, 00:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Ak47black @  1.8.2007,  22:12 Найти цитируемый пост)
Bose, лан я тут просто могу напрямую присвоить.Просто хотел убедиться что так нельзя.

Если ты изначально хотел присвоить, то почему не написал так в вопросе?  smile 

Гони плюс как компенсацию за потраченные нервы и время! smile 

Это сообщение отредактировал(а) Bose - 2.8.2007, 00:29
PM MAIL WWW Skype   Вверх
Yanis
Дата 2.8.2007, 09:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Bose @  2.8.2007,  01:28 Найти цитируемый пост)
Гони плюс как компенсацию за потраченные нервы и время!

smile


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


Эксперт
***


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

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



Yanis
Так нагляднее чем через две собаки smile
Код

procedure Test(const str: string);
begin
  ShowMessage('test : ' + str);
end;

type
  TProc = procedure (const str: string);
var
  proc : TProc;
  laddr : Pointer;
begin
  proc := Test;
  proc('begin');
  laddr := Addr(@proc);
  TProc(laddr^)('passed');
end.



пысы: Сорь что переименовал переменную, но есть такая (Addr) функция которой как раз можно воспользоваться  smile 


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


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


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

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



Rennigth, да те же яйца... я бы не сказал, что нагляднее)


--------------------
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.

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


 




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


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

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