Newsgroup: it.comp.lang.delphi
Titolo: Istruzioni "variabili"

Vorrei costruire un'applicazione che riceve via socket dei comandi, e che
una volta ricevuti li esegua cercando in un file di configurazione l'azione
da eseguire.
Per esempio, se il client riceve il comando "A", controlla nel file di
config. a cosa corrisponde "A".
Se nel file c'è scritto A = Edit1.Text:='Ciao', esegue Edit1.Text:='Ciao'
Il problema è che non ho la minima idea su come far eseguire a un programma
istruzioni prese da un file esterno.
Qualcuno ha un'idea anche vaga su come farlo?
Grazie,
Andrea

Allora... io ho fatto così per fare degli scherzi in ufficio :
Metti un TServerSocket sulla tua bella formettina.... poi imposti la
proprietà port ad una porta non usata (p.e. 5555)
Questo programmino lo metti sulla  macchina da comandare
poi gli entri in telnet sulla porta specificata e gli mandi i comandini che
vuoi.
ps: nel mio esempio ci sono delle bischerate, quello che deve fare lo scegli
te.
per quanto riguarda l'eseguire istruzioni contenute in un file esterno......
per ora non mi viene niente
spero di essere stato utile. CIAOUX
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ScktComp, StdCtrls, Phantom, ShellApi;
type
  TForm1 = class(TForm)
    ServerSocket: TServerSocket;
    Memo1: TMemo;
    procedure ServerSocketClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
    procedure ApriExplorer;
    procedure Chiudi;
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
implementation
uses unit2;
{$R *.dfm}
procedure TForm1.ServerSocketClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var
  Incoming : string;
begin
  Incoming := Socket.ReceiveText;
  memo1.Lines.Add(incoming);
  if Incoming = 'C' then
    Screen.Cursor := crHourGlass;
  if Incoming = 'S' then
    ApriExplorer;
  If Incoming = 'B' then
    Chiudi;
  If Incoming = 'Z' then
        ShowMessage('Maximum Licenses Limit!!!');
  If Incoming = 'F' then
      Form2.Show;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
   ServerSocket.Active := true;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
   ServerSocket.Active := false;
end;
procedure TForm1.ApriExplorer;
var i : integer;
begin
   for i := 1 to 10 do
ShellExecute(Handle,'open',PChar('
www.cracks.am/main.html'
),'','',SW_NORMAL)
;
end;
procedure TForm1.Chiudi;
begin
   ExitWindowsEx(EWX_SHUTDOWN, 0);
end;
end.

 Se nel file c'è scritto A = Edit1.Text:='Ciao', esegue Edit1.Text:='Ciao'
Devi decodificarti a mano l'espressione, ma è abbastanza complesso perchè
dovresti prevedere troppe cose.
In questo specifico caso per esempio puoi scorrerti i componenti di una form
e fermarti quando trovi un componente con il name "Edit1". Poi puoi
prevedere la proprietà "Text" a priori e da codice puoi assegnare tu la
stringa passata tipo:
If proprieta='Text' then
  (componentetrovato as TEdit).Text:=StAssegnata;
Ma non è sicuramente flessibile, non puoi prevedere tutto sarebbe troppo, al
massimo puoi vincolare le operazioni possibili e le prevedi già nel
progetto, ma io in quel caso farei un file di configurazioni più umano e non
in puro linguaggio di programmazione.
Puoi crearti per esempio un mini-linguaggio, in modo che con dei semplici
script puoi fare delle operazioni parametrizzabili base che tu prevedi in
anticipo, tipo batch DOS per intenderci, almeno così non è un lavoro troppo
esagerato.
Ciao,
  Fabio

Allora..... non so se ti potrà andare bene
nel tuo file esterno metti IL NOME delle routine da eseguire
e poi fai così....
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Hello_World(Sender: TObject);      // la tua routine da
chiamare per nome
  private
    procedure ExecuteRoutine(Instance: TObject; Name: string);
  end;
var
  Form1: TForm1;
type
  TExecute = procedure of object;
procedure TForm1.ExecuteRoutine(Instance: TObject; Name: string);
var
  Routine: TMethod;
  Execute: TExecute;
begin
  Routine.Data := Pointer(Instance);
  Routine.Code := Instance.MethodAddress(Name);
  if Routine.Code = nil then Exit;
  Execute := TExecute(Routine);
  Execute;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
  ExecuteRoutine(Form1, 'Hello_World');
end;
procedure TForm1.Hello_World(Sender: TObject);
begin
  ShowMessage('Questa è una prova');
end;
CIAOUX

cerca qualcosa su 
www.torry.net
Bye
A.