Delphi-PRAXiS
Seite 5 von 12   « Erste     345 67     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Übersetzung Class MagneticWindow (https://www.delphipraxis.net/78689-uebersetzung-class-magneticwindow.html)

EWeiss 10. Okt 2006 22:41

Re: Übersetzung Class MagneticWindow
 
Zitat:

Zitat von Union
In der Standardkonfiguration heißt es result (extended Syntax). Das hat den Vorteil, dass man die Funktion umbenennen kann, ohne den evtl. verwendeten Namen 20 Mal ebenfalls ändern zu müssen. Und es ermöglicht Rekursion, wenn gewollt.

Danke habs geändert .. kann es aber noch nicht prüfen
da ich noch nicht bis hierher vordringen kann!

Die Klasse ist bis auf ein paar kleinigkeiten übersetzt.
Befinde mich nun in der Form und rufe diese mit diesen parametern auf.

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
Var
  m_Magnetic: TMagnetic;
begin
  m_Magnetic := TMagnetic.Create;    // Class TMagnetic Initialisieren
  m_Magnetic.AddWindow(Form1.Handle); // Main Handle (Hauptanwendung) addieren

end;

end.
Beim ersten aufruf direkt der erste Fehler!

Delphi-Quellcode:
    // Validate windows
    If (IsWindow(Handle) And (IsWindow(hWndParent) Or (hWndParent = 0))) Then
        begin
        // Increase count
        inc(m_lWndCount);
        // Resize arrays
//        ReDim Preserve m_uWndInfo(0 To m_lWndCount);
//        ReDim Preserve m_rcWnd(0 To m_lWndCount);

        // Add info
        With m_uWndInfo[m_lWndCount] do
          begin
            hwnd := Handle;
            hWndParent := hWndParent;
          end;
Er springt bis hwnd := Handle; dann gibt es einen AV
Delphi-Quellcode:
m_uWndInfo   : array of TWND_INFO;
Delphi-Quellcode:
Type
 PWND_INFO = ^TWND_INFO;
    TWND_INFO = record
    hwnd      : Integer;
    hWndParent : Integer;
    Glue      : Boolean;
 end;
Das ist die Type welche angesprochen wird.
Dieser wird durch ReDim Preserve m_uWndInfo(0 To m_lWndCount); verursacht
Das Array wurde noch nicht redimensioniert!
Habe noch keine umsetzungs möglichkeit dafür gefunden!


Doch gerade!
Zitat:

REDIM
To allocate dynamic variables, use New or GetMem. For REDIM PRESERVE, allocate memory for the new variable and copy the old values to the new memory, and erase the old variable with Dispose or FreeMem. A ReAllocMem function is also available.
Wie müßte die funktion dann aussehen?
für ReDim Preserve m_uWndInfo(0 To m_lWndCount);


Gruß

EWeiss 10. Okt 2006 22:45

Re: Übersetzung Class MagneticWindow
 
Zitat:

Zitat von Muetze1
Du hast 100%ig zIdx nicht nochmal woanders verwendet bzw. deklariert? z.B. als Funktionsname?

Delphi-Quellcode:
function TMagnetic.zIdx(lng_hWnd: Integer; bAdd: Boolean = False): Integer;
//Get the sc_aSubData() array index of the passed hWnd
//Get the upper bound of sc_aSubData()
//If you get an error here, you're probably Subclass_AddMsg-ing before Subclass_Start

begin
    zIdx := UBound(sc_aSubData);
     While zIdx >= 0 Do                //Iterate through the existing sc_aSubData() elements
        With sc_aSubData[zIdx] do
        begin
            If (hwnd = lng_hWnd) Then  //If the hWnd of this element is the one we're looking for
            begin
              If (Not bAdd) Then       //If we're searching not adding
                Exit;                  //Found
              If (hwnd = 0) Then       //If this an element marked for reuse.
              begin
                If (bAdd) Then         //If we're adding
                    Exit;
              end;
            End;
        End;
        dec(zIdx);                     //Decrement the index

End;
zIdx ist die funktion in der ich mich befinde.
Ansonsten wird sie nur im Header als privat nochmal aufgeführt!
function zIdx(lng_hWnd: Integer; bAdd: Boolean = False): Integer;

Gruß

Muetze1 11. Okt 2006 00:35

Re: Übersetzung Class MagneticWindow
 
Zu deinem REDIM Problem: SetLength()
Delphi-Quellcode:
  SetLength(Array, NeueLänge); // danach hat das Array von Low(Array) bis High(Array) Einträge - bzw. da es dynamisch ist von 0 bis Length(Array)-1
Zitat:

Zitat von EWeiss
Zitat:

Zitat von Muetze1
Du hast 100%ig zIdx nicht nochmal woanders verwendet bzw. deklariert? z.B. als Funktionsname?

zIdx ist die funktion in der ich mich befinde.
Ansonsten wird sie nur im Header als privat nochmal aufgeführt!
function zIdx(lng_hWnd: Integer; bAdd: Boolean = False): Integer;

Dann ist es klar, warum er ein Handle will. Das hatte ich vorhin übersehen. Dadurch wird auch dei Rekursionshinweise der anderen erklärlich. Die Lösung mit der Verwendung von Result hast du ja nun schon.

xaromz 11. Okt 2006 00:42

Re: Übersetzung Class MagneticWindow
 
Hallo,

hierzu
Delphi-Quellcode:
WMSZ_LEFT, WMSZ_TOPLEFT, WMSZ_BOTTOMLEFT:
  begin
      case Abs(rcTmp.x1 - x1) < SnapWidth of True:
       rcWnd.x1 := x1;
      end;
      case Abs(rcTmp.x1 - x2) < SnapWidth of true:
       rcWnd.x1 := x2;
      End;
   End;
fällt mir noch was ein:
Warum benutzt Du überhaupt bei einer boolschen Abfrage case?
So ist es doch viel logischer und einfacher zu verstehen:
Delphi-Quellcode:
WMSZ_LEFT, WMSZ_TOPLEFT, WMSZ_BOTTOMLEFT:
begin
  if Abs(rcTmp.x1 - x1) < SnapWidth then
    rcWnd.x1 := x1;

  if Abs(rcTmp.x1 - x2) < SnapWidth then
    rcWnd.x1 := x2;
end;
Gruß
xaromz

EWeiss 11. Okt 2006 01:24

Re: Übersetzung Class MagneticWindow
 
Warum benutzt Du überhaupt bei einer boolschen Abfrage case?
So ist es doch viel logischer und einfacher zu verstehen:
Delphi-Quellcode:
WMSZ_LEFT, WMSZ_TOPLEFT, WMSZ_BOTTOMLEFT:
begin
  if Abs(rcTmp.x1 - x1) < SnapWidth then
    rcWnd.x1 := x1;

  if Abs(rcTmp.x1 - x2) < SnapWidth then
    rcWnd.x1 := x2;
end;

Werde mir den Vorschlag mal durch den Kopf gehen lassen
Bei Vb ist ein Case Anweisung schneller als eine IF abfrage.

gruß

EWeiss 11. Okt 2006 01:43

Re: Übersetzung Class MagneticWindow
 
Delphi-Quellcode:
  SetLength(Array, NeueLänge); // danach hat das Array von Low(Array) bis High(Array) Einträge - bzw. da es dynamisch ist von 0 bis Length(Array)-1
Supi läuft jetzt durch bis zum nächsten Fehler.
Danke

Zitat:

Dann ist es klar, warum er ein Handle will. Das hatte ich vorhin übersehen. Dadurch wird auch dei Rekursionshinweise der anderen erklärlich. Die Lösung mit der Verwendung von Result hast du ja nun schon.
Jo habe das mit dem Result übernommen aber soweit bin ich mit meinen
Durchlauf noch nicht gekommen.

gruß

EWeiss 11. Okt 2006 02:15

Re: Übersetzung Class MagneticWindow
 
Delphi-Quellcode:
    // Validate windows
    If (IsWindow(Handle) And IsWindow(hWndParent)) Or (hWndParent = 0) Then
        begin
        // Increase count
        inc(m_lWndCount);
        // Resize arrays
        SetLength(m_uWndInfo, m_lWndCount);
//        ReDim Preserve m_uWndInfo(0 To m_lWndCount);
        SetLength(m_rcWnd, m_lWndCount);
//        ReDim Preserve m_rcWnd(0 To m_lWndCount);

        // Add info
        With m_uWndInfo[m_lWndCount -1] do
          begin
            hwnd := Handle;
            hWndParent := hWndParent;
          end;
Läuft jetzt durch bis an dieser stelle!
Bei ReDim Preserve funktioniert diese anweisung
Delphi-Quellcode:
With m_uWndInfo[m_lWndCount] do
Bei
Delphi-Quellcode:
SetLength(m_rcWnd, m_lWndCount);
muss ich den counter wieder um eins herabsetzen
Delphi-Quellcode:
With m_uWndInfo[m_lWndCount -1] do
ansonsten werden mir keine Daten übergeben.

Ich denke mal wenn Length(Array)-1 wird das so in Ordnung sein.

gruß

Union 11. Okt 2006 08:56

Re: Übersetzung Class MagneticWindow
 
Das liegt daran, dass in Delphi dynamische Arrays immer mit Index 0 beginnen. Bei SetLength(Array, 10) geht dann z.b. der Index von 0..9

xaromz 11. Okt 2006 09:50

Re: Übersetzung Class MagneticWindow
 
Hallo,

Du hast hier
Delphi-Quellcode:
        // Add info
        With m_uWndInfo[m_lWndCount -1] do
          begin
            hwnd := Handle;
            hWndParent := hWndParent; <---------
          end;
ein Problem. Deine Variable im Record heißt genauso wie die Variable, die Du zuweisen willst. Delphi benutzt dann zwei mal den Record-Member (geringste Sichtbarkeit).
Meist ist es sowieso besser, with zu vermeiden, dann spart man sich viel Ärger beim Debuggen (der Debugger kann innerhalb eines solchen Blocks Variableninhalte nicht anzeigen :evil: ).
Also so:
Delphi-Quellcode:
// Add info
m_uWndInfo[m_lWndCount -1].hwnd := Handle;
m_uWndInfo[m_lWndCount -1].hWndParent := hWndParent;
Gruß
xaromz

Muetze1 11. Okt 2006 10:05

Re: Übersetzung Class MagneticWindow
 
Zitat:

Zitat von EWeiss
Ich denke mal wenn Length(Array)-1 wird das so in Ordnung sein.

Darauf habe ich dich extra hingewiesen mit meinem Kommentar hinter dem SetLength()! Ansonsten nutze die Funktion High()


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:53 Uhr.
Seite 5 von 12   « Erste     345 67     Letzte »    

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 by Thomas Breitkreuz