|
[ salvaric @ 07.05.2014. 19:41 ] @
| Pozdrav,
interesuje me dal je moguće pretvoriti neki string u naziv procedure i pokrenuti je,
tj. dal je moguće pokenuti neku već definisanu proceduru upisom njenog naziva u neko edit polje tipa:
Code:
private
procedure PrikaziPoruku();
...
procedure TForm1.PrikaziPoruku();
begin
ShowMessages('poruka');
....
end;
i posle pokretanja programa koji sadrzi edit polje uneti naziv i pokrenuti je pritiskom na neko dugme ili bilo koji drugi dogadjaj. |
[ reiser @ 07.05.2014. 19:55 ] @
Mozes pomocu RTTI-ja
Code:
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
public
procedure NekaMetoda(const AMessage: String);
end;
var
Form1: TForm1;
implementation
uses
System.Rtti;
{$R *.dfm}
function ExecMethod(const AClass: TClass; const AMethod: String; const AArgs: array of TValue): Boolean;
var
r: TRttiContext;
t: TRttiType;
m: TRttiMethod;
begin
t := R.GetType(AClass);
m := t.GetMethod(AMethod);
if Assigned(m) then
begin
m.Invoke(AClass.Create, AArgs);
Exit(TRUE);
end;
Exit(FALSE);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
ExecMethod(TForm1, 'NekaMetoda', ['neka poruka']);
end;
procedure TForm1.NekaMetoda(const AMessage: String);
begin
ShowMessage(AMessage);
end;
end.
[ salvaric @ 07.05.2014. 20:19 ] @
Hvala drugar,
radim u Lazarusu, zaboravio sam napomenuti, tako da mi ova procedure ne fercera, rtti biblioteka nepostoji za njega.
[ reiser @ 07.05.2014. 20:26 ] @
Probaj MethodAddress(), s' tim sto onda moras da znas unapred deklaraciju funkcije. Koliko vidim, Lazarus ima ovo. Pisano iz glave, ali ce ti dati ideju:
Code:
TNekaFunkcija = procedure(const AParametar: String) of object;
PNekaFunkcija = ^TNekaFunkcija;
TNekaKlasa = class
private
function IzvrsiMetodu(const AMetoda, AParametar: String): Boolean;
public
published
procedure NekaMetoda(const AParametar: String);
end;
function TNekaKlasa.IzvrsiMetodu(const AMetoda, AParametar: String): Boolean;
var
method_addr: PNekaFunkcija;
begin
method_addr := self.MethodAddress(AMetoda);
if not Assigned(method_addr) then
Exit(FALSE);
method_addr^(AParametar);
Exit(TRUE);
end;
procedure TNekaKlasa.NekaMetoda(const AParametar: String);
begin
ShowMessage(AParametar);
end;
[ Milan Milosevic @ 08.05.2014. 16:06 ] @
Sto jednostavno ne probas
If Edit.text = nazivprocedure then pozoviprocedru
[ salvaric @ 10.05.2014. 21:17 ] @
Hteo sam da smestim nazive procedura i funkcija u jednu tabelu (.mdb), i da se pokreću po potrebi, hteo sam da izbegnem if varijantu svake procedure, pošto planiram da stalno nadograđujem iste, pa da nemoram pravim kilometarski kod ako to nije potrebno.
Pokušao sam pomoću prethodnog predloga, al neradi.
U svakom slučaju hvala!
[ savkic @ 10.05.2014. 21:35 ] @
> Hteo sam da smestim nazive procedura i funkcija u jednu tabelu (.mdb), i da se pokreću po potrebi, hteo sam da izbegnem if varijantu svake procedure, pošto planiram da stalno
> nadograđujem iste, pa da nemoram pravim kilometarski kod ako to nije potrebno.
Ako pozivaš metode po nazivu tu je problem kako proslediti argumente...
Pogledaj da iskoristiš neki od postoječih skriptova za pascal (npr. www.remobjects.com/ps.aspx), dobićeš daleko veću fleksibilnost.
[ salvaric @ 10.05.2014. 21:49 ] @
Dal se može izvršiti neka procedura upisana u nekom stringlist-u il tako nešto, tj. nemora imati naziv već sadržaj koda?
Čak procedure mogu imati samo naziv bez argumenata tipa "Ispis()", samo da je mogu izvrsiti na neki način.
[ reiser @ 10.05.2014. 22:13 ] @
"Pokušao sam pomoću prethodnog predloga, al neradi."
Mozda kada bi nam dao vise informacije zasto "ne radi", neko bi ti pomogao. Ako metoda postoji u Lazarusu, onda sigurno ima neku svrhu, i sigurno radi, samo treba da se napise kod ispravno. Sta si pokusao, sta ne radi, zasto ne radi, kakvu gresku javlja?
[ salvaric @ 10.05.2014. 22:29 ] @
Code: unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;
type
TNekaFunkcija = procedure(const AParametar: String) of object;
PNekaFunkcija = ^TNekaFunkcija;
type
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
function IzvrsiMetodu(const AMetoda, AParametar: String): Boolean;
{ private declarations }
public
published
procedure NekaMetoda(const AParametar: String);
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.Button1Click(Sender: TObject);
begin
IzvrsiMetodu('NekaMetoda','poruka');
end;
function TForm1.IzvrsiMetodu(const AMetoda, AParametar: String): Boolean;
var
method_addr: PNekaFunkcija;
begin
method_addr := self.MethodAddress(AMetoda);
if not Assigned(method_addr) then
Exit(FALSE);
method_addr^(AParametar);
Exit(TRUE);
end;
procedure TForm1.NekaMetoda(const AParametar: String);
begin
ShowMessage(AParametar);
end;
end.
izbaci poruku: poruka
[ savkic @ 11.05.2014. 00:25 ] @
Code:
type
TNekaFunkcija = procedure(const AParametar: string) of object;
type
TForm1 = class(TForm)
btn1: TButton;
procedure btn1Click(Sender: TObject);
private
function IzvrsiMetodu(const AMetoda, AParametar: String): Boolean;
public
published
procedure NekaMetoda(const AParametar: String);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{ TForm1 }
procedure TForm1.NekaMetoda(const AParametar: String);
begin
ShowMessage(AParametar);
end;
procedure TForm1.btn1Click(Sender: TObject);
begin
IzvrsiMetodu('NekaMetoda','poruka');
end;
function TForm1.IzvrsiMetodu(const AMetoda, AParametar: String): Boolean;
var
Method: TMethod;
Exec: TNekaFunkcija;
begin
Method.Code := MethodAddress(AMetoda);
if Assigned(Method.Code) then
begin
Method.Data := Self;
Exec := TNekaFunkcija(Method);
Exec(AParametar);
end;
end;
end.
[ salvaric @ 11.05.2014. 13:26 ] @
Hvala Savkiću, to je to!
Zahvaljujem se i ostalima na pomoći i sugestijama, možete zaključati temu.
[Ovu poruku je menjao salvaric dana 11.05.2014. u 22:07 GMT+1]
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|