www.ewlab.de
Delphi 2006
Delphi 2005
Kylix
Delphi 6
Delphi 5
Delphi 4
Impressum
THistoryCombo

In einem Programm, in dem ein leerer String in eine THistoryCombo eingefügt werden kann, kann es zu folgendem Fehler kommen: Die Liste wird beim Programmende zunächst mit dem leeren String in der Registry gespeichert. Wenn die Liste beim nächsten Programmstart wieder geladen wird, wird der Leerstring jedoch aus der Liste herausgefiltert (die Methode LoadFromIni interpretiert Leerstrings als “Eintrag nicht vorhanden”). Dadurch ist die History-Liste nach dem nächsten Laden kürzer geworden. Wird nun diese kürzere Liste in der Registry gespeichert, so bleiben Reste der vorher gespeicherten Liste in der Registry stehen und können beim nächsten Programmstart wieder geladen werden. Das kann dann zu doppelten Einträgen führen.

Zur Korrektur kommen zwei Stellen im Programmcode von THistoryList in Frage. Zwei neue Zeilen in SaveToIni sorgen beim Speichern der Liste dafür, dass keine alten Einträge in der Registry stehen bleiben (*):

procedure THistoryList.SaveToIni(IniName, IniSection : string);
var
  i : integer;
  IniFile : TCustomIniFile;
begin
  { Da IniFile.FileName nicht nachträglich geändert werden kann,
   muß IniFile jedesmal neu initialisiert werden: }
  if FUseRegistry then
   IniFile:=TRegistryIniFile.Create(IniName)
  else
   IniFile:=TIniFile.Create(IniName);
  try
   { Falls die INI.Datei mehr Einträge enthält, als die aktuelle
     Liste, werden die überzähligen Einträge nicht überschrieben. }
   for i:=0 to Count-1 do
     IniFile.WriteString(IniSection, 'History'+IntToStr(i), Strings[i]);
(**)for i:=Count to FMaxLen-1 do
(**) IniFile.DeleteKey(IniSection, 'History'+IntToStr(i));
  finally
   IniFile.Free;
  end;
end;

Alternativ könnte auch das Einfügen des Leerstrings in die Liste verboten werden (*):

procedure THistoryList.AddString(s : string);
var
  OldIndex : integer;
begin
(**) if s <> '' then begin
    
... // alle bisherigen Zeilen der Methode
(**) end;
end;

Dieser Fehler wurde gefunden dank eines Hinweises von Andreas Keppler.

(*) Die Listings stammen aus der Datei HList.pas. Sie beschränken sich auf die für Delphi 6 gültigen Zeilen, bedingte Kompilierung für frühere Delphi-Versionen wurde also gekürzt. Einzufügen sind die markierten Zeilen. Der durchgestrichene Kommentar kann entfernt werden.

 

 

Diese Seite wurde am 03/12/13 10:25 erzeugt.