![]() |
Komponente in eigener Unit verwenden
Hallo!!
Habe ein Problem.... Ich will die Komponente TClientSocket in meiner eignenen Unit verwenden. Aber das geht nicht.... Beim Createn des Objekts tritt eine Zugriffsverletzung auf. Außerdem meckert er immer über ein fehlendes Active Attribut, obwohl es nicht verwendet wird. Wie kann ich diese Komponete in meiner eigenen Klasse verwenden?? MfG |
Re: Komponente in eigener Unit verwenden
Zeig mal den Code, der den Fehler verursacht
|
Re: Komponente in eigener Unit verwenden
Hi langer Hans
Hast du die Unit, in der ClientSocket definiert ist, eingebunden? Gruss Delbor |
Re: Komponente in eigener Unit verwenden
Hier die Klasse die den Fehler verursacht:
Delphi-Quellcode:
MfG
unit Upop3;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ScktComp, StdCtrls; type pop = class(Tobject) Client: TClientSocket; procedure ClientRead(Sender: TObject; Socket: TCustomWinSocket); private Status: integer; ip:String; port:Integer; user:String; password:String; procedure delay(time: integer); procedure connect1(); public constructor Create(ip,user,pass:string;port:integer); procedure disconnect(); function getList():String; function connect():boolean; function getmail(nr:integer):String; function delmail(nr:integer):STring; end; var Form1: pop; implementation {$R *.dfm} constructor pop.create(ip,user,pass:string;port:integer); begin client.Active := false; self.ip :=ip; self.user := user; self.password := pass; client.Address := ip; client.Port := port; self.status := 0; end; procedure pop.delay(time: integer); var time1 : longint; begin time1 := gettickcount; while ((time1+ time )> gettickcount) do application.processmessages; end; procedure pop.connect1(); begin case status of 0: begin client.Open; end; 1: begin client.Socket.SendText('USER ' + user + chr(10));end; 2: begin client.Socket.SendText('PASS ' + password + chr(10)); end; end; end; function pop.connect():boolean; var check:integer; begin check := -2 ; while ((status > -1) and (status < 3)) do begin delay(100); if (check <> status) then begin check := status; connect1(); delay(100); //memo1.lines.add('test'); end end; delay(100); showmessage(IntToStr(status)); if (status = -1) then result := false else result := true; //status := 0; end; procedure pop.ClientRead(Sender: TObject; Socket: TCustomWinSocket); var bra:string; begin bra := socket.ReceiveText; //showmessage(bra); if pos(bra,'+')=0 then begin //memo1.lines.add(bra); inc(status); end else begin //memo1.lines.add(bra ); status:= -1; end; end; procedure pop.disconnect(); begin client.Socket.SendText('QUIT ' + chr(10)); end; function pop.getList():String; begin showmessage(IntToStr(status)); if status > 0 then begin client.Socket.SendText('LIST ' + chr(10)); delay(1000); result := client.Socket.ReceiveText; end else result := 'nein' end; function pop.getmail(nr:integer):String; begin if status > 0 then begin client.Socket.SendText('RETR ' + IntToStr(nr) + chr(10)); delay(1000); result := client.Socket.ReceiveText; end else result := 'nein' end; function pop.delmail(nr:integer):String; begin if status > 0 then begin client.Socket.SendText('DELE ' + IntToStr(nr) + chr(10)); delay(1000); result := client.Socket.ReceiveText; end else result := 'nein' end; {procedure pop.Button1Click(Sender: TObject); begin self.ip := '213.165.64.22'; self.user := 'ich@du.de'; self.password := '*********'; port := 110; client.Address := ip; client.Port := port; self.status := 0; if connect() then memo1.Lines.add('es hat alles geklappt') else memo1.lines.add('Fehler bei der anmeldung'); end;} {procedure pop.Button2Click(Sender: TObject); begin memo1.Lines.add(getmail(2)); end;} end. [edit=SirThornberry]Passwort entfernt - Mfg, SirThornberry[/edit] [edit=SirThornberry]E-Mailadresse geändert (zwecks weniger spam) - Mfg, SirThornberry[/edit] |
Re: Komponente in eigener Unit verwenden
Du musst eine Instanz der TClientSocket-Klasse erzeugen
Es fehlt auch er Aufruf des Konstruktors der Superklasse. |
Re: Komponente in eigener Unit verwenden
Ich hoffe das ganze ist nur ein Testemailkonto bei GMX, ansonsten ÄNDERE DEIN KENNWORT.
ÄNDERE DEIN KENNWORT, sonst mache ich es. Nun zum Problem. Der Client muß wahrscheinlich im Konstruktor erzeugt werden und am Ende im Destruktor zerstört werden.
Delphi-Quellcode:
pop = class(Tobject)
private FClient: TClientSocket; ... public constructor Create(ip,user,pass:string;port:integer); destructor Destroy; ... end;
Delphi-Quellcode:
constructor pop.create(ip,user,pass:string;port:integer);
begin FClient:= TClientSocket.Create; FClient.Active := false; self.ip :=ip; self.user := user; self.password := pass; FClient.Address := ip; FClient.Port := port; self.status := 0; end;
Delphi-Quellcode:
Dann sollte es mit dem Zugriff funktionieren.
destructor pop.destroy;
begin FClient.Free; end; [edit=SirThornberry] Mfg, SirThornberry[/edit] [edit=SirThornberry]Beiträge zusammengeführt - Mfg, SirThornberry[/edit] [edit=SirThornberry]Nächsten Beitrag angefügt - nächstes mal bitte die Edit-Funktion verwenden! - Mfg, SirThornberry[/edit] |
Re: Komponente in eigener Unit verwenden
Zitat:
|
Re: Komponente in eigener Unit verwenden
Kannst du den ClientSocket denn in einer normalen Anwendung verwenden oder gibts da den selben Fehler?
|
Re: Komponente in eigener Unit verwenden
Also in einer vorherigen Version des Programms (ohne OOP) hat es problemlos funktioniert...
MfG |
Re: Komponente in eigener Unit verwenden
Delphi-Quellcode:
constructor pop.create(ip,user,pass:string;port:integer);
begin inherited Create; FClient:= TClientSocket.Create(Nil); ... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:14 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