Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 11 odgovora
  • 4.137 pregleda

Najnovija ↓

pokretanje procedure iz programa? 07.05.2014. u 20:41 · pre 151 mesec #1
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.
Potpis
Nikad izvini!
Re: pokretanje procedure iz programa? 07.05.2014. u 20:55 · pre 151 mesec #2
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.
Re: pokretanje procedure iz programa? 07.05.2014. u 21:19 · pre 151 mesec #3
Hvala drugar,

radim u Lazarusu, zaboravio sam napomenuti, tako da mi ova procedure ne fercera, rtti biblioteka nepostoji za njega.
Potpis
Nikad izvini!
Re: pokretanje procedure iz programa? 07.05.2014. u 21:26 · pre 151 mesec #4
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;
Re: pokretanje procedure iz programa? 10.05.2014. u 22:17 · pre 151 mesec #6
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!
Potpis
Nikad izvini!
Re: pokretanje procedure iz programa? 10.05.2014. u 22:35 · pre 151 mesec #7
> 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.
Potpis
Do not be a help vampire (http://slash7.com/pages/vampires), use the google.

How to ask questions the smart way:
http://www.catb.org/~esr/faqs/smart-questions.html
http://solair.eunet.rs/~fangor...stions/smart-questions.sr.html
Re: pokretanje procedure iz programa? 10.05.2014. u 22:49 · pre 151 mesec #8
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.
Potpis
Nikad izvini!
Re: pokretanje procedure iz programa? 10.05.2014. u 23:13 · pre 151 mesec #9
"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?
Re: pokretanje procedure iz programa? 10.05.2014. u 23:29 · pre 151 mesec #10
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
Potpis
Nikad izvini!
Re: pokretanje procedure iz programa? 11.05.2014. u 01:25 · pre 151 mesec #11
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.


Potpis
Do not be a help vampire (http://slash7.com/pages/vampires), use the google.

How to ask questions the smart way:
http://www.catb.org/~esr/faqs/smart-questions.html
http://solair.eunet.rs/~fangor...stions/smart-questions.sr.html
Re: pokretanje procedure iz programa? 11.05.2014. u 14:26 · pre 151 mesec
izmenjeno 1 put, poslednji put salvaric 11.05.2014. u 22:07
  1. salvaric11.05.2014. u 22:07zapis iz teksta poruke
#12
Hvala Savkiću, to je to!

Zahvaljujem se i ostalima na pomoći i sugestijama, možete zaključati temu.
Potpis
Nikad izvini!
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme