Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

pokretanje procedure iz programa?

[es] :: Pascal / Delphi / Kylix :: pokretanje procedure iz programa?

[ Pregleda: 3000 | Odgovora: 11 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

salvaric
Novi Sad

Član broj: 53995
Poruke: 204
*.adsl.eunet.rs.



+4 Profil

icon pokretanje procedure iz programa?07.05.2014. u 19:41 - pre 120 meseci
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.
Nikad izvini!
 
Odgovor na temu

reiser

Član broj: 7895
Poruke: 2314



+102 Profil

icon Re: pokretanje procedure iz programa?07.05.2014. u 19:55 - pre 120 meseci
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.
 
Odgovor na temu

salvaric
Novi Sad

Član broj: 53995
Poruke: 204
*.adsl.eunet.rs.



+4 Profil

icon Re: pokretanje procedure iz programa?07.05.2014. u 20:19 - pre 120 meseci
Hvala drugar,

radim u Lazarusu, zaboravio sam napomenuti, tako da mi ova procedure ne fercera, rtti biblioteka nepostoji za njega.
Nikad izvini!
 
Odgovor na temu

reiser

Član broj: 7895
Poruke: 2314



+102 Profil

icon Re: pokretanje procedure iz programa?07.05.2014. u 20:26 - pre 120 meseci
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;
 
Odgovor na temu

Milan Milosevic

Član broj: 67
Poruke: 932
*.dynamic.isp.telekom.rs.



+31 Profil

icon Re: pokretanje procedure iz programa?08.05.2014. u 16:06 - pre 120 meseci
Sto jednostavno ne probas
If Edit.text = nazivprocedure then pozoviprocedru
 
Odgovor na temu

salvaric
Novi Sad

Član broj: 53995
Poruke: 204
*.adsl.eunet.rs.



+4 Profil

icon Re: pokretanje procedure iz programa?10.05.2014. u 21:17 - pre 120 meseci
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!
Nikad izvini!
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: pokretanje procedure iz programa?10.05.2014. u 21:35 - pre 120 meseci
> 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.

 
Odgovor na temu

salvaric
Novi Sad

Član broj: 53995
Poruke: 204
*.adsl.eunet.rs.



+4 Profil

icon Re: pokretanje procedure iz programa?10.05.2014. u 21:49 - pre 120 meseci
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.
Nikad izvini!
 
Odgovor na temu

reiser

Član broj: 7895
Poruke: 2314



+102 Profil

icon Re: pokretanje procedure iz programa?10.05.2014. u 22:13 - pre 120 meseci
"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?
 
Odgovor na temu

salvaric
Novi Sad

Član broj: 53995
Poruke: 204
*.adsl.eunet.rs.



+4 Profil

icon Re: pokretanje procedure iz programa?10.05.2014. u 22:29 - pre 120 meseci
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
Nikad izvini!
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: pokretanje procedure iz programa?11.05.2014. u 00:25 - pre 120 meseci
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.



 
Odgovor na temu

salvaric
Novi Sad

Član broj: 53995
Poruke: 204
*.adsl.eunet.rs.



+4 Profil

icon Re: pokretanje procedure iz programa?11.05.2014. u 13:26 - pre 120 meseci
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]
Nikad izvini!
 
Odgovor na temu

[es] :: Pascal / Delphi / Kylix :: pokretanje procedure iz programa?

[ Pregleda: 3000 | Odgovora: 11 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.