1. Dua Formulir
Kita akan membuat fitur jendela pop-up dengan Form1 (formulir utama) + Form2 (jendela pop-up)
1. Langkah Pengerjaan
- Buat proyek baru, seret Button1 ke Form1, ubah
Caption = Open Form2lalu buat peristiwaOnClick(anda bisa klik dua kali tombol di desain formulir untuk membuat peristiwa klik dengan cepat); - Gunakan menu bagian atas
File → New Formuntuk membuat Form2; - Pasang Button1 di Form2, atur
Caption = Closedan buat peristiwaOnClickmiliknya; - Pintasan ganti formulir:
Shift+F12buka daftar formulir /F12tukar tampilan desain dan kode; - Referensikan Unit2 ke Unit1: tambahkan
Unit2di bagianinterface uses.
Unit1 (Formulir Utama)
Ada dua hal penting yang harus diperhatikan: Unit2; // Impor Unit2
Hal kedua ada di fungsi klik, buka jendela kedua secara modal dengan perintah Form2.ShowModal; // Tampilkan Form2 secara modal
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, Unit2; // Impor Unit2
type
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
public
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
Form2.ShowModal; // Tampilkan Form2 secara modal
end;
end.
Unit2 (Formulir Anak)
Cara menambahkan formulir kedua ke dalam proyek

Setelah ditambahkan, akan muncul tab tambahan di editor kode
Satu tab berisi kode formulir utama, tab lainnya berisi kode belakang Form2


Untuk mengedit Form2, pilih tab Unit2 lalu tekan F12 untuk membuka jendela desain Form2

Tambahkan tombol seperti pelajaran sebelumnya, ubah teks tombol menjadi Close lalu buat fungsi tutup. Anda bisa menyelesaikannya sendiri karena sudah dipelajari di materi terdahulu.
unit Unit2;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls;
type
{ TForm2 }
TForm2 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
public
end;
var
Form2: TForm2;
implementation
{$R *.lfm}
procedure TForm2.Button1Click(Sender: TObject);
begin
Close; // Tutup Form2 yang aktif saat ini
end;
end.

2. Perbedaan Inti Show dan ShowModal (Contoh Perbandingan)
Modifikasi Antarmuka
Tambahkan dua tombol di Form1:
- btnShow:Caption = Show
- btnShowModal:Caption = ShowModal

