Autor Beitrag
Gwaineg
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 55

WIN XP Prof
D7 Ent
BeitragVerfasst: Mo 29.08.05 11:06 
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 user profile iconChristian S.: Topic aus Sonstiges verschoben am Di 30.08.2005 um 09:48
AXMD
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 4006
Erhaltene Danke: 7

Windows 10 64 bit
C# (Visual Studio 2019 Express)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 55

WIN XP Prof
D7 Ent
BeitragVerfasst: Mo 29.08.05 11:15 
ja, scheint das richtige zu sein
THX
Gwaineg Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 55

WIN XP Prof
D7 Ent
BeitragVerfasst: 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?
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
var f:TextFile;
    s:string;
begin
  assignfile(f,ini);
  reset(f);
  seek(f,2);
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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:
ausblenden volle Höhe 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
  //eventuell Self.SaveTofile;
  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:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
  TForm1 = class(TForm)
  //(...)
  private
    fSettings: TMySettings;
  //(...)
  end;

  //(...)

//In FormCreate:
Self.fSettings := TMySettings.Create(IncludeTrailingPathDelimiter(
  ExtractFilePath(ParamStr(0))) + 'Settings.ProgSettings');

//In FormDestroy:
Self.fSettings.Free;
Gwaineg Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 55

WIN XP Prof
D7 Ent
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 29.08.05 13:09 
user profile iconGwaineg 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...