Difference between revisions of "Frames"

From Lazarus wiki
Jump to navigationJump to search
Line 58: Line 58:
  
 
= Sample of dynamic creation =
 
= Sample of dynamic creation =
More easy. Because TFrame component is not required. And save resource.
+
More easy. Because TFrame component in component palette is not required. And you can make a page change type application(like a smart phone application) with save resource.
 
<syntaxhighlight>
 
<syntaxhighlight>
 
unit Unit1;
 
unit Unit1;
Line 67: Line 67:
  
 
uses
 
uses
   Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
+
   Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;
  Unit2;
 
  
 
type
 
type
Line 78: Line 77:
 
     GroupBox1: TGroupBox;
 
     GroupBox1: TGroupBox;
 
     procedure Button1Click(Sender: TObject);
 
     procedure Button1Click(Sender: TObject);
 +
    procedure FormCreate(Sender: TObject);
 
   private
 
   private
 
     { private declarations }
 
     { private declarations }
     Frame1: TFrame1; // TFrame1 in Unit2
+
     Frame: TFrame;
 
   public
 
   public
 
     { public declarations }
 
     { public declarations }
Line 89: Line 89:
  
 
implementation
 
implementation
 +
uses
 +
  Unit2{TFrame1}, Unit3{TFrame2}, Unit4{TFrame3};
  
 
{$R *.lfm}
 
{$R *.lfm}
  
 
{ TForm1 }
 
{ TForm1 }
 +
 +
procedure TForm1.FormCreate(Sender: TObject);
 +
begin
 +
  Frame := TFrame1.Create(GroupBox1);
 +
  Frame.Parent := GroupBox1;
 +
end;
  
 
procedure TForm1.Button1Click(Sender: TObject);
 
procedure TForm1.Button1Click(Sender: TObject);
 
begin
 
begin
   if Assigned(Frame1) then
+
   if not Assigned(Frame) then
 
   begin
 
   begin
     FreeAndNil(Frame1);
+
     Frame := TFrame1.Create(GroupBox1);
 +
    Frame.Parent := GroupBox1;
 +
  end else if Frame is TFrame1 then begin
 +
    Frame.Free;
 +
    Frame := TFrame2.Create(GroupBox1);
 +
    Frame.Parent := GroupBox1;
 +
  end else if Frame is TFrame2 then begin
 +
    Frame.Free;
 +
    Frame := TFrame3.Create(GroupBox1);
 +
    Frame.Parent := GroupBox1;
 
   end else begin
 
   end else begin
     Frame1 := TFrame1.Create(GroupBox1);
+
     FreeAndNil(Frame);
    Frame1.Parent := GroupBox1;
 
 
   end;
 
   end;
 
end;
 
end;

Revision as of 10:38, 21 April 2013

>> LCL Components >> TFrame

About

Frames are named containers for components and very similar to forms. Their unique ability is that they can be embedded into forms or other frames in the designer. As forms they are stored in two files: the code is stored in .pas file and the design in the .lfm file.

Are they VCL compatible? Yes, frames are fully compatible with VCL frames.

How to create a frame?

Press File->New... menu item and in the opened dialog select "Frame" item.

Frame new.PNG

How to place a frame to the form or another frame?

Standard component palette has a special component item "TFrame". When you drop it to the form or frame the IDE asks you to choose one of project frames. Frames in packages are not yet implemented. But you can create frames in code even in packages. You can't create frame circles - the IDE will forbid this, iow you can't place FrameA to FrameA and you can't place any frame which contains FrameA to FrameA.

Frame add.PNG

What can they be used for?

They are needed when you have a group of components that you want to reuse on multiple forms. The group should have the same set of controls and logic between them at different windows (forms) of your application. You can group that repeated controls and logic into one frame and use that frame in different places. Therefore you don't need to repeat the work of control layouting and writing their logic.

For example, you have two listboxes and buttons to move items between them. So you can create a frame with two listboxes and needed buttons, write the logic for items moving and then use your frame on all forms where needed. Moreover, if you find an error in the frame code then you can fix it once in the frame code instead of fixing it n-times among all forms.

a frame in designer:

Frame example.PNG


the frame placed on a form:

Frame embedded.PNG

the same frame placed on another form:

Frame embedded2.PNG

Initialising private variables

TFrame does not have OnCreate or OnDestroy events in which private variables can be initialised and released. Override the default constructor and destructor to do this.

TFrame1 = class(TFrame)
  private
    MyObj: TObject;
  public
    constructor Create(TheOwner: TComponent); override;
    destructor Destroy; override;
  end; 

constructor TFrame1.Create(TheOwner: TComponent);
begin
  inherited Create(TheOwner);
  MyObj := TObject.Create;
end;

destructor TFrame1.Destroy;
begin
  MyObj.Free
  inherited Destroy;
end;

Sample of dynamic creation

More easy. Because TFrame component in component palette is not required. And you can make a page change type application(like a smart phone application) with save resource.

unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    GroupBox1: TGroupBox;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { private declarations }
    Frame: TFrame;
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation
uses
  Unit2{TFrame1}, Unit3{TFrame2}, Unit4{TFrame3};

{$R *.lfm}

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
begin
  Frame := TFrame1.Create(GroupBox1);
  Frame.Parent := GroupBox1;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  if not Assigned(Frame) then
  begin
    Frame := TFrame1.Create(GroupBox1);
    Frame.Parent := GroupBox1;
  end else if Frame is TFrame1 then begin
    Frame.Free;
    Frame := TFrame2.Create(GroupBox1);
    Frame.Parent := GroupBox1;
  end else if Frame is TFrame2 then begin
    Frame.Free;
    Frame := TFrame3.Create(GroupBox1);
    Frame.Parent := GroupBox1;
  end else begin
    FreeAndNil(Frame);
  end;
