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 TClientSocket - OnError Event per Code zuweisen (https://www.delphipraxis.net/78622-tclientsocket-onerror-event-per-code-zuweisen.html)

Yheeky 8. Okt 2006 00:45


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(???);

Christian Seehase 8. Okt 2006 00:51

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;

Yheeky 8. Okt 2006 01:16

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:
procedure ClientError(Sender: TObject;
  Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
  var ErrorCode: Integer);
begin
// ...

end;
Anschließend bekomme ich folgende Fehlermeldung:
Zitat:

[Fehler] Funktionen.pas(507): Inkompatible Typen: Methodenzeiger und reguläre Prozedur
:cry:

Christian Seehase 8. Okt 2006 02:03

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.

Yheeky 8. Okt 2006 10:50

Re: TClientSocket - OnError Event per Code zuweisen
 
Zitat:

Zitat von Christian Seehase
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? ;-)

Stimmt :lol: :oops:

Ich habe das bisher nur mit anderen Komponenten gemacht z.B. mit Labels und da hat folgendes immer geklappt:

Delphi-Quellcode:
procedure LabelClick (Sender : TObject);
begin
ShowMessage('Label geklickt');

end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Label1.OnClick := LabelClick;

end;
Deswegen dachte ich, dass die alt bekannte Variante funktioniert, an die ich mich durch dich wieder erinnern konnte *g*.

Zitat:

Zitat von Christian Seehase
Du kannst die, z.b., als Methode im Formular unterbringen.

Ich hab bisher nur mit procedures und functionen gearbeitet...wie mache ich denn eine Methode? Vielleicht hab ich´s auch schon gemacht, aber jedenfalls nicht wissentlich ;-)

Christian Seehase 8. Okt 2006 12:05

Re: TClientSocket - OnError Event per Code zuweisen
 
Moin Christian,

Zitat:

Zitat von Yheeky
Ich habe das bisher nur mit anderen Komponenten gemacht z.B. mit Labels und da hat folgendes immer geklappt:

Delphi-Quellcode:
procedure LabelClick (Sender : TObject);
begin
ShowMessage('Label geklickt');

end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Label1.OnClick := LabelClick;

end;

Das wird genausowenig funktionieren.

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;

Yheeky 8. Okt 2006 12:45

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...

Christian Seehase 8. Okt 2006 12:50

Re: TClientSocket - OnError Event per Code zuweisen
 
Moin Christian,

dann bau Dir doch eine Dummyklasse.


Delphi-Quellcode:
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;
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)

Yheeky 8. Okt 2006 13:28

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.

Christian Seehase 8. Okt 2006 14:06

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 15:37 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