Zou het niet handig zijn om eindgebruikers de mogelijkheid te geven om een formulier naar eigen smaak in te richten? Daar zit natuurlijk heel wat geprogrammeer aan vast, maar het verlost je als programmeur wel van het eindeloos bijstellen van een formulierenresultaat. Om er toch wat aan over te houden in financieel opzicht zou je het natuurlijk optioneel moeten meeleveren. Een van de klusjes die daarbij komt kijken is het programmeren van die handige pipjes rond de controls waaraan een en ander kan worden vastgepakt, geresized en geherpositioneerd.
Na wat speurwerk op het web bleek hier reeds een passende oplossing voor te bestaan in de vorm van een component met de naam StretchHandle wat door Anthony Scott is vervolmaakt en als freeware beschikbaar is gesteld.
De hier getoonde versie 2.0 is ook in staat om meerdere child componenten te manipuleren.
Samenvatting:
TStretchHandle imiteert de grabhandles die ook te zien zijn in de Delphi Forms Designer. Het bevat drag/drop en resize functionaliteit door gebruik te maken van de linker muistoets en de cursortoetsen. Zet gewoon een TStretchHandle component op je form, en attach de componenten of het component dat op runtime moet worden gemanipuleerd. Dit gaat door het aanroepen van de Attach methode. Een goede plek om dit te bewerkstelligen zou zijn door Attach aan te roepen in de OnMouseDown event handler van het component.:
Voorbeeld:
procedure TForm1.Label1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
StretchHandle1.Attach(Label1);
end;
Grab handles verschijnen op de hoeken en zijden van het te resizen (child) control, TStretchHandle doet de rest. TStretchHandle wordt niet de Parent van de control(s) die het bevat, hoewel je dit misschien zou denken; in feite wordt automatisch de Parent van het eerste 'child' overgenomen. Er zijn properties om de kleur van de grab handles te beinvloeden, voor de dragcursor en de instellingen van het optionele snap-to grid.
Notes:
ChildCount en Attached zijn readonly properties.
TStretchHandle doet geen "echte" drag en drop tijdens het draggen van componenten - die worden simpelweg verplaatst naar een nieuwe positie op de zelfde Parent.
|
Properties: |
Methods: |
Events: |
|
|
|
Attached |
Create(AOwner: TComponent) |
OnClick |
|
ChildCount |
Destroy |
OnDblClick |
|
Children[] |
Attach(ChildControl: TControl) |
OnMouseDown |
|
Color |
Detach |
OnMouseMove |
|
Cursor |
ReleaseChild(ChildControl: TControl) |
OnMouseUp |
|
DragCursor |
IndexOf(ChildControl: TControl) |
OnKeyDown |
|
Enabled |
BringToFront |
OnKeyUp |
|
GridX |
SendToBack |
OnKeyPress |
|
GridY |
SetBounds(ALeft, ATop, AWidth, AHeight: Integer) |
|
Height |
SetColors(Color1, Color2: TColor) |
|
HelpContext |
|
Hint |
|
Left |
|
Locked |
Exceptions: |
|
Name |
|
ParentShowHint |
EBadChild (when trying to attach a Form!) |
|
PopupMenu |
|
SecondaryColor |
|
ShowHint |
|
SnapToGrid |
|
Tag |
|
Top |
|
Visible |
|
Width |
Dit component downloaden : #SLOT_IMG >Stretch.zip