Thema: Delphi SetLength mein problem

Einzelnen Beitrag anzeigen

EWeiss
(Gast)

n/a Beiträge
 
#13

Re: SetLength mein problem

  Alt 1. Nov 2006, 17:47
Zitat:
Beim Zweiten hast du ein Array wo jedes Element direkt ein Record ist. D.h. ein Eintrag in dem Array ist SizeOf(TWindowDescr) gross. Du bekommst hier im Gegensatz zum Ersten nicht nur 4 Bytes der erst auf den Record zeigt sondern du hast direkt hier den Record liegen.
Ich habe es insoweit verstanden und hoffe das ich es jetzt richtig interpretiere.
Wenn ich kein Array von Zeigern auf den Typ des Records verwende benötige ich kein New() mehr
da ich den Record direkt zur verfügung habe.
Das bedeutet auch ich benötige ebenfalls ZeroMemory nicht mehr.

Demnach sieht mein Code nun so aus!

Delphi-Quellcode:
 PWindowDescr = ^TWindowDescr;
 TWindowDescr = record
    hWnd : HWND;
    ProcessID : Pointer;
    Title : String;
    Klass : String;
    ExeName : String;
End;
    AWindowDescr = array of TWindowDescr;

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
Begin
    // Zähler initialisieren
    IntI := 0;
    h_wnd := GetTopWindow(0);
    // Zuweisen von 100 Array Elementen of PWindowDescr
    // Zum einlesen der Fenster Handle
    SetLength(wDescr, 100);

    Repeat
      // Wenn mehr als 100 Fenster Handle gefunden
      If IntI > High(wDescr) Then
        // Array um 10 erhöhen
        SetLength(wDescr, Length(wDescr) + 10);
        // Fenster Handle ermitteln
        h_wnd := GetWindow(h_wnd, GW_HWNDNEXT);
        // Fenster Handle gefunden
        If h_wnd <> 0 Then
         begin
           // Wert zuweisen
           wDescr[IntI].hWnd := h_wnd;
           // Window Informationen einlesen
           GetWindowInfo(@wDescr[IntI]);
         end;
         // Zähler um 1 erhöhen
         inc(IntI);
    // Schleife durchlaufen bis kein Fenster Handle mehr existiert
    until h_wnd = 0;

    // Array Redimensionieren Fenster-Handle Count
    SetLength(wDescr, succ(IntI));
    // Ergebnis übergeben
    Result := succ(IntI);

End;
Zitat:
Wieso 99? Ich verstehe es nicht. Ich weise nochmals auf den Unterschied bei den Begrifflichkeiten der Indexe und der Anzahl hin! Wenn ein Array 100 Elemente hat, dann sind die Index 0 bis 99 gültig. Da 0 auch ein gültiger Eintrag ist, wird 0 mitgezählt. Daher ist immer zu unterscheiden ob es nun um die Anzahl der Elemente geht oder um den höchsten Index. Der höchste Index ist bei einem dynamischen Array immer eins unter der Anzahl der Elemente!
Denke da reden wir aneinandner vorbei ich meinte den Index := 100 diesen nach Index := 99 ändern.. ergibt 100 elemente
Brauchen tu ich diesen aber auch nicht mehr da ich es geändert habe
SetLength(wDescr, 100);
Zitat:
Ich hatte das mit dem ^ falsch geschrieben. Ich hatte gestern an FillChar() gedacht, da wäre der Parameter kein Pointer sondern ein Var Parameter und dort wäre das ^ nötig gewesen. Bei ZeroMemory() sollte von daher das ^ auch bei einem Array Of PWindowDescr nicht nötig sein.
Ja das hatte ich bemerkt es hatte nämlich AV's als rückgabe
Da ich nun direkt den Record einlese hat sich das erstmal erledigt aber destotrotz Danke für die Infos
kann bei erneuter verwendung dann darauf zurückgreifen (Thread als .PDF abspeichern) feine Sache.

Gruß
  Mit Zitat antworten Zitat