![]() |
Re: Übersetzung Class MagneticWindow
Habe gerade den Tab hier im FF entdeckt.
Unions code lässt sich ziemlich easy in eine Komponente werfen, die man dan auf ein Form ziehen kann. Habe das eben mal durchprobiert und es geht eigentlich...
Delphi-Quellcode:
Natürlich ist es Blödsinn das ganze von der Seite aufzuwickeln.
unit uFormMagnet;
interface uses Classes, Forms, Messages, Windows; type TFormMagnet = class(TComponent) private fPreviousLocation : TPoint; fParentsOldWinProc : TWndMethod; fParent : TCustomForm; protected procedure WindowProcHandler(var message: TMessage); virtual; procedure OnMove(var msg: TWMMove); message WM_MOVE; public property Parent : TCustomForm read fParent; procedure AfterConstruction; override; procedure BeforeDestruction; override; end; implementation uses Types; { TFormMagnet } procedure TFormMagnet.AfterConstruction; begin inherited; if Owner is TCustomForm then begin fParent := TCustomForm(Owner); fParentsOldWinProc := Parent.WindowProc; Parent.WindowProc := WindowProcHandler; fPreviousLocation := Point(Parent.Left, Parent.Top); end; end; procedure TFormMagnet.BeforeDestruction; begin inherited; if Assigned(fParentsOldWinProc) then Parent.WindowProc := fParentsOldWinProc; end; procedure TFormMagnet.WindowProcHandler(var message: TMessage); begin if message.Msg = WM_MOVE then OnMove(TWMMove(message)); if Assigned(fParentsOldWinProc) then fParentsOldWinProc(TMessage(message)); end; procedure TFormMagnet.OnMove(var msg: TWMMove); var i : Integer; form : TCustomForm; begin for i := 0 to Screen.FormCount - 1 do begin form := Screen.Forms[i]; if form <> Parent then begin // Differenz zwischen alter und neuer Position ebenfalls // auf die anderen Fenster anwenden form.Top := form.Top + (Parent.Top - fPreviousLocation.y); form.Left := form.Left + (Parent.Left - fPreviousLocation.x); end; end; fPreviousLocation := Point(Parent.Left, Parent.Top); end; end. Eigentlich sollte derjenige, der sich an ein Fenster gedockt hat, sich in dessen MessageLoop klinken und mitbewegen und beim Abdocken wieder herausklinken. Die simple Lösung oben würde schon bei einem 2. Form mit der Komponente drauf oder eine weitere auf der gleichen Form aus den Fugen geraten. ;) |
Re: Übersetzung Class MagneticWindow
Zitat:
1 Prüfung zu den Screenrändern fehlt 2 Taskbar wurde nicht mit einbezogen 3 spätstens mit der 3 Form bricht das Gerüst zusammen 4 Sobald von der Masterform getrennt ist der magnetismus der anderen Formen nicht mehr gegeben 5 die ausmaße der parent Formen wurde nicht berücksichtigt 6 Kein TRECT Array 7 Kein HWND Array usw... über performance müssen wir gar nicht erst reden. Zitat:
Die Parents sollten bei der Übergabe von vorn herein schon zu einer HWND Collection addiert werden. Dann muss man nix suchen, da vorhanden. Davon sehe ich in seiner Lösung auch nichts. gruß |
Re: Übersetzung Class MagneticWindow
Zitat:
Es ging nur um ein Beispiel wie man a) simpel die Nachrichten eines Fensters abfangen kann b) andere Fenster mitbebewegen kann. Zitat:
Herauszufinden ob ein Form an die Hauptform gedockt ist wirst du doch noch hinkriegen, oder? :roll: Zitat:
Zitat:
Nix? Richtig! Zitat:
Es ist übrigens enorm schwierig Argumente zu suchen, meine Meinung darüber zu ändern, warum ich Benutzer einer gewissen "Programmier"-sprache nicht ausstehen kann. Vor allem wenn sie sich alle Mühe geben, jedem Detail des herrschenden Klischees zu entsprechen. :? |
Re: Übersetzung Class MagneticWindow
Zu deinen Antworten.
Einfach Genial hast dich selbst übertroffen. Zitat:
Verzichte Dankend auf fertigen Code wenn er so .. eine zeile höher. Zitat:
Nur dokumentieren wie schlecht die Codeansätze sind.. Kein Hand kein Fuss. Man übergibt das Handle seiner anwendung AddMainWindow(MasterHandle) Mit jeder neu aufgerufenen Form wird das Handle dieser Form mit AddMainWindow(Form, MasterHandle) zum ParentWindow(MasterHandle) als Collection addiert. Was ist da so schwer ? Ist ein leichtes abgeleitet davon Records und andere benötigte funktionen aus der Collection zu übergeben/zu vergleichen. Zitat:
Ich wiederhole mich !!! :-D Zitat:
Zitat:
Du solltest aber mal von deinen Egotripp runterkommen .. Delphi über alles. :mrgreen: gruß |
Re: Übersetzung Class MagneticWindow
Zitat:
Es ist im Übrigen generell nicht sehr performant, wenn man mehrere Fenster gleichzeitig verschiebt. Letztendlich mündet alles, ob Delphi oder VB, in einem Sendmessage(WM_WINDOWPOSCHANGED...) und das löst wieder eine unendliche Kette von Folgenachrichten aus. Eine Lösung, wie das peformanter vonstatten gehen kann, würde mich aber sehr interessieren. |
Re: Übersetzung Class MagneticWindow
Emil, kommt mal wieder ein wenig runter. Dein Interesse an einer sachlichen Diskussion ist nicht mehr erkennbar.
Wenn es nur noch um hohles Geblöke geht oder die Frage, nun doch noch irgendwie Recht zu behalten, dann bitte ich darum, diese Diskussion woanders fortzusetzen. Aktuell ist dieses Thema in einer Situation festgefahren, in der wir lediglich primitivem Herumgetrolle beiwohnen können und dafür zahle ich den Server nicht. Also: Reißt Euch allesamt (!) am Riemen und hievt diese Diskussion wieder auf ein ordentliches Level. Wer daran kein Interesse hat, möge diesem Thema fern bleiben. Union hat dankenswerterweise die Frage nach der Performanz aufgegriffen. Vielleicht ist das ja ein netter Punkt zum Anknüpfen. |
Re: Übersetzung Class MagneticWindow
Zitat:
Es löst gerade mal 1 nachfolgende Nachrichten aus. WM_GETMINMAXINFO Danach wird WM_WINDOWPOSCHANGED continue processing false ausgeführt. gruß |
Re: Übersetzung Class MagneticWindow
Moin, moin,
THEMA Eigenformsuche durch Komponente: Es gibt da zwei Fälle: 1. Die Komponente ist von TComponent abgeleitet. Diese kann sie auf Panels liegen, die wieder auf Panels liegen... Da kann man sich zur Form hochhangeln. Das ist aber im Create der Komponente ein einmaliger Vorgang. Dann hat man den Pointer auf das Form in einer Variable. 2. Die Komponente ist von TObjekt abgeleitet. Dann ist ihr Parent automatisch das Form. Zitat:
THEMA Perfomance: Innerhalb einener MDI Applikation kann man auch ohne Windows-Messages auskommen, denn in der MDI-ChildListe hat man die anderen Childfenster. Über ihre Position und Größe lassen sich dann die Fensterabstände berechnen und das Verschieben direkt ohne Message erreichen. So long // Martin |
Re: Übersetzung Class MagneticWindow
Hi,
welche Aktion hat diese (und nur diese?) Nachricht ausgelöst? Die VB-Klasse oder ein Delphi-Programm? Oder einfach das manuelle Verschieben eine bleibigen Fensters? |
Re: Übersetzung Class MagneticWindow
Zitat:
Winspector Spy überprüft nur meine Fenster andere Fenster werden nicht berücksichtigt. gruß |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:44 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