R2x Electronics & Microcontroller Clubs
Tempat sharing ilmu dan pengalaman dengan cara sopan dan santun
Thursday, October 30, 2025
Wednesday, October 29, 2025
Simulasi Dinamika Tangki Air dengan Lazarus: Cara Mudah Memahami Sistem Kontrol
Simulasi Dinamika Tangki Air dengan Lazarus: Cara Mudah Memahami Sistem Kontrol
kita akan membaut sebuah sistem pengisian tanki air, kenapa pilih tanki air karena paling simple perhitungannya dan mudah buatnya dan analisanya. tapi meskipun system ini lambat tapi kita bisa aplikasikan nantinya PID buatan kita sehingga kita tau apakah PID aplikatif dan sekalian belajar karakteristik PID pada system lambat.
jadi mari kita mulai dengan membayangkan sebuah tangki dulu :
| Volume tangki |
jika dengan luas alas 100cm2 dan tinggi tangki 100cm jadi volume tangki full adalah 10.000cm3 itu yang akan mendasari simulasi kita.
Dalam dunia kontrol sistem, memahami perilaku sistem dinamik adalah langkah penting sebelum menerapkan algoritma seperti PID.
Pada artikel ini, kita akan membangun dan mensimulasikan sistem pengisian tangki air, sebuah model klasik yang sederhana namun kaya makna.
Meski sistem ini tergolong lambat, justru di situlah tantangannya — kita bisa menguji respons dan kestabilan PID pada kondisi nyata sekaligus memahami karakteristik sistem dengan lebih intuitif.
| Desain system tangki |
Menetapkan FlowIn / FlowOut — kenapa 100 s untuk mengisi / menguras?
Dalam contoh teks kamu disebutkan: FlowIn dan FlowOut masing-masing 100 cm³/s. Dengan parameter tanki di kode:
-
TankArea = 100.0cm² -
TankHeightMax = 100.0cm
maka volume penuh tangki = TankArea * TankHeightMax = 100 cm² * 100 cm = 10.000 cm³.
Jika laju pengisian bersih (net flow) = 100 cm³/s, waktu untuk mengisi dari kosong ke penuh adalah:
-
waktu = volume / laju =
10.000 cm³ / 100 cm³/s = 100 s.
(Itu yang kamu tulis — aritmetika di atas valid digit-by-digit: 10000 ÷ 100 = 100.)
Jadi pernyataan “mengisi dari kosong membutuhkan 100 detik dan untuk menguras dari full membutuhkan 100 detik” benar asalkan FlowIn = 100 dan FlowOut = 0 untuk kasus isi; atau untuk menguras, FlowOut = 100 dan FlowIn = 0. Jika keduanya aktif, yang relevan adalah net flow = FlowIn − FlowOut.
Hubungan langsung dengan kode (baris penting dan maknanya)
Di kode kamu ada fungsi penting:
NetFlow := FlowRate - flow_out; // Net flow (cm^3/s) Level := Level + (NetFlow / TankArea) * DeltaTime;
Penjelasan langkah-per-langkah:
-
NetFlowdihitung dalam satuan cm³/s. -
NetFlow / TankArea→ perubahan tinggi per detik (cm/s), karena cm³/s dibagi cm² → cm/s. -
Dikali
DeltaTime(detik per step, di kodeDeltaTime = 0.1→ 100 ms) → perubahan tinggi per step (cm). -
Ditambahkan ke
Leveluntuk mendapatkan tinggi baru.
Dengan kata lain formula update tingkat (Level) di kode sama dengan persamaan kontinuitas sederhana:
di mana h = tinggi (cm), Q = laju aliran (cm³/s), A = luas penampang (cm²), Δt = durasi step (s).
sekarang kita membutuhkan mendesain program di lazarusnya :
Inti desain: kenapa butuh 2 procedure + 2 timer
Desain yang kamu tulis membagi tugas menjadi dua lapis waktu berbeda:
-
RunSimulationStep (high-rate, mis. tiap 100 ms)
-
Tugas: menghitung dinamika plant secara numerik (perubahan level/volume pada tiap langkah simulasi).
-
Alasan: fisika (perubahan tinggi akibat flow) harus dihitung cukup sering agar simulasi stabil dan numerik akurat. Di kode kamu
DeltaTime = 0.1→ 100 ms, dantmr1memanggilRunSimulationSteptiap interval itu.
-
-
UpdateTank (low-rate / akumulasi, mis. tiap 1 s)
-
Tugas yang kamu maksud: menghitung/menyimpan akumulasi total volume untuk keperluan logging, tampilan yang tidak perlu update tiap-milisekon, atau penyajian nilai per detik.
-
Alasan: operasi UI, penulisan log, atau pembacaan sensor sering cukup tiap 1 s; mempercepat UI tidak memberi manfaat dan malah bisa membuat aplikasi berat. Maka
tmr2dipakai untuk tugas yang lebih lambat (UI / akumulasi) — di desainmu kamu ingintmr2.Interval := 1000.
-
Kesimpulan: dua timer ini meng-decouple (memisahkan) perhitungan fisika berkecepatan tinggi dari tugas UI/akumulasi berkecepatan rendah — praktek standar pada simulasi & control realtime.
Dari kode bisa di lihat:
-
tmr1.Interval := round(DeltaTime*1000);→tmr1dipakai untuk memanggilRunSimulationStep(Δt = 0.1 s).
procedure TForm1.tmr1Timer(Sender: TObject); begin RunSimulationStep; end; -
RunSimulationStepmengambil nilai trackbar (flow_in := tb1.Position; flow_out := tb2.Position;) lalu memanggilUpdateTank(level_tanki, flow_in);dan mengesettinggi := round(level_tanki); -
tmr2Timersaat ini hanya melakukan:tinggi := Round(level_tanki); // ambil nilai dari sensor VirtualScreen.RedrawBitmap;namun di desain kamu ingin
tmr2menjalankan akumulasi / update per 1 detik (misalnya untuk menambah entri log / menampilkan total volume per detik).
Catatan: di kode UpdateTank sekarang menghitung level tiap kali dipanggil (yaitu saat tmr1 berjalan) — sehingga UpdateTank sesungguhnya adalah update fisika per step, bukan akumulasi per 1 detik.
berikut adalah video aplikasi yang sudah jadi : file project bisa didwonload di
Wednesday, October 15, 2025
Dunia Baru dengan Admin yang Bisa Programming: Apa yang Terjadi?
Dunia Baru dengan Admin yang Bisa Programming: Apa yang Terjadi?
Nah, di sini kata kuncinya adalah pekerjaan yang banyak, mungkin sampai menumpuk. Informasi yang disimpan banyak jenisnya, seperti data spare part, data absensi, data ceklis, surat keluar, berita acara, work order, permit, dan lain-lain. Nah, bagaimana jika ini disimpan oleh admin dan kadang data ini diminta dengan format yang berbeda-beda setiap kali atasan ingin menganalisis sesuatu atau membuat laporan? Inilah yang sering terjadi saat ini: mengeluh tidak menyelesaikan masalah. Syukur jika perusahaan tempat kita bekerja menerapkan SAP sebagai pondasinya, tapi lebih sering tidak semua data akan tercover karena biaya yang besar. Jadi, sisanya kemana? Ya, dikumpulkan, dirawat, dan diolah sendiri. Itu sudah pasti.
Nah, jika seorang programmer (anggaplah kemampuan biasa saja) sulit mendapatkan pekerjaan yang berhubungan dengan IT, apalagi sekarang dengan bantuan AI, pekerjaan coding menjadi mudah dalam artian dibantu dengan AI untuk masalah teknis. Saya punya kemampuan coding yang cukup, dan dengan AI, malah menjadi sangat mudah, meskipun tidak menyelesaikan semua masalah coding saya, tapi saya sangat terbantu dengan kecepatan dalam mencari solusi teknis coding. Jadi, pengurangan orang di bidang ini menjadi gelombang perampingan di mana-mana, terutama di perusahaan IT.
berikut adalah contoh kecil yang bisa dilakukan oleh admin yang mempunyai kemapuan programming :
Jika alat bantu software ini dimasukkan ke dalam CV kita dan kita bisa mempresentasikannya, jika ada kesempatan, bisa saja Anda menjadi admin super yang bisa mengolah data lebih banyak daripada orang lain yang menggunakan metode manual. Bisa mengurangi error data karena human error, bisa memberikan laporan dalam waktu yang singkat (hitungan detik jika data sudah masuk sistem). Atau, jika masih mengejar pekerjaan IT, berarti bisa dippresentasikan software kerja yang sudah dibuat sendiri sebagai referensi hasil aplikasi kemampuan IT yang sinergis dengan aplikasi lapangan. "Apapun itu, kesempatan kadang datang dari keberuntungan, tapi kesungguhan dan kerja keraslah yang menjamin keberhasilan."
Monday, October 13, 2025
Share "Prosedur Standar Menghadapi Motor 3 Phase Trip: Jangan Panik, Ikuti Ini!"
Share "Prosedur Standar Menghadapi Motor 3 Phase Trip: Jangan Panik, Ikuti Ini!"
Tuesday, September 30, 2025
Panduan Praktis Mengirim dan Menerima Data melalui Serial Port dengan Lazarus dan CPort
Panduan Praktis Mengirim dan Menerima Data melalui Serial Port dengan Lazarus dan CPort
| penampakkan com0com |
selain itu juga untuk contoh kali ini jelas ketika kita mencoba software yang kita buat kita juga membutuhkan software termite (serial terminal) karena siapa yang mau menerima data yang kita kirimkan ? ya kecuali nanti pada saat aplikasi mungkin kita akan berkomunikasi dengan microcontroller atau bahkan dengan software proteus dll
| form |
dan berikut ini adalah listingnya :
🔧 1. Komponen yang Digunakan
Unit yang di-uses:
-
Classes, SysUtils: Unit standar untuk operasi dasar Pascal. -
Forms, Controls, Graphics, Dialogs, StdCtrls: Untuk komponen antarmuka pengguna (form, tombol, edit box, dll). -
CPort, CPortCtl: Unit untuk menangani komunikasi serial (COM port).
🧱 2. Desain Form dan Komponen
Komponen pada TForm1:
-
4 Tombol:
-
btn1: Tombol untuk membuka koneksi ke COM port. -
btn2: Tombol untuk menutup koneksi ke COM port. -
btn3: Tombol untuk mengirim byte (nilai angka). -
btn4: Tombol untuk mengirim string (teks).
-
-
3 Edit Box:
-
edt1: Tempat pengguna memasukkan angka (byte) untuk dikirim. -
edt2: Tempat pengguna memasukkan string untuk dikirim. -
edt3: Menampilkan data yang diterima dari COM port.
-
-
1 ComboBox Khusus COM Port (
TComComboBox):-
cbb1: Combo box untuk memilih COM port yang tersedia di sistem.
-
-
1 Objek
TComPort:-
port1: Objek yang digunakan untuk menangani komunikasi serial. port1 : masih menggunakan default speed 9600 baud
port1 : menggunakan 8 data, no parity, 1 stop bit (default)
-
-
4 GroupBox:
-
Untuk mengelompokkan komponen dalam tampilan GUI (tidak memiliki logika program langsung).
-
⚙️ 3. Logika Program
3.1. FormCreate(Sender: TObject)
cbb1.ComProperty := cpPort;
-
Mengatur
cbb1agar menampilkan daftar port COM yang tersedia. Ini harus dilakukan secara manual karena jika diset lewat properti di IDE bisa menyebabkan error.
3.2. btn1Click(Sender: TObject) – Open COM Port
if not port1.Connected then begin port1.Port := cbb1.Text; port1.Open; end;
-
Mengecek apakah
port1belum terbuka, lalu membuka port yang dipilih dicbb1.
3.3. btn2Click(Sender: TObject) – Close COM Port
if port1.Connected then port1.Close;
-
Menutup koneksi ke port jika sedang terbuka.
3.4. btn3Click(Sender: TObject) – Kirim Byte
SendByte(StrToInt(edt1.Text));
-
Mengambil angka dari
edt1, mengubahnya ke tipeByte, lalu mengirimkannya.
Fungsi Pendukung:
procedure TForm1.SendByte(Value: Byte); begin port1.Write(Value, 1); end;
-
Mengirim satu byte ke port serial.
3.5. btn4Click(Sender: TObject) – Kirim String
port1.WriteStr(edt2.Text);
-
Mengirim string yang dimasukkan di
edt2melalui port serial.
3.6. port1RxChar(Sender: TObject; Count: Integer) – Terima Data
var s: string; begin port1.ReadStr(s, Count); edt3.Text := s; end;
-
Dipanggil otomatis saat data diterima dari COM port (
Countkarakter). -
Membaca data dan menampilkannya di
edt3.
🔁 Alur Kerja Program
-
Saat form dijalankan, daftar COM port akan dimuat ke
cbb1. -
Pengguna memilih COM port dari daftar.
-
Tekan tombol btn1 → membuka koneksi ke COM port.
-
Pengguna dapat:
-
Mengirim byte dengan tombol
btn3. -
Mengirim string dengan tombol
btn4.
-
-
Data yang diterima dari COM port akan langsung tampil di
edt3. -
Tekan tombol btn2 → menutup koneksi COM port.
🛠️ Catatan Teknis Tambahan
-
Pastikan Anda menggunakan komponen CPort yang sudah diinstal di Lazarus.
-
Perlu mengatur
BaudRate,Parity,StopBits, danDataBitsdariport1agar sesuai dengan perangkat yang dikomunikasikan. (Belum diatur dalam kode ini, jadi memang masih default 9600 8N1). -
Saat mengirim data byte, pastikan
edt1.Textbenar-benar angka valid (0–255), jika tidak bisa menyebabkan error runtime. Oleh karena itu edt1 di set "only Number" properties nya
Monday, September 22, 2025
Membuat Aplikasi Spreadsheet Sederhana dengan Lazarus dan fpspreadsheet
Membuat Aplikasi Spreadsheet Sederhana dengan Lazarus dan fpspreadsheet
Lazarus adalah salah satu IDE (Integrated Development Environment) yang kuat dan gratis, yang memungkinkan pengembang untuk membuat aplikasi berbasis Pascal. Dalam artikel ini, kita akan membahas cara membuat aplikasi spreadsheet sederhana dengan menggunakan Lazarus dan pustaka fpspreadsheet, yang memungkinkan kita untuk membaca, menulis, dan mengedit file spreadsheet berbagai format seperti Excel, CSV, dan lainnya.
Aplikasi yang akan kita buat memungkinkan pengguna untuk membuka file spreadsheet, mengeditnya, dan menyimpannya kembali dalam format yang berbeda. Di bawah ini, kita akan menguraikan langkah-langkah implementasi dalam source code Lazarus yang sudah disediakan.
Persiapan Awal
Sebelum memulai, pastikan Anda sudah menginstal Lazarus IDE dan pustaka fpspreadsheet. Pustaka fpspreadsheet memungkinkan kita untuk bekerja dengan berbagai format file spreadsheet secara fleksibel. Jika pustaka ini belum terpasang, Anda bisa mengunduhnya melalui Paket Manajer Lazarus atau menggunakan perintah berikut:
Penjelasan Source Code
Berikut ini adalah penjelasan bagian-bagian utama dari kode sumber aplikasi spreadsheet sederhana yang telah disiapkan.
Unit dan Import
Pada bagian awal, kita mendeklarasikan unit-unit yang diperlukan, seperti fpspreadsheet, fpspreadsheetctrls, dan fpspreadsheetgrid, yang akan membantu dalam bekerja dengan spreadsheet. Berikut adalah deklarasi unit yang digunakan:
uses Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ExtCtrls, StdCtrls, fpstypes, fpspreadsheet, fpspreadsheetctrls,fpspreadsheetgrid, fpsallformats, fpcanvas, lazutf8, fpsutils, fpsReaderWriter;
-
fpspreadsheet: Pustaka utama untuk memanipulasi file spreadsheet.
-
fpspreadsheetctrls dan fpspreadsheetgrid: Digunakan untuk menampilkan grid spreadsheet dalam aplikasi Lazarus.
-
fpsallformats: Mengizinkan aplikasi membaca dan menulis berbagai format spreadsheet seperti XLS, XLSX, CSV, dan lainnya.
Desain Form dan Komponen
Komponen yang digunakan dalam aplikasi ini meliputi:
-
Button1 dan Button2: Digunakan untuk membuka dan menyimpan file spreadsheet.
-
OpenDialog dan SaveDialog1: Digunakan untuk memilih file yang akan dibuka atau disimpan.
-
WorksheetGrid: Komponen utama untuk menampilkan data spreadsheet dalam grid yang dapat diedit.
Selain itu, ada objek sWorkbookSource1 dan sWorkbookTabControl1, yang berfungsi untuk memuat dan menampilkan data spreadsheet.
Fungsi LoadFile
Fungsi LoadFile bertanggung jawab untuk membaca file spreadsheet yang dipilih pengguna dan memuatnya ke dalam aplikasi. Fungsi ini menerima dua parameter: nama file dan indeks filter dari dialog pemilih file (untuk menentukan format file yang akan dibaca).
procedure TForm1.LoadFile(const AFileName: String; index : byte); var wb: TsWorkbook; begin wb := TsWorkbook.Create; case index of 1: wb.ReadFromFile(AFileName); // Semua jenis file spreadsheet 2: wb.ReadFromFile(AFileName); // Excel secara otomatis 3: wb.ReadFromFile(AFileName, sfOOXML); // Excel 2007+ 4: wb.ReadFromFile(AFileName, sfExcel8); // Excel 97-2003 5: wb.ReadFromFile(AFileName, sfExcel5); // Excel 5.0 6: wb.ReadFromFile(AFileName, sfExcel2); // Excel 2.1 7: wb.ReadFromFile(AFileName, sfOpenDocument); // LibreOffice 8: wb.ReadFromFile(AFileName, sfCSV); // File teks CSV else wb.Free; MessageDlg('File format not implemented.', mtError, [mbOk], 0); exit; end; sWorkbookSource1.LoadFromWorkbook(wb); end;
Dalam fungsi ini, objek TsWorkbook digunakan untuk memuat file spreadsheet berdasarkan format yang dipilih. Pengguna dapat memilih dari berbagai format file spreadsheet, dan aplikasi akan otomatis mendeteksi serta memproses file tersebut.
Fungsi SaveFile
Fungsi SaveFile digunakan untuk menyimpan data spreadsheet yang telah dimodifikasi ke dalam file baru dengan format yang dipilih oleh pengguna. Format yang dapat dipilih meliputi berbagai format Excel, OpenDocument, CSV, dan lainnya.
procedure TForm1.SaveFile(const AFileName: String; index : byte); var fmt: TsSpreadsheetFormat; begin Screen.Cursor := crHourglass; try case index of 1: fmt := sfOOXML; // Format Excel 2007+ 2: fmt := sfExcel8; // Format Excel 97-2003 3: fmt := sfExcel5; // Format Excel 5.0 4: fmt := sfExcel2; // Format Excel 2.1 5: fmt := sfOpenDocument; // Format OpenDocument 6: fmt := sfCSV; // Format CSV 7: fmt := sfWikiTable_WikiMedia; // Format WikiTable end; sWorkbookSource1.SaveToSpreadsheetFile(AFileName, fmt); finally Screen.Cursor := crDefault; end; end;
Fungsi ini mengubah format file berdasarkan pilihan pengguna dan menyimpannya menggunakan sWorkbookSource1.SaveToSpreadsheetFile.
saya menambahkan ini di file form lazarus untuk setting filternya, ya karena malas ketik jadi bagus copy paste aja
object OpenDialog: TOpenDialog
Filter = 'All spreadsheet files|*.xls;*.xlsx;*.ods;*.csv|All Excel files (*.xls, *.xlsx)|*.xls;*.xlsx|Excel XML spreadsheets (*.xlsx)|*.xlsx|Excel XP/2003 XML spreadsheets (*.xml)|*.xml|Excel 97-2003 spreadsheets (*.xls)|*.xls|Excel 5 spreadsheets (*.xls)|*.xls|Excel 2.1 spreadsheets (*.xls)|*.xls|LibreOffice/OpenOffice spreadsheets (*.ods)|*.ods|HTML files (*.html; *.htm)|*.html;*.htm|Comma-separated text files (*.csv; *.txt)|*.csv;*.txt'
Left = 664
Top = 93
end
object SaveDialog1: TSaveDialog
Filter = 'Excel XML spreadsheet (*.xlsx)|*.xlsx|Excel 97-2003 spreadsheets (*.xls)|*.xls|Excel 5 spreadsheet (*.xls)|*.xls|Excel 2.1 spreadsheets (*.xls)|*.xls|LibreOffice/OpenOffice spreadsheet (*.ods)|*.ods|Comma-delimited files (*.csv)|*.csv|WikiTable (WikiMedia-Format, *.wikitable_wikimedia)|*.wikitable_wikimedia'
Left = 736
Top = 93
bisa dilihat juga di video ketika saya copy pastenya
Event Handling: Button1Click dan Button2Click
Event handler untuk dua tombol utama:
-
Button1Click: Membuka file menggunakan
OpenDialogdan memanggil fungsiLoadFile. -
Button2Click: Menyimpan file menggunakan
SaveDialog1dan memanggil fungsiSaveFile.
procedure TForm1.Button1Click(Sender: TObject); begin if OpenDialog.Execute then LoadFile(OpenDialog.FileName, OpenDialog.FilterIndex); WorksheetGrid.SetFocus; WorksheetGrid.Row := 1; WorksheetGrid.Col := 1; end; procedure TForm1.Button2Click(Sender: TObject); begin if SaveDialog1.Execute then SaveFile(SaveDialog1.FileName, SaveDialog1.FilterIndex); end;
Pada Button1Click, file yang dipilih akan dimuat ke dalam worksheet grid, dan grid akan difokuskan ke sel pertama. Sedangkan pada Button2Click, aplikasi akan menyimpan file dengan format yang dipilih oleh pengguna.
Penutupan
Dengan langkah-langkah di atas, Anda telah membuat aplikasi spreadsheet sederhana yang dapat membuka dan menyimpan file dalam berbagai format menggunakan Lazarus dan pustaka fpspreadsheet. Aplikasi ini dapat menjadi dasar yang baik untuk pengembangan lebih lanjut, seperti penambahan fitur pengeditan sel, filter data, dan sebagainya.
Pustaka fpspreadsheet menawarkan banyak kemampuan untuk bekerja dengan data spreadsheet, dan dengan Lazarus sebagai IDE, Anda dapat dengan mudah membuat aplikasi desktop yang kuat dan fleksibel.
Sekarang sudah menjadi umum template management ISO, nah pada ISO sudah jelas bahwa document itu tercontrol... artinya formatnya pun terkontrol nah dengan lazarus bisa saja membuat alat bantu untuk memasukkan data excel itu ke database di olah baru di keluarkan kembali menjadi data yang kita inginkan. jika berminat silahkan komen dibawah dan emailkan saya file excelnya biar saya bantu dan buatkan artiklenya.
SourceCode bisa di download disini
Sunday, September 7, 2025
Membuat Animasi Water Tank Level di Lazarus dengan BGRA Bitmap
Membuat Animasi Water Tank Level di Lazarus dengan BGRA Bitmap
Visualisasi level air pada sebuah tangki sering digunakan dalam sistem SCADA, HMI, maupun aplikasi monitoring sederhana. Dengan Lazarus + BGRA Bitmap, kita bisa membuat animasi water tank level yang interaktif, misalnya dengan slider (TrackBar) untuk mengatur ketinggian air.
pada artikle kali ini saya hanya memfokuskan pada pengendalian animasi sederhananya jadi belum terkoneksi dengan rangkaian elektronik dan itu akan di bahas pada artikle lainnya, semoga secepatnya tinggalkan komen jika memang menginginkannya.
![]() |
| ini gambar background "test.bmp" |
Persiapan Komponen
Buat sebuah form baru di Lazarus, lalu tambahkan komponen berikut:
-
TBGRAVirtualScreen→ untuk menggambar grafik. -
TTrackBar→ untuk mengatur tinggi air. -
TLabel→ untuk menampilkan koordinat mouse. -
Tambahkan juga unit BGRABitmap dan BGRABitmapTypes pada bagian
uses.
Logika Utama Program
Ada beberapa poin penting dalam program ini:
-
Inisialisasi Tangki dan Warna
x0 := 111; y0 := 320; tebal := 2; lebar := 148; tinggi := 217; garis := BGRA(0,0,255,128); isian := BGRA(0,0,255,128);Di sini kita tentukan posisi, ukuran tangki, dan warna air.
-
Memuat Background
background := TBGRABitmap.Create; background.LoadFromFile('test.bmp');Background hanya diload sekali saat
FormCreate. -
Kontrol Level Air dengan TrackBar
TrackBar1.Min := 0; TrackBar1.Max := tinggi; TrackBar1.Position := 0;Nilai TrackBar dihubungkan dengan tinggi air di tangki.
-
Menggambar Ulang pada VirtualScreen
Bitmap.RectangleAntialias(x0, y0, x0+lebar, y0-tinggi, garis, tebal, isian);Bagian ini yang membuat animasi level air naik-turun sesuai posisi TrackBar.
-
Menjaga Proporsi Background
Ada perhitungan aspect ratio agar background tidak gepeng ketika digambar ulang.// hitung aspect ratio
imgRatio := background.Width / background.Height;
scrRatio := Bitmap.Width / Bitmap.Height;
if imgRatio > scrRatio then
begin
// gambar lebih lebar daripada layar → sesuaikan lebar penuh
drawWidth := Bitmap.Width;
drawHeight := Round(drawWidth / imgRatio);
xOff := 0;
yOff := (Bitmap.Height - drawHeight) div 2;
end
else
begin
// gambar lebih tinggi daripada layar → sesuaikan tinggi penuh
drawHeight := Bitmap.Height;
drawWidth := Round(drawHeight * imgRatio);
yOff := 0;
xOff := (Bitmap.Width - drawWidth) div 2;
end;
// gambar background dengan stretch proporsional-- jangan lupa urutan menggambarnya
Bitmap.StretchPutImage(Rect(xOff, yOff, xOff+drawWidth, yOff+drawHeight), background, dmSet);
Kekurangan dari animasi yang saya buat adalah meletakkan objectnya, kordinatnya harus di cari secara manual makanya pada form ini bisa di lihat ada label yang menampilkan kordinat mouse pada virtualscreen dari BRGAbitmap, bisa di lihat disini
jadi baru mencari dulu kordinat yang di perlukan dengan menjalankan aplikasi dan mencatat kordinat mouse secara manual saya masih belum dapat cara yang lebih mudah lagi jadi jika banyak object maka kesulitan dalam mengumpulkan kordinat ini juga bertambah.
mudah2an nantinya ada yang bisa menyumbangkan idenya untuk mengatasi hal ini
berikut adalah source code lengkapnya dan jangan lupa silahkan di instal komponen BRGABitmapnya terlebih dahulu.
dan berikut adalah lazarus formnya :






