Delphi-PRAXiS
Seite 11 von 12   « Erste     91011 12      

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)

Union 15. Okt 2006 14:40

Re: Übersetzung Class MagneticWindow
 
Also bei mir löst es immer folgendes aus (in den "angedockten" Fenstern):
  • WM_WINDOWPOSCHANGING
  • WM_GETMINMAXINFO
  • WM_WINDOWPOSCHANGING
  • WM_WINDOWPOSCHANGED
  • WM_MOVE
Ermittelt habe ich das mit WinSpector

EWeiss 15. Okt 2006 14:56

Re: Übersetzung Class MagneticWindow
 
Zitat:

Zitat von Union
Also bei mir löst es immer folgendes aus (in den "angedockten" Fenstern):
  • WM_WINDOWPOSCHANGING
  • WM_GETMINMAXINFO
  • WM_WINDOWPOSCHANGING
  • WM_WINDOWPOSCHANGED
  • WM_MOVE
Ermittelt habe ich das mit WinSpector

Dürfte aber nicht das Performance problem auslösen.

Man hätte ja auch noch die möglichkeit
  • BeginDeferWindowPos
    DeferWindowPos
    EndDeferWindowPos

anstelle von MoveWindow zu verwenden.

Dürfte die performance wieder etwas verbessern.
Aber das ist ja allgemein bekannt.

gruß

Union 15. Okt 2006 15:31

Re: Übersetzung Class MagneticWindow
 
Ja, darüber strieten sich die Experten. Wenn ich mein altes Beispiel wie folgt ändere:
Delphi-Quellcode:
procedure TForm1.OnMove(var Msg: TWMMove);
var
   i, NumWindows : integer;
   hWinPosInfo : Cardinal;
   OldPos : TRect;
begin
   inherited;
   NumWindows := 0;
   for i := 0 to Screen.FormCount -1 do
   begin
      if Screen.Forms[i] is TForm2 then
      begin
         inc(NumWindows);
      end;
   end;

   hWinPosInfo := BeginDeferWindowPos(NumWindows);

   for i := 0 to Screen.FormCount -1 do
   begin
      if Screen.Forms[i] is TForm2 then
      begin
         // Differenz zwischen alter und neuer Position ebenfalls
         // auf die anderen Fenster anwenden
         GetWindowRect(Screen.Forms[i].handle, OldPos);
         hWinPosInfo := DeferWindowPos(hWinPosInfo,
                           Screen.Forms[i].Handle,
                           0,
                           OldPos.Left+Left-FTopLeft.Y,
                           OldPos.Top+Top-FTopLeft.X,
                           OldPos.Right-OldPos.Left,
                           OldPos.Bottom-OldPos.Top,
                           SWP_NOZORDER or SWP_NOACTIVATE);
      end;
   end;

   EndDeferWindowPos(hWinPosInfo);
end;
... dann verbessert sich die Performance nicht merklich. Und es werden immer noch die selben Nachrichten ausgeführt, nur eben in geringerem zeitlichen Abstand. Vielleicht elimiert der Aufwand für den Aufbau der Liste den dadruch entstehenden Performancegewinn ?

EWeiss 15. Okt 2006 16:43

Re: Übersetzung Class MagneticWindow
 
Zitat:

Zitat von Union
Ja, darüber strieten sich die Experten. Wenn ich mein altes Beispiel wie folgt ändere:
Delphi-Quellcode:
procedure TForm1.OnMove(var Msg: TWMMove);
var
   i, NumWindows : integer;
   hWinPosInfo : Cardinal;
   OldPos : TRect;
begin
   inherited;
   NumWindows := 0;
   for i := 0 to Screen.FormCount -1 do
   begin
      if Screen.Forms[i] is TForm2 then
      begin
         inc(NumWindows);
      end;
   end;

   hWinPosInfo := BeginDeferWindowPos(NumWindows);

   for i := 0 to Screen.FormCount -1 do
   begin
      if Screen.Forms[i] is TForm2 then
      begin
         // Differenz zwischen alter und neuer Position ebenfalls
         // auf die anderen Fenster anwenden
         GetWindowRect(Screen.Forms[i].handle, OldPos);
         hWinPosInfo := DeferWindowPos(hWinPosInfo,
                           Screen.Forms[i].Handle,
                           0,
                           OldPos.Left+Left-FTopLeft.Y,
                           OldPos.Top+Top-FTopLeft.X,
                           OldPos.Right-OldPos.Left,
                           OldPos.Bottom-OldPos.Top,
                           SWP_NOZORDER or SWP_NOACTIVATE);
      end;
   end;

   EndDeferWindowPos(hWinPosInfo);
