| Autor |
Beitrag |
.Chef
      
Beiträge: 1112
|
Verfasst: 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
      
Beiträge: 6395
Erhaltene Danke: 149
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: So 31.10.04 20:47
Bei mir bekomme ich im Resize so:
Delphi-Quelltext 1:
| label1.Caption := IntToStr(Form1.Width); |
immer den virtuellen Wert angezeigt.
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: 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 
      
Beiträge: 1112
|
Verfasst: 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 
      
Beiträge: 1112
|
Verfasst: 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
      
Beiträge: 6395
Erhaltene Danke: 149
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: 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 
      
Beiträge: 1112
|
Verfasst: 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.  |

_________________ 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 
      
Beiträge: 1112
|
Verfasst: 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
      
Beiträge: 2931
XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
|
Verfasst: 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 
      
Beiträge: 1112
|
Verfasst: 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
      
Beiträge: 2931
XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
|
Verfasst: 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..
| .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:
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 public 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 with PRect(Message.lParam)^ do begin Right := Right - (Right mod 20); Bottom := Bottom - (Bottom mod 20); end;
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 
      
Beiträge: 1112
|
Verfasst: Mo 01.11.04 23:42
| Motzi hat folgendes geschrieben: | Du brauchst ja auch keine Events wenn du auf WM_SIZING reagierst..  |
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?  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
      
Beiträge: 2931
XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
|
Verfasst: 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? Ich bin doch auch kein wandelndes Lexikon für Messages. |
Sorry, hab den Thread gestern wohl übersehn..  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 
      
Beiträge: 1112
|
Verfasst: 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 "="!
|
|
|