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

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

EVAL etc [D5, Win95/98, Win2k]


HIDDEN ©   (2002-07-31 17:36:00) 

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


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

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


Eugene Lachinov   (2002-08-01 10:35:00) [1]

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


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

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


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

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

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

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


ЮЮ   (2002-08-01 02:21:00) [4]

Также подготовить обработчики 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


Eugene Lachinov   (2002-07-31 21:01:00) [5]

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


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

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


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

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


Eugene Lachinov   (2002-07-31 20:08:00) [8]

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


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

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


Eugene Lachinov   (2002-07-31 19:42:00) [10]

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


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

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


Eugene Lachinov   (2002-07-31 19:38:00) [12]

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


Eugene Lachinov   (2002-07-31 19:31:00) [13]

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

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.


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

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


DiamondShark   (2002-07-31 18:41:00) [15]

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


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

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


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

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


Наверх

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