Autor Beitrag
.Chef
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1112



BeitragVerfasst: So 31.10.04 20:22 
Hallo,

ich hätte da auch mal eine Frage. ;-)

Gibt es eine Möglichkeit, die (virtuellen) neuen Koordinaten eines Fensters zu überwachen, während seine Größe geändert wird (sozusagen die Koordinaten dieses Resize-Rahmens)? Ich habe bis jetzt erfolglos probiert:

- Alle Events von TForm, die irgendwas mit Resize zu tun haben, liefern den Wert erst zurück, wenn die Maus losgelassen wird.
- Für WM_SYSCOMMAND - SC_SIZE gilt das Gleiche.
- OnMouseMove wird nicht ausgelöst, was mir etwas schleierhaft ist.
- WM_WINDOWPOSCHANGING reagiert nur zu Beginn der Änderung.
- Ich habe schon WM_ENTERSIZEMOVE und WM_EXITSIZEMOVE probiert, was mir aber nichts nützt, wenn ich die Mausbewegung nicht überwachen kann.

Hintergrund der Frage ist, dass ich eine gerasterte Größenänderung des Fensters realisieren möchte. Das Fenster wird vollständig von einem Memo belegt, und ich möchte darin nur "ganze" Zeichen anzeigen. Außerdem möchte ich während der Größenänderung einen Tooltip zeigen, welcher die Anzahl sichtbarer Zeilen und Spalten im Memo anzeigt.

Gruß,
Jörg

_________________
Die Antworten auf die 5 häufigsten Fragen:
1. Copy(), Pos(), Length() --- 2. DoubleBuffered:=True; --- 3. Application.ProcessMessages bzw. TThread --- 4. ShellExecute() --- 5. Keine Vergleiche von Real-Typen mit "="!
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6395
Erhaltene Danke: 149

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: So 31.10.04 20:47 
Bei mir bekomme ich im Resize so:
ausblenden Delphi-Quelltext
1:
  label1.Caption := IntToStr(Form1.Width);					

immer den virtuellen Wert angezeigt.
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: So 31.10.04 20:51 
Guck dir mal das Ereignis OnCanResize an.
Dort kannst du auch Einfluss auf die Größe nehmen, bzw. die Mauskoordinaten abfragen.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
.Chef Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1112



BeitragVerfasst: So 31.10.04 20:54 
Ich nicht. Kann es sein, dass du den Fensterinhalt anzeigen lässt während der Größenänderung? Ich nämlich nicht. Was vielleicht auch zum Problem wird beim Anzeigen von dem Tooltip.

_________________
Die Antworten auf die 5 häufigsten Fragen:
1. Copy(), Pos(), Length() --- 2. DoubleBuffered:=True; --- 3. Application.ProcessMessages bzw. TThread --- 4. ShellExecute() --- 5. Keine Vergleiche von Real-Typen mit "="!
.Chef Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1112



BeitragVerfasst: So 31.10.04 20:55 
BenBE hat folgendes geschrieben:
Guck dir mal das Ereignis OnCanResize an.
Dort kannst du auch Einfluss auf die Größe nehmen, bzw. die Mauskoordinaten abfragen.

Das hab ich mir schon angeschaut. Selbes Problem.

_________________
Die Antworten auf die 5 häufigsten Fragen:
1. Copy(), Pos(), Length() --- 2. DoubleBuffered:=True; --- 3. Application.ProcessMessages bzw. TThread --- 4. ShellExecute() --- 5. Keine Vergleiche von Real-Typen mit "="!
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6395
Erhaltene Danke: 149

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: So 31.10.04 21:01 
.Chef hat folgendes geschrieben:
Kann es sein, dass du den Fensterinhalt anzeigen lässt während der Größenänderung?

Stimmt. Sonst könnte ich die Änderung der Label-Caption ja auch nicht sehen.
Hab so auf Anhieb auch keine Idee für dein Problem. :(
.Chef Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1112



BeitragVerfasst: So 31.10.04 21:03 
jasocul hat folgendes geschrieben:
Stimmt. Sonst könnte ich die Änderung der Label-Caption ja auch nicht sehen.

Das habe ich umgangen, in dem ich wahlweise die Größe im Application.Title oder einem zweiten Fenster angezeigt habe.

jasocul hat folgendes geschrieben:
Hab so auf Anhieb auch keine Idee für dein Problem. :(

:bawling:

_________________
Die Antworten auf die 5 häufigsten Fragen:
1. Copy(), Pos(), Length() --- 2. DoubleBuffered:=True; --- 3. Application.ProcessMessages bzw. TThread --- 4. ShellExecute() --- 5. Keine Vergleiche von Real-Typen mit "="!
.Chef Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1112



BeitragVerfasst: Mo 01.11.04 22:56 
Problem gelöst mit einem Maushook ...

_________________
Die Antworten auf die 5 häufigsten Fragen:
1. Copy(), Pos(), Length() --- 2. DoubleBuffered:=True; --- 3. Application.ProcessMessages bzw. TThread --- 4. ShellExecute() --- 5. Keine Vergleiche von Real-Typen mit "="!
Motzi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: Mo 01.11.04 23:04 
.Chef hat folgendes geschrieben:
Problem gelöst mit einem Maushook ...

Ist ein Maushook dafür nicht ein bisschen overkill? Was hältst du von WM_SIZING?

Wie hast du denn das im Moment mit dem Tooltip gelöst? Ich würd das über ein selbst erzeugtes Hint-Fenster machen (siehe dazu in der OH: HintWindowClass)..

Gruß, Motzi

_________________
gringo pussy cats - eef i see you i will pull your tail out by eets roots!
.Chef Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1112



BeitragVerfasst: Mo 01.11.04 23:09 
Motzi hat folgendes geschrieben:
Ist ein Maushook dafür nicht ein bisschen overkill? Was hältst du von WM_SIZING?

Das Problem ist, dass die ganzen Events nicht ausgelöst werden, wenn man beim Größe ändern den Fensterinhalt nicht anzeigt (von den Windowseinstellungen aus).
Also schalte ich bei WM_ENTERSIZEMOVE den Hook an, und bei WM_EXITSIZEMOVE wieder aus. Das geht. Mit Gewalt geht eben alles.

Motzi hat folgendes geschrieben:
Wie hast du denn das im Moment mit dem Tooltip gelöst? Ich würd das über ein selbst erzeugtes Hint-Fenster machen (siehe dazu in der OH: HintWindowClass)..

Ich wollte erst die bewährte Panel-Lösung nehmen, hab jetzt aber ein eigenes Formular dafür, damit der Tip auch frei schweben kann.

_________________
Die Antworten auf die 5 häufigsten Fragen:
1. Copy(), Pos(), Length() --- 2. DoubleBuffered:=True; --- 3. Application.ProcessMessages bzw. TThread --- 4. ShellExecute() --- 5. Keine Vergleiche von Real-Typen mit "="!
Motzi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: Mo 01.11.04 23:28 
.Chef hat folgendes geschrieben:
Motzi hat folgendes geschrieben:
Ist ein Maushook dafür nicht ein bisschen overkill? Was hältst du von WM_SIZING?

Das Problem ist, dass die ganzen Events nicht ausgelöst werden, wenn man beim Größe ändern den Fensterinhalt nicht anzeigt (von den Windowseinstellungen aus).
Also schalte ich bei WM_ENTERSIZEMOVE den Hook an, und bei WM_EXITSIZEMOVE wieder aus. Das geht. Mit Gewalt geht eben alles.

Du brauchst ja auch keine Events wenn du auf WM_SIZING reagierst.. :roll:

.Chef hat folgendes geschrieben:
Motzi hat folgendes geschrieben:
Wie hast du denn das im Moment mit dem Tooltip gelöst? Ich würd das über ein selbst erzeugtes Hint-Fenster machen (siehe dazu in der OH: HintWindowClass)..

Ich wollte erst die bewährte Panel-Lösung nehmen, hab jetzt aber ein eigenes Formular dafür, damit der Tip auch frei schweben kann.

Ein eigenes Formular..? Wozu, geht mit einem Hint-Window auch..!

Probier mal folgenden Code:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
  private
    { Private declarations }
  public
    { Public declarations }
    FHintWnd: THintWindow;
    procedure WMEnterSizeMove(var Message: TMessage); message WM_ENTERSIZEMOVE;
    procedure WMExitSizeMove(var Message: TMessage); message WM_EXITSIZEMOVE;
    procedure WMSizing(var Message: TMessage); message WM_SIZING;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.WMEnterSizeMove(var Message: TMessage);
begin
  if not Assigned(FHintWnd) then
    FHintWnd := HintWindowClass.Create(Self);
end;

procedure TForm1.WMExitSizeMove(var Message: TMessage);
begin
  FHintWnd.ReleaseHandle;
end;

procedure TForm1.WMSizing(var Message: TMessage);
var
  aRect: TRect;
  aPoint: TPoint;
  sHint: String;
begin
  // Formular nur in 20px-Schritten resizen lassen
  with PRect(Message.lParam)^ do
  begin
    Right := Right - (Right mod 20);
    Bottom := Bottom - (Bottom mod 20);
  end;

  // Hint-Fenster anzeigen
  sHint := Format('Width: %d; Height: %d', [Width, Height]);
  FHintWnd.Color := Application.HintColor;
  aRect := FHintWnd.CalcHintRect(GetSystemMetrics(SM_CXSCREEN), sHint, nil);
  GetCursorPos(aPoint);
  OffsetRect(aRect, aPoint.x + (GetSystemMetrics(SM_CXCURSOR) div 2),
    aPoint.y + (GetSystemMetrics(SM_CYCURSOR) div 2));
  FHintWnd.ActivateHint(aRect, sHint);
end;

end.

_________________
gringo pussy cats - eef i see you i will pull your tail out by eets roots!
.Chef Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1112



BeitragVerfasst: Mo 01.11.04 23:42 
Motzi hat folgendes geschrieben:
Du brauchst ja auch keine Events wenn du auf WM_SIZING reagierst.. :roll:

Das meinte ich auch mit Events, denn Messages sind ja quasi das Selbe (keine Diskussion!!). WM_SIZING habe ich allerdings noch nicht ausprobiert, und ausgerechnet das geht! Hättste das nicht mal eher sagen können? :roll: Ich bin doch auch kein wandelndes Lexikon für Messages. Jetzt habe ich den Hook, und werde ihn auch lassen. Der macht wenigstens was her im Quelltext.

Motzi hat folgendes geschrieben:
Ein eigenes Formular..? Wozu, geht mit einem Hint-Window auch..!

Mit dem Formular habe ich jetzt designtechnisch mehr Freiheiten.

_________________
Die Antworten auf die 5 häufigsten Fragen:
1. Copy(), Pos(), Length() --- 2. DoubleBuffered:=True; --- 3. Application.ProcessMessages bzw. TThread --- 4. ShellExecute() --- 5. Keine Vergleiche von Real-Typen mit "="!
Motzi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: Mo 01.11.04 23:49 
.Chef hat folgendes geschrieben:
Das meinte ich auch mit Events, denn Messages sind ja quasi das Selbe (keine Diskussion!!).

Jain.. die Events werden auch nur aufgrund von Messages ausgelöst, da hast du recht, aber es gibt eben nicht für jede Message ein Event.
.Chef hat folgendes geschrieben:
WM_SIZING habe ich allerdings noch nicht ausprobiert, und ausgerechnet das geht! Hättste das nicht mal eher sagen können? :roll: Ich bin doch auch kein wandelndes Lexikon für Messages.

Sorry, hab den Thread gestern wohl übersehn.. :oops: Aber mit ein bisschen suchen im SDK hättest du sie durchaus finden können. Soo abwegig ist der Name ja schließlich nicht..! ;)
.Chef hat folgendes geschrieben:
Jetzt habe ich den Hook, und werde ihn auch lassen.

Deine Entscheidung, ich würd aber trotzdem auf die Message umstellen...

.Chef hat folgendes geschrieben:
Mit dem Formular habe ich jetzt designtechnisch mehr Freiheiten.

Gut, da hast du natürlich recht..!

_________________
gringo pussy cats - eef i see you i will pull your tail out by eets roots!
.Chef Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1112



BeitragVerfasst: Mo 01.11.04 23:55 
Wie dem auch sei, ich danke dir für deine Hinweise. :-)

_________________
Die Antworten auf die 5 häufigsten Fragen:
1. Copy(), Pos(), Length() --- 2. DoubleBuffered:=True; --- 3. Application.ProcessMessages bzw. TThread --- 4. ShellExecute() --- 5. Keine Vergleiche von Real-Typen mit "="!