Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi [solved] Pointerfrage und eine Exception... (https://www.delphipraxis.net/71896-%5Bsolved%5D-pointerfrage-und-eine-exception.html)

JPSelter 22. Jun 2006 09:49


[solved] Pointerfrage und eine Exception...
 
Ich habe mir ein Objekt angelegt, dass aus einem record besteht. Das ganze kommt dann in ein VirtualTreeView. Das klappt alles perfekt, bis ich versucht habe, einen String-Teil des Objektes an einen String zu kopieren:

Delphi-Quellcode:
temp:=TDetailObject(Data.FObject).verantw; <------- exception

[... hier manipuliere ich temp noch etwas ...]

case Column of
      0: Celltext := TDetailObject(Data.FObject).name;
      1: Celltext := temp;
    //1: Celltext := TDetailObject(Data.FObject).verantw; <----- keine exception
      2: Celltext := '---';
    end;
Wieso passiert das? Die Variable temp ist vom Typ string, .verantw ist ebenfalls ein string. Wahrscheinlich sagt gleich jemand, dass das nur ein Zeiger auf einen String ist, aber wieso klappt das dann bei "Celltext". Und wie muss ich die obige Zeile ändern?

Elvis 22. Jun 2006 10:17

Re: Pointerfrage und eine Exception...
 
Wenn in FObject ein Pointer steckt musst du ihn erst dereferenzieren, bevor du an die Felder herankommst.
Hier mal ein kleiner Ausschnitt der 5.000 Möglichkeiten um typisiert an den Speicher der record Instanz zu kommen:
Delphi-Quellcode:
type
  TSomeRecord = record
    Value : Integer;
    SubThinging : record
      Value2 : Double;
    end
  end;
 PSomeRecord = ^TSomeRecord;
var
  instance : TSomeRecord;
  untyped : Pointer;
  typed   : PSomeRecord;
begin
  instance.Value := 1;
  instance.SubThinging.Value2 := 2.3;

  untyped := @instance;
  typed := PSomeRecord(untyped);

  WriteLn(typed^.Value, typed^.SubThinging.Value2);
  WriteLn(typed.Value, typed.SubThinging.Value2);
  WriteLn(PSomeRecord(untyped)^.Value,
          PSomeRecord(untyped)^.SubThinging.Value2);
  WriteLn(PSomeRecord(untyped).Value,
          PSomeRecord(untyped).SubThinging.Value2);
  WriteLn(TSomeRecord(untyped^).Value,
          TSomeRecord(untyped^).SubThinging.Value2);
end.
Das erledigt übrigens der Kompiler für dich, wenn du Klassen nimmst. Wobei er auch bei typisierten Pointern autom. dereferenziert. :)

edit: btw: Pass mit AnsiStrings in primitiven Typen auf. Du kannst dich nicht darauf verlassen, dass die Referenzzählung des Strings funktioniert: Er könnte dir unter'm Hintern gelöscht oder nie freigegeben werden.

JPSelter 22. Jun 2006 10:26

Re: Pointerfrage und eine Exception...
 
OK, hat sich erledigt... Data wurde erst einige Zeilen später definiert... jetzt gehts doch. War doch nicht to Pointer-spezifisch...


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