Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi MRU Liste erstellen. (https://www.delphipraxis.net/5905-mru-liste-erstellen.html)

Luckie 22. Jun 2003 19:49


MRU Liste erstellen.
 
Ich habe einen Knoten im Hirn.

Ich habe hier Code für eine MRU Liste geschrieben, also eine Liste mit den zu letzt geöffneten Dateien. So weit so gut, geht auch alles. Nur würde ich sie gerne bergrenzen auf eine bestimmte Anzahl von Dateien. Also wenn es 5 Stück sind dass er dann die von vorne anfängt die Einträge zu ersetzen.

Aber ich bekomme es ums verrecken nicht gebacken. Hier mal mein Code:
Delphi-Quellcode:
procedure TForm1.AddLastFileToList(Filename: String);
var
  ini: TInifile;
  slKeyNumbers: TStringList;
  KeyNumber, LastKeyWritten: Integer;
begin
  ini := TIniFile.Create(ExtractFilePath(ParamStr(0)) + '\mru.ini');
  try
    slKeyNumbers := TStringList.Create;
    try
      ini.ReadSectionValues('MRU', slKeyNumbers);
      KeyNumber := slKeyNumbers.Count;
      LastKeyWritten := ini.ReadInteger('LKW', 'LastKeyWritten', 0);
      if KeyNumber = MAXFILES then
      begin
        KeyNumber := MAXFILES-LastKeyWritten-1;
        ini.WriteString('MRU', IntToStr(KeyNumber), Filename);
      end;
      ini.WriteString('MRU', IntToStr(KeyNumber), Filename);
      ini.WriteInteger('LKW', 'LastKeyWritten', KeyNumber);
    finally
      slKeyNumbers.Free;
    end;
  finally
    ini.Free;
  end;
end;
Aber irgendwie macht er nicht das was ich will. Habe ich vier voll, setzt er den fünften an die erste Stelle, aber den nächsten dann nicht an die zweite sondern ans Ende.

Daniel B 22. Jun 2003 20:11

Hi,

und wenn Du ein Arrays als "Zwischenpuffer" nimmst, der 5 lang ist?
Immer wenn ein neuer Eintrag dazu kommt und das Array schon voll ist, dann kannst Du den letzten löschen, die restlichen 4 nachrücken und an der leeren Stelle den neuen Eintrag einfügen!?

Grüsse, Daniel :hi:

Luckie 22. Jun 2003 20:12

Das befriedigt mich noch nicht ganz.

Weitere Vorschläge?

Ghostwalker 23. Jun 2003 06:43

Vorschlag

http://jvcl.sourceforge.net

Da gibts ne fertige Komponente dafür.:)


Gruß Ghostwalker

Luckie 23. Jun 2003 07:29

Danke für den Hinweis. Aber fertige Komponenten will ich nicht, habe ich selber schon gefunden bzw. weiß, dass es sie gibt. Bloß so viel Code ist es ja auch nicht und wegen jeden Fliegendreck extra eine Komponente installieren? Kein Wunder, dass wir bei den C/C++ Programmierern als Klicki-Bunti-Programmierer verschrieen sind.

Luckie 23. Jun 2003 07:47

Für alle die es noch interessiert:
Delphi-Quellcode:
procedure TForm1.AddLastFileToList(Filename: String);
var
  ini: TInifile;
  slKeyNumbers: TStringList;
  KeyNumber, LastKeyWritten: Integer;
begin
  ini := TIniFile.Create(ExtractFilePath(ParamStr(0)) + '\mru.ini');
  try
    slKeyNumbers := TStringList.Create;
    try
      ini.ReadSectionValues('MRU', slKeyNumbers);
      KeyNumber := slKeyNumbers.Count;
      LastKeyWritten := ini.ReadInteger('LKW', 'LastKeyWritten', 0);
      if (KeyNumber = MAXFILES) and (LastKeyWritten = MAXFILES-1) then
      begin
        KeyNumber := 0;
        ini.WriteString('MRU', IntToStr(KeyNumber), Filename);
      end;
      if (KeyNumber = MAXFILES) and (LastKeyWritten < MAXFILES-1) then
      begin
        KeyNumber := LastKeyWritten+1;
        ini.WriteString('MRU', IntToStr(KeyNumber), Filename);
      end;
      ini.WriteString('MRU', IntToStr(KeyNumber), Filename);
      ini.WriteInteger('LKW', 'LastKeyWritten', KeyNumber);
    finally
      slKeyNumbers.Free;
    end;
  finally
    ini.Free;
  end;
end;
So geht's. Ich war eben nur immer darauf versessen gewesen und wollte es mit einer if-Anweisung lösen und hatte dabei aus dem Blick verloren, dass man doch zwei braucht.

Aber nichts desto trotz: Wer den Code vereinfachen kann, soll sich keinen Zwang antun.

Tom 23. Jun 2003 08:43

Zitat:

Zitat von Luckie
Für alle die es noch interessiert:
Delphi-Quellcode:
  ini := TIniFile.Create(ExtractFilePath(ParamStr(0)) + '\mru.ini');

Da ExtractFilePath das abschließende \ enthält (zumindest wenn es nicht die Hauptebene des Datenträgers ist) enthält der Dateiname im Ergebnis ein \\. Ich hatte zumindest bei einer Windowsversion mal ein Problem mit dieser Variante von Dateinamen.

Zitat:

So geht's.
Ich sehe keine Überprüfung auf doppelte Einträge.

Luckie 23. Jun 2003 08:50

Hm, tatsächlich.

Und das mit den doppelten Einträgen, muß ich mir noch mal überlegen. :?

Niko 23. Jun 2003 10:01

Hallo,
nur eine Kleinigkeit:
Das
Delphi-Quellcode:
ini.WriteString('MRU', IntToStr(KeyNumber), Filename);
in den if-Anweisungen ist redundant.

Luckie 23. Jun 2003 10:02

Stimmt danke. Ich habe da ziemlich lange rumgebastelt und probiert.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:23 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