Delphi-PRAXiS
Seite 10 von 12   « Erste     8910 1112      

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)

Elvis 15. Okt 2006 01:30

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:
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.
Natürlich ist es Blödsinn das ganze von der Seite aufzuwickeln.
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. ;)

EWeiss 15. Okt 2006 11:51

Re: Übersetzung Class MagneticWindow
 
Zitat:

Zitat von mschaefer
Union hat das fatal einfach gelöst. Mir fällt dazu nur ein, dass man auch mit einer Komponente auf die Messages eines Forms zugreifen kann. Man muß nur die Parents durchlaufen bis man am Form angekommen ist und klinkt sich dann ein.

Ach so, so ein Ingenieur- oder Informatiikstudium hat aus gutem Grund einen Titel. Das wird einem nicht geschenkt und ist einfach der Nachweiss, für Biss und Ausdauer und (Prüfungs-)(Sresstoleranz auf einem Arbeitsgebiet. Es gibt natürlich auch andere Nachweismöglichkeiten, z.B. die Bill Gates-Variante.

Grüße // Martin

Der Effekt dieser lösung ist gleich 0
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:

Man muß nur die Parents durchlaufen bis man am Form angekommen ist und klinkt sich dann ein.
Schlechteste Lösung überhaupt!

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ß

Elvis 15. Okt 2006 12:25

Re: Übersetzung Class MagneticWindow
 
Zitat:

1 Prüfung zu den Screenrändern fehlt
2 Taskbar wurde nicht mit einbezogen
Öhm, es ging hier nicht darum dir fertigen Code zu liefern.
Es ging nur um ein Beispiel wie man a) simpel die Nachrichten eines Fensters abfangen kann
b) andere Fenster mitbebewegen kann.
Zitat:

3 spätestens mit der 3 Form bricht das Gerüst zusammen
Wie gesagt, der Code oben gibt dir alle Forms deiner App zur Hand und lässt dich dann entscheiden was zu tun ist.
Herauszufinden ob ein Form an die Hauptform gedockt ist wirst du doch noch hinkriegen, oder? :roll:

Zitat:

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
ach ne... :roll:

Zitat:

6 Kein TRECT Array
7 Kein HWND Array
6, setzen. Was will man mit einem Rect/Handle-Array wenn man bereits eine objektorientierte Abstraktion über die WinAPI benutzt?
Nix? Richtig!
Zitat:

Schlechteste Lösung überhaupt!
Du wirst lachen, im Normalfall verfügen die Leser in diesem Forum über genügend Fähigkeiten in Sachen Abstraktion und Assoziation, dass sie erkannt hätten, dass es ein Beispiel ist was grundlegende Dinge erklären soll. Natürlich hatten weder Union noch ich vor fertigen Code zu liefern. :wall:

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. :?

EWeiss 15. Okt 2006 13:17

Re: Übersetzung Class MagneticWindow
 
Zu deinen Antworten.
Einfach Genial hast dich selbst übertroffen.

Zitat:

Öhm, es ging hier nicht darum dir fertigen Code zu liefern.
Es ging nur um ein Beispiel wie man a) simpel die Nachrichten eines Fensters abfangen kann
Was ist ein Beispiel wert das nicht annährend funktional ist.
Verzichte Dankend auf fertigen Code wenn er so .. eine zeile höher.

Zitat:

Wie gesagt, der Code oben gibt dir alle Forms deiner App zur Hand und lässt dich dann entscheiden was zu tun ist.
Herauszufinden ob ein Form an die Hauptform gedockt ist wirst du doch noch hinkriegen, oder?
Ich will gar nichts hinkriegen.
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:

Was will man mit einem Rect/Handle-Array wenn man bereits eine objektorientierte Abstraktion über die WinAPI benutzt?
Hast du selbst schon sehr genial beantwortet. :roll: :wall:
Ich wiederhole mich !!! :-D
Zitat:

Natürlich hatten weder Union noch ich vor fertigen Code zu liefern.
Du wiederholst dich gerne kann das sein :wall:

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.
Zugegeben Delphi ist eine feine Sprache.
Du solltest aber mal von deinen Egotripp runterkommen .. Delphi über alles. :mrgreen:

gruß

Union 15. Okt 2006 13:25

Re: Übersetzung Class MagneticWindow
 
Zitat:

über performance müssen wir gar nicht erst reden
Der Code war nur ein POC wie man so etwas generell lösen kann und innerhalb von ein paar Minuten hingehackt um evtl. Denkanstöße zu liefern. Es sollte nicht heissen, dass es die komplette Klasse TMagnetic auch abbildet - es sollte vielmehr zeigen, was für Möglichkeiten Delphi in dem Bereich bietet ohne große Verrenkungen bietet.

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.

Daniel 15. Okt 2006 13:30

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.

EWeiss 15. Okt 2006 13:53

Re: Übersetzung Class MagneticWindow
 
Zitat:

Zitat von Union
Zitat:

über performance müssen wir gar nicht erst reden
Der Code war nur ein POC wie man so etwas generell lösen kann und innerhalb von ein paar Minuten hingehackt um evtl. Denkanstöße zu liefern. Es sollte nicht heissen, dass es die komplette Klasse TMagnetic auch abbildet - es sollte vielmehr zeigen, was für Möglichkeiten Delphi in dem Bereich bietet ohne große Verrenkungen bietet.

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.

Ich habs geprüft mit Winspector Spy kann deine Meinung nicht bestätigen.
Es löst gerade mal 1 nachfolgende Nachrichten aus.

WM_GETMINMAXINFO
Danach wird WM_WINDOWPOSCHANGED continue processing false ausgeführt.

gruß

mschaefer 15. Okt 2006 13:54

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:

Zitat von EWeiss
[Die Parents sollten bei der Übergabe von vorne herein schon zu einer HWND Collection addiert werden.

Bei beiden Varianten habe ich dann einen Pointer des Typs TForm. Weiterhin hat jedes MDI eine Childs-Liste. Zusätzliche Arrays braucht man unter Delphi nicht, da man Aufbaubedingt nichts suchen muß, soweit man den Effekt nur innerhalb der eigenen Applikation haben möchte. Wenn er Applikationsübergreifend stattfinden soll, dann muß geklärt werden, welche Applikation Master ist und welche sich nur neu positioniert.


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

Union 15. Okt 2006 13:57

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?

EWeiss 15. Okt 2006 14:05

Re: Übersetzung Class MagneticWindow
 
Zitat:

Zitat von Union
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?

Das verschieben meines Fensters(Player) incl.. der angedockten Fenster.
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.
Seite 10 von 12   « Erste     8910 1112      

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