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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как правильно передать саму процедуру 
V
    Опции темы
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   Вверх
Страницы: (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.1752 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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