Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

как вызвать процедуру по ссылке?


Страницы:   1 2

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]


> можно


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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо