type TForm1 = class(TForm) protected procedure CreateParams(var Params: TCreateParams); override; end; procedure TForm1.CreateParams(var Params: TCreateParams); begin BorderStyle := bsNone; inherited; Params.ExStyle := Params.ExStyle or WS_EX_STATICEDGE; Params.Style := Params.Style or WS_SIZEBOX; end;
Sunday, February 24, 2008
Resize Form even if it is borderless
We may make a form without borders to show some additional information using some popup windows. However, a borderless form will no longer resizable.
Use the following code to make a borderless form resizable:
Move a form without dragging on the title bar
We usually use mouse to drag the windows form title bar to move the window on our desktop. There is a new way to move the form by just dragging on any point in the form itself. This is ideally suitable for those form that don't have title bar.
For example,
FormStyle := bsNone;
Use the following code to drag on window content and you able to move the form just as you drag on title bar:
type TForm1 = class(TForm) private procedure WMNCHitTest(var Msg: TWMNCHitTest); message WM_NCHitTest; end; procedure TForm1.WMNCHitTest(var Msg: TWMNCHitTest); begin inherited; if Msg.Result = htClient then Msg.Result := htCaption; end;The above code attempt to hijack the mouse event to tell the system to treat the mouse click action on windows client area as mouse click on windows title bar. There is a drawback using the message handler. All form's customize mouse events will no longer function as the mouse event has been hijacked by WM_NCHitTest handler. What if there are controls on the forma and you still wish to drag on the window to move the form around? The above above will only function if you drag on the empty area in the form. To make the dragging more sensible, write a MouseMove event for the control:
procedure TForm12.ListBox1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin ReleaseCapture; SendMessage(Self.Handle, WM_SYSCOMMAND, 61458, 0); end;
Thursday, February 21, 2008
TListBox review
TListBox is a simple visual component that always use for display a list of items but it has some nice features that we always neglected.
Using TListBox to show column-like data
procedure TForm1.FormCreate(Sender: TObject);
var L: TListBox;
begin
L := TListBox.Create(Self);
L.Parent := Self;
L.Align := alClient;
L.TabWidth := 20;
with L.Items do begin
Add('Item 01'^I'This is Item 01'^I'3.00');
Add('Item 02'^I'This is Item 02'^I'5.00');
Add('Item 03'^I'This is Item 03'^I'23.00');
Add('Item 04'^I'This is Item 04'^I'33.00');
Add('Item 05'^I'This is Item 05'^I'43.00');
end;
end;
Custom Draw items in TListBox #1
procedure TForm1.FormCreate(Sender: TObject); var L: TListBox; begin L := TListBox.Create(Self); L.Parent := Self; L.Align := alClient; L.Style := lbOwnerDrawFixed; L.OnDrawItem := OnDrawItem; with L.Items do begin Add('Item 01'); Add('Item 02'); Add('Item 03'); Add('Item 04'); Add('Item 05'); end; end; procedure TForm1.OnDrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); var C: TColor; begin with Control as TListBox do begin Canvas.FillRect(Rect); if odSelected in State then C := Canvas.Font.Color else if Index mod 2 = 0 then C := clGreen else C := clBlue; Canvas.Font.Color := C; Canvas.TextOut(Rect.Left, Rect.Top, Items[Index]); end; end;Custom Draw items in TListBox #2
procedure TForm1.FormCreate(Sender: TObject); var L: TListBox; begin L := TListBox.Create(Self); L.Parent := Self; L.Align := alClient; L.Style := lbOwnerDrawVariable; L.OnDrawItem := OnDrawItem; L.OnMeasureItem := OnMeasureItem; with L.Items do begin Add('Item 01'); Add('Item 02'); Add('Item 03'); Add('Item 04'); Add('Item 05'); end; end; procedure TForm11.OnDrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); var iSize: integer; begin with Control as TListBox do begin Canvas.FillRect(Rect); if Index mod 2 = 0 then iSize := 12 else iSize := 20; Canvas.Font.Size := iSize; Canvas.TextOut(Rect.Left, Rect.Top, Items[Index]); end; end; procedure TForm11.OnMeasureItem(Control: TWinControl; Index: Integer; var Height: Integer); var iSize: integer; L: TListBox; begin L := Control as TListBox; if Index mod 2 = 0 then iSize := 12 else iSize := 20; L.Canvas.Font.Size := iSize; Height := L.Canvas.TextHeight(L.Items[Index]); end;Custom Draw items in TListBox #3 Due to the design of windows list box control, the OnMeasure event is trigger once only if an item is added. The following code shows example of how to draw item with custom item height.
procedure TForm1.BeforeDestruction; begin inherited; Font1.Free; Font2.Free; end; procedure TForm1.FormCreate(Sender: TObject); var L: TListBox; begin L := TListBox.Create(Self); L.Parent := Self; L.Align := alClient; L.Style := lbOwnerDrawVariable; L.OnDrawItem := OnDrawItem; Font1 := TFont.Create; Font1.Name := 'Tahoma'; Font1.Size := 25; Font1.Color := clGreen; Font2 := TFont.Create; Font2.Name := 'Arial'; Font2.Size := 15; Font2.Color := clNavy; Font2.Style := [fsBold]; with L.Items do begin AddObject('Item 01', Font1); AddObject('Item 02', Font2); AddObject('Item 03', Font1); AddObject('Item 04', Font2); AddObject('Item 05', Font1); end; end; procedure TForm1.OnDrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); var C: TColor; L: TListBox; begin L := Control as TListBox; L.Canvas.FillRect(Rect); C := L.Canvas.Font.Color; L.Canvas.Font.Assign(L.Items.Objects[Index] as TFont); if odSelected in State then L.Canvas.Font.Color := C; SendMessage(L.Handle, LB_SETITEMHEIGHT, Index, L.Canvas.TextHeight(L.Items[Index])); L.Canvas.TextOut(Rect.Left, Rect.Top, L.Items[Index]); end;
Saturday, February 09, 2008
Create home directory manually
When we use /usr/sbin/useradd to create a user, it's home directory may contain some default files or folders (it is hidden usually).
However, we may want to create a the home directory for user manually in certain situation, for example, use LDAP to manage user account:
# mkdir /home/someuser
# cp /etc/skel/.* /home/someuser
# chown -R somebody.users /home/someuser
# chmod 700 -R /home/someuser
Subscribe to:
Posts (Atom)