Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi VAR-Parameter als Pointer speichern und verändern (https://www.delphipraxis.net/102247-var-parameter-als-pointer-speichern-und-veraendern.html)

Pfoto 25. Okt 2007 14:00


VAR-Parameter als Pointer speichern und verändern
 
Hallo zusammen!

Ich übergebe dem "Create" einer Klasse eine Variable per VAR-Parameter,
um innerhalb der Klasse deren Wert zu setzen.
Beim VAR-Parameter wird doch nur der Pointer übergeben, richtig?

Um mir diese Pointer-Adresse zu merken, speichere ich sie
in einer internen Adresse der Klasse, also so:
Delphi-Quellcode:
Type
  TTest = class
  private
    fPHasChanged: ^Boolean;
  [...]
  end;

constructor TTest.Create(VAR aHasChanged: Boolean);
begin
  { Adresse im internen Zeiger zwischenspeichern }
  fPHasChanged:= @aHasChanged;
end;
Wenn ich jetzt an diese gespeicherte Adresse etwas innerhalb
der Klasse speichern will, gibt es einen Zugriffsfehler.

Delphi-Quellcode:
Procedure TTest.DoSomething;
begin
  { Wert setzen, hier knallt's dann... } 
  fPHasChanged^:= Boolean(false);

  { zum Test }
  If Boolean(fPHasChanged^) = true then
    ShowMessage('true') else
    ShowMessage('false');
end;
Ich dachte, ich hätte den Pointer so richtig
dereferenziert (Das Dach hinter die Adresse)

Was habe ich denn hier falsch gemacht?



Dank und Gruß
Pfoto

Phoenix 25. Okt 2007 14:04

Re: VAR-Parameter als Pointer speichern und verändern
 
Dann übergebe doch gleich den Pointer?
Bei einem Var-Parameter gehe ich davon aus, dass er modifiziert zurückkehrt, nicht, dass er _irgendwann_ später nochmal geändert werden könnte.

mkinzler 25. Okt 2007 14:06

Re: VAR-Parameter als Pointer speichern und verändern
 
Eine klasse wird immer per referenz übergeben ob Var, Const, ...

SirThornberry 25. Okt 2007 14:16

Re: VAR-Parameter als Pointer speichern und verändern
 
@mkinzler: hier wird aber keine Klasse übergeben.
ansonsten stimme ich Phoenix zu. Nimm gleich einen Pointer. Allerdings wird das nicht dein Problem lösen. Du übergibst vermutlich eine locale Variable welche später nicht mehr existiert.

Desweiteren sind mir einige unschönheiten aufgefallen. Du vergleichst einen boolischen Wert auf True. True ist allerdings eine Konstante die den Wert 1 hat. Ein Boolean hingegen ist wahr sobald er ungleich 0 ist und nicht nur wenn er 1 ist. Also bei einem Vergleich nicht auf True testen.

desweiteren brauchst du False nicht auf Boolean casten etc.

Wie erzeugst du eigentlich deine Klasse. Vielleicht liegt ja dort der Fehler das du gar keine Instanz erzeugst.

Pfoto 25. Okt 2007 14:20

Re: VAR-Parameter als Pointer speichern und verändern
 
Zitat:

Zitat von Phoenix
Dann übergebe doch gleich den Pointer?
Bei einem Var-Parameter gehe ich davon aus, dass er modifiziert zurückkehrt, nicht, dass er _irgendwann_ später nochmal geändert werden könnte.

Es ist doch von außen bequemer, einfach einen Boolean zu übergeben (für mich jedenfalls).
Zudem würde ich prinzipell wissen, ob ich mit den Pointern falsch umgehe...

Zitat:

Zitat von mkinzler
Eine klasse wird immer per referenz übergeben ob Var, Const, ...

Ja, dass ist mir bekannt,
dieser Klasse soll ein Boolean per VAR übergeben werden.

Sinn:
Wenn die Klasse zerstört wurde, möchte ich durch die
zuvor übergebene Bool-Variable auslesen können, ob sich
etwas geändert hatte.
Deswegen kann ich nicht mehr über eine öffentliche Property
auf die Klasse zugreifen.

SirThornberry 25. Okt 2007 14:24

Re: VAR-Parameter als Pointer speichern und verändern
 
du machst mit der Übergabe und dem Pointer nichts falsch. Allerdings verstehe ich nicht wo das Problem ist einfach
Delphi-Quellcode:
x = Klasse.Create(@boolvariable)
anstelle von
Delphi-Quellcode:
x = Klasse.Create(boolvariable)
aufzurufen.

Für dein eigentliches Problem würde ich auch lieber ein Event vorschlagen (ein OnDestroy)
Das heißt, einfach im Destructor das Event auslösen und dann kannst du in dem Event noch drauf reagieren und noch fix properties auslesen etc.


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