Delphi-PRAXiS

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

Brainshock 19. Mai 2008 12:38

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:
{$R *.dfm}
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:

Delphi-Quellcode:
var
  Form1: pop;
nach:

Delphi-Quellcode:
var
  MyPop1: TMyPop;
entsprechend anpassen.

Jetzt mußt du nur noch überlegen, wo die MyPop1 erzeugt und gelöscht werden soll.

langer hans 20. Mai 2008 14:25

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:
client.OnRead:=ClientRead;
Das hat gefehlt...

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