Delphi-PRAXiS

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 12:34


Höchster Wert aus Registry
 
Also in einem Registry Verzeichniss hat es ganz viele Unterordner die irgendwie so aussehen 478956 898756, 1203213 und davon möchte ich immer in den höchsten einen Wert schreiben. Wie finde ich jetzt heraus welches der höchste Wert ist?

fkerber 17. Jun 2007 12:39

Re: Höchster Wert aus Registry
 
Hi!

Alle Werte auslesen und sortieren lassen?
z.B. in eine Stringlist und dann sorted := true;


Ciao, Frederic

Luckie 17. Jun 2007 12:40

Re: Höchster Wert aus Registry
 
@fkerber: Das funktioniert nicht. Die Stringliste sortiert alphanummerisch:
1
10
2
3
4
40
41
5
...

Er wird da schon einen Sortieralgorithmus benutzen müssen.

mkinzler 17. Jun 2007 12:41

Re: Höchster Wert aus Registry
 
Zitat:

Er wird da schon einen Sortieralgorithmus benutzen müssen.
Aber das dürfte auch keine großes Problem darstellen

kaschte 17. Jun 2007 12:43

Re: Höchster Wert aus Registry
 
Hm, ok und gibts irgendwo n Tutorial dazu oder könnt ihr mir ein Beispiel machen?

mkinzler 17. Jun 2007 12:46

Re: Höchster Wert aus Registry
 
Hier im Forum suchenQuickSort

kaschte 17. Jun 2007 12:50

Re: Höchster Wert aus Registry
 
Hm, irgendwie find ich nur Sachen für Arrays aber nix für Stringlist's. Kannst du mir nicht n bisschen weiter helfen irgendwie find ich nix :oops:

Luckie 17. Jun 2007 12:52

Re: Höchster Wert aus Registry
 
Wo ist das Problem, die StringListe in ein Array zu packen? In einer Schleife durchgehen und in das Array schreiben.

kaschte 17. Jun 2007 12:54

Re: Höchster Wert aus Registry
 
Zitat:

Zitat von Luckie
Wo ist das Problem, die StringListe in ein Array zu packen? In einer Schleife durchgehen und in das Array schreiben.

Das Problem ist, dass ich noch nicht alzugut darin bin und deshalb Unterstützung brauche, kurz gesagt habe ich keinen Plan wie ich das machen soll.

Kann mir niemand einen Link oder einen kurzen Beispielcode geben?

Luckie 17. Jun 2007 12:56

Re: Höchster Wert aus Registry
 
Delphi-Quellcode:
var
  MyIntArray: array of Integer
  i: Integer;
begin
  SetLength(MyIntArray, sl.Count);
  for i := 0 to sl.Count - 1 do
  begin
    MyIntArray[i] := StrToInt(sl.Strings[i]);
  end;

Neutral General 17. Jun 2007 12:56

Re: Höchster Wert aus Registry
 
Hi,

Ich würde aber für den Anfang Bubblesort empfehlen. Ist natürlich um einiges langsamer aber fürn anfang um einiges verständlicher und einfacher... Und wenn du nicht sooo viele Werte hast dann reicht das eigentlich auch aus...

Gruß
Neutral General

kaschte 17. Jun 2007 13:03

Re: Höchster Wert aus Registry
 
Zitat:

Zitat von Luckie
Delphi-Quellcode:
var
  MyIntArray: array of Integer
  i: Integer;
begin
  SetLength(MyIntArray, sl.Count);
  for i := 0 to sl.Count - 1 do
  begin
    MyIntArray[i] := StrToInt(sl.Strings[i]);
  end;

Meine Stringlist heisst reglist, wo kommt jetzt also der Name reglist rein?


@Neutral General

Ok, also Bubblesort versteh ich glaubs, wie kann ich jetzt da es sortiert ist den höchsten Wert auslesen und diesen dann öffnen?

Luckie 17. Jun 2007 13:08

Re: Höchster Wert aus Registry
 
Und meine StringList heißt sl.

kaschte 17. Jun 2007 13:22

Re: Höchster Wert aus Registry
 
Ok, jetzt funktionieren beide varianten mit Quicksort und Bubblesort (werde wahrscheinlich Quicksort nehmen da schneller). Wie kann ich jetzt den höchsten Wert aus dem sortierten Array auslesen?

mkinzler 17. Jun 2007 13:30

Re: Höchster Wert aus Registry
 
Zitat:

Wie kann ich jetzt den höchsten Wert aus dem sortierten Array auslesen?
Je nach Sortierungsreihenfolge. Entweder den 1. oder den letzten

