Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   in der Laufzeit erstellte Komponenten und ihre Funktionen (https://www.delphipraxis.net/119310-der-laufzeit-erstellte-komponenten-und-ihre-funktionen.html)

BAMatze 24. Aug 2008 10:12


in der Laufzeit erstellte Komponenten und ihre Funktionen
 
Hallo an alle,

Ich hab eine Frage. Ich habe mir Turbo Delphi geladen und wie wahrscheinlich die meisten wissen, gibt es dort Einschränkungen für Komponenten von Dritten (unteranderem Indy). Ich möchte für die Arbeit ein Programm zur Steuerung einer Maschine schreiben. Die Maschine steht aus Sicherheitsgründen in einem seperaten Raum. Deswegen soll über einem 2. Rechner und TServerSocket/ TServerClient das Programm an der Maschine gesteuert werden.

Nun das Problem:

Wie initialisiere ich bei einem TServerSocket die OnClientRead-Funktion, so dass ich sie benutzen kann. Klingt zwar trivial aber bisher hatte ich immer eine Delphi Version, wo Indy direkt eingebunden war und somit über den Objektinspektor angesprochen werden konnte.

Würde mich über eure Hilfe freuen, auch wenn das eine wahrscheinlich eher triviale Frage ist.

Danke

BAMatze

DeddyH 24. Aug 2008 10:20

Re: in der Laufzeit erstellte Komponenten und ihre Funktione
 
Im Prinzip ganz einfach: Du definierst Dir eine Methode mit gleicher Signatur und kannst diese dann dem Event zuweisen. Es muss aber eine Methode sein, eine reguläre Funktion geht nicht. Ein Beispiel für einen Button:
Delphi-Quellcode:
type TMyForm = class(TForm)
private
  procedure DoOnClick(Sender: TObject);
...
end;

...

procedure TMyForm.DoOnClick(Sender: TObject);
begin
  //hier der Code der Methode
end;

...
MyButton := TButton.Create(self);
...
MyButton.OnClick := DoOnClick;
...
end.

BAMatze 24. Aug 2008 10:41

Re: in der Laufzeit erstellte Komponenten und ihre Funktione
 
Danke für deine Hilfe,

Habe jetzt folgendes Programm dazu geschrieben und es kommt zumindest beim compilieren zu keinem Fehler. Kannst ja mal schauen, ob ich einen logischen Fehler (wie z.B. Unendlich Schleife)eingebaut hab, der durch den Compiler nicht erkannt wird.

Delphi-Quellcode:
type
  TForm1 = class(TForm)
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure OnClientRead(Sender: TObject; Socket: TCustomWinSocket);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  myServer : TServerSocket;

implementation

{$R *.dfm}

procedure TForm1.OnClientRead(Sender: TObject; Socket: TCustomWinSocket);
var i : integer;
begin
  For i := 0 to myServer.Socket.ActiveConnections - 1 do
    begin
      with myServer.Socket.Connections [i] do
      if (Connected) then SendText('Hallo');
    end;

end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  myServer := TServerSocket.Create(Form1);
  myServer.Port := 6712;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  myServer.Destroy;
end;

end.

Danke nochmal

SirThornberry 24. Aug 2008 10:44

Re: in der Laufzeit erstellte Komponenten und ihre Funktione
 
Du solltest das OnClientRead auch noch zuweisen (am besten mit im OnCreate)

DeddyH 24. Aug 2008 10:44

Re: in der Laufzeit erstellte Komponenten und ihre Funktione
 
Auf die Schnelle fallen mir 2 Dinge auf:
- statt Destroy besser Free aufrufen
- Du hast die Methode noch nicht zugewiesen

BAMatze 24. Aug 2008 10:52

Re: in der Laufzeit erstellte Komponenten und ihre Funktione
 
Die beiden letzten Proceduren habe ich so abgeändert:

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  myServer := TServerSocket.Create(Form1);
  myServer.Port := 6712;
  myServer.OnClientRead := Form1.OnClientRead;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  myServer.free;
end;

DeddyH 24. Aug 2008 10:58

Re: in der Laufzeit erstellte Komponenten und ihre Funktione
 
Kleiner Verbesserungsvorschlag:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  myServer := TServerSocket.Create(Form1);
  myServer.Port := 6712;
  myServer.OnClientRead := self.OnClientRead;
end;
Man sollte niemals benannte Instanzen nehmen.

BAMatze 24. Aug 2008 11:03

Re: in der Laufzeit erstellte Komponenten und ihre Funktione
 
Danke hab ich noch verädert.

Eine kleine Zusatzfrage, wie kann ich in dem Memo die Cursorposition (der blinkende senkrechte Strich im Textfeld) ausschalten ohne gleich das ganze Memo-Feld zu deaktivieren oder kann ich die Schriftfarbe des deaktivierten Memofeldes von grau auf schwarz ändern?

DeddyH 24. Aug 2008 11:15

Re: in der Laufzeit erstellte Komponenten und ihre Funktione
 
Für den Cursor müsste HideCaret() weiterhelfen.

SirThornberry 24. Aug 2008 11:53

Re: in der Laufzeit erstellte Komponenten und ihre Funktione
 
Zitat:

Zitat von DeddyH
Kleiner Verbesserungsvorschlag:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  myServer := TServerSocket.Create(Form1);
  myServer.Port := 6712;
  myServer.OnClientRead := self.OnClientRead;
end;
Man sollte niemals benannte Instanzen nehmen.

Nicht ganz konsequent :wink: Schau dir mal den Parameter von TServerSocket.Create an.

DeddyH 24. Aug 2008 12:06

Re: in der Laufzeit erstellte Komponenten und ihre Funktione
 
:oops: Hab Erbarmen, ich bin Brillenträger :mrgreen:

BAMatze 24. Aug 2008 12:10

Re: in der Laufzeit erstellte Komponenten und ihre Funktione
 
So hab das Clientprogramm geschrieben und auch schon einige eurer Anmerkungen umgesetzt. Das Programm startet auch ohne Probleme, bis ich auf "Senden" drücke. Dann erhalte ich die Fehlermeldung: "Exeption der Klasse ESocketError mit der Meldung 'Asyncroner Socket-Fehler 10061 aufgetreten'. Da ich aber durch "localhost" eigentlich an den Client die Nachricht selbst schicke sollte das meiner Meinung nach nicht auftreten.

Delphi-Quellcode:
unit Grundclient;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ScktComp, StdCtrls;

type
  TForm1 = class(TForm)
    Bt_Senden: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure OnRead(Sender: TObject; Socket: TCustomWinSocket);
    procedure Bt_SendenClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  myClient : TClientSocket;

implementation

{$R *.dfm}

procedure TForm1.OnRead(Sender: TObject; Socket: TCustomWinSocket);
begin
  Memo1.Lines.Add('Daten vom Server');
  Memo1.Lines.Add(Socket.ReceiveText);
end;

procedure TForm1.Bt_SendenClick(Sender: TObject);
begin
  myClient.Host := 'localhost';
  myClient.Active := True;
  if myClient.active=true then
    begin
      myClient.Socket.SendText(edit2.text);
      Memo1.Lines.Add('Nachricht gesendet');
      Memo1.Lines.Add(edit2.text);
    end;
  edit2.text:=''
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Memo1.Text := 'Client getrennt';

  myClient := TClientSocket.Create(self);
  myClient.Port := 6712;
  myClient.OnRead := self.OnRead;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  myClient.Free;
end;

end.
Hoffe ihr könnt mir nochmal helfen.

Danke

DeddyH 24. Aug 2008 12:45

Re: in der Laufzeit erstellte Komponenten und ihre Funktione
 
Hast Du denn auch einen Server?

BAMatze 24. Aug 2008 12:54

Re: in der Laufzeit erstellte Komponenten und ihre Funktione
 
muss ich den trotzdem laufen lassen? das Serverprogramm war ja das Programm von vorhin.

DeddyH 24. Aug 2008 12:55

Re: in der Laufzeit erstellte Komponenten und ihre Funktione
 
Der Client verbindet sich mit einem Server. Dieser muss den Verbindungsversuch aber auch akzeptieren. Du kannst Dir aber auch einmal diesen Thread durchlesen.

BAMatze 24. Aug 2008 17:12

Re: in der Laufzeit erstellte Komponenten und ihre Funktione
 
Leider konnte mir die Seite nicht wirklich weiterhelfen, weil dort eine TTCPServer und TTCPClient benutzen und ganz andere Methoden haben. Hab es jetzt eine Weile versucht und verstanden, dass ich meinen Server mit dem Port und der lokalen Adresse anscheinend verbinden muss, damit er Anfragen abhören kann, aber noch keine Möglichkeit gefunden dies mit TServerSocket zu verbinden.

Vieleicht habt ihr noch ein paar Ideen.

BAMatze 27. Aug 2008 08:59

Re: in der Laufzeit erstellte Komponenten und ihre Funktione
 
Erstmal recht herzlichen Danke an alle die mir geholfen haben.

Hab aber noch eine weitere Frage. Ich habe die Timer-Funktion an eine Funktion der TForm angebunden, möchte dieser aber weitere Variablen übergeben. Mein Problem ist eigentlich die Angabe des richtigen Sender (TObject) dieser Funktion.

Hier meine derzeitigen Versuche:

Delphi-Quellcode:
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  Controll := TTimer.Create(self);
  Controll.Interval := 25;
  Controll.OnTimer := self.Kontrolle(Sender,Key);
  if key in [#48..#57,#44] then
    begin
      sBuffer := sBuffer + key;
    end;
end;
Wie man sieht, soll die Taste zusätzlich mitgegeben werden. Für Sender in der Funktionszuweisung Controll.OnTimer := self.Kontrolle(Sender,Key); hab ich ich schon Nil und '' angegeben aber bekomme dann immer Fehlermeldungen. Welche Angabe kann ich dort machen, damit dies nicht mehr geschieht.

DeddyH 27. Aug 2008 09:02

Re: in der Laufzeit erstellte Komponenten und ihre Funktione
 
Die Signaturen müssen exakt übereinstimmen, Du kannst die Parameterliste nicht ändern. Also bliebe Dir die Möglichkeit, eine globale Variable (lieber nicht) oder eine Property (besser) zu definieren, auf die Du im Timer-Event zugreifen kannst.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:27 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