Senin, 29 Juli 2013

Mengakses Daftar Method dari class dengan String pada Lazarus

Suatu hari aku memiliki pekerjaan yang mengharuskanku untuk membuat sebuah RPC yang sesederhana mungkin dan fungsional dengan lazarus. Menurutku sih itu mudah banget secara dah banyak komponen socket TCP/IP dan contoh program server HTTP jadi aku berencana memakai http protokol sebagai sarana komunikasi server dengan kliennya.

Tapi entah kenapa kok saya tiba-tiba malas banget untuk meregistrasi setiap prosedur yang dipublish oleh modul web servicenya, sehingga aku membuat sebuah fungsi untuk meregistrasi semua fungsi didalam class modul servis yang dipublish secara otomatis dari informasi class itu.

Pertama-tama aku mencoba mendeklarasikan tipe untuk mengakses struktur tabel method dari suatu class di lazarus, sebagai berikut:

type
tmethodnamerec = packed record
name : pshortstring;
addr : pointer;
end;

tmethodnametable = packed record
count : dword;
entries : packed array[0..0] of tmethodnamerec;
end;

pmethodnametable = ^tmethodnametable;

// type untuk menjalankan method lengkap dengan parameternya
TTestMethod = procedure(const AData: String) of object;

Setelah itu semua method yang akan diakses dideklarasikan sebagai published, sebagai berikut:

type
TMyApplication = class(TCustomApplication)
published
procedure TestReadMethod;
procedure Test1(const AData: String);
.
.

Kemudian berikut method yang digunakan untuk membaca daftar method terpublish dan contoh menjalankan sebuah method dengan string:

procedure TMyApplication.TestReadMethod;
var
methodtable : pmethodnametable;
i : dword;
ovmt : PVmt;
m : TTestMethod;
begin
ovmt:=PVmt(self.ClassType);
while assigned(ovmt) do
begin
methodtable:=pmethodnametable(ovmt^.vMethodTable);
if assigned(methodtable) then
begin
for i:=0 to methodtable^.count-1 do
begin
WriteLn('Found method: ',methodtable^.entries[i].name^);

// jika menemukan fungsi Test1 jalankan dengan parameter '
Halo'
if (SameText(methodtable^.entries[i].name^,'Test1')) then
begin
TMethod(m).Code := methodtable^.entries[i].addr;
TMethod(m).Data := Self;
m('Halo');
end;
end;
end;
ovmt := ovmt^.vParent;
end;
end;

Source code dari contoh fungsi yang dijalankan:

procedure TMyApplication.Test1(const AData: String);
begin
WriteLn('Test1 dijalankan dgn parameter ',AData);
end;

Dari contoh program di atas output program yang didapatkan adalah sebagai berikut:

Dari output di atas bisa disimpulkan bahwa source code yang saya buat telah berhasil membaca daftar method dari class dan menjalankan salah satu fungsi dengan String.

Sekian contoh pengalaman saya dalam membuat fungsi untuk membaca method secara otomatis dari class di lazarus, semoga bermanfaat.

Selasa, 16 Juli 2013

Mencoba membuat sebuah aplikasi web dengan server buatan sendiri dengan Lazarus

Singkat cerita pada suatu waktu saya memiliki waktu luang yang sangat melimpah, semacam bergelimang waktu luang gitu deh. Karena aku itu hiperaktif jadi aku manfaatkan untuk mencoba membuat sebuah aplikasi web dengan web server yang aku buat sendiri make lazarus.

Dari situ aku mulai merancang modularitasnya agar masing2 modul aplikasi bisa lebih fokus pada urusannya sendiri namun tetap bisa saling komunikatif agar hubungannya tidak retak.. halah..

Setelah beberapa hari didevel maka akhirnya software coba-coba saya mulai menampakkan hasil, berikut screen capturenya:

Tampilan control panel utamanya:

Tampilan opsi servernya:

Tampilan aplikasi web home screen sblm login:

Tampilan home screen aplikasi saat login:

Tampilan salah satu menu program:

Tampilan halaman browsing datanya:

Tampilan form edit datanya:

Tampilan programnya lumayan bagus dan enak utk membuat skinnya karena bisa make css ala web. Utk komunikasi dengan javascriptnya aku bikin sendiri rutinnya dengan transportnya masih make json.

Tetapi karena setelah diujicoba terasa terlalu rumit dalam developmen aplikasi maka project ini terpaksa dirombak total dan sampai saat ini aku belum punya waktu untuk melanjutkannya.

Creating Linux Daemon or Windows Service with Lazarus

Daemon Application in Linux or Service Application in Windows is an application that running in the background, usually automatically starte...