// Non-modal dengan Show
procedure TForm1.btnShowClick(Sender: TObject);
begin
Form2.Show;
ShowMessage('Form2 sudah dibuka, formulir utama masih bisa digunakan');
end;
// Modal dengan ShowModal
procedure TForm1.btnShowModalClick(Sender: TObject);
begin
Form2.ShowModal;
ShowMessage('Pesan ini baru muncul setelah Form2 ditutup');
end;Code language: JavaScript (javascript)
Penjelasan Perbedaan
Show(Non-modal)
- Kode akan langsung lanjut dieksekusi setelah formulir anak dibuka;
- Formulir utama bisa digeser dan tombol lain dapat diklik;
- Sama dengan
Form2.Visible := True;dan otomatis muncul di paling depan layar.
ShowModal(Jendela Modal Pop-up)
- Eksekusi kode terhenti sampai formulir anak ditutup;
- Formulir utama terkunci dan tidak dapat dioperasikan;
- Merupakan fungsi yang mengembalikan nilai
ModalResultuntuk mengetahui cara penutupan jendela.
Singkatnya: jendela modal mengharuskan anda menutup formulir anak sebelum menggunakan formulir utama, sedangkan non-modal memungkinkan anda mengoperasikan kedua jendela secara bersamaan.
3. Panggilan Timbal Balik Antar Formulir: Atasi Kesalahan Referensi Siklus
Kebutuhan: Form1 buka Form2, Form2 buka Form1
Jika saling mereferensikan di bagian interface uses akan muncul kesalahan unit siklus. Solusi: Pindahkan referensi ke bagian implementation
Unit1
unit Unit1;
interface
uses Forms,StdCtrls;
type
TForm1=class(TForm)
Button1:TButton;
procedure Button1Click(Sender:TObject);
end;
var Form1:TForm1;
implementation
uses Unit2; // Letakkan referensi di sini
{$R *.lfm}
procedure TForm1.Button1Click(Sender:TObject);
begin
Form2.Show;
end;
end.
Unit2
unit Unit2;
interface
uses Forms,StdCtrls;
type
TForm2=class(TForm)
Button1:TButton;
procedure Button1Click(Sender:TObject);
end;
var Form2:TForm2;
implementation
uses Unit1; // Referensi timbal balik ditempatkan di bagian implementasi
{$R *.lfm}
procedure TForm2.Button1Click(Sender:TObject);
begin
Form1.Show;
end;
end.
4. Melewatkan Nilai Antar Formulir (Contoh Variabel Anggota Publik)
Fungsi: setiap kali formulir utama membuka formulir anak, hitungan akan bertambah, formulir anak dapat melihat jumlah total pembukaan
Deklarasikan variabel bilangan bulat publik di Unit2
type
TForm2 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
public
Count: Integer; // Variabel publik yang bisa diakses dari Unit1
end;
Tambah hitungan saat tombol Unit1 diklik
procedure TForm1.Button1Click(Sender: TObject);
begin
Inc(Form2.Count); // Hitungan +1
Form2.ShowModal;
end;Code language: JavaScript (javascript)
Tampilkan jumlah pembukaan lewat pop-up di Unit2
procedure TForm2.Button1Click(Sender: TObject);
begin
ShowMessage('Formulir ini telah dibuka '+IntToStr(Count)+' kali');
end;Code language: JavaScript (javascript)
Saran standar penulisan kode: kurangi penggunaan variabel global/publik, sebaiknya gunakan Property untuk melewatkan parameter nilai.
5. Membuat Formulir Secara Dinamis
Tidak bergantung pada variabel Form global yang dibuat otomatis oleh proyek
Cara 1: Buat Form2 yang sudah didesain secara dinamis
- Buka file
Project.lprdan hapus barisApplication.CreateForm(TForm2, Form2); - Kode tombol pada Form1:
procedure TForm1.Button1Click(Sender: TObject);
var
frm2: TForm2;
begin
frm2 := TForm2.Create(nil); // Buat instansi secara manual
frm2.ShowModal;
FreeAndNil(frm2); // Bebaskan memori untuk menghindari kebocoran memori
end;Code language: JavaScript (javascript)
Cara 2: Buat formulir sepenuhnya lewat kode (tidak perlu desain sebelumnya)
Klik tombol untuk menghasilkan jendela baru lengkap dengan tombol tutup bawaan
unit Unit1;
interface
uses Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
procedure DynamicBtnClick(Sender: TObject); // Peristiwa klik tombol dinamis buatan sendiri
public
end;
var Form1: TForm1;
implementation
{$R *.lfm}
procedure TForm1.DynamicBtnClick(Sender: TObject);
begin
ShowMessage('Akan menutup formulir dinamis');
TForm(TButton(Sender).Parent).Close;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
MyForm: TForm;
MyBtn: TButton;
begin
MyForm := TForm.Create(nil);
MyForm.SetBounds(100,100,220,150);
MyForm.Caption := 'Formulir Dibuat Dinamis';
// Buat tombol, pemiliknya MyForm sehingga tombol hancur otomatis saat jendela ditutup
MyBtn := TButton.Create(MyForm);
MyBtn.SetBounds(10,10,200,30);
MyBtn.Caption := 'Tutup Jendela';
MyBtn.Parent := MyForm;
MyBtn.OnClick := @DynamicBtnClick;
MyForm.ShowModal;
FreeAndNil(MyForm);
end;
end.
Muncul Dialog “Choose Debug Information format”



Cukup atur format informasi debug agar semuanya berjalan normal.
Pengembangan Multi-Form di Lazarus