Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
14-48275
MBo
2002-07-18 12:13
2002.08.15
---|Ветка была без названия|---


1-48132
PONTIY
2002-08-01 11:40
2002.08.15
Проверка каталога на существование


1-48067
eruc
2002-08-04 14:53
2002.08.15
AppBar & Popupmenu


1-48036
V.Turecky
2002-08-03 15:31
2002.08.15
Как организовать выход по Esc?


3-47955
sdram
2002-07-18 11:23
2002.08.15
Как прочитать базу из





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский