Difference between revisions of "LCL Tips/de"

From Lazarus wiki
Jump to navigationJump to search
(Translation "GUI Anwendung per Code erstellen")
(Translation "GUI Anwendung per Code erstellen")
Line 23: Line 23:
 
end.</syntaxhighlight>
 
end.</syntaxhighlight>
  
 +
Die Unit, die das Formular beinhaltet:
 +
 +
<syntaxhighlight>unit mainform;
 +
 +
{$MODE DELPHI}{$H+}
 +
 +
interface
 +
 +
uses Forms, StdCtrls;
 +
 +
type
 +
  TMyForm = class(TForm)
 +
  public
 +
    MyButton: TButton;
 +
    procedure ButtonClick(ASender: TObject);
 +
    constructor Create(AOwner: TComponent); override;
 +
  end;
 +
 +
implementation
 +
 +
procedure TMyForm.ButtonClick(ASender:TObject);
 +
begin
 +
  Close;
 +
end;
 +
 +
constructor TMyForm.Create(AOwner: TComponent);
 +
begin
 +
  inherited Create(AOwner);
 +
  //Hint: FormCreate() is called BEFORE Create() !
 +
  //so You can also put this code into FormCreate()
 +
  //(This is not the case when creating components ..)
 +
 +
  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;
 +
 +
  // Erstellen Sie hier noch weitere Komponenten
 +
end;
 +
 +
end.</syntaxhighlight>
  
 
== Bedienelemente manuell erzeugen ohne Overhead ==
 
== Bedienelemente manuell erzeugen ohne Overhead ==

Revision as of 18:37, 16 May 2014

Deutsch (de) English (en) français (fr) русский (ru) 中文(中国大陆)‎ (zh_CN)

GUI Anwendung per Code erstellen

Es ist möglich eine GUI Anwendung (Graphical User Interface) vollständig durch Pascalcode in Lazarus zu erstellen. Alles, was von der IDE aus möglich ist, ist auch per Code umsetzbar. Die nachfolgenden Beispieldateien für die Programm- und Unitdateien (codegui.lpr und mainform.pas) können Sie als Vorlage verwenden, die Sie anpassen können. Das wichtigste ist, nicht zu vergessen die Parent-Eigenschaft der Komponenten festzulegen. Die Erstellung von Steuerelementen innerhalb des Formulars erfolgt am besten im Konstruktor des Formulars:

Hauptprogrammdatei:

program codedgui;

{$MODE DELPHI}{$H+}

uses
  Interfaces, Forms, StdCtrls,
  MainForm;

var
  MyForm: TMyForm;
begin
  Application.Initialize;
  Application.CreateForm(TMyForm, MyForm);
  Application.Run;
end.

Die Unit, die das Formular beinhaltet:

unit mainform;

{$MODE DELPHI}{$H+}

interface

uses Forms, StdCtrls;

type
  TMyForm = class(TForm)
  public
    MyButton: TButton;
    procedure ButtonClick(ASender: TObject);
    constructor Create(AOwner: TComponent); override;
  end;

implementation

procedure TMyForm.ButtonClick(ASender:TObject);
begin
  Close;
end;

constructor TMyForm.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  //Hint: FormCreate() is called BEFORE Create() !
  //so You can also put this code into FormCreate()
  //(This is not the case when creating components ..)

  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;

  // Erstellen Sie hier noch weitere Komponenten 
end;

end.

Bedienelemente manuell erzeugen ohne Overhead

Parent zuletzt setzen

Für Delphianer: Im Gegensatz zu Delphi erlaubt die LCL beinahe alle Eigenschaften in beliebiger Reihenfolge zu setzen. Zum Beispiel unter Delphi können sie ein Bedienelement nicht ohne a parent positionieren. Die LCL erlaubt dies und dieses Feature kann benutzt werden, den Overhead zu reduzieren.

 with TButton.Create(Form1) do begin
   // 1. Erzeugen eines button setzt die Vorgabegröße
   // 2. Ändern der Position. Keine Randeffekte, weil Parent=nil
   SetBounds(10,10,Width,Height);
   // 3. Ändern der Größe abhängig vom Thema. Noch nicht, weil Parent=nil
   AutoSize:=true;
   // 4. Ändern der Größe wegen AutoSize=true. Noch nicht, weil Parent=nil
   Caption:='Ok';
   // 5. Setzen sie Parent. Jetzt geschieht all das obige, aber in einer einzigen Aktion.
   Parent:=Form1;
 end;

Wenn ein Bedienelement a Parent hat, dann werden alle Eigenschaften unverzüglich wirksam. Ohne a Parent tun viele Eigenschaften nicht mehr, als den Wert zu speichern. Und sobald the Parent gesetzt ist, wird jede Eigenschaft angewendet. Das trifft besonders für grand children zu:

 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 startet nicht bevor jeder parent eingerichtet ist und das Formular sichtbar wird.

Vermeiden sie eine frühe Handle Erzeugung

Sobald das Handle eines TWinControl erzeugt ist, ändert jede Änderung einer Eigenschaft the visual thing (called the widget), sogar wenn ein Bedienelement nicht sichtbar ist. Wenn es ein Handle hat, sind Änderungen dennoch aufwändig.

Verwenden sie SetBounds anstelle von Left, Top, Width, Height

Anstelle von

 with Button1 do begin
   Left:=10;
   Top:=10;
   Width:=100;
   Height:=25;
 end;

verwenden sie

 with Button1 do begin
   SetBounds(10,10,100,25);
 end;

Left, Top, Width, Height rufen SetBounds auf. Und jede Änderung der Position oder Größe ruft die Neuberechnung aller sibling Bedienelemente und eventuell rekursiv die der parent und/oder der grandchild Bedienelemente auf.

DisableAlign / EnableAlign

Wenn sie viele Bedienelemente positionieren, ist es eine gute Idee, die Neuberechnungvon all auto sizing, aligning, anchoring zu deaktivieren.

 DisableAlign;
 try
   ListBox1.Width:=ClientWidth div 3;
   ListBox2.Width:=ClientWidth div 3;
   ListBox3.Width:=ClientWidth div 3;
 finally
   EnableAlign;
 end;

Anmerkung: Jeder DisableAlign Aufruf benötigt einen EnableAlign Aufruf. Zum Beispiel wenn sie DisableAlign zweimal aufrufen, müssen sie auch EnableAlign zweimal aufrufen.

Für Delphianer: Dies funktioniert rekursiv. Das bedeutet, DisableAlign stoppt aligning in allen childs und grand childs.