AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi TClientSocket - OnError Event per Code zuweisen
Thema durchsuchen
Ansicht
Themen-Optionen

TClientSocket - OnError Event per Code zuweisen

Ein Thema von Yheeky · begonnen am 8. Okt 2006 · letzter Beitrag vom 8. Okt 2006
Antwort Antwort
Seite 1 von 2  1 2      
Yheeky

Registriert seit: 7. Jun 2002
1.339 Beiträge
 
#1

TClientSocket - OnError Event per Code zuweisen

  Alt 8. Okt 2006, 01:45
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(???);
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: TClientSocket - OnError Event per Code zuweisen

  Alt 8. Okt 2006, 01:51
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;
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Yheeky

Registriert seit: 7. Jun 2002
1.339 Beiträge
 
#3

Re: TClientSocket - OnError Event per Code zuweisen

  Alt 8. Okt 2006, 02:16
Okay, wären wir schonmal einen Schritt näher

Nun habe ich folgendes probiert:
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
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: TClientSocket - OnError Event per Code zuweisen

  Alt 8. Okt 2006, 03:03
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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Yheeky

Registriert seit: 7. Jun 2002
1.339 Beiträge
 
#5

Re: TClientSocket - OnError Event per Code zuweisen

  Alt 8. Okt 2006, 11:50
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

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 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
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: TClientSocket - OnError Event per Code zuweisen

  Alt 8. Okt 2006, 13:05
Moin Christian,

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;
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Yheeky

Registriert seit: 7. Jun 2002
1.339 Beiträge
 
#7

Re: TClientSocket - OnError Event per Code zuweisen

  Alt 8. Okt 2006, 13:45
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...
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#8

Re: TClientSocket - OnError Event per Code zuweisen

  Alt 8. Okt 2006, 13:50
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)
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Yheeky

Registriert seit: 7. Jun 2002
1.339 Beiträge
 
#9

Re: TClientSocket - OnError Event per Code zuweisen

  Alt 8. Okt 2006, 14:28
Okay, danke schonmal bis hierhin!

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.
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#10

Re: TClientSocket - OnError Event per Code zuweisen

  Alt 8. Okt 2006, 15:06
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;
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  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 13:10 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