Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.08.15;
Скачать: CL | DM;

Вниз

EVAL etc   Найти похожие ветки 

 
HIDDEN   (2002-07-31 17:36) [0]

Народ! Здравствуйте
Допустим есть процедура
Procedure ddd(...);


Procedure TForm1.ddd(...);
Begin
.....
End;

И есть строка
S:="form1.ddd(....)";
Так вот я хочу исполнить эту процедуру если есть строка вызова(S)
Возможно ли такое???


 
Eugene Lachinov ©   (2002-07-31 17:49) [1]

Если где-нибудь хранить адрес TForm1.DDD и описание его параметров, то да


 
HIDDEN   (2002-07-31 18:37) [2]

А можно подробнее про адрес и параметры


 
DiamondShark ©   (2002-07-31 18:41) [3]

У меня почему-то ощущение, что вопрос порожден более глубинными причинами. Вы расскажите немного о возникновении вопроса, может найдется какое-нибудь еще решение.


 
HIDDEN   (2002-07-31 18:46) [4]

Дело в том что в некотором месте программы выскакивает попапменю
так вот оно строится по запросу в базу по коду доступа и прочим условиям
до этого момента мы использовали соответственно процедуры оракла имена и строки вызова ессно хранились в базе
а теперь нам надо вызывать процедуры которые написаны внутри программы то есть в дельфи
И вот тут то мы и встали....Думали что-то типа Eval найти, а нету..:-(


 
Eugene Lachinov ©   (2002-07-31 19:31) [5]

В первом приближении про использование адреса и параметров,

var
ProcList : TObjectStrings; // это надо реализовать

type
TProcInfo = class
private
FParams : TList;
FProcAddr : Pointer;
FResult : Pointer;
public
constructor Create(aProcAddr : Pointer; aParams : array of Pointer; aResult : Pointer);
destructor Destroy; override;
function Execute (aRealParams : array of string) : Variant;
end;

{ TProcInfo }

constructor TProcInfo.Create(aProcAddr : Pointer; aParams : array of Pointer; aResult : Pointer);
var
i : Integer;
begin
FParams := TList.Create;
inherited Create;
FProcAddr := aProcAddr;
FResult := aResult;
for i := 0 to High(aParams) do
FParams.Add(aParams[i]);
end;

destructor TProcInfo.Destroy;
begin
FreeAndNil(FParams);
inherited Destroy
end;

function TProcInfo.Execute (aRealParams : array of string) : Variant;
begin
{ засовывание параметров в стек и вызов процедуры (функции) }
end;

procedure AddProc(const aProcName : string; aProcAddr : Pointer; aParams : array of Pointer; aResult : Pointer);
begin
ProcList.AddObject(aProcName, TProcInfo.Create(aProcAddr, aParams, aResult))
end;

function CallProc(const CompName, ProcName : string; aRealParams : array of string) : Variant;
var
i : Integer;
C : TComponent;
begin
Result := NULL;
C := FindGlobalComponent(CompName);
if C <> nil then begin
i := ProcList.IndexOf(C.ClassName + "." + ProcName);
if (i <> -1) then
Result := TProcInfo(Proclist.Objects[i]).Execute(aRealParams)
end
end;

procedure TForm1.DDD(S : string; I : Integer; D : Double);
begin

end;

procedure TForm1.Button1Click(Sender: TObject);
begin
CallProc("Form1", "DDD", ["AAAA", "1", "0.12345"])
end;

initialization
ProcList := TObjectStrings.Create;
AddProc("TForm1.DDD", @TForm1.DDD, [TypeInfo(string), TypeInfo(Integer), TypeInfo(Double)], nil);
finalization
FreeAndNil(ProcList)
end.



 
Eugene Lachinov ©   (2002-07-31 19:38) [6]

Упустил, при вызове еще указатель на компонент нужен будет


 
HIDDEN   (2002-07-31 19:40) [7]

А как быть с TObjectStrings??


 
Eugene Lachinov ©   (2002-07-31 19:42) [8]

Это наследник от TStringList, который в Destroy уничтожает объекты, которыми владеет


 
HIDDEN   (2002-07-31 20:02) [9]

Прости, где ты говоришь нужен указатель??


 
Eugene Lachinov ©   (2002-07-31 20:08) [10]

В function TProcInfo.Execute (aComponent : TComponent; aRealParams : array of string) : Variant;


 
Дмитрий_Горелов   (2002-07-31 20:53) [11]

Куда-то делась наша ТЕМА???


 
igorekg   (2002-07-31 20:56) [12]

Тему убили!!
За что????
Eugene Lachinov HELP!


 
Eugene Lachinov ©   (2002-07-31 21:01) [13]

Господа, дальше собственными силами, если это вам действительно нужно (вдруг возникло сомнение).


 
ЮЮ ©   (2002-08-01 02:21) [14]

Также подготовить обработчики onClick для пунктов меню:
TForm1.N_DoSomthingClick(Sender: TObject);
begin
...
ddd(...);
...
end;
...
TForm1.N_DoSomthingElseClick(Sender: TObject);
...
и назначать их соответствующим пунктам меню
N_DoSomthing.onClick:=N_DoSomthingClick;
N_DoSomthingElse.onClick:=N_DoSomthingElseClick;

или использовать
N_DoSomthing.Action



 
Григорий Ситнин ©   (2002-08-01 09:20) [15]

Быть может я не так понял, но:

Как я разумею - динамически создается popup-меню (имена пунктов - из базы по запросу), затем необходимо обрабатывать запуск пунктов меню и него...

А зачем для этого огород городить? Не проще всего-лишь назначить всем жлементам меню один обработчик OnClick, и в нем, в зависимости от значения (Sender as MenuItem).Caption вызывать ту или иную функцию?


 
Григорий Ситнин ©   (2002-08-01 09:21) [16]

Извините, MenuItem следует читать, как TMenuItem.


 
Eugene Lachinov ©   (2002-08-01 10:35) [17]

Да может быть огород действительно городить не стоило, может быть все достаточно статично.



Страницы: 1 вся ветка

Текущий архив: 2002.08.15;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.027 c
1-48051
V.Turecky
2002-08-04 08:40
2002.08.15
CreateProcess. Нужна информация.


1-48179
Igorek
2002-08-02 13:02
2002.08.15
Еще раз про class of


3-48007
PAVrus
2002-07-27 19:26
2002.08.15
Вторичный индекс и


3-47996
grandad
2002-07-26 10:16
2002.08.15
Нужно поставить прогу, работающую с БД accesss (mdb) от MS Office


1-48031
Вечно молодой
2002-08-03 18:35
2002.08.15
TStringList