Форум: "Начинающим";
Текущий архив: 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