AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Übersetzung Class MagneticWindow

Ein Thema von EWeiss · begonnen am 9. Okt 2006 · letzter Beitrag vom 18. Dez 2006
Antwort Antwort
Seite 10 von 12   « Erste     8910 1112      
Elvis

Registriert seit: 25. Nov 2005
Ort: München
1.909 Beiträge
 
Delphi 2010 Professional
 
#91

Re: Übersetzung Class MagneticWindow

  Alt 15. Okt 2006, 00:30
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.
Robert Giesecke
I’m a great believer in “Occam’s Razor,” the principle which says:
“If you say something complicated, I’ll slit your throat.”
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#92

Re: Übersetzung Class MagneticWindow

  Alt 15. Okt 2006, 10:51
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ß
  Mit Zitat antworten Zitat
Elvis

Registriert seit: 25. Nov 2005
Ort: München
1.909 Beiträge
 
Delphi 2010 Professional
 
#93

Re: Übersetzung Class MagneticWindow

  Alt 15. Okt 2006, 11:25
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?

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

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.

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.
Robert Giesecke
I’m a great believer in “Occam’s Razor,” the principle which says:
“If you say something complicated, I’ll slit your throat.”
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#94

Re: Übersetzung Class MagneticWindow

  Alt 15. Okt 2006, 12:17
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.
Ich wiederhole mich !!!
Zitat:
Natürlich hatten weder Union noch ich vor fertigen Code zu liefern.
Du wiederholst dich gerne kann das sein

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.

gruß
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.487 Beiträge
 
Delphi 7 Enterprise
 
#95

Re: Übersetzung Class MagneticWindow

  Alt 15. Okt 2006, 12:25
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.
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Daniel
(Co-Admin)

Registriert seit: 30. Mai 2002
Ort: Hamburg
13.919 Beiträge
 
Delphi 10.4 Sydney
 
#96

Re: Übersetzung Class MagneticWindow

  Alt 15. Okt 2006, 12:30
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.
Daniel R. Wolf
mit Grüßen aus Hamburg
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#97

Re: Übersetzung Class MagneticWindow

  Alt 15. Okt 2006, 12:53
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ß
  Mit Zitat antworten Zitat
Benutzerbild von mschaefer
mschaefer

Registriert seit: 4. Feb 2003
Ort: Hannover
2.029 Beiträge
 
Delphi XE3 Enterprise
 
#98

Re: Übersetzung Class MagneticWindow

  Alt 15. Okt 2006, 12:54
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 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
Martin Schaefer
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.487 Beiträge
 
Delphi 7 Enterprise
 
#99

Re: Übersetzung Class MagneticWindow

  Alt 15. Okt 2006, 12:57
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?
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#100

Re: Übersetzung Class MagneticWindow

  Alt 15. Okt 2006, 13:05
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ß
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 10 von 12   « Erste     8910 1112      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:46 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz