Autor Beitrag
Tobi482
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 135



BeitragVerfasst: So 03.08.08 11:26 
Hi Leute,

ich habe einen kleinen schönheitsmakel in meinem programm gefunden und weiß nicht recht wie man ihn behebt. auf meiner form sind mehrere controls angeordnet, die sich beim "resizen" der form dynamische positionieren. ihre lage zueinander ist jedoch nur bis zu einem gewissen grad realisierbar (sonst wird alles funzelig klein). deshalb habe ich die größe meiner form begrenzt (constraints).

vergrößert oder verkleinert man ein fenster durch ziehen mit der maus, so ensteht ein grauer rahmen, der die neue größe angibt. ich erinner mich an programme, die in der lage waren diesen rahmen zu begrenzen.

wie geht das?

in meinem fall kann ich den rahmen viel zuklein wählen und mein fenster springt, aber wieder auf meine limitierung zurück. also im prinzip geht alles außer, dass dieser graue rahmen potentiell kleiner gezogen werden kann als erlaubt.

wie behebe ich diesen kleinen schönheitsfehler?

Mit freundlichen Grüßen
Tobi
Blawen
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 616
Erhaltene Danke: 33

Win XP, Vista, 7
Delphi 5 Prof., BDS 2006 Prof. RAD Studio XE
BeitragVerfasst: So 03.08.08 15:22 
So richtig verstanden habe ich Dein Problem nicht wirklich.

Daher mal ne "dumme" Frage:
Du willst anscheinend, dass die Grösse Deiner Form nicht verändert werden kann.
Wieso nimmst Du beim BorderStyle nicht einach (z.B) bsDialog?

_________________
Es kompilert, wir können ausliefern.
Und es kompiliert wieder - das Update ist fertig - bitte 100 Euro ;-)
Tobi482 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 135



BeitragVerfasst: Do 07.08.08 13:23 
hi danke für deine Antrowrt, also ich probiere es nochmal^^

ich habe eine form auf der sind controls angeordnet. diese controls müssen imemr in bestimmen relationen zueinander stehen (leiste links muss immer 20% der fenster breite sein etc). diese relationen werden nach jedem resize im onresize event neu besetzt.

soweit sogut

es ist jedoch nicht möglich diese reltionen bis ins kleinste aufrecht zu halten. irgendwann würden die controls sehr sehr klein werden und die funktionalität wäre nicht mehr gewährleistet, da einige control fast verschwinden (zu kline werden). daher habe ich eine mindestgröße für mein fenster festgelegt.
diese mindestgröße habe ich durch constraints festgelegt.

die limiterung klappt! ich kann das fenster nicht mehr kleiner machen als erwünscht.

nun zu meinem problem. es handlet sich hierbei um einen schönheitsfehler der an sich keine auswirkungen hat, mich aber trotzdem stört.

klickt man auf den fensterrahmen und hält die maustaste gedrückt, so friert windows das fenster ein und einer grauer semitransparenter rahmen wird sichtbar. solange man die maus nicht loslässt, ist man in der lage diesen rahmen zu verändern. er ist ein repäsentant der neuen zukünftigen fenstergröße.

trotz der limitierung der constraints ist man in der lage diesen grauen rahmen kleiner zu machen als man ihn machen drüfte. lässt man den rahmen in einem zukleinen zustand los, so treten die constraints in kraft und stelle die mindestgröße wieder her. ich kann mich aber auch an programme erinnern(gerade kein beispiel) bei denen dieser graue rahmen beschränkt wurde.

Frage: wie beschränke ich diesen grauen rahmen?

Gruß
Tobi
Tobi482 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 135



BeitragVerfasst: Fr 08.08.08 14:36 
da mir bisher keiner helfen konnte und mich dieser schönheitsfehler wirklich wurmt, hab ich die entsprechende stelle in einem geeigneten Programm reverse't.

Durch etwas Backtracing ergab die Analyse folgenden Resultate

ausblenden Delphi-Quelltext
1:
procedure OnMessage_GETMINMAXINFO(var Msg:TWMGETMINMAXINFO); message WM_GETMINMAXINFO;					

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure TForm.OnMessage_GETMINMAXINFO(var Msg:TWMGetMinMaxInfo);
function cp(x,y:Integer):TPoint;
begin
     Result.X := x;
     result.Y := y;
end;
begin
     Msg.MinMaxInfo^.ptMinTrackSize := cp(100100);
     Msg.MinMaxInfo^.ptMaxTrackSize := cp(640480);

     inherited;
end;


Habe trotz Hilfe der MSDN keine auswirkungen der anderen Parameter finden können.

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:
typedef struct {
    POINT ptReserved;
    POINT ptMaxSize;
    POINT ptMaxPosition;
    POINT ptMinTrackSize;
    POINT ptMaxTrackSize;
}
 MINMAXINFO;

Members
ptReserved
     Reserved; do not use.

ptMaxSize
     Specifies the maximized width (POINT.x) and the maximized height (POINT.y) of
     the window. For top-level windows, this value is based on the width of the
     primary monitor.

ptMaxPosition

     Specifies the position of the left side of the maximized window (POINT.x) and
     the position of the top of the maximized window (POINT.y). For top-level windows,
     this value is based on the position of the primary monitor.

ptMinTrackSize
     Specifies the minimum tracking width (POINT.x) and the minimum tracking height
     (POINT.y) of the window. This value can be obtained programmatically from the
     system metrics SM_CXMINTRACK and SM_CYMINTRACK.

ptMaxTrackSize
     Specifies the maximum tracking width (POINT.x) and the maximum tracking height
     (POINT.y) of the window. This value is based on the size of the virtual screen
     and can be obtained programmatically from the system metrics SM_CXMAXTRACK and
     SM_CYMAXTRACK.


Mit freundlichen Grüßen
Tobi