![]() |
Re: Übersetzung Class MagneticWindow
Zitat:
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:
Beim ersten aufruf direkt der erste Fehler!
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.
Delphi-Quellcode:
Er springt bis hwnd := Handle; dann gibt es einen AV
// 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;
Delphi-Quellcode:
m_uWndInfo : array of TWND_INFO;
Delphi-Quellcode:
Das ist die Type welche angesprochen wird.
Type
PWND_INFO = ^TWND_INFO; TWND_INFO = record hwnd : Integer; hWndParent : Integer; Glue : Boolean; end; 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:
für ReDim Preserve m_uWndInfo(0 To m_lWndCount); Gruß |
Re: Übersetzung Class MagneticWindow
Zitat:
Delphi-Quellcode:
zIdx ist die funktion in der ich mich befinde.
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; Ansonsten wird sie nur im Header als privat nochmal aufgeführt! function zIdx(lng_hWnd: Integer; bAdd: Boolean = False): Integer; Gruß |
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:
|
Re: Übersetzung Class MagneticWindow
Hallo,
hierzu
Delphi-Quellcode:
fällt mir noch was ein:
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; Warum benutzt Du überhaupt bei einer boolschen Abfrage case? So ist es doch viel logischer und einfacher zu verstehen:
Delphi-Quellcode:
Gruß
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; xaromz |
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ß |
Re: Übersetzung Class MagneticWindow
Delphi-Quellcode:
Supi läuft jetzt durch bis zum nächsten Fehler.
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
Danke Zitat:
Durchlauf noch nicht gekommen. gruß |
Re: Übersetzung Class MagneticWindow
Delphi-Quellcode:
Läuft jetzt durch bis an dieser stelle!
// 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; Bei ReDim Preserve funktioniert diese anweisung
Delphi-Quellcode:
Bei
With m_uWndInfo[m_lWndCount] do
Delphi-Quellcode:
muss ich den counter wieder um eins herabsetzen
SetLength(m_rcWnd, m_lWndCount);
Delphi-Quellcode:
ansonsten werden mir keine Daten übergeben.
With m_uWndInfo[m_lWndCount -1] do
Ich denke mal wenn Length(Array)-1 wird das so in Ordnung sein. gruß |
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
|
Re: Übersetzung Class MagneticWindow
Hallo,
Du hast hier
Delphi-Quellcode:
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).
// Add info
With m_uWndInfo[m_lWndCount -1] do begin hwnd := Handle; hWndParent := hWndParent; <--------- end; 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:
Gruß
// Add info
m_uWndInfo[m_lWndCount -1].hwnd := Handle; m_uWndInfo[m_lWndCount -1].hWndParent := hWndParent; xaromz |
Re: Übersetzung Class MagneticWindow
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:53 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 by Thomas Breitkreuz