AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Zugriff auf Objekt in Klasse

Ein Thema von FediDelPr · begonnen am 25. Dez 2020 · letzter Beitrag vom 10. Jan 2021
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    
FediDelPr

Registriert seit: 16. Feb 2018
112 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#1

Zugriff auf Objekt in Klasse

  Alt 25. Dez 2020, 17:12
Im Umgang mit Klassen (eigene Definitionen) bin ich noch nicht wirklich geübt.

Jetzt bin ich aber doch einigermassen erstaunt darüber, dass der Compiler folgendes
frisst:

Ich definiere eine eigene Klasse:

Code:
  TEmailCoreObject = CLASS(TObject)
    IMAPClient: TIdIMAP4;
    ...
und greife dann darauf zu, ohne vorher eine Instanz gebildet zu haben.
Code:
    IMAPClient.Host := 'imaps.gmail.com';
    IMAPClient.Port := 993;
Warum geht das ?
Macht das Sinn ?

Mit einer Typendeklaration RECORD ... geht das nicht, ich muss zuerst eine
Variable mit diesem Typ definieren.

Habe ich etwas nicht kapiert ?
  Mit Zitat antworten Zitat
FediDelPr

Registriert seit: 16. Feb 2018
112 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#2

AW: Zugriff auf Objekt in Klasse

  Alt 25. Dez 2020, 17:25
Der Fall liegt vermutlich etwas komplizierter. Studiert im Moment noch
nicht zuviel daran herum.
Ich werde ein Präzisierung nachliefern.
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#3

AW: Zugriff auf Objekt in Klasse

  Alt 26. Dez 2020, 06:29
Moin...
Zitat:
dass der Compiler folgendes frisst ... Warum geht das ?
...und zur Laufzeit macht es Bummm!

Delphi-Quellcode:
TEmailCoreObject = CLASS(TObject)
  IMAPClient: TIdIMAP4;
...Felder einer Klasse werden immer mit F gekennzeichnet. Da liegt u.a. an einer Property...wenn man es braucht.
StyleGuide:
https://www.delphi-treff.de/object-pascal/styleguide/
Bitte denke auch ggf. an die Sichtbarkeiten...wenn benötigt.
http://docwiki.embarcadero.com/RADSt...assenelementen

Besser:
Delphi-Quellcode:
TEmailCoreObject = class
private
  
protected
  FIMAPClient: TIdIMAP4; // protected...weil das auch in der abgeleiteten Klasse nach Core verfügbar sein soll, oder?
public
  constuctor Create;
  destructor Destroy; override;
  property IMAPClient: TIdIMAP4 read FIMAPClient write FIMAPClient; // ggf. als property nach "Außen"
end;

...

constructor TEmailCoreObject.Create;
begin
  FIMAPClient := TIdIMAP4.Create;
end;

destructor TEmailCoreObject.Destroy;
begin
  FIMAPClient.Free;
  inherited;
end;

Geändert von haentschman (26. Dez 2020 um 07:37 Uhr)
  Mit Zitat antworten Zitat
FediDelPr

Registriert seit: 16. Feb 2018
112 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#4

AW: Zugriff auf Objekt in Klasse

  Alt 26. Dez 2020, 20:57
@Haentschman
danke, werde das genauer ansehen.

Ich hab's jetzt nochmals genauer angeschaut:

Eine Instanz von IMAPClient oder neu jetzt FIMAPClient wurde erzeugt und
das überrascht mich jetzt, ohne vorher eine Instanz von TEmailCoreObject
gebildet zu haben. Es existiert also nur:

Code:
TEmailCoreObject = CLASS(TObject)
   ...
 PUBLIC
   FIMAPClient: TIdIMAP4;
END;
und eine uninitialisierte Instanz von TEmailCoreObject in einem übergeordneten Modul
(ohne je ein Create durchgeführt zu haben). Und es läuft trotzdem.

Nebenbei:
Sehe ich das richtig, dass FIMAPClient ohne Schlüsselwort mit PUBLIC gleichzusetzen
ist? Mindestens so scheint es bei mir zu funktionieren.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#5

AW: Zugriff auf Objekt in Klasse

  Alt 26. Dez 2020, 21:55
Der Name ist vollkommen egal.

Und egal ob Record oder Class, die Instanz von TIdIMAP4 mußt du immer erstllen.
Es wird da garnichts automatisch gemacht.

Beim Class muß natürlich auch noch die Instanz von TEmailCoreObject erstellt werden.


