Einzelnen Beitrag anzeigen

Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#8

Re: Befehlsübermittlung über Internet

  Alt 8. Mai 2008, 18:50
Ich glaube, du hast da irgendwas verwechselt. Du meinst sicher TButton(FINDCOMPONENT('Button1'));
Wie auch immer, ich habe heir mal eine kleine ungetestete Lösung vorbereitet: Die Basisklasse TNachricht verwaltet hier eine interne Liste mit Unterklassen. Dabei benutze ich TClassList aus der unit contnrs. Jede abgeleitete Klasse kann sich dort registrieren (Musst du manuell aufrufen (siehe initialization-abschnitt). Ich hätte schwören können, ich wollte da noch irgendwas automatisieren...). Per TNachricht.getSubClass(klassenname) wird die passende klasse aus der liste gesucht und zurückgegeben.
Delphi-Quellcode:
unit Unit1;

interface

uses
  classes, types, contnrs;

type
  TNachrichtClass = class of TNachricht;
  TNachricht = class
  strict protected
    class var fSubClasses: TClassList;
    class procedure Register_Class; virtual;
  public
    class function getSubClass(const ClassName: string): TNachrichtClass;
    procedure Execute(Strings : TStringList); virtual; abstract;
  end;

type
  TKarteHinzufügen = class(TNachricht)
  strict private
    class procedure Register_Class; override;
  public
    procedure Execute(Strings : TStringList); override;
  end;

//...

implementation

var
  AddKarte : TNachricht;

//...
procedure TKarteHinzufügen.Execute(Strings : TStringList);
var InfoFile : TextFile;
    Info : string;
begin
//...
end;

procedure TFMain.FormCreate(Sender: TObject);
begin
  AddKarte := TKarteHinzufügen.Create;
  //...
end;

//...
// Client sendet string (Inhalt: AddKarte,...)
//...

procedure TFMain.ServerExecute(AContext: TIdContext);
var Strings : TStringList;
    //test : TNachricht;
begin
  Strings := TStringList.Create;
  Strings.CommaText := AContext.Connection.IOHandler.Readln;
  //test := TNachricht(Strings[0]);
  //test.Execute(strings);
  with TNachricht.getSubClass[strings[0]].create do
  begin
    Execute(Strings);
  end;
end;

{ TNachricht }

class procedure TNachricht.Register_Class;
begin
  // nix
end;

class function TNachricht.getSubClass(const ClassName: string): TNachrichtClass;
begin
  result := TNachrichtClass(fSubClasses[classname]);
end;

{ TKarteHinzufügen }

class procedure TKarteHinzufügen.register_Class;
begin
  fSubClasses.Add(Self);
end;

initialization

TNachricht.SubClasses := TClassList.Create;
Tkartehinzufügen.Register_Class;

end.
Logischerweise ungetestet, da delphi die ganzen bezeichner nicht kennt und ich zu faul bin, ein demoprojekt zu erstellen.

Btw: Herlich Willkommen in der DP
  Mit Zitat antworten Zitat