end;

end.

Return To: LCL Components  — Previous: TPanel Next: TActionList


LCL Components
Component Tab Components
Standard TMainMenu • TPopupMenu • TButton • TLabel • TEdit • TMemo • TToggleBox • TCheckBox • TRadioButton • TListBox • TComboBox • TScrollBar • TGroupBox • TRadioGroup • TCheckGroup • TPanel • TFrame • TActionList
Additional TBitBtn • TSpeedButton • TStaticText • TImage • TShape • TBevel • TPaintBox • TNotebook • TLabeledEdit • TSplitter • TTrayIcon • TControlBar • TFlowPanel • TMaskEdit • TCheckListBox • TScrollBox • TApplicationProperties • TStringGrid • TDrawGrid • TPairSplitter • TColorBox • TColorListBox • TValueListEditor
Common Controls TTrackBar • TProgressBar • TTreeView • TListView • TStatusBar • TToolBar • TCoolBar • TUpDown • TPageControl • TTabControl • THeaderControl • TImageList • TPopupNotifier • TDateTimePicker
Dialogs TOpenDialog • TSaveDialog • TSelectDirectoryDialog • TColorDialog • TFontDialog • TFindDialog • TReplaceDialog • TTaskDialog • TOpenPictureDialog • TSavePictureDialog • TCalendarDialog • TCalculatorDialog • TPrinterSetupDialog • TPrintDialog • TPageSetupDialog
Data Controls TDBNavigator • TDBText • TDBEdit • TDBMemo • TDBImage • TDBListBox • TDBLookupListBox • TDBComboBox • TDBLookupComboBox • TDBCheckBox • TDBRadioGroup • TDBCalendar • TDBGroupBox • TDBGrid • TDBDateTimePicker
Data Access TDataSource • TCSVDataSet • TSdfDataSet • TBufDataset • TFixedFormatDataSet • TDbf • TMemDataset
System TTimer • TIdleTimer • TLazComponentQueue • THTMLHelpDatabase • THTMLBrowserHelpViewer • TAsyncProcess • TProcessUTF8 • TProcess • TSimpleIPCClient • TSimpleIPCServer • TXMLConfig • TEventLog • TServiceManager • TCHMHelpDatabase • TLHelpConnector
Misc TColorButton • TSpinEdit • TFloatSpinEdit • TArrow • TCalendar • TEditButton • TFileNameEdit • TDirectoryEdit • TDateEdit • TTimeEdit • TCalcEdit • TFileListBox • TFilterComboBox • TComboBoxEx • TCheckComboBox • TButtonPanel • TShellTreeView • TShellListView • TXMLPropStorage • TINIPropStorage • TJSONPropStorage • TIDEDialogLayoutStorage • TMRUManager • TStrHolder
LazControls TCheckBoxThemed • TDividerBevel • TExtendedNotebook • TListFilterEdit • TListViewFilterEdit • TLvlGraphControl • TShortPathEdit • TSpinEditEx • TFloatSpinEditEx • TTreeFilterEdit • TExtendedTabControl •
RTTI TTIEdit • TTIComboBox • TTIButton • TTICheckBox • TTILabel • TTIGroupBox • TTIRadioGroup • TTICheckGroup • TTICheckListBox • TTIListBox • TTIMemo • TTICalendar • TTIImage • TTIFloatSpinEdit • TTISpinEdit • TTITrackBar • TTIProgressBar • TTIMaskEdit • TTIColorButton • TMultiPropertyLink • TTIPropertyGrid • TTIGrid
SQLdb TSQLQuery • TSQLTransaction • TSQLScript • TSQLConnector • TMSSQLConnection • TSybaseConnection • TPQConnection • TPQTEventMonitor • TOracleConnection • TODBCConnection • TMySQL40Connection • TMySQL41Connection • TMySQL50Connection • TMySQL51Connection • TMySQL55Connection • TMySQL56Connection • TMySQL57Connection • TSQLite3Connection • TIBConnection • TFBAdmin • TFBEventMonitor • TSQLDBLibraryLoader
Pascal Script TPSScript • TPSScriptDebugger • TPSDllPlugin • TPSImport_Classes • TPSImport_DateUtils • TPSImport_ComObj • TPSImport_DB • TPSImport_Forms • TPSImport_Controls • TPSImport_StdCtrls • TPSCustomPlugin
SynEdit TSynEdit • TSynCompletion • TSynAutoComplete • TSynMacroRecorder • TSynExporterHTML • TSynPluginSyncroEdit • TSynPasSyn • TSynFreePascalSyn • TSynCppSyn • TSynJavaSyn • TSynPerlSyn • TSynHTMLSyn • TSynXMLSyn • TSynLFMSyn • TSynDiffSyn • TSynUNIXShellScriptSyn • TSynCssSyn • TSynPHPSyn • TSynTeXSyn • TSynSQLSyn • TSynPythonSyn • TSynVBSyn • TSynAnySyn • TSynMultiSyn • TSynBatSyn • TSynIniSyn • TSynPoSyn
Chart TChart • TListChartSource • TRandomChartSource • TUserDefinedChartSource • TCalculatedChartSource • TDbChartSource • TChartToolset • TChartAxisTransformations • TChartStyles • TChartLegendPanel • TChartNavScrollBar • TChartNavPanel • TIntervalChartSource • TDateTimeIntervalChartSource • TChartListBox • TChartExtentLink • TChartImageList
IPro TIpFileDataProvider • TIpHtmlDataProvider • TIpHttpDataProvider • TIpHtmlPanel
Virtual Controls TVirtualDrawTree • TVirtualStringTree • TVTHeaderPopupMenu