Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > вызов функции по имени


Автор: Budy 28.1.2006, 09:05
:Приветствую
Видел подобную фишку в C и Java (человек за две минуты такую пишет):
в поле ввода указывает как зовут ту или иную ф-цию в языке программирования, указывает ей несколько параметров и хоп, она выдает ответ или проводит какуюлибо операцию.
то есть прога заранее не знает какие функции будут вызываться...
дак вот, меня такая штука заинтерисовала, может кто знает мона ли в Delphi такую замутить?

Автор: Guedda 28.1.2006, 09:21
Можно, но с помощью WinApi. Тебе в тот раздел.

Автор: Yanis 28.1.2006, 09:31
Как вариант, создай DLL с нужными функциями, а потом подгружай их при помощи LoadLibrary. А ещё тебе наверное будет интересно глянуть на http://www.fastreport.ru/ru/products/products.php?BID=5.

Автор: Msl 28.1.2006, 09:40
QA From DKB:
execute a method by name;
Author: Tomas Rutkauskas
Цитата


Answer:

Here is an example that executes a method by name.
Note that the method to be called (in the example that is SomeMethod)
must be declared as published, otherwise MethodAddress wil return nil.


{ ... }
type
  PYourMethod = ^TYourMethod;
  TYourMethod = procedure(S: string) of object;

procedure TMainForm.Button1Click(Sender: TObject);
begin
  ExecMethodByName('SomeMethod');
end;

procedure TMainForm.ExecMethodByName(AName: string);
var
  PAddr: PYourMethod;
  M: TMethod;
begin
  PAddr := MethodAddress(AName);
  if PAddr <> nil then
  begin
    M.Code := PAddr;
    M.Data := Self;
    TYourMethod(M)('hello');
  end;
end;

procedure TMainForm.SomeMethod(S: string);
begin
  ShowMessage(S);
end;

Добавлено @ 09:55
Этот вызов по имени для динамической загрузки из DLL:
Код


procedure TForm1.btnShowBackupDlgClick(Sender: TObject);
var
 hDLL: THandle;

 //lpmCopy: 
function (lpszSrce, lpszDest, lpszHelp, lpszMask: pChar; bVerCheck, bPrompt: boolean): boolean;
begin

 @lpmCopy := nil;
 hDLL := LoadLibrary('cw_bck.dll'); {will work if dll is in the path}
 if hDLL > HINSTANCE_ERROR then
  try
   @lpmCopy := GetProcAddress(hDLL,'ShowBackupDlg');
   if Assigned(lpmCopy) then
    lpmCopy('C:\DBD\',
            'C:\DBD\backup',
            'C:\DBD\DBD.HLP',
            '*.*',false,true)
  finally
   FreeLibrary(hDLL);
  end;
end;
)

Автор: Budy 29.1.2006, 14:12
Msl, сенк, хороший пример, правда процедуры и функции получается использовать только моего типа TMainForm (по примеру №1)

всем спасибо, но всеже не то что надо.

приведу пример:
в Math дофига всяких тригонометрических функций. Тема такая: юзер в Edit1 указывает (например) cos, а в Edit2 - агрумент (например) 1,7, жмет кнопку, а прога хлоп посчитала и вывела ответ

Автор: ivan219 29.1.2006, 15:08
Как вариант использовать ComboBox с задаными функциями а в Edit писать значение.

Автор: Демо 29.1.2006, 17:34
Используй WSH - Windows Script host и ActiveX к нему.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)