![]() |
Stack Überlauf, beim eruezgen der eigenen Klasse! Wieso??
Hallo, ich habe folgende Klasse deklariert:
Delphi-Quellcode:
unit Livetrack;
interface uses IdFTP, IdHTTP; type TFTP = class(TIDFTP) end; type THTTP = class(TIDHTTP) end; type TLivetrack = class(TObject) private {private Vars} FHTTP : THTTP; FFTP : TFTP; FCacheDirectory : string; FFTPHost : String; FFTPDirectory : String; FFTPLoginName : String; FFTPPassword : String; FHTTPUrl : String; FFileName : String; FVID : String; {Set Procedures} procedure SetFTPHost(Host : String); procedure SetFTPDirectory(Directory : String); procedure SetFTPLoginName(LoginName : String); procedure SetFTPPassword(Password : String); procedure SetVID(VID : String); {get Functions} function GetFTPHost : String; function GetFTPLoginName : String; function GetFTPPassword : String; public {Functions} constructor create(const CacheDirectory : String; const FTPHost : string; const FTPDirectory : string; const FTPLoginName : string; const FTPPassword : string; const HTTPUrl : String; const FileName : String; const VID : string); overload; constructor create(const CacheDirectory : String; const FTPHost : string; const FTPDirectory : string; const FTPLoginName : string; const FTPPassword : string; const HTTPUrl : String; const FileName : String); overload; destructor destroy ; override; {properties} property CacheDirectory : String read FCacheDirectory write FCacheDirectory; property FTPHost : String read GetFTPHost write SetFTPHost; property FTPDirectory : String read FFTPDirectory write SetFTPDirectory; property FTPLoginName : String read GetFTPLoginName write SetFTPLoginName; property FTPPassword : String read GetFTPPassword write SetFTPPassword; property HTTPUrl : String read FHTTPUrl write FHTTPUrl; property FileName : String read FFileName write FFileName; property VID : String read FVID write SetVID; end; implementation {Set Procedures} procedure TLivetrack.SetFTPHost(Host : String); begin self.FFTP.Host := Host; end; procedure TLivetrack.SetFTPDirectory(Directory : String); begin if Directory = '' then exit; if self.FFTP.Connected then self.FFTP.ChangeDir(Directory); end; procedure TLivetrack.SetFTPLoginName(LoginName : String); begin if self.FFTP.Connected then exit; self.FFTP.Username := LoginName; end; procedure TLivetrack.SetFTPPassword(Password : String); begin if self.FFTP.Connected then exit; self.FFTP.Password := Password; end; procedure TLivetrack.SetVID(VID : String); begin self.VID := VID; end; // Ende Set Procedures //////////////////////////////////////////////////////////////////////////////// {Get Functions} function TLivetrack.GetFTPHost : String; begin result := self.FFTP.Host; end; function TLivetrack.GetFTPLoginName : String; begin result := self.FFTP.Username; end; function TLivetrack.GetFTPPassword : String; begin result := self.FFTP.Password; end; // Ende Get Functions //////////////////////////////////////////////////////////////////////////////// {Constructor} constructor TLivetrack.create(const CacheDirectory : String; const FTPHost : string; const FTPDirectory : string; const FTPLoginName : string; const FTPPassword : string; const HTTPUrl : String; const FileName : String); begin inherited create; self.FFTP := TFTP.Create(nil); self.FHTTP := THTTP.Create(nil); // Setzen der Parameter für HTTP und FTP self.CacheDirectory := CacheDirectory; self.FTPHost := FTPHost; self.FTPDirectory := FTPDirectory; self.FTPLoginName := FTPLoginName; self.FTPPassword := FTPPassword; self.HTTPUrl := HTTPUrl; self.FileName := FileName; //self.VID := 'none'; end; constructor TLivetrack.create(const CacheDirectory : String; const FTPHost : string; const FTPDirectory : string; const FTPLoginName : string; const FTPPassword : string; const HTTPUrl : String; const FileName : String; const VID : string); begin inherited create; self.FFTP := TFTP.Create(nil); self.FHTTP := THTTP.Create(nil); // Setzen der Parameter für HTTP und FTP self.CacheDirectory := CacheDirectory; self.FTPHost := FTPHost; self.FTPDirectory := FTPDirectory; self.FTPLoginName := FTPLoginName; self.FTPPassword := FTPPassword; self.HTTPUrl := HTTPUrl; self.FileName := FileName; //self.VID := VID; end; // Ende Constructor //////////////////////////////////////////////////////////////////////////////// {Destructor} destructor TLivetrack.destroy; begin self.FFTP.Free; self.FHTTP.free; inherited destroy; end; // Ende Destructor //////////////////////////////////////////////////////////////////////////////// end. Nun habe ich das Problem, dass es zu einem Stack Überlauf kommt wenn ich diese erzeugen will, allerdings nur wenn ich die Property VID aufrufe.
Delphi-Quellcode:
property VID : String read FVID write SetVID;
Der Aufruf sieht so aus :
Delphi-Quellcode:
type TForm1 = class(TForm)
(...) public Livetrack : TLivetrack; { Public-Deklarationen } end; (...) Livetrack := TLivetrack.create(extractfilepath(paramstr(0)) + '\Data\Cache','marcos-ivao-tools.net' ,'***','***','***','***','data.csv'); Hat wer ne Idee, wieso es gerade beim Aufrufen von VID zum Überlauf kommt? |
Re: Stack Überlauf, beim eruezgen der eigenen Klasse! Wieso?
Ja der Setter rufst sich ja selbst auf, müsste
Delphi-Quellcode:
heissen
procedure TLivetrack.SetVID(VID : String);
begin self.FVID := VID; end; |
Re: Stack Überlauf, beim eruezgen der eigenen Klasse! Wieso?
Ok , danke.
Irgendwie sieht man manchmal einfach die einfachsten Fehler net! :wall: |
Re: Stack Überlauf, beim eruezgen der eigenen Klasse! Wieso?
Glaub nicht, dass das anderen nicht auch schon passiert ist :roll: *pfeif*
|
Re: Stack Überlauf, beim eruezgen der eigenen Klasse! Wieso?
Zitat:
|
Re: Stack Überlauf, beim eruezgen der eigenen Klasse! Wieso?
:-D Das beruhigt mich .... *fg*
Vielen Dank nochmal! |
Re: Stack Überlauf, beim eruezgen der eigenen Klasse! Wieso?
Mal 'ne Frage am Rande: Wozu
Delphi-Quellcode:
hier das self? Sollte doch auch ohne funktionieren
self.FVID := VID;
|
Re: Stack Überlauf, beim eruezgen der eigenen Klasse! Wieso?
VID := VID; säh ja komisch aus.
Ich glaub aber das viele das self. mit aus anderen Sprachen übernehmen und es in Delphi auch überall hinschreiben. |
Re: Stack Überlauf, beim eruezgen der eigenen Klasse! Wieso?
auch wenn es OT ist:
Das Self hinzuschreiben hat in meinen Augen mehr Vor- als Nachteile. Man sieht dadurch sofort das es sich um eine Variable der Klasse handelt und es keine globale, parameter etc. ist. Zudem hat man dadurch die Möglichkeit Variablen der Klasse genau so zu benennen wie auch Parameter der Funktion in denen die Variable gesetzt wird. |
Re: Stack Überlauf, beim eruezgen der eigenen Klasse! Wieso?
Aus den von Jens genannten Gründen schreibe ich auch immer self davor, obwohl es nicht notwendig ist. Aber man sieht sofort, dass es sich dabei um ein Feld der eigenen Klasse handelt, ohne lange suchen zu müssen. Und wenn dann noch ein with-Block im Spiel ist, kommt man oft um self nicht mehr rum, außer durch Vermeidung von with ;)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 06: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 by Thomas Breitkreuz