Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2010.03.21;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.54 MB
Время: 0.005 c
2-1263832168
Делфиец
2010-01-18 19:29
2010.03.21
LowerCase почему то не работает


1-1244548514
Валигози
2009-06-09 15:55
2010.03.21
Как прикрутить к своему приложению "7z.dll"?


15-1262390117
dedi
2010-01-02 02:55
2010.03.21
Оптимальный алгоритм


15-1262280863
Kerk
2009-12-31 20:34
2010.03.21
А где можно сделать онлайн плейлист и слушать?


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





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