Entwickler-Ecke
Dateizugriff - Textfile: zu bestimmter zeile springen
Gwaineg - Mo 29.08.05 11:06
Titel: Textfile: zu bestimmter zeile springen
ich will eine Ini-Datei in der alle mögliche Daten eingetragen werden
Jetzt will ich diese Daten aber nicht alle auf einmal auslesen sondern nur wenn sie benötigt werden.
Also brauch ich jetzt eine Methode mit der ich zu Zeile x springen kann.
Ich könnte es zwar auch machen indem ich, ganz oft readln mache aber das ist mir zu mühselig und unprofesionel
Moderiert von
Christian S.: Topic aus Sonstiges verschoben am Di 30.08.2005 um 09:48
AXMD - Mo 29.08.05 11:08
Seek oder FileSeek - bin in der Arbeit und hab hier leider kein Delphi; eines der beiden sollte es sein :)
AXMD
Gwaineg - Mo 29.08.05 11:15
ja, scheint das richtige zu sein
THX
Gwaineg - Mo 29.08.05 12:13
hmmm ...
geht doch nicht
er sagt mir das mein Textfile ein inkompatibler Typ
das geht scheinbar nur mit binären Files(oder wie die heißen)
sonst sollte das doch gehen, oder?
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| var f:TextFile; s:string; begin assignfile(f,ini); reset(f); seek(f,2); |
jaenicke - Mo 29.08.05 12:35
Ich würde zum professionellen :wink: Speichern von Einstellungen sowieso binäre Dateien verwenden, weil da dann ganze Records einfach gespeichert werden können.
Und was das Einlesen angeht: Meist ist es langsamer auf der Festplatte jedesmal die Einstellung zu suchen, als die gesamte Datei hintereinander beim Start in den Arbeitsspeicher zu lesen, und alle Einstellungen in Variablen zu tun.
(Oder dann im Arbeitsspeicher nach den Werten zu suchen)
Was aber Seek und Textfiles angeht, das wird nix, auch mal abgesehen von dem Kompilierfehler, und zwar aus dem einfachen Grund, dass du ja gar nicht
weißt, wo du hinspringen willst, denn Seek braucht den Offset.
Hier ein kleines Beispiel, wie ich das machen würde:
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: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67:
| type TWindowSettings = record PosX, PosY, SizeX, SizeY: Integer; end;
TMySettings = class private fFile: String; public FormSettings: TWindowSettings; ServerIP: String[19]; UseServer: Boolean; TryCount: Integer; constructor Create(uFile: String; LoadAtOnce: Boolean = True); destructor Destroy; override; function LoadFromFile(uFile: String = ''): Boolean; procedure SaveToFile(uFile: String = ''); end;
implementation
constructor TMySettings.Create(uFile: String; LoadAtOnce: Boolean = True); begin Self.fFile := uFile; if LoadAtOnce then Self.LoadFromFile; end;
destructor TMySettings.Destroy; override; begin inherited Destroy; end;
function TMySettings.LoadFromFile(uFile: String): Boolean; var tmpStream: TFileStream; begin Result := False; if FileExists(uFile) then tmpStream := TFileStream.Create(uFile, fmOpenRead) else if FileExists(Self.fFile) then tmpStream := TFileStream.Create(Self.fFile, fmOpenRead) else Exit; tmpStream.ReadBuffer(Self.FormSettings, SizeOf(Self.FormSettings)); tmpStream.ReadBuffer(Self.ServerIP, SizeOf(Self.ServerIP)); tmpStream.ReadBuffer(Self.UseServer, SizeOf(Self.UseServer)); tmpStream.ReadBuffer(Self.TryCount, SizeOf(Self.TryCount)); tmpStream.Free; Result := True; end;
procedure TMySettings.SaveToFile(uFile: String); var tmpStream: TFileStream; begin if uFile <> '' then tmpStream := TFileStream.Create(uFile, fmCreate) else tmpStream := TFileStream.Create(Self.fFile, fmCreate); tmpStream.WriteBuffer(Self.FormSettings, SizeOf(Self.FormSettings)); tmpStream.WriteBuffer(Self.ServerIP, SizeOf(Self.ServerIP)); tmpStream.WriteBuffer(Self.UseServer, SizeOf(Self.UseServer)); tmpStream.WriteBuffer(Self.TryCount, SizeOf(Self.TryCount)); tmpStream.Free; end; |
Hab ich jetzt nicht getestet, sollte aber so gehen... :wink:
Benutzung:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| TForm1 = class(TForm) private fSettings: TMySettings; end;
Self.fSettings := TMySettings.Create(IncludeTrailingPathDelimiter( ExtractFilePath(ParamStr(0))) + 'Settings.ProgSettings');
Self.fSettings.Free; |
Gwaineg - Mo 29.08.05 12:49
ich sollte das wort professinell wohl nicht so leichtfertig verwenden :roll:
INI-Datei muss es aber eine sein, weil man Einstellungen dort verändern können soll
wegen dem mit dem "nicht wissen wo ich hinspringen will" könnte ich ja nach dem Zeichen für einen Zeilenumbruch suchen aber wenn delphi so etwas nicht standartmässig hat ist es mir doch etwas zu kompliziert
ich werd also einfach alles auf einmal einlesen ist vllt. doch keine so schlechte Idee
jaenicke - Mo 29.08.05 13:09
Gwaineg hat folgendes geschrieben: |
INI-Datei muss es aber eine sein, weil man Einstellungen dort verändern können soll |
Nun, dann gibts da noch TMemIniFile, das managed den Zugriff auf Inis und lädt wohl nur, wenns benötigt wird...
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 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!