Runtime Dinamic Form (Form Dinamis)

on Selasa, 29 September 2009


Jika karena suatu hal (misal, untuk memangkas memory yang digunakan, agar aplikasi lebih ringan, dan sebagainya) anda ingin membuat form secara dinamis pada aplikasi anda, atau anda ingin memanggil Form anda hanya dengan mengetahui Nama Class-nya saja, maka penggalan kode/ source code dibawah adalah untuk anda.

Penggalan dibawah ini terdiri dari 2 (dua) unit, yakni "Main_U.pas" sebagai Main Form-nya dan "FormDinamis_U.pas" sebagai Form yang akan dibuat secara runtime/ dinamis.

Listing program Main_U.pas :


unit Main_U;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

//Dinamic form show hanya dengan mengetahui nama kelasnya
procedure ExtShowForm(aFormClass:TFormClass);

var
Form1: TForm1;

implementation

uses FormDinamis_U; // <== Tambahkan Unit FormDinamis anda {$R *.dfm} procedure ExtShowForm(aFormClass:TFormClass); begin with aFormClass.Create(Application) do try Caption := 'Disini diisi Caption Form'; ShowModal; //Tampilkan Form dengan Modal actif finally Release; // Hapus memory end; end; procedure TForm1.Button1Click(Sender: TObject); begin ExtShowForm(TForm2); end; end.


dan Listing untuk FormDinamis.pas (Form Kosong yang hanya berisi label) :

unit FormDinamis_U;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm2 = class(TForm)
Label1: TLabel;
Label2: TLabel;
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form2: TForm2;

implementation
{$R *.dfm}

end.

Reshi Mahendra

2 komentar:

Edo Prayogo mengatakan...

Mas, saya mau tanya nih. Bisa ga suatu form dimasukkan pada sebuah panel? Jadi yang menjadi induk dari form tersebut adalah Component TPanel. Saya membuat aplikasi yang meniru gaya MDI Form tapi dengan customisasi, sehingga main form selalu tampil dengan catatan, sebuah panel (yang diletakkan pada main form) dijadikan sebagai tempat Form anak (MDI Child).

Matur nuwun.

Edo Prayogo

Reshi Mahendra mengatakan...

Sebenarnya bisa saja mas edo, anda tinggal men-set Parent dari form yang anda akan sisipkan saja ke Panel yang akan anda jadikan induk. Kalau disesuaikan dengan source diatas, anda tinggal menambahkan kode untuk mengeset parent dari Form yang anda sisipkan sebelum form ditampilkan. Kode untuk mengeset parent adalah sebagai berikut (disesuaikan dengan kasus diatas) :

Parent := Self.aPanel;

Yang perlu diingat, anda tidak boleh memanggil form induk sebagai modal form (ShowModal) karena akan membuat aplikasi Hang.
Jadi, Pastikan anda memanggilnya dengan perintah Show dan bukan ShowModal. dan juga Release setelah baris finally dihilangkan agar form anak yang dibuat tidak langsung dihapus oleh aplikasi. Tapi anda perlu menambahkan kode untuk mem-free memory pada form anak, yakni pada Event OnClose di isi dengan Action := caFree


Jadi listing dari prosedur ExtShowForm akan menjadi :

procedure ExtShowForm(aFormClass:TFormClass);
begin
with aFormClass.Create(Application) do
try
Caption := 'Disini diisi Caption Form';
Parent := Self.aPanel; //Nama panel induk
Show; //Tampilkan Form dengan Modal tidak aktif
finally
// Hapus memory dibagian ini dihilangkan,
// tapi diganti dengan hapus memory
// pada bagian OnClose Form anak

//Release;
end;
end;

Posting Komentar