Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Komponente in eigener Unit verwenden (https://www.delphipraxis.net/114053-komponente-eigener-unit-verwenden.html)

langer hans 19. Mai 2008 08:14


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

mkinzler 19. Mai 2008 08:16

Re: Komponente in eigener Unit verwenden
 
Zeig mal den Code, der den Fehler verursacht

Delbor 19. Mai 2008 08:21

Re: Komponente in eigener Unit verwenden
 
Hi langer Hans
Hast du die Unit, in der ClientSocket definiert ist, eingebunden?

Gruss
Delbor

langer hans 19. Mai 2008 08:27

Re: Komponente in eigener Unit verwenden
 
Hier die Klasse die den Fehler verursacht:

Delphi-Quellcode:
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.
MfG

[edit=SirThornberry]Passwort entfernt - Mfg, SirThornberry[/edit]
[edit=SirThornberry]E-Mailadresse geändert (zwecks weniger spam) - Mfg, SirThornberry[/edit]

mkinzler 19. Mai 2008 08:30

Re: Komponente in eigener Unit verwenden
 
Du musst eine Instanz der TClientSocket-Klasse erzeugen
Es fehlt auch er Aufruf des Konstruktors der Superklasse.

Brainshock 19. Mai 2008 09:26

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:
destructor pop.destroy;
begin    
  FClient.Free;
end;
Dann sollte es mit dem Zugriff funktionieren.

[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]

langer hans 19. Mai 2008 11:36

Re: Komponente in eigener Unit verwenden
 
Zitat:

---------------------------
Fehler
---------------------------
Fehler im Modul : Deklaration der Klasse TClientSocket fehlt oder ist fehlerhaft.
---------------------------
OK Hilfe
---------------------------
Das ist die Fehlermeldung die ich erhalte, auch mit der Erzeugung des Objektes im Konstruktor!

Fussball-Robby 19. Mai 2008 11:48

Re: Komponente in eigener Unit verwenden
 
Kannst du den ClientSocket denn in einer normalen Anwendung verwenden oder gibts da den selben Fehler?

langer hans 19. Mai 2008 11:49

Re: Komponente in eigener Unit verwenden
 
Also in einer vorherigen Version des Programms (ohne OOP) hat es problemlos funktioniert...

MfG

mkinzler 19. Mai 2008 11:59

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 20:22 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