AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit FileRead

Ein Thema von McDaTob · begonnen am 9. Jan 2005 · letzter Beitrag vom 9. Jan 2005
Antwort Antwort
McDaTob

Registriert seit: 9. Jan 2005
29 Beiträge
 
#1

Problem mit FileRead

  Alt 9. Jan 2005, 00:49
Hallo,
kann mir jemand folgendes Phänomen erklären?

Code:
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.
Der Inhalt von 'x.txt' ist '123'.
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.
  Mit Zitat antworten Zitat
Benutzerbild von Nothine
Nothine

Registriert seit: 3. Jul 2004
Ort: Mülheim an der Ruhr
198 Beiträge
 
Delphi 5 Enterprise
 
#2

Re: Problem mit FileRead

  Alt 9. Jan 2005, 01:40
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)
Delphi-Quellcode:
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;
[Edit] achja und willkommen in der DP [/edit]
if ThisPost is senseless then
ThisPost.WasPostedBy := SomeoneElse();
  Mit Zitat antworten Zitat
McDaTob

Registriert seit: 9. Jan 2005
29 Beiträge
 
#3

Re: Problem mit FileRead

  Alt 9. Jan 2005, 11:56
Danke für deine Antwort!
Funktioniert jetzt. Hatte das StrDispose aus Verzweiflung vergessen.
Wollte den Code minimal halten. Zu minimal...
Danke nochmal.
  Mit Zitat antworten Zitat
Benutzerbild von Nothine
Nothine

Registriert seit: 3. Jul 2004
Ort: Mülheim an der Ruhr
198 Beiträge
 
Delphi 5 Enterprise
 
#4

Re: Problem mit FileRead

  Alt 9. Jan 2005, 14:05
kein problem, dafür is die DP doch da

@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...
if ThisPost is senseless then
ThisPost.WasPostedBy := SomeoneElse();
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:41 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