Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.03.21;
Скачать: CL | DM;

Вниз

как вызвать процедуру по ссылке?   Найти похожие ветки 

 
HRustBB   (2010-01-14 20:01) [0]

добавляем в TreeView1 нод


sub2node:=TreeView1.Items.AddChild(subnode,"CommentAttr");
sub2node.Data:=@TreeClick;


необходимо чтобы по двойному клику вызывалась соответствующая процедура (TreeClick)



procedure TForm8.TreeView1DblClick(Sender: TObject);
begin
if not(TreeView1.Selected.Data=nil) then begin
//Что здесь писать ?
end;
end;


 
Демо ©   (2010-01-14 20:07) [1]

type
 TMyProc=procedure;

var
 mp: TMyProc;

procedure MyProc;
begin
 ShowMessage("Моя процедура");
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
 mp := @MyProc;
 mp;


 
Демо ©   (2010-01-14 20:08) [2]

procedure TForm8.TreeView1DblClick(Sender: TObject);
begin
 if not(TreeView1.Selected.Data=nil) then
 begin
   TMyProc(TreeView1.Selected.Data);
 end;
end;


 
Игорь Шевченко ©   (2010-01-14 20:23) [3]

Только метод туда таким образом не поместится, а автору (я больше чем уверен) понадобится метод туда впихнуть


 
Ганя   (2010-01-14 21:03) [4]

Проще в Data хранить некий тег, а обработчик повесить единый, а внутри него уже по тегу разбираться, что делать


 
oxffff ©   (2010-01-14 22:29) [5]


> Игорь Шевченко ©   (14.01.10 20:23) [3]
> Только метод туда таким образом не поместится, а автору
> (я больше чем уверен) понадобится метод туда впихнуть


Ну смотря у кого. :)
Метод обернутый в процедуру отлично помещается.

см. пример из forms
function MakeObjectInstance(Method: TWndMethod): Pointer;
begin
{$IFDEF LINUX}
 Result := WinUtils.MakeObjectInstance(Method);
{$ENDIF}
{$IFDEF MSWINDOWS}
 Result := Classes.MakeObjectInstance(Method);
{$ENDIF}
end;


 
Игорь Шевченко ©   (2010-01-14 22:47) [6]

oxffff ©   (14.01.10 22:29) [5]

А это ничего, что не все методы сигнатурой с TWndMethod совпадают и им StdWndProc не надо вызывать ?


 
oxffff ©   (2010-01-14 23:10) [7]


>
> А это ничего, что не все методы сигнатурой с TWndMethod
> совпадают и им StdWndProc не надо вызывать ?


Совершенно ничего страшного поскольку передача происходит по ссылке(var), если я правильно понял Ваш вопрос.


 
oxffff ©   (2010-01-14 23:16) [8]


> Совершенно ничего страшного поскольку


Ну страшное есть в любом случае(что с случае вызова процедуры или метода), поскольку нет возможности обеспечить безопасность типов в случае вызова через сырой указатель. Но это уже из другой оперы.


 
HRustBB   (2010-01-17 01:31) [9]


> Демо ©   (14.01.10 20:08) [2]
> procedure TForm8.TreeView1DblClick(Sender: TObject);begin
> if not(TreeView1.Selected.Data=nil) then begin    
>  TMyProc(TreeView1.Selected.Data);  
> end;
> end;


а параметры в фунцию можно поместить какнибудь


 
Германн ©   (2010-01-17 01:45) [10]


> а параметры в фунцию можно поместить какнибудь
>

В какую функцию?


 
HRustBB   (2010-01-17 02:03) [11]

в функцию указатель на которую помещен в TreeView1.Selected.Data.
Почитайте посты выше (если интересно), не описывать же всю проблемму поновы.


 
Игорь Шевченко ©   (2010-01-17 02:20) [12]


> а параметры в фунцию можно поместить какнибудь


можно


 
HRustBB   (2010-01-17 10:53) [13]


> можно


Вы бы мне очень помогли еслиб объяснили каким образом ))


 
HRustBB   (2010-01-17 11:04) [14]

я пишу так:

procedure TreeClick1(i:integer);
begin
//процедурка
end;



sub2node:=TreeView1.Items.AddChild(subnode,"CommentAttr");
sub2node.Data:=@TreeClick1(1);


выдает ошибочку требуется переменная


 
HRustBB   (2010-01-17 12:15) [15]

ну как, я уже пол дня бьюсь, пишу:


var ii:integer;

procedure TreeClick1(i:integer);
begin
//процедурка
end;

sub2node:=TreeView1.Items.AddChild(subnode,"CommentAttr");
sub2node.Data:=@TreeClick1(ii);


всеравно ошибка variable required, как еще решить можно подскажите пожалуйсто


 
Игорь Шевченко ©   (2010-01-17 12:38) [16]

Я так и не понял, что тебе надо


 
Плохиш ©   (2010-01-17 12:43) [17]

Раздел справки "Procedural Types".


 
HRustBB   (2010-01-17 13:04) [18]


> Игорь Шевченко ©   (17.01.10 12:38) [16]
> Я так и не понял, что тебе надо


type
TTreeClick=procedure;

имеется соответствующая процедура

procedure TreeClick(hgh:integer);
begin
//процедура
end;

добавляем в TreeView1 нод

sub2node:=TreeView1.Items.AddChild(subnode,"CommentAttr");
sub2node.Data:=@TreeClick;


необходимо чтобы по двойному клику вызывалась соответствующая процедура (TreeClick)

делаем это так

procedure TForm8.TreeView1DblClick(Sender: TObject);
begin
if not(TreeView1.Selected.Data=nil) then begin
TTreeClick(TreeView1.Selected.Data);
end;
end;

а вот как сделать чтобы в procedure TreeClick(hgh:integer); при вызове по указателю передать определенное значение параметра hgh:integer


 
Игорь Шевченко ©   (2010-01-17 13:14) [19]


> при вызове по указателю передать определенное значение параметра
> hgh:integer


а чему должно быть значение параметра ?


 
Игорь Шевченко ©   (2010-01-17 13:15) [20]

автор, завязывай партизанить, ты не в гестапо и никому не надо вытягивать из тебя клещами детали, хочется просто поговорить, есть специальная конференция


 
HRustBB   (2010-01-17 13:43) [21]


> автор, завязывай партизанить, ты не в гестапо и никому не
> надо вытягивать из тебя клещами детали, хочется просто поговорить,
>  есть специальная конференция


прошу прощения, какие могут быть секреты, просто я не думал что значение ппеременной имеет для вас какоето значение.

Вобщем излагаю все от и до:

type
TTreeClick=procedure;



type
THighlihter  = record
Bg:TColor;
Fg:TColor;
Style:TFontStyles;


имеется соответствующая процедура (по правде параметр не integer a THighlihter)

procedure TreeClick(hgh:THighlihter);
begin
Form8.PHPCommentAttr1.MyRepaint(hgh);
end;

PHPCommentAttr1 это фрейм
добавляем в TreeView1 нод

sub2node:=TreeView1.Items.AddChild(subnode,"CommentAttr");
sub2node.Data:=@TreeClick;


необходимо чтобы по двойному клику вызывалась соответствующая процедура (TreeClick)

делаем это так

procedure TForm8.TreeView1DblClick(Sender: TObject);
begin
if not(TreeView1.Selected.Data=nil) then begin
TTreeClick(TreeView1.Selected.Data);
end;
end;

а вот как сделать чтобы в procedure TreeClick(hgh:THighlihter); при вызове по указателю передать определенное значение параметра hgh:THighlihter. Значение параметра hgh:THighlihter ? Ну это значение setting.phpCommentAttr где setting это класс с настройками для моей программки


 
HRustBB   (2010-01-17 13:51) [22]


> а вот как сделать чтобы в procedure TreeClick(hgh:THighlihter);
>  при вызове по указателю передать определенное значение
> параметра hgh:THighlihter.


я забыл пояснить что для каждого нода в TreeView1 параметр hgh:THighlihter должен иметь разное значение, тоесть значение параметру hgh:THighlihter задается  в зависимости от того по какому ноду кликнем.


 
sniknik ©   (2010-01-17 14:00) [23]

> при вызове по указателю передать определенное значение параметра
в типе процедуры писать с параметром, таким же как в основной.

> я забыл пояснить что для каждого нода ...
а уже никак... т.к. для вариабельных данных используется Data нода, а ты это место занял под адрес неизменной процедуры.
теперь только все заново.

p.s. объяснять надо сразу и полно, как делаешь, не думая о том надо нам это или нет.


 
HRustBB   (2010-01-17 14:01) [24]


> а уже никак... т.к. для вариабельных данных используется
> Data нода, а ты это место занял под адрес неизменной процедуры.
> теперь только все заново


