Pengembangan Multi-Form di Lazarus

1. Dua Formulir

Kita akan membuat fitur jendela pop-up dengan Form1 (formulir utama) + Form2 (jendela pop-up)

1. Langkah Pengerjaan

  1. Buat proyek baru, seret Button1 ke Form1, ubah Caption = Open Form2 lalu buat peristiwa OnClick (anda bisa klik dua kali tombol di desain formulir untuk membuat peristiwa klik dengan cepat);
  2. Gunakan menu bagian atas File → New Form untuk membuat Form2;
  3. Pasang Button1 di Form2, atur Caption = Close dan buat peristiwa OnClick miliknya;
  4. Pintasan ganti formulir: Shift+F12 buka daftar formulir / F12 tukar tampilan desain dan kode;
  5. Referensikan Unit2 ke Unit1: tambahkan Unit2 di bagian interface 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

  1. 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.
  1. ShowModal (Jendela Modal Pop-up)
  • Eksekusi kode terhenti sampai formulir anak ditutup;
  • Formulir utama terkunci dan tidak dapat dioperasikan;
  • Merupakan fungsi yang mengembalikan nilai ModalResult untuk 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

  1. Buka file Project.lpr dan hapus baris Application.CreateForm(TForm2, Form2);
  2. 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

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *