Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Pointer und TObject (https://www.delphipraxis.net/68440-pointer-und-tobject.html)

Martin K 29. Apr 2006 15:07


Pointer und TObject
 
Wie geht das, wenn ich einen Zeiger z.B. auf Form1.Caption zeigen lassen will?
Wenn ich dann den Wert des Zeiger ändere, müsste sich doch auch die Caption von Form1 ändern...

Theoretisch müsste es doch so gehen:
Delphi-Quellcode:
type
  a = ^String;

  TForm1 = class(TForm)
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  b: a;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  b := @Caption;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  b^ := 'test';
end;
Aber praktisch funzt es nich... :gruebel:
Kann mir jemand den Code so abändern, dass er funzt?
:?:

Es soll natürlich nicht nur mit Form1.Caption gehen, sondern z.B. auch mit Label1.Caption oder Label1.Font.Name etc.

Ziel ist es, ein Array mit Zeigern auf String zu erstellen.
Dann noch eine Prozedur der ein Zeiger auf einen String übergeben wird (z.B. Label1.Font.Name), dieser wird dann dem Array hinzugefügt.
Führe ich dann z.B. diesen Befehl aus (b ist dann mein Array):
b[1] := 'Arial'
so sollte also die Schriftart von Label1 Arial sein.

jim_raynor 29. Apr 2006 15:13

Re: Pointer und TObject
 
Caption ist eine Eigenschaft und keine Variable. Von einer Eigenschaft, kann man keinen Pointer holen, da in der Regel eine Funktion dahinter liegt. Das funktioniert nur mit normalen Variablen.

Martin K 29. Apr 2006 15:19

Re: Pointer und TObject
 
Hmm...

Und wie kann ich dann dieses Problem lösen :?: :?: :?:

Also mein eigentliches Ziel ist es, eine vereinfachte IniFile Unit zu erstellen.
Es sollen einfach verschiedene Komponenten-Eigenschaften hinzugefügt werden, z.B. AddComponent(Form1.Caption);
Diese Komponenten-Eigenschaften werden dann alle auf einmal aus der Ini-Datei geladen bzw. in die Ini gespeichert.

z.B.:
Code:
[Form1]
Caption=test
Width=640
Height=480

DGL-luke 29. Apr 2006 15:23

Re: Pointer und TObject
 
Das solltest du sowieso nie machen!

Du kannst dich nie darauf verlassen, dass die Speicheradressen zwischen Programmaufrufen die selben bleiben.

Für so etwas, was du machen willst, gibt es die Hier im Forum suchenSerialization, Khabarakh kann dazu mehr sagen, und die dpCollectiondpCollection (allerdings dann nur für selbst erstellte Klassen).

EDIT: Hier stehts: http://www.delphipraxis.net/internal...ct.php?t=72501 (.Net-Thema, einfach n bisschen nach unten scrollen, da steht wies für Win32 geht ;) )

Die Muhkuh 29. Apr 2006 15:23

Re: Pointer und TObject
 
such ma nach RTTI

Martin K 29. Apr 2006 15:38

Re: Pointer und TObject
 
Zitat:

Zitat von DGL-luke
EDIT: Hier stehts: http://www.delphipraxis.net/internal...ct.php?t=72501 (.Net-Thema, einfach n bisschen nach unten scrollen, da steht wies für Win32 geht ;) )

Hmm.... sieht gut aus, verstehe aber wenig. :gruebel:

Evtl. Beispiel für eine procedure AddComponent (s. oben)? :roll:
wäre echt nett...

Martin K 29. Apr 2006 15:55

Re: Pointer und TObject
 
Hab noch eine andere Idee:

Allerdings: Gibts so was wie FindProperty (also wie FindComponent), so dass ich z.B. die Eigenschaft Caption von meiner Form1 erhalten kann?
etwa so: FindProperty('Form1.Caption');

Dann wäre es nämlich einfach:
Delphi-Quellcode:
//speichern:
procedure Speichern(ObjectName, PropertyName: String);
begin
  IniFile.WriteString(ObjectName, PropertyName, FindProperty(ObjectName+'.'+PropertyName);
end;

//Aufruf:
Speichern('Form1', 'Caption');


//laden:
procedure Laden;
var s1, s2: TStrings; i1, i2: Integer;
begin
  s1 := TStrings.Create;
  s2 := TStrings.Create;
  IniFile.ReadSections(s1);

  for i1 := 0 to s1.Count-1 do
  begin
    IniFile.ReadSection(s1[i1], s2);

    for i2 := 0 to s2.Count-1 do
      FindProperty(s1[i1]+'.'s2[i2]) := IniFile.ReadString(s1[i1], s2[i2], '');

    s2.Clear;
  end;

  s1.Free;
  s2.Free;
end;

3_of_8 29. Apr 2006 16:04

Re: Pointer und TObject
 
Zitat:

Zitat von DGL-luke
Du kannst dich nie darauf verlassen, dass die Speicheradressen zwischen Programmaufrufen die selben bleiben.

Genaugenommen kann man sich darauf verlassen, dass es nicht so ist. Man hat heutzutage mindestens 256 MB RAM zur Verfügung, die Wahrscheinlichkeit, dass da eine Variable zweimal hintereinander den gleichen Speicherplatz bekommt, ist verschwindend gering. Wenn der Pointer geladen wird, zeigt er in ein Speichernirvana und produziert mit hoher Wahrscheinlichkeit eine AV.

r2c2 29. Apr 2006 17:09

Re: Pointer und TObject
 
Guck dir mal das an: http://www.delphipraxis.net/internal...ct.php?t=80217

Mit n bisschen Abänderung sollte das was für dich sein. Statt die ganzen Komponenten zu speichern, wie ich das mache, köntest du mit... wie heißt die Funktion nochmal? :gruebel: hm... muss mir die RTTI auch nochmal genauer angucken... hm... Delphi-Referenz durchsuchenGetPublishedProperty glaub ich. Guck mal in die Hilfe...

mfg

Christian

Martin K 29. Apr 2006 17:14

Re: Pointer und TObject
 
Hab mal einen neuen Thread für dieses Thema gemacht.


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