AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Befehlsübermittlung über Internet

Ein Thema von x3no · begonnen am 8. Mai 2008 · letzter Beitrag vom 8. Mai 2008
Antwort Antwort
Seite 1 von 2  1 2      
x3no

Registriert seit: 24. Mär 2008
6 Beiträge
 
#1

Befehlsübermittlung über Internet

  Alt 8. Mai 2008, 18:29
Hi, alle zusammen!

Erst einmal vorweg ein digges Lob an 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.
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Befehlsübermittlung über Internet

  Alt 8. Mai 2008, 18:31
Du kannst doch nicht einfach einen String in eine Klassen-Instanz casten!
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
x3no

Registriert seit: 24. Mär 2008
6 Beiträge
 
#3

Re: Befehlsübermittlung über Internet

  Alt 8. Mai 2008, 18:36
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;
  Mit Zitat antworten Zitat
x3no

Registriert seit: 24. Mär 2008
6 Beiträge
 
#4

Re: Befehlsübermittlung über Internet

  Alt 8. Mai 2008, 18:36
sry doppelpos
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Befehlsübermittlung über Internet

  Alt 8. Mai 2008, 18:39
Darf ich fragen, wo du das gelernt hast?
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
x3no

Registriert seit: 24. Mär 2008
6 Beiträge
 
#6

Re: Befehlsübermittlung über Internet

  Alt 8. Mai 2008, 18:44
ähm so beim programmieren unso

bisschen googel hier bisschen google da^^
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: Befehlsübermittlung über Internet

  Alt 8. Mai 2008, 18:47
Ich versichere dir, dass deine Technik aus Post 3 nicht funktioniert.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
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
x3no

Registriert seit: 24. Mär 2008
6 Beiträge
 
#9

Re: Befehlsübermittlung über Internet

  Alt 8. Mai 2008, 18:55
Eine Frage: Was bedeutet das "strict" da?
  Mit Zitat antworten Zitat
Namenloser

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

Re: Befehlsübermittlung über Internet

  Alt 8. Mai 2008, 18:59
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:54 Uhr.
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