arnold mueller 17. Jun 2007 13:33

Re: Höchster Wert aus Registry
 
Wie meinst Du das? Wie man auf ein Element des Arrays zugreift, oder wie man den größten Wert im Array ermittelt?

Wie man auf ein Element des Array zugreift weißt Du ja bereits, da Du ja auch schon Daten in das Array geschrieben hast. Also einfach anders herum. Für den zweiten Fall stell Dir einfach vor, das Array wären Uno Karten in Deiner Hand, und Du hast Dir viel Mühe gegeben sie nach dem Wert zu sortieren. Wo würdest Du nun die Karte mit dem höchsten Wert suchen. Wahrscheinlich ganz links oder ganz rechts, oder?

-
arno

kaschte 17. Jun 2007 13:35

Re: Höchster Wert aus Registry
 
Delphi-Quellcode:
procedure Quick_Sort(var A: array of Integer);

 procedure QuickSort(var A: array of Integer; iLo, iHi: Integer);
 var
   Lo, Hi, Mid, T: Integer;
 begin
   Lo := iLo;
   Hi := iHi;
   Mid := A[(Lo + Hi) div 2];
   repeat
     while A[Lo] < Mid do Inc(Lo);
     while A[Hi] > Mid do Dec(Hi);
     if Lo <= Hi then
     begin
       T := A[Lo];
       A[Lo] := A[Hi];
       A[Hi] := T;
       Inc(Lo);
       Dec(Hi);
     end;
   until Lo > Hi;
   if Hi > iLo then QuickSort(A, iLo, Hi);
   if Lo < iHi then QuickSort(A, Lo, iHi);
 end;

begin
 QuickSort(A, Low(A), High(A));
end;
Das ist der Sortierungscode und mit dem hier ruf ich ihn auf. Arrayname ist MyIntArray:

Delphi-Quellcode:
   for I:=Low(MyIntArray) to High(MyIntArray) do
   MyIntArray[I]:=Random(High(Integer));

 Quick_Sort(MyIntArray);
Welche Reihenfolge wird hier gemacht und wie lese ich den Wert jetzt aus?

Neutral General 17. Jun 2007 13:41

Re: Höchster Wert aus Registry
 
Hi,

Im Notfall lässt du dir einfach mal Array[0] und Array[High(Array)] anzeigen und dann siehst du ja spätestens wie rum sortiert wurde ;)

Gruß
Neutral General

kaschte 17. Jun 2007 13:48

Re: Höchster Wert aus Registry
 
Delphi-Quellcode:
procedure TForm1.Deaktivieren1Click(Sender: TObject);
var regist: TRegistry;
reglist : Tstringlist;
status, i : integer;
  MyIntArray: array of Integer;
   arr: array[0..100] of integer;
begin
  regist:=TRegistry.Create;
  regist.RootKey:=HKEY_CURRENT_USER;
  regist.OpenKey('Software\***\*\*', true);
  reglist := TStringList.Create;
  status := 1;
  regist.GetKeyNames(reglist);
    SetLength(MyIntArray, reglist.Count);
  for i := 0 to reglist.Count - 1 do
  begin
    MyIntArray[i] := StrToInt(reglist.Strings[i]);
  end;
   for I:=Low(MyIntArray) to High(MyIntArray) do
   MyIntArray[I]:=Random(High(Integer));

 Quick_Sort(MyIntArray);

regist.free;
label3.caption := IntToStr(MyIntArray[0]);
Bei diesem Code kommt die Fehlermeldung:
Project *.exe raised exception class EConvertError with message "4226805319' is not a valid integer value'. Process stopped.

4226805319 ist übrigens der höchste Wert neben ihm gibt es allerdings nur noch 0 werds aber noch auf nem anderen PC probieren dort hat es mehrere.

EDIT2: Die Fehlermeldung auf dem anderen PC gab den mittleren Wert als is not a valid iteger value an.

Ralf Kaiser 17. Jun 2007 14:28

Re: Höchster Wert aus Registry
 
Zitat:

Zitat von Luckie
Er wird da schon einen Sortieralgorithmus benutzen müssen.

Nö.

Um den höchsten Wert aus einem Array rauszusuchen muss amn es nicht sortieren. Eine Variable mit 0, -1 oder leeren String initialisieren und dann mit allen Werten im Array vergleichen, ist ein Wert höher diesen Wert merken. So kommt man auch ohne sortieren aus.

Also:

Delphi-Quellcode:
maxWert := -1
for i := 0 to obereArraygrenze do begin

  if aArray[i] > maxWert then maxWert := aArray[i]

end;

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:45 Uhr.

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