![]() |
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); ... |
Re: Komponente in eigener Unit verwenden
Deine Unit wird so nicht hinhauen. Du hast versucht aus einem normalen Formular eine Klasse zu machen.
Die neue Unit besitzt keine Formularresource, deshalb lösche bitte die Zeile:
Delphi-Quellcode:
Bitte nenne deine Klasse auch anders z.B. TMyPop (vor Klassen setzt man ein T). Es wird ansonsten wahrscheinlich sonst woanders noch Probleme geben, Namenskonflikte etc. Die Einbindung würde ich von:
{$R *.dfm}
Delphi-Quellcode:
nach:
var
Form1: pop;
Delphi-Quellcode:
entsprechend anpassen.
var
MyPop1: TMyPop; Jetzt mußt du nur noch überlegen, wo die MyPop1 erzeugt und gelöscht werden soll. |
Re: Komponente in eigener Unit verwenden
Danke für die Tipps!
Ich werde weiter berichten! MfG EDIT: Das Objekt wird in einer GUI-Klasse erzeugt und gelöscht. Edit2: Ich hab es geändert so wie du sagtest, allerdings kommt immernoch der gleiche fehler: --------------------------- Fehler --------------------------- Fehler im Modul : Deklaration der Klasse TClientSocket fehlt oder ist fehlerhaft. --------------------------- OK Hilfe --------------------------- EDIT3: Ok, jetzt gehts grade soweit, nur habe ich das Problem, dass das Event OnClientRead nicht ausgelöst wird... Was muss ich dafür noch ändern?? EDIT4: Problem ist gelöst!!
Delphi-Quellcode:
Das hat gefehlt...
client.OnRead:=ClientRead;
Danke für die Hilfe! mfg |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:28 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