end;
... dann verbessert sich die Performance nicht merklich. Und es werden immer noch die selben Nachrichten ausgeführt, nur eben in geringerem zeitlichen Abstand. Vielleicht elimiert der Aufwand für den Aufbau der Liste den dadruch entstehenden Performancegewinn ?

Deshalb ist meine Vorstellung gewesen!

Die handles und Recs in einen array einzubinden.
Jeder zugriff auf die Form (bei VB zumindest so) setzt eine neue Initialisierung dieser vorraus.
das geht auf die performance.

Der Vorteil es wird keine Form mehr abgefragt sondern nur noch
über die API IsWindow(handle) or IsWindow(hParent) die handles selbst überprüft.

Gruß

Muetze1 15. Okt 2006 18:55

Re: Übersetzung Class MagneticWindow
 
Zitat:

Zitat von EWeiss
Deshalb ist meine Vorstellung gewesen!

?? Hab ich nicht verstanden.

Zitat:

Zitat von EWeiss
Die handles und Recs in einen array einzubinden.
Jeder zugriff auf die Form (bei VB zumindest so) setzt eine neue Initialisierung dieser vorraus.
das geht auf die performance.

In VB mag das so sein, in Delphi ist dies nicht der Fall. Daher auch von den Vorrednern das Unverständnis eine extra Rect/Window Handle Liste zu führen.

Daniel G 15. Okt 2006 19:04

Re: Übersetzung Class MagneticWindow
 
@EWeis: Evtl. solltest du dir doch mal ein gutes Buch über Delphi holen und mal von Null anfangen? :duck:

EWeiss 15. Okt 2006 21:12

Re: Übersetzung Class MagneticWindow
 
Zitat:

In VB mag das so sein, in Delphi ist dies nicht der Fall. Daher auch von den Vorrednern
das Unverständnis eine extra Rect/Window Handle Liste zu führen.
Danke hab's verstanden !

gruß

EWeiss 15. Okt 2006 21:25

Re: Übersetzung Class MagneticWindow
 
Zitat:

Zitat von Daniel G
@EWeis: Evtl. solltest du dir doch mal ein gutes Buch über Delphi holen und mal von Null anfangen? :duck:

Na ja mußt dich nicht verstecken.
Denke wenn man zu einer anderen Sprache wechselt kann man
nicht vorraussetzen das die gepflogenheiten der neuen Sprache direkt bekannt sind.

Delphianer machen das mit ihren Boardmitteln weil bekannt ich über die API
was bitte schön ist da verkehrt ?
Wie schon gesagt es führt zum gleichen ziel, wenn auch von euch mit unverständnis ausgelegt!

Übrigends habe ich festgestellt das einige hier mit API überhaupt nichts anzufangen wissen.
Weil sie 'nur' mit Boardmitteln arbeiten.

Und fragen zu stellen davor habe ich mich noch nie gefürchtet.
Dumme Fragen gibt es nicht ... nur dumme Antworten.

In dem Sinne .


Gruß

Elvis 15. Okt 2006 22:18

Re: Übersetzung Class MagneticWindow
 
Zitat:

Zitat von EWeiss
Übrigends habe ich festgestellt das einige hier mit API überhaupt nichts anzufangen wissen.
Weil sie 'nur' mit Boardmitteln arbeiten.

In diesem Thread? Wer? :gruebel:
Es macht halt nur dann Sinn wenn man es von der VCL nicht vorgesetzt bekommt.
Denn redundanter Code ist nicht wirklich das Gelbe vom Ei. Irgendwann in den nächsten 2 Jahren wird die VCL von ANSI auf Unicode umgestellt. Code, der daran vorbeigeht könnte dann schnell Ärger machen.

sailxia 16. Dez 2006 04:56

Re: Übersetzung Class MagneticWindow
 
Liste der Anhänge anzeigen (Anzahl: 1)
hi:
i found a better Class for make magnet form, please look at:

http://codecentral.borland.com/Item.aspx?id=18654

http://www.bcp-software.nl/artikelen/magnets.html

you can download it here:


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:42 Uhr.
Seite 11 von 12   « Erste     91011 12      

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