Einziger Unterschied, das Feld (FIMAPClient) wird in der Klasse automatisch mit NIL initialisiert.
Ob das auch bei dem Record passiert, hängt davon ab, wo diese Variable liegt. (lokale Variablen in Prozeruden/Methoden sind nie initialisiert)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#6

AW: Zugriff auf Objekt in Klasse

  Alt 27. Dez 2020, 06:42
Moin...
Zitat:
das überrascht mich jetzt, ohne vorher eine Instanz von TEmailCoreObject
Du darfst aber die Komponente nicht auf die Form ziehen...Weil das riecht danach.
Zitat:
Sehe ich das richtig, dass FIMAPClient ohne Schlüsselwort mit PUBLIC gleichzusetzen
Prinzipiell ja. Aber...ich würde das den Compiler nicht selbst entscheiden lassen...ich entscheide wer was ist! Später heraus willst du vieleicht Felder hinzufügen, die nicht Properties sind...dann greift die Sichtbarkeit (public, private, protected). Also, warum nicht gleich so?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#7

AW: Zugriff auf Objekt in Klasse

  Alt 27. Dez 2020, 15:18
Zitat:
Sehe ich das richtig, dass FIMAPClient ohne Schlüsselwort mit PUBLIC gleichzusetzen
Ja
und auch NEIN.

Normalerweise ist bei Objekten und auch Records der Default das "public".

ABER alles ab TComponent TPersistent, da ist es "published", da {$M+} !
http://docwiki.embarcadero.com/RADSt...tionen_(Delphi)
Darum sind die Komponenten-Variablen in TForms am Anfang eben auch published, damit der DFM-Reader diese Varialen und die EventMethoden finden kann.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
2.942 Beiträge
 
Delphi 12 Athens
 
#8

AW: Zugriff auf Objekt in Klasse

  Alt 28. Dez 2020, 16:56
Nebenbei:
Sehe ich das richtig, dass FIMAPClient ohne Schlüsselwort mit PUBLIC gleichzusetzen
ist? Mindestens so scheint es bei mir zu funktionieren.
Ja. Das sollte man selber aber besser vermeiden, da es nicht im Sinne der OOP ist.
Nur VCL/FMX Klassen brauchen dieses Verhalten, da alle in dieser "nicht" Sektion
deklarierte Felder die auf der Form liegenden Komponenten sind, deren eigentliche
Erzeugung/Initialisierung über den Form Streaming Mechanismus erfolgt.

Aber du solltest dir's besser gleich abgewöhnen.
  Mit Zitat antworten Zitat
FediDelPr

Registriert seit: 16. Feb 2018
112 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#9

AW: Zugriff auf Objekt in Klasse

  Alt 4. Jan 2021, 00:05
Ich bin da weiterhin am Üben.

Die Klassendefinition habe ich geändert, so dass nun TEmailCoreObject ein
Nachkomme von TidIMAP4 ist.

Code:
TYPE
  TEmailCoreObject = CLASS(TidIMAP4)
  PRIVATE
    (* Private-Deklarationen *)
    OpenSSLHandler: TIdSSLIOHandlerSocketOpenSSL;
  PUBLIC
    (* Public-Deklarationen *)
    PROCEDURE OpenEmail(VAR IMAPClientExtd: TEmailCoreObject);
    PROCEDURE CloseEmail(VAR IMAPClientExtd: TEmailCoreObject);
  END;
Nun einige Fragen:
- Wenn ich eine Instanz von TEmailCoreObject erzeuge, ist dann das CREATE nur
für diese Instanz notwendig oder zusätzlich auch für TidIMAP4 ?
- Die Klasse TEmailCoreObject kommt auch als Parameter in den Methoden vor,
z.B. in OpenEmail(..). Ist das ein unzulässiger Schwanzbeisser oder geht das ?
- Wie kann ich ganz einfach feststellen, ob ein Objekt richtig erzeugt wurde ?
(am liebsten mit Debugger)
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: Zugriff auf Objekt in Klasse

  Alt 4. Jan 2021, 00:15
Hallo,
schreib ins Create ein inherited Create,
dann gilt das Create für beide.

Schwanzbeisser, ja
Warum das Objekt als Parameter an das gleiche Objekt/Klasse übergeben?

Initialisiertes Objekt erkennen?
Setze es auf NIL sonst erkennst du es nicht.
Heiko
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:32 Uhr.
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