Thema: Delphi SetLength mein problem

Einzelnen Beitrag anzeigen

Muetze1
(Gast)

n/a Beiträge
 
#10

Re: SetLength mein problem

  Alt 31. Okt 2006, 18:51
Ich gebe deinen Quellcode mal wieder mit ein paar Anmerkungen als Kommentar

Delphi-Quellcode:
 PWindowDescr = ^TWindowDescr;
 TWindowDescr = record
    hWnd : HWND;
    ProcessID : Pointer;
    Title : String;
    Klass : String;
    ExeName : String;
End;
    AWindowDescr = array of PWindowDescr; // Warum ein Array von Zeigern auf den Record anstatt eines Arrays of Records?

Var
    wDescr : AWindowDescr;

// Alle offene Fenster suchen.
Function GetWindowList(var wDescr: AWindowDescr): DWORD;
Var
  IntI : Integer; // Zähler füt die Fenster Handle
  h_wnd : HWND; // Fenster Handle
  Index : Integer;
Begin
    // Zähler initialisieren
    IntI := 0;
    h_wnd := GetTopWindow(0);
    // Zuweisen von 100 Array Elementen of PWindowDescr
    // Zum einlesen der Fenster Handle
    Index := 100;
    SetLength(wDescr, Succ(index)); // also werden hier 101 Elemente angelegt, Zugreifbar mit Index 0 bis 100

    New(wDescr[index]); // warum holst du dir den Speicher für nur einen Record (den an Index 100)? Was ist der Sinn?

    ZeroMemory(wDescr[index], SizeOf(wDescr[index]^)); // warum initialisierst du den Record bei Index 100?
                                                        // Ich glaube der erste Parameter müsste noch ein ^ bekommen, weil sonst
                                                        // schreibt ZeroMemory die Array-Pointer-Liste mit 0'en voll anstatt des Records
    Repeat
      // Zähler um 1 erhöhen // warum? Willst du Index 0 nicht nutzen? Wenn vor dem Until ein Inc(IntI)
      inc(IntI);

      // Wenn mehr als High Fenster Handle gefunden
      If IntI > High(wDescr) Then
        // Array um 10 erhöhen
        SetLength(wDescr, High(wDescr) + 10); // High() gibt dir den höchsten Index an, aber nicht die Anzahl der Elemente. SetLength() will die Anzahl der neuen Elemente, also Anzahl der Elemente bisher + 10, sprich: SetLength(wDescr, Length(wDescr) + 10);

        // Fenster Handle ermitteln
        h_wnd := GetWindow(h_wnd, GW_HWNDNEXT);
        // Fenster Handle gefunden
        If h_wnd <> 0 Then
         begin
           New(wDescr[IntI]); // beachte hier: es ist der Index 100 schon initialisiert!
           ZeroMemory(wDescr[IntI], SizeOf(wDescr[IntI]^)); // siehe oben: 1. Parameter sollte noch ein ^ bekommen
           // Wert zuweisen
           wDescr[IntI].hWnd := h_wnd;
           // Window Informationen einlesen
           GetWindowInfo(wDescr[IntI]);
         end;

    // Schleife durchlaufen bis kein Fenster Handle mehr existiert
    until h_wnd = 0;

    // Array Redimensionieren Fenster-Handle Count
    SetLength(wDescr, IntI); // wenn du oben das mit dem Inc(IntI) änderst, dann hier Succ(IntI) als höchstes Element setzen
    // Ergebnis übergeben
    Result := IntI;

End;
Ich hoffe das hilft und löst nicht wieder Beleidigungen aus...
  Mit Zitat antworten Zitat