блин, ну тогда подумаю пока в другом направлении


 
Игорь Шевченко ©   (2010-01-17 14:36) [25]

делаешь объект, у которого два поля - значение параметра для процедуры и адрес процедуры. Для каждой ноды создаешь экземпляр объекта, при создании указываешь нужную процедуру и нужное значение параметра, node.data присваиваешь адрес созданного объекта, в OnClick из ноды вынимаешь объект, там уже и параметр и процедура, вызываешь.


 
Плохиш ©   (2010-01-17 15:00) [26]


> HRustBB   (17.01.10 13:43) [21]

Я что-то не понял, судя по приведённому коду, процедура одна для всех нодов, только параметр меняется?


 
oxffff ©   (2010-01-17 16:48) [27]


> HRustBB   (17.01.10 13:43) [21]


Нарушение безопасности типов может иметь большие последствия.

Тип процедуры TTreeClick не является ни типом ни подтипом экземпляра
procedure TreeClick(хотя в delphi это не сработает, поскольку в delphi -invariant type system).

Вообщем правь код.

TTreeClick=procedure(hgh:THighlihter);

вызов
TTreeClick(TreeView1.Selected.Data)(Param);


 
HRustBB   (2010-01-18 00:18) [28]


> oxffff


а возможно ли засунуть таким образом в качестве параметра процедуры типизированный указатель (указатель на переменную типа THighlihter в моем случае) и если можно, как? я если пишу


TTreeClick=procedure(hgh:^THighlihter);


вылезает ошибочка


 
HRustBB   (2010-01-18 00:28) [29]

а вот вроде так


type
PHighlihter=^THighlihter;

type
TTreeClick=procedure(hl:PHighlihter);


 
HRustBB   (2010-01-18 22:48) [30]


> Игорь Шевченко ©   (17.01.10 14:36) [25]
> делаешь объект, у которого два поля - значение параметра
> для процедуры и адрес процедуры. Для каждой ноды создаешь
> экземпляр объекта, при создании указываешь нужную процедуру
> и нужное значение параметра, node.data присваиваешь адрес
> созданного объекта, в OnClick из ноды вынимаешь объект,
> там уже и параметр и процедура, вызываешь.


Ну вот, делаю так:


type
TTreeClick = procedure(hl:PHighlihter);

type
 TTreeClickrecord = record
  data: PHighlihter;//это типизированный указатель на record
  proc: ^TTreeClick;
 end;

здесь класс формы

var
 Form8: TForm8;
 vitems: array [0..21] of TTreeClickrecord;

implementation

{$R *.dfm}

procedure TreeClick1(hl:PHighlihter);
begin
//процедура
end;

procedure TForm8.FormCreate(Sender: TObject);
var node,subnode,sub2node:TTreeNode;
begin
node:=TreeView1.Items.Add(nil,"подсветка");
subnode:=TreeView1.Items.AddChild(node,"PHP");
sub2node:=TreeView1.Items.AddChild(subnode,"CommentAttr");
vitems[0].data:=@setting.phpCommentAttr;
vitems[0].proc:=@TreeClick1;
sub2node.Data:=@vitems[0];
//...
end;

procedure TForm8.TreeView1DblClick(Sender: TObject);
var tproc:TTreeClickrecord;
begin
if not(TreeView1.Selected.Data=nil) then begin
tproc:=TTreeClickrecord(TreeView1.Selected.Data);// получаем invalid type cast
end;
end;


че на этот раз то?


 
Плохиш ©   (2010-01-18 23:04) [31]


> HRustBB   (18.01.10 22:48) [30]

Ты ответы-то читаешь?


 
HRustBB   (2010-01-18 23:19) [32]


> Плохиш


спасыба брат, слюшай да, class а не record

так вроде пока нормально )



Страницы: 1 вся ветка

Текущий архив: 2010.03.21;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.01 c
2-1263542459
Andy BitOff
2010-01-15 11:00
2010.03.21
Нумерация страниц в Ворде


1-1243255012
TStas
2009-05-25 16:36
2010.03.21
Как удалить файл в корзину?


2-1263314056
almal
2010-01-12 19:34
2010.03.21
по работе с FTP


15-1262338995
dr_creigan
2010-01-01 12:43
2010.03.21
Ядра процессоров


1-1244132608
mfender
2009-06-04 20:23
2010.03.21
Поле становится Inaccessible value