AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Höchster Wert aus Registry

Offene Frage von "kaschte"
Ein Thema von kaschte · begonnen am 17. Jun 2007 · letzter Beitrag vom 18. Jun 2007
Antwort Antwort
Seite 3 von 3     123   
kaschte

Registriert seit: 2. Apr 2006
72 Beiträge
 
#21

Re: Höchster Wert aus Registry

  Alt 17. Jun 2007, 14:31
So komm ich nie vom Fleck, irgendwie habe ich keinen blassen Schimmer wieso jetzt nix mehr geht Findet niemand den Fehler?
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#22

Re: Höchster Wert aus Registry

  Alt 17. Jun 2007, 16:02
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
  Mit Zitat antworten Zitat
kaschte

Registriert seit: 2. Apr 2006
72 Beiträge
 
#23

Re: Höchster Wert aus Registry

  Alt 17. Jun 2007, 16:57
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!
  Mit Zitat antworten Zitat
kaschte

Registriert seit: 2. Apr 2006
72 Beiträge
 
#24

Re: Höchster Wert aus Registry

  Alt 18. Jun 2007, 16:46
UPUPUPUPUP

Kennt noch keiner Lösung??

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

Registriert seit: 2. Apr 2006
72 Beiträge
 
#25

Re: Höchster Wert aus Registry

  Alt 18. Jun 2007, 16:52
Zitat von Hawkeye219:
(ohne führende Nullen)
Der Erste Schlüssel ist eine alleinstehende "0".
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#26

Re: Höchster Wert aus Registry

  Alt 18. Jun 2007, 20:20
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 3     123   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:28 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