AGB  ·  Datenschutz  ·  Impressum  







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

Verwenden von Pointern

Ein Thema von Getox · begonnen am 28. Dez 2012 · letzter Beitrag vom 2. Jan 2013
Antwort Antwort
Seite 2 von 2     12   
Getox

Registriert seit: 28. Dez 2012
155 Beiträge
 
Delphi XE3 Professional
 
#1

AW: Verwenden von Pointern

  Alt 2. Jan 2013, 10:35
Ich hab zwar bei der Hälfte von dem was ihr hier redet keine Ahnung was ihr meint, oder worum es eigentlich geht, aber ich habe mir Singleton mal angeschaut.

Lustigerweise gehen fast alle Threads über singleton in die Richtung: "Globale Variablen böse, Singleton böse, alles böse". Ich habe hier im Forum aber einen sehr gut verständlichen Guide als PDF gefunden und habe es damit verstanden und auch schon angewendet. Für meinen Zweck scheint es wirklich gut zu sein.

Ich verstehe zwar nicht was an globalen Variablen so "Böse" ist, aber egal... Mein alter Programmierlehrer hat immer gesagt, globale Variablen seinen einfach nur unschön. In Foren habe gelesen, dass globale Variablen "unangenehme Nebenwirkungen" haben könnten. Aber ich glaube das steht auf einem anderen Blatt.

Mein problem, wegen dem ich diesen Thread ursprünglich gestartet habe ist gelöst und dafür danke ich.

Und ja, ich habe schon öfters miterlebt, dass aus eine simplen Anfängerfrage riesige Grundsatzdiskussionen werden und das ist in der Tat sehr verwirrend für den fragenden Neuling. Wer hat jetzt recht? Was soll man jetzt tun? Was bedeutet eigentlich die Hälfte von dem was da geschrieben wurde?

Getox
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.352 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Verwenden von Pointern

  Alt 28. Dez 2012, 16:05
Ein Objekt wird immer über einen Pointer angesprochen.
Wenn Du z.B. auf Panel1 zugreifst, wird auf eine Speicheradresse zugegriffen.
Der entsprechende Speicherplatz auf den der Pointer verweist wird dann in als Klasse TPanel interpretiert.

Insofern kannst Du Deine Instanz Panel1 anderen Units zugänglich machen und musst nicht extra mit Pointern hantieren.

Wenn Du der Unit uForm2 Deine Unit uForm1 bekannt gibst, kannst Du auf Form1.Panel1 ganz normal zugreifen.

Du könntest aber auch eine globale Unit definieren, in der Du eine entsprechende Objektvariable definierst.
Im OnCreate Deines Hautpformulars weist Du dieser dann Deine Objektinstanz zu und im OnDestroy setzt Du sie auf nil.
Dann kannst Du von den anderen Formularen aus auf diese globale Variable zugreifen.

Im Grunde läuft es darauf raus, dass Du eine Variable von verschiedenen Stellen aus zugängliche Variable definierst, der dann irgendwann die eigentliche Objektinstanz zugewiesen wird.
Eigentlich funktioniert das genau wie mit einer Integer- oder String-Variable.

Es gibt noch andere und bessere Lösungen, aber so kann man das schon auch realisieren.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.688 Beiträge
 
Delphi 2007 Enterprise
 
#3

AW: Verwenden von Pointern

  Alt 28. Dez 2012, 16:11
Eigentlich funktioniert das genau wie mit einer Integer- oder String-Variable.
Eigentlich genau nicht, da nach so etwas hier dann verschiedene Werte in den Variablen stecken:

Delphi-Quellcode:
var
  str1, str2: String;
  int1, int2: Integer;
  obj1, obj2: TMyClass;
begin
  str1 := 'hallo';
  str2 := str1;
  str1 := 'bye';
  // hiernach ist str1 = 'bye' und str2 = 'hallo'

  int1 := 1;
  int2 := int1;
  int1 := 2;
  // hiernach ist int1 = 2 und int2 = 1

  obj1 := TMyClass.Create;
  obj1.SomeProperty := 1;
  obj2 := obj1;
  obj1.SomeProperty := 2;
  // hier hingegen sind obj1.SomeProperty und obj2.SomeProperty = 2
end;
Edit: Der Vollständigkeit halbar das ganze noch mit einem Record:
Delphi-Quellcode:
var
  rec1, rec2: TMyRec;
begin
  rec1.SomeValue := 1;
  rec2 := rec1;
  // bis hier hin sind rec1 und rec2 IDENTISCH, nicht nur gleich. Beide Variablen greifen auf den SELBEN Speicher zu
  rec2.SomeValue := 2;
  // Und hier greift dann compiler magic (copy-on-write genannt): Es wurde im Hintergrund eine Kopie angelegt. Nunmehr zeigt nur noch rec1 auf den anfänglichen Speicher, rec2 hat automatisch eine völlig eigene Instanz erhalten.
end;
Mit Strings läuft das übrigens eigentlich genau so ab.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)

Geändert von Medium (28. Dez 2012 um 16:16 Uhr)
  Mit Zitat antworten Zitat
Getox

Registriert seit: 28. Dez 2012
155 Beiträge
 
Delphi XE3 Professional
 
#4

AW: Verwenden von Pointern

  Alt 28. Dez 2012, 16:17
Was ich eigentlich vorhabe ist, dass ich in den Units in denen sich Formulare befinden so weinig wie möglich Code habe.

Mein Hauptprogramm habe ich eigentlich in einer Unit ohne Formular. Dieses habe ich als Klasse geschrieben. Ich will nun onCreate von Form1 eine instanz dieser Klasse erstellen, auf Welche dann alle Forms zugreifen. Dreh- und Angelpunkt ist somit also nicht mehr die unit mit Form1, sondern mein Objekt.

Innerhalb dieses Objektes sind dann halt verschiedenste methoden und Variablen (unter anderem auch ein record) auf die aber alle forms irgendwann dann mal zugreifen.

Inwiefern das nun sinnvoll ist, kann ich nicht einschätzen, aber auf jeden Fall übt es mich im Umgang mit der Objektorientierung.

Wie ich mein Problem nun löse: Ich schreibe einfach in allen Units, wo es erforderlich ist meine Unit, in der ich das Objekt erstellt habe in USES. Dann kann ich das ja direkt über Form1.Core ansprechen, egal in welcher Unit ich dann bin

Aber danke für die vielen Vorschläge, das hat mich wieder etwas schlauer gemacht.

Geändert von Getox (28. Dez 2012 um 16:31 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.352 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Verwenden von Pointern

  Alt 28. Dez 2012, 16:29
Dein Ansatz ist sehr sinnvoll, da Du so eine gute Trennung zwischen Businesslogik und GUI erhältst.

Schau Dir mal weiter obden den Hinweis zum Singleton an.
Damit kannst Du immer genau eine Instanz einer Klasse sicher stellen.

Wie Du es genau realiseren kannst hängt auch von Deiner Delphiversion ab und ob Di die Instanz Deiner Klasse schon zur Designtime benötigst, z.B. um irgendwelche Einstellungen im Objketinspektor vorzunehmen.

Du könntest z.B. in der Unit Deiner Klasse eine öffentliche Variable MyObjekt definieren und dieser in Deinem Constructor "Self" zuweisen und im Destructor nil.
Sofern Du nur eine Instanz Deiner Klasse erzeugst, würde das funktionieren.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Verwenden von Pointern

  Alt 28. Dez 2012, 16:45
Ich würde den Constructor der entsprechenden Forms überschreiben (die Klasse als Parameter mitschicken), also diese Forms nicht von der dpr-Datei verwalten lassen.

Delphi-Quellcode:
type
  TFormA = class(TForm)
   ..
  private
    FKlasse: TKlasse;
  end;

..

procedure TFormA.FormCreate(Sender: TObject);
begin
  FKlasse:= TKlasse.Create;
  FormB:= TFormB.Create(Self, FKlasse);
end;

procedure TFormA.FormDestroy(Sender: TObject);
begin
  FKlasse.Free;
  FormB.Free;
end;
Delphi-Quellcode:
type
  TFormB = class(TForm)
    ..
  private
    FKlasse: TKlasse;
  public
    constructor Create(AOwner: TComponent; const Klasse: TKlasse); reintroduce; overload;
  end;

constructor TFormB.Create(AOwner: TComponent; const Klasse: TKlasse);
begin
  inherited Create(AOwner);
  FKlasse:= Klasse;
end;
  Mit Zitat antworten Zitat
hoika

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

AW: Verwenden von Pointern

  Alt 28. Dez 2012, 21:59
Hallo,

warum jetzt wieder die Klasse im Form ???
Eine globale Unit mit Singleton !

Heiko
Heiko
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 22:01 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