Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - dynamische Liste aus Records mit Strings
nickbierwisch - Fr 05.12.08 19:10
Titel: dynamische Liste aus Records mit Strings
Hi,
ich möchte dynamisch eine Liste von Records verwalten. Allerdings klappt es nur wenn mein Record keinen String enthält. Das Programm stürzt beim Setzen von 'Test' ab. Muss ich bei einem String den Speicherbereich noch irgendwie reservieren?
Vielen Dank im Vorraus
Nick
Der TestCode:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28:
| type TTestRecord = record e:extended; i:integer; s:string; end;
PTestRecord = ^TTestRecord;
TForm1 = class(TForm) procedure FormCreate(Sender: TObject); end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject); var p:PTestRecord; begin p:=GlobalAllocPtr(GMEM_FIXED,sizeof(TTestRecord)); p^.e:=1.3; p^.i:=1; p^.s:='Test'; end; |
Moderiert von
Narses: Topic aus Sonstiges (Delphi) verschoben am Fr 05.12.2008 um 18:47
jaenicke - Fr 05.12.08 19:17
Versuchs doch mal so: ;-)
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| var p: PTestRecord; begin New(p); p.e := 1.3; p.i := 1; p.s := 'Test'; ShowMessage(p.s); Dispose(p); |
Die Dereferenzierung kannst du dir sparen, denn Delphi weiß ja, dass es ein Pointer auf den Record ist.
alzaimar - Fr 05.12.08 22:10
Der Grund, wieso die Alloziierung und anschließende Zuweisung nicht funktioniert ist der, das ein 'string' einfach ein Zeiger ist. Wenn Du Strings in einem statischen Record ablegen willst, empfiehlt sich die alte 'String[<Länge>]' schreibweise. So wird der String direkt im Speicherbereich des Records abgelegt:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| Type TRecord1 = Record mystring : String; end;
TRecord2 = Record myString : String[80]; end;
begin writeln(SizeOf(TRecord1)); writeln(SizeOf(TRecord2)); end. |
nickbierwisch - Mo 05.01.09 18:34
Danke für die schnellen Antworten. Leider bin ich erst jetzt dazu gekommen es auszuprobieren. Die Version von jaenicke funktioniert und die alzaimar habe ich deshalb nicht probiert.
Nochmals vielen Dank
Nick
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!