Difference between revisions of "LCL Tips"
(→Creating a GUI by code)
m (→DisableAlign / EnableAlign)
|Line 146:||Line 146:|
'''Note''': Every DisableAlign call needs a EnableAlign call. For example if you call two times
'''Note''': Every DisableAlign call needs a EnableAlign call. For example if you call two times, you must call EnableAlign .
'''For Delphians''': This works recursively. That means DisableAlign stops aligning in all
'''For Delphians''': This works recursively. That means DisableAlign stops aligning in all and .
Revision as of 11:31, 4 December 2008
Creating a GUI by code
It is possible to create the GUI code completely by code in Lazarus. Everything accessible from the IDE is also accessible by code. It should look like in this example bellow. The most important part is not forgetting to set the Parent property of the components. The creation of controls inside the form can be done in the constructor of the form:
main program file:
<delphi> program codedgui;
Interfaces, Forms, StdCtrls, MainForm;
Application.Initialize; Application.CreateForm(TMyForm, MyForm); Application.Run;
And a unit containing a form:
<delphi> unit mainform;
uses Forms, StdCtrls;
TMyForm = class(TForm) public MyButton: TButton; procedure ButtonClick(ASender: TObject); constructor Create(AOwner: TComponent); override; end;
procedure TMyForm.ButtonClick(ASender:TObject); begin
constructor TMyForm.Create(AOwner: TComponent); begin
Position := poScreenCenter; Height := 400; Width := 400;
VertScrollBar.Visible := False; HorzScrollBar.Visible := False;
MyButton := TButton.Create(Self); with MyButton do begin Height := 30; Left := 100; Top := 100; Width := 100; Caption := 'Close'; OnClick := ButtonClick; Parent := Self; end;
// Add other components creation here
Create controls manually without overhead
Set the Parent as last
For Delphians: Contrary to Delphi the LCL allows to set nearly all properties in any order. For example under Delphi you can not position a control without a parent. The LCL allows this and this feature can be used to reduce overhead.
with TButton.Create(Form1) do begin // 1. creating a button sets the default size // 2. change position. No side effects, because Parent=nil SetBounds(10,10,Width,Height); // 3. change size depending on theme. Not yet, because Parent=nil AutoSize:=true; // 4. changing size because of AutoSize=true. Not yet, because Parent=nil Caption:='Ok'; // 5. Set Parent. Now all the above takes place, but in a single action. Parent:=Form1; end;
When a control has a Parent, then all properties take effect immediately. Without a Parent many properties do nothing more than store the value. And as soon as the Parent is set every property is applied. This is especially true for grand children:
GroupBox1:=TGroupBox.Create(Self); with GroupBox1 do begin with TButton1.Create(Self) do begin AutoSize:=true; Caption:='Click me'; Parent:=GroupBox1; end; Parent:=Form1; end; Form1.Show;
Autosizing starts not before every parent is setup and the form becomes visible.
Avoid early Handle creation
As soon as the Handle of a TWinControl is created, every change of a property changes the visual thing (called the widget). Even if a control is not visible, when it has a Handle, changes are still expensive.
Use SetBounds instead of Left, Top, Width, Height
with Button1 do begin Left:=10; Top:=10; Width:=100; Height:=25; end;
with Button1 do begin SetBounds(10,10,100,25); end;
Left, Top, Width, Height are calling SetBounds. And every change of position or size invokes recalculation of all sibling controls and maybe recursively the parent and/or the grandchild controls.
DisableAlign / EnableAlign
When positioning many controls, it is a good idea to disable the recalculation of all auto sizing, aligning, anchoring.
DisableAlign; try ListBox1.Width:=ClientWidth div 3; ListBox2.Width:=ClientWidth div 3; ListBox3.Width:=ClientWidth div 3; finally EnableAlign; end;
Note: Every DisableAlign call needs a EnableAlign call. For example if you call DisableAlign two times, you must call EnableAlign twice as well.
For Delphians: This works recursively. That means DisableAlign stops aligning in all child and grandchild controls.