Delphi-PRAXiS
Seite 3 von 4     123 4      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Zugriff auf Objekt in Klasse (https://www.delphipraxis.net/206473-zugriff-auf-objekt-klasse.html)

FediDelPr 6. Jan 2021 14:41

AW: Zugriff auf Objekt in Klasse
 
@TiGü

Du schon recht, das einzelne Tutorial lässt sich schon runterladen. Was nicht geht
ist der Download des Delphi-Starter.

TiGü 7. Jan 2021 10:28

AW: Zugriff auf Objekt in Klasse
 
Du meinst dieses PDF-Buch?
Naja, da verpasst man jetzt auch nichts.

FediDelPr 8. Jan 2021 15:59

AW: Zugriff auf Objekt in Klasse
 
An meinem letzten Problem stehe ich immer noch an, trotz lesen in
mehreren Büchern.

Im Hauptmodul soll's so aussehen, kein Create:

Code:
VAR
  IMAPClientEx: TEmailCoreObject;
  ...

 BEGIN
   IMAPClientEx.OpenEmail;
   ..
   ..
 
 END;

Das Untermodul (EmailCore) soll so aussehen:

Code:
UNIT EmailCore;

TYPE
  TEmailCoreObject = CLASS(TidIMAP4)
  PRIVATE
    (* Private-Deklarationen *)
    ..
  PUBLIC
    (* Public-Deklarationen *)
    // hier CONSTRUCTOR notwendig ?? Wie genau ?  <---
    PROCEDURE OpenEmail;
    ..
  END;

PROCEDURE TEmailCoreObject.OpenEmail;
 BEGIN
   // Was muss hier eingefuegt werden, damit der Speicher für TEmailCoreObject
   // reserviert wird ?   <---
   ..
   ..
 END;
Kann da jemand konkret weiterhelfen ? Danke

Klaus01 8. Jan 2021 16:21

AW: Zugriff auf Objekt in Klasse
 
warum sträubst Du dich so gegen ein Create?

Delphi-Quellcode:
VAR
  IMAPClientEx: TEmailCoreObject;
  ...

 BEGIN
   IMAPClientEx := TEmailCoreObject.Create;
   try
     IMAPClientEx.OpenEmail;
     ..
     ..
   finally
    IMAPClientEx.Free;
   end;
 
 END;
Wenn Du kein Create haben möchstes musst Du Klassen-Methoden erstellen.
Dann könnte es so gehen.

Grüße
Klaus

FediDelPr 8. Jan 2021 16:46

AW: Zugriff auf Objekt in Klasse
 
Weil das nur ein technisches Problem (endlicher Speicher) ist und nichts mit der eigentlichen
Aufgabe zu tun hat. Es verhunzt die eigentliche Absicht. Die Essenz des Programmes
versinkt in solchen technischen Details. Das Programm ist schlussendlich schlechter lesbar,
es sind mehr Fehler möglich. Natürlich mag das für einen Einzelfall nicht grafierend sein
aber in der Summe.. Eine normale Variable muss man ja auch nicht zuerst kreiieren.

Ich mag diesen Ballast nicht, so ähnlich ist es ja auch mit der Fehlerverarbeitung. Auch die
ist so dominant, obwohl es eigentlich nur um die Ausnahmen geht.

Ich bin da ein Purist und würde sogar soweit gehen, dass dies ein Teil unserer heutigen
Softwarekrise ist.

Um es zu verdeutlichen ein Beispiel - der Zugriff auf eine Festplatte:

- Oeffnen (mit moeglichst wenigen Parametern, oder allenfalls Setup)
- Lesen oder Schreiben
- Schliessen

Das ist die Hauptstruktur, nichts weiter. Und die muss möglichst sichtbar bleiben.
Details dann in tieferen Schichten und auch dort dasselbe.

Ich hoffe du verstehst mich nicht falsch. Ich finde es wird gerade in der
Software-Industrie oft viel zu kompliziert gedacht. Ich könnte jetzt ein weiteres Mal
Einstein zitieren...

Grüsse

FediDelPr

FediDelPr 8. Jan 2021 16:48

AW: Zugriff auf Objekt in Klasse
 
Ah danke noch, dann schau ich mal bei den Klassen-Methoden

FediDelPr 9. Jan 2021 21:07

AW: Zugriff auf Objekt in Klasse
 
Gesetzt den Fall ich verzichte auf das Create im aufrufenden Modul,

Code:
VAR
  IMAPClientEx: TEmailCoreObject;
  ...

 BEGIN
   // IMAPClientEx := TEmailCoreObject.Create(nil); --> kein Create
   IMAPClientEx.OpenEmail;
   ..
kann ich eine Methode trotzdem erreichen oder nicht ? Ist also der Einsprung trotzdem
garantiert oder geht der Aufruf quasi ins Leere (weil nicht definiert) ?
Beim Debugging war das erfolgreich. Zufall ?

haentschman 10. Jan 2021 06:55

AW: Zugriff auf Objekt in Klasse
 
Moin...:P
Zitat:

kann ich eine Methode trotzdem erreichen oder nicht
Du kannst doch nicht ein Auto einsteigen (OpenEMail) wenn du es nicht produziert hast (Create)! :zwinker:
Zur dynamischen Verwendung einer Klasse/Objekt gehört immer ein Create/Free. Bei dieser Konstellation hast du die Wahl wann das Objekt im Speicher aufgenommen wird (Create) und wieder entfernt wird (Free).
Zitat:

Beim Debugging war das erfolgreich. Zufall ?
Wenn das so wäre, erzählst du uns nur die Hälfte. Bei diesen obigen Code, ohne Create, bekommst du definiv eine Zugriffsverletzung!
Zitat:

Weil das nur ein technisches Problem (endlicher Speicher) ist und nichts mit der eigentlichen Aufgabe zu tun hat.
Auch deine Main Form, und alle anderen automatisch erzeugten, liegen schon im Speicher. Besser wäre es wenn nur die Formulare erzeugt werden wenn sie gebraucht werden und wieder aus dem Speicher entfernt werden. Alle Forms haben ein Create/Free...nur macht das Delphi im Hintergrund. :zwinker:
Zitat:

versinkt in solchen technischen Details.
...das nennt man programmieren und nicht Klick Bunti. :stupid: :zwinker:
Zitat:

Eine normale Variable muss man ja auch nicht zuerst kreiieren.
Auch für eine Variable wird Speicher reserviert...im Hintergrund.

Wie schon mehrfach gesagt:
Delphi-Quellcode:
type
  TEmailCoreObject = class(TidIMAP4)
  private
  public
    constructor Create(Owner: TComponent);
    destructor Destroy; override;
    procedure OpenEmail;
  end;


implementation

constructor TEmailCoreObject.Create(Owner: TComponent)
begin
  inherited Create(Owner) // immer erste Zeile -> Erzeugen Vorfahr TidIMAP4
  //
end;

destructor TEmailCoreObject.Destroy;
begin
  //
  inherited; // immer letzte Zeile
end;
.
.
.
procedure TfoMain.Blubb;
var
  IMAPClientEx: TEmailCoreObject;

begin
  IMAPClientEx := TEmailCoreObject.Create(nil);
  try
    IMAPClientEx.OpenEmail;
  finally
    IMAPClientEx.Free;
  end;
end;
Stell den gesamten Code mal ein.

hoika 10. Jan 2021 07:24

AW: Zugriff auf Objekt in Klasse
 
Hallo,
ich glaube der TE verwechselt Debuggen mit Compilieren.

Wenn Du ohne Create arbeiten willst,
Musst du die Klasse über den Delphi-Designer auf das DataModul packen.

Davon raten dir hier alle ab.
Jetzt musst du halt entscheiden.

haentschman 10. Jan 2021 07:40

AW: Zugriff auf Objekt in Klasse
 
Zitat:

Musst du die Klasse über den Delphi-Designer auf das DataModul packen.
@TE: Zum Verständnis. Auch bei dieser Variante wird ein Create/Free ausgeführt...im Hintergrund. :zwinker: Das Objekt ist immer im Speicher, mit Create des DataModules, auch wenn es nicht benutzt wird!

Nochmal zu Klassenmethoden:
https://www.delphi-treff.de/tutorial...i-crashkurs/8/
Zitat:

Klassenmethoden

Es kann manchmal sinnvoll sein, dass man eine Methode nicht über die Instanz einer Klasse aufrufen möchte, sondern nur über die Klasse. So könnte man sich vorstellen, dass die Klasse „TgeomForm“ eine Methode „dimension“ besitzt, welche zurückgibt, welche Dimension die geometrischen Objekte besitzen, die durch diese Klasse dargestellt werden. Das Ergebnis dieser Methode wäre nicht abhängig von einer Instanz, sondern für die gesamte Klasse identisch.
Möchte man eine solche Methode haben, so leitet man sie bei der Deklaration mit dem Schlüsselwort „class“ ein.

type
TgeomForm = class
{...}
public
class function dimension : Integer;
end;

{...}

class function TgeomForm.dimension : Integer;
begin
result := 2;
end;

Selbstverständlich kann man in Klassenmehtoden nicht auf die Eigenschaften einer Klasse zuzugreifen, da diese nur existieren, wenn man mit Instanzen arbeitet!
PS: Der Tippfehler aus Seite kopiert. :zwinker:

Frage:
Wie oft wird das Objekt benutzt? Je nach Verwendung kann man das Objekt direkt vor OpenMail erzeugen und direkt wieder freigeben oder z.b. im constructor der Form oder der Logik Klasse erzeugen und am Ende (jeweiliger destuctor) wieder freigeben. Damit hat man das Objekt über die Lebensdauer der Form z.B. im Zugriff ohne ständig Create/Free. :zwinker:


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:21 Uhr.
Seite 3 von 4     123 4      

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