![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
как вызвать процедуру по ссылке?
HRustBB © (2010-01-14 20:01:00)добавляем в 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;
HRustBB (2010-01-18 23:19:00) [1]
> Плохиш
спасыба брат, слюшай да, class а не record
так вроде пока нормально )
Плохиш (2010-01-18 23:04:00) [2]
> HRustBB (18.01.10 22:48) [30]
Ты ответы-то читаешь?
HRustBB (2010-01-18 22:48:00) [3]
> Игорь Шевченко © (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;
че на этот раз то?
HRustBB (2010-01-18 00:28:00) [4]а вот вроде так
type
PHighlihter=^THighlihter;
type
TTreeClick=procedure(hl:PHighlihter);
HRustBB (2010-01-18 00:18:00) [5]
> oxffff
а возможно ли засунуть таким образом в качестве параметра процедуры типизированный указатель (указатель на переменную типа THighlihter в моем случае) и если можно, как? я если пишу
TTreeClick=procedure(hgh:^THighlihter);
вылезает ошибочка
oxffff (2010-01-17 16:48:00) [6]
> HRustBB (17.01.10 13:43) [21]
Нарушение безопасности типов может иметь большие последствия.
Тип процедуры TTreeClick не является ни типом ни подтипом экземпляра
procedure TreeClick(хотя в delphi это не сработает, поскольку в delphi -invariant type system).
Вообщем правь код.
TTreeClick=procedure(hgh:THighlihter);
вызов
TTreeClick(TreeView1.Selected.Data)(Param);
Плохиш (2010-01-17 15:00:00) [7]
> HRustBB (17.01.10 13:43) [21]
Я что-то не понял, судя по приведённому коду, процедура одна для всех нодов, только параметр меняется?
Игорь Шевченко (2010-01-17 14:36:00) [8]делаешь объект, у которого два поля - значение параметра для процедуры и адрес процедуры. Для каждой ноды создаешь экземпляр объекта, при создании указываешь нужную процедуру и нужное значение параметра, node.data присваиваешь адрес созданного объекта, в OnClick из ноды вынимаешь объект, там уже и параметр и процедура, вызываешь.
HRustBB (2010-01-17 14:01:00) [9]
> а уже никак... т.к. для вариабельных данных используется
> Data нода, а ты это место занял под адрес неизменной процедуры.
> теперь только все заново
блин, ну тогда подумаю пока в другом направлении
sniknik (2010-01-17 14:00:00) [10]> при вызове по указателю передать определенное значение параметра
в типе процедуры писать с параметром, таким же как в основной.
> я забыл пояснить что для каждого нода ...
а уже никак... т.к. для вариабельных данных используется Data нода, а ты это место занял под адрес неизменной процедуры.
теперь только все заново.
p.s. объяснять надо сразу и полно, как делаешь, не думая о том надо нам это или нет.
HRustBB (2010-01-17 13:51:00) [11]
> а вот как сделать чтобы в procedure TreeClick(hgh:THighlihter);
> при вызове по указателю передать определенное значение
> параметра hgh:THighlihter.
я забыл пояснить что для каждого нода в TreeView1 параметр hgh:THighlihter должен иметь разное значение, тоесть значение параметру hgh:THighlihter задается в зависимости от того по какому ноду кликнем.
HRustBB (2010-01-17 13:43:00) [12]
> автор, завязывай партизанить, ты не в гестапо и никому не
> надо вытягивать из тебя клещами детали, хочется просто поговорить,
> есть специальная конференция
прошу прощения, какие могут быть секреты, просто я не думал что значение ппеременной имеет для вас какоето значение.
Вобщем излагаю все от и до:
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 это класс с настройками для моей программки
Игорь Шевченко (2010-01-17 13:15:00) [13]автор, завязывай партизанить, ты не в гестапо и никому не надо вытягивать из тебя клещами детали, хочется просто поговорить, есть специальная конференция
Игорь Шевченко (2010-01-17 13:14:00) [14]
> при вызове по указателю передать определенное значение параметра
> hgh:integer
а чему должно быть значение параметра ?
HRustBB (2010-01-17 13:04:00) [15]
> Игорь Шевченко © (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 12:43:00) [16]Раздел справки "Procedural Types".
Игорь Шевченко (2010-01-17 12:38:00) [17]Я так и не понял, что тебе надо
HRustBB (2010-01-17 12:15:00) [18]ну как, я уже пол дня бьюсь, пишу:
var ii:integer;
procedure TreeClick1(i:integer);
begin
//процедурка
end;
sub2node:=TreeView1.Items.AddChild(subnode,'CommentAttr');
sub2node.Data:=@TreeClick1(ii);
всеравно ошибка variable required, как еще решить можно подскажите пожалуйсто
HRustBB (2010-01-17 11:04:00) [19]я пишу так:
procedure TreeClick1(i:integer);
begin
//процедурка
end;
sub2node:=TreeView1.Items.AddChild(subnode,'CommentAttr');
sub2node.Data:=@TreeClick1(1);
выдает ошибочку требуется переменная
HRustBB (2010-01-17 10:53:00) [20]
> можно
Вы бы мне очень помогли еслиб объяснили каким образом ))