Форум: "Основная";
Текущий архив: 2002.08.15;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.007 c