Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Befehlsübermittlung über Internet (https://www.delphipraxis.net/113499-befehlsuebermittlung-ueber-internet.html)

x3no 8. Mai 2008 18:29


Befehlsübermittlung über Internet
 
Hi, alle zusammen!

Erst einmal vorweg ein digges Lob an DP :dp:! Die Seite hat mir schon zu vielen Problemen
eine gute Lösung geboten.

Doch nun hab ich ein Problem, mit dem ich nicht weiter komme:

Delphi-Quellcode:
type
  TNachricht = class
  public
    procedure Execute(Strings : TStringList); virtual; abstract;
  end;

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

//...

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);
  TNachricht(Strings[0]).Execute(Strings); // Hier kommt eine Zugriffsverletzung
                                           // vermutlich durch den cast
end;
Also: Was es später werden soll ist eine Befehlsübermittlung per IndyClient.

Vorher hatte ich den string mit einer case Struktur abgetastet, aber es sollte
vll noch bessere Möglichkeiten geben, und das soll ein Ansatz darstellen.

Falls jmd das Problem mit der Zugriffsverletzung lösen kann, oder mit sagen kann,
wie ich so eine Befehlsübermittlung programmieren kann wäre ich sehr dankbar.

Meine Vermutung ist noch, dass der Fehler am Cast liegt, jedoch weiß ich nicht warum.

Apollonius 8. Mai 2008 18:31

Re: Befehlsübermittlung über Internet
 
Du kannst doch nicht einfach einen String in eine Klassen-Instanz casten!

x3no 8. Mai 2008 18:36

Re: Befehlsübermittlung über Internet
 
Zitat:

Zitat von Apollonius
Du kannst doch nicht einfach einen String in eine Klassen-Instanz casten!

Ich habs daher abgeleitet:

Delphi-Quellcode:
type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure FormActivate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  Btns : array [1..2] of TButton;
implementation

{$R *.dfm}

procedure TForm1.FormActivate(Sender: TObject);
var i : integer;
begin
  for i := 1 to 2 do
   Btns[i] := TButton('Button' + IntToStr(i));
end;

x3no 8. Mai 2008 18:36

Re: Befehlsübermittlung über Internet
 
sry doppelpos :(

Apollonius 8. Mai 2008 18:39

Re: Befehlsübermittlung über Internet
 
:shock: Darf ich fragen, wo du das gelernt hast?

x3no 8. Mai 2008 18:44

Re: Befehlsübermittlung über Internet
 
ähm so beim programmieren unso

bisschen googel hier bisschen google da^^

Apollonius 8. Mai 2008 18:47

Re: Befehlsübermittlung über Internet
 
Ich versichere dir, dass deine Technik aus Post 3 nicht funktioniert.

Namenloser 8. Mai 2008 18:50

Re: Befehlsübermittlung über Internet
 
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 :party:

x3no 8. Mai 2008 18:55

Re: Befehlsübermittlung über Internet
 
Eine Frage: Was bedeutet das "strict" da?

Namenloser 8. Mai 2008 18:59

Re: Befehlsübermittlung über Internet
 
Wenn man nur private oder protected schreibt, kann man innerhalb der gleichen Unit imemrnoch auf die felder zugreifen. Das finde ich irgendwie inkonsequent. Das strict bewirkt, dass wirklich nur die Klasse darauf zugreifen kann.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:30 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz