Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Höchster Wert aus Registry (https://www.delphipraxis.net/94160-hoechster-wert-aus-registry.html)

kaschte 17. Jun 2007 14:31

Re: Höchster Wert aus Registry
 
:( So komm ich nie vom Fleck, irgendwie habe ich keinen blassen Schimmer wieso jetzt nix mehr geht :( Findet niemand den Fehler?

Hawkeye219 17. Jun 2007 16:02

Re: Höchster Wert aus Registry
 
Hallo,

der Laufzeitfehler wird ausgegeben, weil beim Versuch, einen Stringinhalt in einen Integerwert zu wandeln, der zulässige Wertebereich für Integer (-2147483648..2147483647) verlassen wurde. Du könntest nun alles auf Cardinal oder Int64 umstellen und hättest damit einen größeren Wertebereich zur Verfügung. Wenn die Schlüsselnamen nur Ziffernfolgen (ohne führende Nullen) sind, könntest du aber auch bei Strings bleiben und die Methode Delphi-Referenz durchsuchenTStringList.CustomSort verwenden:

Delphi-Quellcode:
var
  Keys : TStringList;
  Reg : TRegistry;
begin
  ...
  Reg.GetKeyNames (Keys);
  Keys.CustomSort (CompareKeys);
  ShowMessage ('Maximum: ' + Keys[0]);
  ...
end;
Die Funktion CompareKeys würde dann so aussehen:

Delphi-Quellcode:
function CompareKeys (List: TStringList; Index1, Index2: Integer): Integer;
var
  Key1, Key2 : string;
begin
  Key1 := List[Index1];
  Key2 := List[Index2];
  // zunächst nur die Längen vergleichen
  Result := Length(Key2) - Length(Key1);
  if (Result = 0) then
    // bei gleicher Stringlänge zeichenweise vergleichen
    Result := CompareStr(Key2, Key1);
end;
Gruß Hawkeye

kaschte 17. Jun 2007 16:57

Re: Höchster Wert aus Registry
 
Zitat:

Zitat von Hawkeye219
Hallo,

der Laufzeitfehler wird ausgegeben, weil beim Versuch, einen Stringinhalt in einen Integerwert zu wandeln, der zulässige Wertebereich für Integer (-2147483648..2147483647) verlassen wurde. Du könntest nun alles auf Cardinal oder Int64 umstellen und hättest damit einen größeren Wertebereich zur Verfügung. Wenn die Schlüsselnamen nur Ziffernfolgen (ohne führende Nullen) sind, könntest du aber auch bei Strings bleiben und die Methode Delphi-Referenz durchsuchenTStringList.CustomSort verwenden:

Delphi-Quellcode:
var
  Keys : TStringList;
  Reg : TRegistry;
begin
  ...
  Reg.GetKeyNames (Keys);
  Keys.CustomSort (CompareKeys);
  ShowMessage ('Maximum: ' + Keys[0]);
  ...
end;
Die Funktion CompareKeys würde dann so aussehen:

Delphi-Quellcode:
function CompareKeys (List: TStringList; Index1, Index2: Integer): Integer;
var
  Key1, Key2 : string;
begin
  Key1 := List[Index1];
  Key2 := List[Index2];
  // zunächst nur die Längen vergleichen
  Result := Length(Key2) - Length(Key1);
  if (Result = 0) then
    // bei gleicher Stringlänge zeichenweise vergleichen
    Result := CompareStr(Key2, Key1);
end;
Gruß Hawkeye

Also bei mir gehts mit dem Code, bei meinem Bruder der mehrere Einträge hat (ich habe nur 0 und 42********) nimmt es nur das zweitgrösste!

kaschte 18. Jun 2007 16:46

Re: Höchster Wert aus Registry
 
UPUPUPUPUP

Kennt noch keiner Lösung??

EDIT: Kann es sein, dass bei der oben genannten Funktion nur zwei Zahlen verglichen werden??

kaschte 18. Jun 2007 16:52

Re: Höchster Wert aus Registry
 
Zitat:

Zitat von Hawkeye219
(ohne führende Nullen)

Der Erste Schlüssel ist eine alleinstehende "0".

Hawkeye219 18. Jun 2007 20:20

Re: Höchster Wert aus Registry
 
Hallo kaschte,

Zitat:

Kann es sein, dass bei der oben genannten Funktion nur zwei Zahlen verglichen werden??
Das ist richtig. Die Funktion CompareKeys wird von der internen Sortierroutine der Stringliste (eine QuickSort-Implementierung) immer dann aufgerufen, wenn zwei Werte verglichen werden müssen.

Zitat:

Der Erste Schlüssel ist eine alleinstehende "0".
Meine Einschränkung in Beitrag #22 bezog sich auf führende Nullen. So werden beispielsweise die Werte "00033" und "1234" nicht richtig angeordnet. Der erste Wert ist zwar numerisch betrachtet kleiner, er besitzt jedoch die größere Anzahl Zeichen. Die Rouutine CompareKeys vergleicht zunächst die Stringlängen und würde somit den Wert "00033" als größer einstufen.

Da du offenbar noch keine Lösung für dein Problem gefunden hast: kannst du eine Menge von Einträgen angeben, für die ein falsches Ergebnis ermittelt wird?

Gruß Hawkeye


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:49 Uhr.
Seite 3 von 3     123   

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz