![]() |
Problem mit FileRead
Hallo,
kann mir jemand folgendes Phänomen erklären?
Code:
Der Inhalt von 'x.txt' ist '123'.
unit Unit2;
interface uses SysUtils, Classes, Dialogs; type TXY = class(TObject) public constructor Create; end; implementation constructor TXY.Create; var f : integer; b : PChar; begin inherited Create; f := FileOpen('D:\x.txt',fmOpenReadWrite); FileSeek(f,0,soFromBeginning); b := StrAlloc(3); FileRead(f,b^,3); ShowMessage(StrPas(b)+'!'); FileClose(f); end; end. Wenn ich eine Instanz dieser Klasse aus meinem Programm heraus erstelle, sollte doch eigentlich eine MessageBox mit dem Inhalt '123!' erscheinen. Wenn ich die Instanz bei einem ButtonClick erstelle passiert dies auch. Wenn ich es aber in der FormCreate mache, erhalte ich '123S____'. Ich verstehe nicht, wo der Unterschied ist. Der Sinn des Programmes spielt dabei keine Rolle. Ist nur eine Prinzipsache, die ich nicht verstehe. Wäre nett,wenn mir das jemand erklären könnte. |
Re: Problem mit FileRead
moin,
auch wenn ich nicht genau weiß warum dem so ist, kann ich dir zumindest schonmal sagen dass der den fehler produzierende teil deines sources die funktion StrAlloc ist. ersetze sie durch GetMem oder AllocMem, und der fehler dürfte nicht mehr auftreten (zumindest tut er es bei mir nach dem ersetzen nicht mehr). noch so am rande: wer speicher alloziert sollte ihn auch am ende wieder freigeben (mit StrDispose bzw. bei GetMem und AllocMem mit der Funktion FreeMem) :wink:
Delphi-Quellcode:
[Edit] achja und willkommen in der DP :party: :mrgreen: [/edit]
constructor TXY.Create;
var F: Integer; B: PChar; begin inherited Create; F := FileOpen('D:\x.txt',fmOpenRead); //leseberechtigung reicht doch, oder? B := AllocMem(4); try FileSeek(F,0,soFromBeginning); FileRead(F,B^,3); ShowMessage(B+'!'); //StrPas ist eigentlich überflüssig finally FreeMem(B); FileClose(F); end; end; |
Re: Problem mit FileRead
Danke für deine Antwort!
Funktioniert jetzt. Hatte das StrDispose aus Verzweiflung vergessen. Wollte den Code minimal halten. Zu minimal... Danke nochmal. |
Re: Problem mit FileRead
kein problem, dafür is die DP doch da :mrgreen:
@all others: mich würd aber auch mal interessieren warum die funktion StrAlloc in diesem zusammenhang so merkwürdig funktioniert, intern ist sie ja auch nichts anderes als ein GetMem aufruf, lediglich mit einem dem PChar vorangestelltem 32bit-wert der aufschluss über die menge an alloziertem speicher gibt... :gruebel: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03: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