![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Подскажите возможно ли вызвать процедуру имя которой хранится в переменной. То-есть у меня такая ситуация: есть много закладок(tabsheet), на них огромное количество компонентов используют один и тот же обработчик, хочу в обработчике реализовать такую вещь:
s:='ShowText'+IntToStr(PageControl1.ActivePageInde x+1); то-есть есть набор процедур ShowText1, ShowText2 итд и надо если первая вкладка открыта то чтоб выполнялась первая процедура и т.д. Господа программисты возможно ли такое реализовать ? |
|
#2
|
|||
|
|||
|
Можно. Читать в сторону RTTI.
А можно обойтись и без этого, но будет больше работы - надо создать базовый фрейм. В нем пишешь свою процедуру ShowText. Далее от него наследуешь нужное тебе кол-во фреймой (для каждой вкладки свой фрейм). В наследниках перекрываешь эту процедуру ShowText. Далее протос получаешь с вкладки ее фрейм и просто вызываешь ShowText. |
|
#3
|
|||
|
|||
|
Цитата:
![]() |
|
#4
|
|||
|
|||
|
Как вариант:
Код:
uses
ObjAuto,
type
TMyClass = class
public
{$METHODINFO ON}
function test4(N:integer; S:String):String;
procedure test5;
{$METHODINFO OFF}
published
end;
implementation
function TMyClass.test4(N:integer; S:String):String;
begin
result := 'test string: '+S+' ('+IntToStr(N)+')';
end;
procedure TMyClass.test5;
begin
ShowMessage(Self.ClassName);
end;
procedure TForm1.SpeedButton1Click(Sender: TObject);
Var
C:TMyClass;
M:PMethodInfoHeader;
V :Variant;
begin
C := TMyClass.Create;
try
M := GetMethodInfo(C, 'test4');
if M <> nil then begin
V := ObjectInvoke(C, M, [1, 2], [55, 'string']);
ShowMessage(trim(V));
end
else begin
ShowMessage('GetMethodInfo (test4): Error');
end;
M := GetMethodInfo(C, 'test5');
if M <> nil then begin
ObjectInvoke(C, M, [], []);
end
else begin
ShowMessage('GetMethodInfo (test5): Error');
end;
finally
C.Free;
end;
end;
Последний раз редактировалось roamer, 18.02.2012 в 20:01. |