![]() |
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:
Also: Was es später werden soll ist eine Befehlsübermittlung per IndyClient.
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; 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. |
Re: Befehlsübermittlung über Internet
Du kannst doch nicht einfach einen String in eine Klassen-Instanz casten!
|
Re: Befehlsübermittlung über Internet
Zitat:
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; |
Re: Befehlsübermittlung über Internet
sry doppelpos :(
|
Re: Befehlsübermittlung über Internet
:shock: Darf ich fragen, wo du das gelernt hast?
|
Re: Befehlsübermittlung über Internet
ähm so beim programmieren unso
bisschen googel hier bisschen google da^^ |
Re: Befehlsübermittlung über Internet
Ich versichere dir, dass deine Technik aus Post 3 nicht funktioniert.
|
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:
Logischerweise ungetestet, da delphi die ganzen bezeichner nicht kennt und ich zu faul bin, ein demoprojekt zu erstellen.
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. Btw: Herlich Willkommen in der DP :party: |
Re: Befehlsübermittlung über Internet
Eine Frage: Was bedeutet das "strict" da?
|
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 21:54 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz