![]() |
TClientSocket - OnError Event per Code zuweisen
Hi,
habe gleich das nächste Problem bezüglich der TClientSocket Komponente. Beim Erstellen einer TClientSocket Komponente per Code möchte ich der Komponente gerne ein OnError-Event zuweisen. Wie kann ich das machen? Bei der Übergabe der Parameter liegt das Problem... Hier der Code:
Delphi-Quellcode:
TempClient := TClientSocket.Create(frmMain);
TempClient.Name := 'SocketNr1'; TempClient.Port := 3341; TempClient.OnError := ClientError(???); |
Re: TClientSocket - OnError Event per Code zuweisen
Moin Christian,
Du musst Dir einfach eine (wichtig!) Methode (Prozedur/Funktion geht nicht), erstellen, die den Aufbau/Typ des OnError-Events hat, und kannst diese dann direkt zuweisen. Beispiel mit OnClick:
Delphi-Quellcode:
// Manuell erstellte Methode vom Typ TNotifyEvent
procedure TForm1.ButtonClick(Sender: TObject); begin end; // Zuweisung Button.OnClick := ButtonClick; |
Re: TClientSocket - OnError Event per Code zuweisen
Okay, wären wir schonmal einen Schritt näher ;-)
Nun habe ich folgendes probiert:
Delphi-Quellcode:
TempClient.OnError := ClientError;
Delphi-Quellcode:
Anschließend bekomme ich folgende Fehlermeldung:
procedure ClientError(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); begin // ... end; Zitat:
|
Re: TClientSocket - OnError Event per Code zuweisen
Moin Christian,
warum schreibe ich eigentlich extra, dass es wichtig ist eine Methode zu deklarieren, und nicht eine Funktion oder Prozedur, wenn Du dann doch eine Prozedur definierst? ;-) Du kannst die, z.b., als Methode im Formular unterbringen. |
Re: TClientSocket - OnError Event per Code zuweisen
Zitat:
Ich habe das bisher nur mit anderen Komponenten gemacht z.B. mit Labels und da hat folgendes immer geklappt:
Delphi-Quellcode:
Deswegen dachte ich, dass die alt bekannte Variante funktioniert, an die ich mich durch dich wieder erinnern konnte *g*.
procedure LabelClick (Sender : TObject);
begin ShowMessage('Label geklickt'); end; procedure TForm1.Button1Click(Sender: TObject); begin Label1.OnClick := LabelClick; end; Zitat:
|
Re: TClientSocket - OnError Event per Code zuweisen
Moin Christian,
Zitat:
Eine Methode ist eine Funktion/Prozedur einer Klasse, Z.B. das Button1Click ist eine Methode der Klasse TForm1. So geht es
Delphi-Quellcode:
TForm1 = class(TForm)
//... // Beispiel einer häufig vorkommenden Methode procedure Button1Click(Sender: TObject); //... procedure ClientError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;var ErrorCode: Integer); //... private //... public //... end; //... implementation procedure TForm1.ClientError(Sender: TObject;Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); begin //... end; |
Re: TClientSocket - OnError Event per Code zuweisen
Okay, jetzt habe ich das Problem verstanden.
Ich habe in meinem Beispiel natürlich TForm1.LabelClick geschrieben, nicht wie im obrigen Beispiel nur LabelClick. Die Sache ist nur, dass ich eine extra Unit für meine Funktionen erstellt habe. Ich habe also keine Form bzw. Klasse in der Unit. Wie mache ich das in diesem Fall? Natürlich kann ich die Funktion auch in eine andere Unit mit Klasse einbauen, aber mich würde mal die klassenlose Variante interessieren... |
Re: TClientSocket - OnError Event per Code zuweisen
Moin Christian,
dann bau Dir doch eine Dummyklasse.
Delphi-Quellcode:
Wenn Du die Methoden dann als Klassenmethoden deklarierst, brauchst Du noch nicht einmal eine Instanz der Klasse zu bilden, um die Methoden nutzen zu können (TMyDummy kann auch in einer anderen Unit deklariert werden)
type
TMyDummy = class(TObject) public class procedure LabelClick(Sender: TObject); end; implementation class procedure TMyDummy.LabelClick (Sender : TObject); begin ShowMessage('Label geklickt'); end; procedure TForm1.Btn1Click(Sender: TObject); begin lbl1.OnClick := TMyDummy.LabelClick; end; |
Re: TClientSocket - OnError Event per Code zuweisen
Okay, danke schonmal bis hierhin! :-D
Nur warum muss ich vor die Prozedur class schreiben? Wenn ich das Beispiel mit dem Laben so aufschreibe, geht´s ja auch...wieso das Client-Beispiel nicht?
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Label1: TLabel; procedure LabelClick(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.LabelClick(Sender: TObject); begin ShowMessage('Label geklickt!'); end; procedure TForm1.Button1Click(Sender: TObject); begin Label1.OnClick := LabelClick; end; end. |
Re: TClientSocket - OnError Event per Code zuweisen
Moin Christian,
das class ist nicht notwendig, aber dann musst Du, um die Methode nutzen zu können, eine Instanz der Klasse bilden (MyDummy := TMyDummy.Create;). Klassenmethoden können aber genutzt werden, ohne dass man eine Instanz erzeugen muss, dafür kann man in diesen nur nicht alles nutzen, was man in einer "normalen" Methode nutzen könnte (Felder der Klasse, Eigenschaften, "normale" Methoden, self verweist auf di e Klasse, nicht auf das Objekt). Diese Einschränkungen dürften aber in dem Zusammenhang, in dem Du es nutzen willst, keine Rolle spielen (zumindest so wie es jetzt aussieht). Anderenfalls lässt Du das class weg, und legst Dir ein Feld, z.B., in Deinem Formular vom Typ der Dummyklasse an. Mal ein Beispiel mit beiden Varianten. Dazu benötigst Du nur ein Formular, und zwei Button.
Delphi-Quellcode:
type
TMyDummyNormal = class(TObject) public procedure MyClick(Sender: TObject); end; TMyDummyClass = class(TObject) public class procedure MyClick(Sender: TObject); end; type TForm1 = class(TForm) btnNormal: TButton; btnClass: TButton; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private { Private declarations } FMyDummyNormal : TMyDummyNormal; public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} // "normale" Methode procedure TMyDummyNormal.MyClick(Sender: TObject); begin ShowMessage('NORMAL'); end; // Klassenmethode class procedure TMyDummyClass.MyClick(Sender: TObject); begin ShowMessage('CLASS'); end; procedure TForm1.FormCreate(Sender: TObject); begin // Instanz der Klasse erzeugen FMyDummyNormal := TMyDummyNormal.Create; // Methode zuweisen // Man beachte das F, denn es wird die // Instanz FMyDummyNormal der Klasse TMyDummyNormal benutzt btnNormal.OnClick := FMyDummyNormal.MyClick; // Methode zuweisen // Man beachte des T, denn es wird direkt die // Klassenmethode benutzt btnClass.OnClick := TMyDummyClass.MyClick; end; procedure TForm1.FormDestroy(Sender: TObject); begin // Instanz wieder freigeben FreeAndNil(FMyDummyNormal); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:42 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