Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi .self oder nicht (aus "SMTP über Strato") (https://www.delphipraxis.net/212202-self-oder-nicht-aus-smtp-ueber-strato.html)

H.Bothur 3. Jan 2023 17:56

.self oder nicht (aus "SMTP über Strato")
 
Moin,

ich trenne das Thema mal aus meinem SMTP-Thread raus um das ganze nicht zu verwässern:

Zitat:

Zitat von himitsu (Beitrag 1516938)
Zu Post 1.

Wer innerhalb einer Klasse (TMailForm) auf die "vermeintlich" richtige globale Variable (MailForm) zugreift,
der gehört irgendwann mal dafür vollkommen zu Recht bestraft.

-> Weglassen (sowas macht man niemals nicht) oder Self benutzen.

Moin Himitsu,

das sagst Du mir schon seid Jahren - und ich glaube Dir (wirklich) auch, aber ...

Delphi-Quellcode:
procedure Verbinden;
begin
  Form1.IdSMTP1.AuthType := satDefault;   // simpler Login ohne Authentifizierung
  Form1.IdSMTP1.Host := 'smtp.strato.de';
  Form1.IdSMTP1.Port := 465;
  Form1.IdSMTP1.UseTLS := utUseRequireTLS; // mit SSL -> Port dann in aller Regel 587
  usw.
-> Keine Fehlermeldung

Delphi-Quellcode:
procedure Verbinden;
begin
  IdSMTP1.AuthType := satDefault;   // simpler Login ohne Authentifizierung
  IdSMTP1.Host := 'smtp.strato.de';
  Form1.IdSMTP1.Port := 465;
  Form1.IdSMTP1.UseTLS := utUseRequireTLS; // mit SSL -> Port dann in aller Regel 587
  usw.
-> da werden sofort die ersten beiden als fehlerhaft markiert.
Erste Zeile: E2003 undeklarierter Bezeichner "IdSMTP1" in Zeile 88
Zweite Zeile: E2066 Operater oder Seikolon fehlt in Zeile 89

Delphi-Quellcode:
procedure Verbinden;
begin
  self.IdSMTP1.AuthType := satDefault;   // simpler Login ohne Authentifizierung
  self.IdSMTP1.Host := 'smtp.strato.de';
  Form1.IdSMTP1.Port := 465;
  Form1.IdSMTP1.UseTLS := utUseRequireTLS; // mit SSL -> Port dann in aller Regel 587
  usw.
-> da werden sofort die ersten beiden als fehlerhaft markiert.
erste Zeile: E2003 undeklarierter Bezeichner "self" in Zeile 88
Erste Zeile: E2066 Operater oder Seikolon fehlt in Zeile 89
Zweite Zeile: E2066 Operater oder Seikolon fehlt in Zeile 89

Und jetzt weiß ich nicht woran das liegt ... aber das es eben mit dem "Form1." oder in dem anderen Fall dem "MailForm." davor klappt !
Wenn Du mir aber sagen kannst was ich falsch mache dann lerne ich es endlich ! Und das soll jetzt keine Verar*** sein sondern wirklich der Wille zu verstehen was ich falsch mache.

Gruss
Hans

mjustin 3. Jan 2023 18:11

AW: .self oder nicht (aus "SMTP über Strato")
 
Der Hinweis bezieht sich vermutlich auf das erste Codebeispiel im ersten Beitrag, das so anfängt:

Delphi-Quellcode:
function TMailForm.SendeMail(MailEmpfaenger, CCListe, Betreff, Anhang :string; Body :TStringList; MailAbsender, MailPasswort, MailServer: String; MailPort: Integer) : boolean;
var
**iAttachment : TIdAttachment;
**Erfolg: Boolean;

begin
**(* Connect mit Server *)
**MailForm.IdSMTP1.AuthType := satDefault; // simpler Login ohne Authentifizierung
**MailForm.IdSMTP1.Host := MailServer;
**MailForm.IdSMTP1.Port := MailPort;

Und das sieht so aus als ob das gemacht wird, was man auf jeden Fall vermeiden sollte. (Zugriff innerhalb der Methode einer Form-Instanz auf die 'globale' Instanz-Variable)


Delphi-Quellcode:
procedure Verbinden;
begin
**Form1.IdSMTP1.AuthType := satDefault; // simpler Login ohne Authentifizierung
**Form1.IdSMTP1.Host := 'smtp.strato.de';
**Form1.IdSMTP1.Port := 465;
**Form1.IdSMTP1.UseTLS := utUseRequireTLS; // mit SSL -> Port dann in aller Regel 587
**usw.
Das ist anderer Code, eine Methode die nicht zur Form-Klasse gehört. Daher ist es hier richtig und notwendig, irgendwie auf die Form-Instanz zuzugreifen. Es sind zwei verschiedene Fälle.

H.Bothur 3. Jan 2023 18:38

AW: .self oder nicht (aus "SMTP über Strato")
 
Zitat:

Zitat von mjustin (Beitrag 1516951)
Der Hinweis bezieht sich vermutlich auf das erste Codebeispiel im ersten Beitrag, das so anfängt:

[...]

Und das sieht so aus als ob das gemacht wird, was man auf jeden Fall vermeiden sollte. (Zugriff innerhalb der Methode einer Form-Instanz auf die 'globale' Instanz-Variable)

[...]

Das ist anderer Code, eine Methode die nicht zur Form-Klasse gehört. Daher ist es hier richtig und notwendig, irgendwie auf die Form-Instanz zuzugreifen. Es sind zwei verschiedene Fälle.

Ahh ... JETZT habe ich es endlich begriffen .... der eine, "schlechte" Code kommt aus einem Projekt mit mehreren Units und da ist SendeMaiil als public deklariert. Das andere ist ein Testprogramm das keine Units hat.

DANKE - ich glaube jetzt habe ich es verstanden !!

Schönen Abend
Hans

himitsu 3. Jan 2023 19:28

AW: .self oder nicht (aus "SMTP über Strato")
 
Problem ist, dass du ja schon in der Klasse drin bist.
Dort hast du Self explizit oder implizit (wenn man es nicht angibt), um auf die aktuelle Instanz zuzugreifen.

In der globalen Variable muß aber nicht die Instanz drin stehen, in welcher du gerade drin bist.
* z.B. wenn man mehrere Instanzen der Klasse hat

* Oder wenn während des Erstellens und Freigebens die Variable (noch) nicht auf diese Instanz zeigt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:30 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