10 Juli 2009

Mau Beli Laptop Tanpa Garansi Resmi?

Indonesia mempunyai pasar yang cukup besar untuk urusan laptop. Banyak produk berbagai macam merk yang di impor masuk ke Indonesia. Karena ada saudara yang minta saran tentang membeli laptop yang cocok, oleh sebab itu aku mulai mencari referensi sebanyak mungkin tentang laptop dan sebagainya. Bukan soal merk atau spesifikasi laptop yang menjadi alasan dari saudara yang meminta bantuan padaku, tapi masalah banyaknya laptop tanpa garansi resmi yang cukup banyak beredar di pasaran.
Ada istilah laptop BM (Black Market) yang berarti laptop tersebut di impor tanpa mengikuti aturan impor yang semestinya, seperti aturan perpajakan, bea masuk, dan lain-lain. Dengan demikian laptop BM bisa lebih murah daripada laptop yang memiliki garansi resmi. Ada lagi istilah PI (Parallel Import) yang berarti laptop tidak di impor oleh badan/toko/perorangan yang tidak ditunjuk sebagai agen atau distributor resmi untuk produk yang bersangkutan.
Dengan demikian berarti laptop BM/PI pasti lebih murah dibanding laptop yang mempunyai garansi resmi. Dengan alasan ini pula yang membuat banyak pembeli tertarik untuk membeli laptop yang tanpa garansi resmi. Menguntungkan bagi pembeli dan juga penjual. Mengapa laptop BM.PI bisa lebih murah? Jelas karena tidak membayar pajak bea cukai. Selain itu pengimpor barang juga tidak perlu mendirikan jaringan service center yang luas, karena anggapan mereka kalau ada kerusakan, mereka perbaiki sendiri, atau kalau sulit diperbaiki, dikembalikan ke negara asalnya. Konsumen menunggu lama? Itulah resikonya kalau membeli barang tanpa garansi resmi.
Ada lagi istilah laptop refurbished, artinya adalah produk yang tidak memenuhi standar kualitas pabrik atau cacat produksi yang terlanjur keluar dipasaran, kemudian dikembalikan ke pabrik. Oleh pabrik tersebut diperbaiki dan bahkan di bentuk ulang bila ada cacat fisiknya. Kemudian laptop tersebut dijual lagi di pasaran dengan harga murah. Di luar negeri, produk semacam ini akan dibeli label “Refurbished” dan dijual dengan harga diskon besar, bahkan bisa mencapai 30%. Di Amerika produk refurbished dibeli label jelas dan tidak boleh dijual sebagai barang yang baru, sekalipun kelihatan baru dan ada segel dari pabrik, karena laptop refurbished bisa ada goresan, kotoran, dan bentuk kerusakan fisik lain yang tidak mempengaruhi performa.
Bagaimana membedakan laptop PI/BM/refurbished dan yang bergaransi resmi? Mudah saja, cek kartu garansinya. Tanyakan kartu garansinya ke penjual. Cek kartu garansinya, apakah dikeluarkan oleh distributor resmi atau tidak. Nomor telepon service centernya pasti tercantum disana, hubungi bila perlu. Beberapa produsen saat ini juga menyediakan registrasi serial number, registrasikan bila memang produsen menyediakan fasilitas tersebut.
Laptop dengan garansi resmi akan diterima di service center di semua kota, bahkan di seluruh dunia. Ada pengalaman teman saya yang membeli laptop Toshiba di luar negeri, ternyata baterainya rusak, kemudian dibawa ke service center di Surabaya dan baterai diganti baru dengan hanya membayar biaya administrasi. Ada pengalaman orang lain yang membeli laptop Toshiba yang tanpa garansi resmi, ketika dia pindah ke kota lain, dan dibawa ke service center, disana dikatakan bahwa barang itu barang bekas! Dengan kenyataan ini dipikirkan dulu apa kita mau membeli laptop yang tanpa garansi resmi, atau kalau tetap mau nekat juga Anda sudah tahu resikonya.

Baca selengkapnya...

07 Juli 2009

Menjalankan File dan Menunggu Sampai Ditutup

Menggunakan fungsi ShellExecuteEx mempunyai keuntungan dibanding dengan fungsi ShellExecute. Jika kita menjalankan aplikasi eksternal dari aplikasi kita dan ingin menunggu sampai aplikasi yang dijalankan ditutup baru bisa kembali ke aplikasi kita, bisa dengan menggunakan fungsi ShellExecuteEx. Kuncinya terletak pada parameter fMask. Jika flag SEE_MASK_NOCLOSEPROCESS aktif, maka saat file dijalankan parameter hProcess akan berisi handle pada file tersebut. Handle tersebut bisa digunakan untuk mengetahui apakah file yang dijalankan tersebut sudah ditutup. Supaya lebih jelas diberikan contoh program seperti dibawah ini.
var
  SEInfo: TShellExecuteInfo;
  ExitCode: DWORD;
begin
  FillChar(SEInfo, SizeOf(SEInfo), 0);
  with SEInfo do
  begin
    cbSize := SizeOf(TShellExecuteInfo);
    fMask := SEE_MASK_NOCLOSEPROCESS;
    lpVerb := PChar('open');
    lpFile := PChar('notepad.exe');
    nShow := SW_SHOWNORMAL;
  end;
  if ShellExecuteEx(@SEInfo) then
  begin
    repeat
      GetExitCodeProcess(SEInfo.hProcess, ExitCode);
    until ExitCode <> STILL_ACTIVE;
  end;
end.

Baca selengkapnya...

06 Juli 2009

Fungsi Windows API: ShellExecuteEx

Fungsi ShellExecuteEx mempunyai kegunaan yang mirip dengan fungsi ShellExecute yang disediakan Windows. Untuk menggunakan fungsi ini, tambahkan unit ShellAPI pada form yang bersangkutan. Fungsi ShellExecuteEx hanya mempunyai satu parameter yang berupa pointer ke suatu record dan mengembalikan nilai dengan tipe boolean, True jika sukses atau False jika gagal. Sintaknya bisa kita lihat dibawah ini.
function ShellExecuteEx(lpExecInfo: PShellExecuteInfo): BOOL;

Parameter pada fungsi diatas di deklarasikan sebagai berikut.
type
  PShellExecuteInfo = ^TShellExecuteInfo;
  TShellExecuteInfo = record
    cbSize: DWORD;
    fMask: ULONG;
    Wnd: HWND;
    lpVerb: PWideChar;
    lpFile: PWideChar;
    lpParameters: PWideChar;
    lpDirectory: PWideChar;
    nShow: Integer;
    hInstApp: HINST;
    lpIDList: Pointer;
    lpClass: PWideChar;
    hkeyClass: HKEY;
    dwHotKey: DWORD;
    hIcon: THandle;
    hProcess: THandle;
  end;

Deskripsi dari parameter diatas adalah sebagai berikut.
  1. cbSize. Merupakan ukuran struktur dalam byte.
  2. fMask. Flag yang menunjukkan isi dan validitas dari anggota struktur yang lain. Bisa merupakan kombinasi dari konstanta berikut.
    • SEE_MASK_CLASSNAME
    • SEE_MASK_CLASSKEY
    • SEE_MASK_IDLIST
    • SEE_MASK_INVOKEIDLIST
    • SEE_MASK_ICON
    • SEE_MASK_HMONITOR.
    • SEE_MASK_HOTKEY
    • SEE_MASK_NOCLOSEPROCESS
    • SEE_MASK_CONNECTNETDRV
    • SEE_MASK_NOASYNC
    • SEE_MASK_FLAG_DDEWAIT
    • SEE_MASK_DOENVSUBST
    • SEE_MASK_FLAG_NO_UI
    • SEE_MASK_UNICODE
    • SEE_MASK_NO_CONSOLE
    • SEE_MASK_ASYNCOK
    • SEE_MASK_NOQUERYCLASSSTORE
    • SEE_MASK_HMONITOR
    • SEE_MASK_NOZONECHECKS
    • SEE_MASK_WAITFORINPUTIDLE
    • SEE_MASK_FLAG_LOG_USAGE
  3. Wnd. Sama dengan parameter hWnd para fungsi ShellExecute.
  4. lpVerb. Sama dengan parameter Operation para fungsi ShellExecute.
  5. lpFile. Sama dengan parameter FileName para fungsi ShellExecute.
  6. lpParameters. Sama dengan parameter Parameters para fungsi ShellExecute.
  7. lpDirectory. Sama dengan parameter Directory para fungsi ShellExecute.
  8. nShow. Sama dengan parameter ShowCmd para fungsi ShellExecute.
  9. hInstApp. Jika flag SEE_MASK_NOCLOSEPROCESS aktif dan fungsi sukses dijalankan, akan berisi nilai lebih dari 32. Jika gagal akan mengembalikan kode kesalahan.
  10. lpIDList. Optional. Alamat absolut dari struktur ITEMIDLIST yang berisi daftar identifier yang unik bagi file yang di eksekusi. Parameter ini diabaikan jika flag SEE_MASK_IDLIST atau SEE_MASK_INVOKEIDLIST pada parameter fMask tidak aktif.
  11. lpClass. Optional. Nama class dari file atau GUID. Parameter ini diabaikan jika flag SEE_MASK_CLASSNAME pada parameter fMask tidak aktif.
  12. hkeyClass. Optional. Registry key untuk class file. Parameter ini diabaikan jika flag SEE_MASK_CLASSKEY pada parameter fMask tidak aktif.
  13. dwHotKey. Optional. Shortcut pada keyboard yang di asosiasikan dengan aplikasi yang bersangkutan. Parameter ini diabaikan jika flag SEE_MASK_HOTKEY pada parameter fMask tidak aktif.
  14. hIcon. Optional. Handle ke suatu icon untuk class file. Hanya digunakan untuk Windows XP dan sebelumnya, diabaikan untuk Windows Vista dan sesudahnya. Parameter ini diabaikan jika flag SEE_MASK_ICON pada parameter fMask tidak aktif.
  15. hProcess. Berisi nilai kembali berupa handle untuk aplikasi yang dijalankan, jika flag SEE_MASK_NOCLOSEPROCESS pada parameter fMask aktif.

Contoh penggunaannya adalah sebagai berikut.
var
  SEInfo: TShellExecuteInfo;
begin
  FillChar(SEInfo, SizeOf(SEInfo), 0);
  with SEInfo do
  begin
    cbSize := SizeOf(TShellExecuteInfo);
    lpVerb := PChar('open');
    lpFile := PChar('C:\Windows');
    nShow := SW_SHOWNORMAL;
  end;
  ShellExecuteEx(@SEInfo);
end.

Baca selengkapnya...

03 Juli 2009

Fungsi Windows API: ShellExecute

ShellExecute merupakan fungsi yang disediakan oleh Windows melalui file pustaka “shell32.dll”, dan sudah ada sejak Windows 9x. Kegunaan dari fungsi ini adalah untuk melakukan operasi terhadap suatu file atau direktori. Operasi yang dimaksud bisa bermacam-macam yang nanti akan dijelaskan. Dalam pengembangan aplikasi dengan Delphi fungsi ini juga bisa dipakai dengan menambahkan unit “ShellAPI” pada form yang mengakses fungsi tersebut. Sintaknya adalah sebagai berikut.
function ShellExecute(hWnd: HWND; Operation, FileName, Parameters, Directory: PChar; ShowCmd: Integer): HINST;

Deskripsi dari parameter diatas adalah sebagai berikut.
  1. hWnd. Merupakan handle terhadap window yang untuk menampilkan user interface (UI) atau pesan kesalahan. Nilai bisa 0 yang berarti tidak berhubungan dengan suatu window.
  2. Operation. Merupakan string yang menggambarkan operasi yang digunakan terhadap suatu file atau direktori. Operasi yang dimaksud bisa berupa:
    • open. Membuka item yang ditentukan oleh parameter FileName. Bisa berupa file atau direktori. Item akan dibuka menggunakan aplikasi sesuai dengan ekstensi file yang di registrasikan.
    • edit. Menampilkan editor yang digunakan untuk membuka dan meng-edit file dokumen dari parameter FileName. Jika parameter yang diberikan bukan merupakan file dokumen, fungsi akan gagal dipanggil.
    • explore. Membuka direktori/folder yang diberikan oleh parameter FileName.
    • find. Membuka dialog pencarian pada direktori aktif atau pada direktori yang ditentukan oleh parameter FileName.
    • print. Mencetak file yang ditentukan oleh parameter FileName. Jika parameter yang diberikan bukan merupakan file dokumen, fungsi akan gagal dipanggil.
  3. FileName. Merupakan suatu obyek, bisa berupa file atau direktori, yang di eksekusi oleh operasi yang ditentukan oleh parameter Operation.
  4. Parameters. Jika file yang ditentukan merupakan file aplikasi yang bisa dijalankan, isi dari parameter ini digunakan sebagai parameter untuk file aplikasi yang bersangkutan.
  5. Directory. Merupakan direktori kerja default, jika tidak diisi merupakan direktori aktif.
  6. ShowCmd. Flag yang menentukan bagaimana aplikasi ditampilkan waktu dibuka. Konstanta yang bisa dipakai:
    • SW_HIDE
    • SW_MAXIMIZE
    • SW_MINIMIZE
    • SW_RESTORE
    • SW_SHOW
    • SW_SHOWDEFAULT
    • SW_SHOWMAXIMIZED
    • SW_SHOWMINIMIZED
    • SW_SHOWMINNOACTIVE
    • SW_SHOWNA
    • SW_SHOWNOACTIVATE
    • SW_SHOWNORMAL

Jika fungsi berhasil dijalankan, akan mengembalikan nilai integer lebih besar dari 32. Jika gagal, akan mengembalikan kode kesalahan sebagai berikut:
  • 0
  • ERROR_FILE_NOT_FOUND
  • ERROR_PATH_NOT_FOUND
  • ERROR_BAD_FORMAT
  • SE_ERR_ACCESSDENIED
  • SE_ERR_ASSOCINCOMPLETE
  • SE_ERR_DDEBUSY
  • SE_ERR_DDEFAIL
  • SE_ERR_DDETIMEOUT
  • SE_ERR_DLLNOTFOUND
  • SE_ERR_FNF
  • SE_ERR_NOASSOC
  • SE_ERR_OOM
  • SE_ERR_PNF
  • SE_ERR_SHARE

Contoh penggunaannya:
Membuka aplikasi tertentu.
ShellExecute(0, ‘open’, ‘notepad.exe’, nil, nil, SW_SHOWNORMAL);
Explore direktori/folder tertentu.
ShellExecute(0, ‘explore’, ‘C:\Windows’, nil, nil, SW_SHOWNORMAL);
Edit file dokumen.
ShellExecute(0, ‘edit’, ‘C:\textfile.txt’, nil, nil, SW_SHOWNORMAL);
Menampilkan dialog pencarian pada direktori tertentu.
ShellExecute(0, ‘find’, ‘C:\Windows\system’, nil, nil, SW_SHOWNORMAL);
Mencetak file dokumen.
ShellExecute(0, ‘print’, ‘C:\textfile.txt’, nil, nil, SW_SHOWNORMAL);

Baca selengkapnya...

01 Juli 2009

Akses Internet Unlimited dengan Mobi

Operator telepon seluler berbasis CDMA Mobile-8 tampaknya tidak mau ketinggalan dengan operator lain dalam rangka akses internet unlimited, walaupun sebenarnya ketinggalan juga nih. Ini ditandai dengan diluncurkan produk Mobi. Berbeda dengan paket Mobi sebelumnya yang di bundling dengan modem, yang ini cuma kartu perdana saja. Dengan begini semakin banyak juga pilihan untuk akses internet yang terjangkau untuk semua rakyat, termasuk yang di pinggiran kota seperti saya ini.
Paket yang disediakan ada 4:
  • Rp. 50.000 (up to 125 Kbps) quota 500 MB setelah itu 64 Kbps
  • Rp. 100.000 (up to 1024 Kbps) quota 1.5 GB setelah itu 64 Kbps
  • Rp. 150.000 (up to 3.1 Mbps) quota 2.5 GB setelah itu 128 Kbps
  • Rp. 250.000 (up to top speed) quota 3.5 GB setelah itu 256 Kbps

Tapi sayangnya dari 4 paket tersebut hanya 1 saja yang bisa dinikmati diluar area Jakarta dan sekitarnya saja. Tapi lumayan buat internetan dengan biaya murah, cuma Rp. 50.000 jadi. Selain itu hanya bisa dinikmati di area Jakarta dan sekitarnya karena jaringan EVDO yang bisa mencapai kecepatan maksimal sampai 3.1 Mbps. Bagi yang pernah coba bisa sharing pengalamannya.
Pertama kali kita mesti beli kartu perdana Mobi dulu di counter Mobile-8, bisa ditebus dengan harga Rp. 75.000 (termasuk untuk akses internet unlimited bulan pertama), selanjutnya dengan melakukan isi ulang senilai Rp. 50.000 tiap bulan, katanya sih bisa akses internet unlimited. Selanjutnya adalah mendaftarkan kartu perdana tersebut seperti layaknya kartu perdana lain, ini bisa dibantu oleh operator yang melayani kita di counter Mobile-8. Langkah terakhir adalah dengan mengirimkan SMS ke 777, yang kemudian akan kita dapatkan kiriman balasan berupa username dan password yang digunakan untuk akses internet.
REG<spasi>UNL50 (untuk paket Rp. 50.000)
REG<spasi>UNL100 (untuk paket Rp. 100.000)
REG<spasi>UNL150 (untuk paket Rp. 150.000)
REG<spasi>UNL250 (untuk paket Rp. 250.000)

Informasi ini sudah sejak pertengahan Juni 2009 aku dapat, tapi baru bisa direalisasikan akhir Juni. Di website Mobile-8 sendiri belum terdapat informasi tentang akses unlimited ini, jadi cukup menyesatkan. Diluar itu akses internet cukup baik, jika dibanding dengan yang aku pakai sebelumnya dari Starone. Tidak bisa membandingkan dengan yang lain, karena pilihan yang sangat terbatas di tempatku. Selamat mencoba mumpung belum terlalu banyak yang tahu…

Baca selengkapnya...

30 Juni 2009

Mendapatkan Informasi File Aplikasi

File aplikasi yang mempunyai ekstensi seperti .exe atau .dll bisa memiliki informasi yang berkaitan dengan file tersebut. Misalnya versi dari file, perusahaan, keterangan, atau apa pun yang kita mau. Informasi tersebut akan menyatu dengan file aplikasi yang bersangkutan. Informasi ini bisa kita dapatkan dengan menampilkan properties dari file aplikasi itu. Jika file aplikasi tersebut memiliki informasi, maka bisa kita lihat pada tab Version dari properties file tersebut.
Menambahkan informasi pada file aplikasi bisa memiliki keuntungan. Misalnya bila kita mengembangkan sebuah aplikasi dan ada update dari file aplikasi untuk keperluan penambahan fitur atau perbaikan terhadap kesalahan/bug. Aplikasi yang dibuat bisa melakukan update otomatis ke suatu lokasi tertentu jika ditemukan file aplikasi yang sama dengan versi yang lebih baru.
Delphi juga menyediakan sarana untuk menambahkan informasi pada aplikasi yang kita buat. Pada menu Project->Options, terdapat pilihan “Include version information in project” yang harus kita aktifkan (default tidak aktif). Versi file di Windows dibagi menjadi 4 bagian, Major, Minor, Release dan Build. Pilihan “Auto-increment build number” jika di aktifkan, maka angka pada bagian Build akan otomatis ditambah satu jika dilakukan proses build (menu Project->Build <nama_project>/Build All Projects) dan compile.








Pada bagian Project Options tersebut terdapat sejumlah key yang bisa kita beri nilai, seperti CompanyName, FileDescription, FileVersion, dan seterusnya. Untuk mendapatkan informasi dari suatu file aplikasi gunakan cara ini.
uses SysUtils, Windows;

function GetFileVersionInformation(const aFileName, aName: string): string;
const
  LocaleID = '0421';
var
  VerInfoSize, VerValueSize, Dummy: DWORD;
  VerInfo, VerValue: PChar;
begin
  Result := '';
  VerInfoSize := GetFileVersionInfoSize(PChar(aFileName), Dummy);
  if VerInfoSize > 0 then
  begin
    VerInfo := AllocMem(VerInfoSize);
    GetFileVersionInfo(PChar(aFileName), 0, VerInfoSize, VerInfo);
    if VerQueryValue(VerInfo, PChar('StringFileInfo\' + LocaleID + '04E4\' + aName), Pointer(VerValue), VerValueSize) then
      Result := VerValue;
    FreeMem(VerInfo, VerInfoSize);
  end;
end;

Contoh cara menggunakannya:
ShowMessage(GetFileVersionInformation(Application.ExeName, ‘FileVersion’));
ShowMessage(GetFileVersionInformation(Application.ExeName, ‘CompanyName’));

Pada skrip diatas terdapat konstanta LocaleID, karakter tersebut tergantung dari pengaturan lokalisasi/bahasa yang kita pakai. Pada contoh diatas digunakan pengaturan lokalisasi/bahasa Indonesian. Pengaturan tersebut bisa kita lihat pada Project Options.











Bisa juga kita menambahkan informasi tambahan selain yang telah ada. Arahkan cursor sampai pada key paling bawah, kemudian tekan tombol panah bawah. Masukkan nama key dan isi nilai dari key tersebut.

Baca selengkapnya...

26 Juni 2009

Query Dinamis SQL Server

Perintah EXECUTE pada SQL Server digunakan untuk menjalankan procedure, function dan bisa juga string yang berisi perintah SQL. Tanda kurung buka dan kurung tutup mutlak digunakan sebelum dan sesudah string perintah SQL. Misalnya untuk menjalankan procedure bisa seperti ini:
EXECUTE (‘sp_databases’);
EXECUTE (‘SELECT * FROM sysdatabases’);

Jika kita memerlukan query yang menghasilkan jumlah field yang bisa berbeda, cara ini bisa menjadi solusi. Misalnya menampilkan hasil penjualan per tahun dari perusahaan. Tidak menjadi masalah jika tahun ditampilkan secara vertikal, tapi jika ditampilkan secara horisontal tentu tidak semudah itu. Disini diberikan contoh kasus dengan 3 tabel, periode, cabang dan penjualan. Tabel periode berisi tahun penjualan, tabel cabang berisi cabang perusahaan, dan tabel penjualan adalah data penjualan berdasarkan tanggal pada suatu cabang. Tabel-tabel tersebut di desain seperti ini.
CREATE TABLE periode(tahun int);
INSERT INTO periode VALUES (2007);
INSERT INTO periode VALUES (2008);
INSERT INTO periode VALUES (2009);

CREATE TABLE cabang(kode char(2));
INSERT INTO cabang VALUES ('01');
INSERT INTO cabang VALUES ('02');

CREATE TABLE penjualan(kode char(5), tanggal datetime, total money, kodecabang char(2));
INSERT INTO penjualan VALUES ('00001', '2007-02-21', 80000, '01');
INSERT INTO penjualan VALUES ('00002', '2007-07-09', 35000, '02');
INSERT INTO penjualan VALUES ('00003', '2008-01-11', 20000, '01');
INSERT INTO penjualan VALUES ('00004', '2008-04-15', 63000, '01');
INSERT INTO penjualan VALUES ('00005', '2008-12-30', 48000, '02');
INSERT INTO penjualan VALUES ('00006', '2009-03-03', 50000, '01');

Yang kita inginkan adalah menampilkan total penjualan per tahun per cabang dengan tahun ditampilkan secara horisontal. Dengan bantuan cursor hasil yang diinginkan bisa kita dapatkan.
DECLARE @tahun char(4);
DECLARE @query varchar(1000);
SET @query = 'SELECT c.kode AS cabang, ';
DECLARE crs CURSOR LOCAL FOR SELECT tahun FROM periode;
OPEN crs;
FETCH NEXT FROM crs INTO @tahun
WHILE @@FETCH_STATUS = 0
BEGIN
  SET @query = @query + 'SUM(CASE WHEN YEAR(p.tanggal) = ' + @tahun + ' THEN p.total ELSE 0 END)' + ' AS tahun' + @tahun;
  FETCH NEXT FROM crs INTO @tahun;
  IF @@FETCH_STATUS = 0 SET @query = @query + ', '
END
CLOSE crs
DEALLOCATE crs
SET @query = @query + ' FROM cabang AS c LEFT JOIN penjualan AS p ON p.kodecabang = c.kode GROUP BY c.kode';
EXECUTE (@query);

Hasilnya dari skrip diatas adalah sebagai berikut.





Untuk mendapatkan hasil dari perintah SQL seperti diatas tidak bisa didapatkan seperti mengakses tabel biasa. Jadi perintah berikut akan menghasilkan pesan kesalahan.
SELECT * FROM EXECUTE (‘SELECT * FROM sysdatabases’);

Caranya adalah menyimpan hasil dari perintah SQL tersebut ke suatu tabel atau tabel sementara. Contoh berikut akan menyimpan hasil dari beberapa perintah SQL ke tabel sementara dan menampilkan hasilnya.
INSERT INTO #tmp EXECUTE ('prosedur1');
INSERT INTO #tmp EXECUTE ('prosedur2');
INSERT INTO #tmp EXECUTE ('prosedur3');
SELECT * FROM #tmp;

Baca selengkapnya...

23 Juni 2009

Perintah GO pada SQL Server

Perintah GO hanya dikenali pada DBMS SQL Server, digunakan untuk mengakhiri perintah-perintah T-SQL (Transact SQL) pada SQL Server. Perintah GO ini bukan merupakan perintah T-SQL. Pada SQL Server kumpulan perintah dikirim ke instance SQL Server yang dinamakan “batch”. Dengan perintah GO, tool yang digunakan pada SQL Server, seperti Query Analyzer pada SQL Server 2000 atau SQL Server Management Studio pada SQL Server 2005/2008, akan mengirim sinyal ke instance SQL Server untuk mengakhiri batch yang bersangkutan. Suatu batch terdiri atas semua perintah setelah perintah GO terakhir, atau sejak awal skrip jika tidak ada perintah GO sebelumnya.
USE master;
GO
DECLARE @i int;
SET @i = 10;
SELECT @i;
GO

Contoh skrip diatas terdiri dari 2 batch, karena terdapat 2 perintah GO. Dengan skrip tersebut sebuah variabel dengan tipe integer di deklarasikan dan diisi dengan nilai 10 yang kemudian ditampilkan hasilnya. Variabel yang di deklarasikan tersebut hanya berlaku pada batch tempat variabel tersebut di deklarasikan dan tidak berlaku setelah perintah GO dijalankan.
USE master;
GO
DECLARE @i int;
SET @i = 10;
SELECT @i;
GO
SELECT @i; -- akan menampilkan pesan kesalahan

Jika kita membuat procedure, function atau trigger, maka perintah untuk membuat obyek tersebut harus merupakan perintah pertama pada suatu batch. Contoh berikut akan menampilkan pesan kesalahan.
USE master;
CREATE PROCEDURE proc1 AS SELECT 1;

Supaya skrip tersebut bisa berjalan tanpa adanya pesan kesalahan, kita harus menambahkan perintah GO sebelum perintah untuk membuat procedure.
USE master;
GO
CREATE PROCEDURE proc1 AS SELECT 1;

Pada SQL Server 2008 terdapat fitur baru dimana pada perintah GO terdapat parameter dengan tipe integer (optional) yang dapat diisi dengan nilai integer positif. Parameter ini jika diisi dengan nilai tertentu akan menjalankan batch yang bersangkutan sebanyak nilai dari parameter tersebut ditentukan. Contoh berikut akan membuat tabel “tbl” dan diisi dengan tanggal dan waktu sekarang sebanyak 10 kali.
CREATE TABLE tbl (tgl datetime)
GO
INSERT INTO tbl VALUES (GETDATE())
GO 10
SELECT * FROM tbl

Catatan: Perintah lain tidak bisa menempati baris yang sama dengan perintah GO. Perintah GO juga tidak memerlukan tanda ; sebagai akhir perintah. Tapi baris komentar dapat menyertai perintah GO. Contoh:
GO [ok]
GO; [error]
GO -- akhir dari batch [ok]

Baca selengkapnya...

22 Juni 2009

Alman, Virus yang Bisa Membuat File Aplikasi Mekar

Virus ini mungkin sudah lama ada, yang aku sendiri juga tidak tahu kapan mulai ada. Tapi belum lama ini benar-benar membuat aku repot. Aku akui pembuat virus ini hebat juga, bisa mengubah/menambahkan ukuran file aplikasi tapi file tersebut masih bisa dijalankan, alias tidak merusak file yang terinfeksi. Ada-ada saja orang yang buat virus ini, kurang kerjaan, ingin pamer, atau mungkin terlalu kreatif. Buat orang yang buat virus yang mungkin baca dan mengerti, ada satu kata, TOBATLAH!
Awalnya aku tidak menyadari bahwa terdapat virus di komputer yang aku gunakan. Tidak ada antivirus aktif yang melindungi komputer, ini aku lakukan untuk meringankan dan mempercepat proses, maklum komputer yang aku gunakan sudah uzur. Aku baru curiga setelah ada yang tidak beres dengan komputerku, dan ternyata setelah melakukan scan dengan antivirus terdeteksi virus Alman pada beberapa file aplikasi. Karena antivirus yang aku gunakan tidak bisa menyembuhkan file yang terinfeksi, dan hanya menganjurkan di karantina atau dihapus, maka tidak ada jalan lain selain menghapus file yang terinfeksi dengan berharap virus tersebut tidak akan mampir lagi.
Ternyata harapan tidak sesuai dengan kenyataan. Virus tersebut tetap tinggal di komputerku dan sering menginfeksi file-file aplikasi yang ada di komputer. Tentu saja ini sangat merepotkan, apalagi sebagian file yang di infeksi adalah file penting. Tiap kali ada file yang terdeteksi selalu dihapus, setidaknya itu langkah yang aku tempuh, karena antivirus juga tidak membantu membasmi virus secara tuntas. Selain itu aku juga malas install ulang Windows, lama dan repot.
Setelah mencari dan mencari, akhirnya ketemu sebuah tool dari AVG yang khusus untuk membasmi virus Alman. Tool ini terdiri dari dua file rmalman.exe dan rmalman.nt yang bisa di download disini. Cara menjalankan tool ini dengan menjalankan rmalman.exe yang otomatis akan memeriksa seluruh file pada disk. Atau jika ingin memeriksa sebagian partisi atau direktori bisa dengan memberikan parameter saat menjalankan file rmalman.exe. Misalnya (jalankan pada command prompt):
rmalman (scans and cleans all available drives)
rmalman C: (scans and cleans the C: drive)
rmalman C: D: (scans and cleans the C: and D: drives)
rmalman C:\Windows (scans and cleans all files in the C:\Windows folder)
rmalman C:\Windows\explorer.exe (Scans and eventually cleans this file)

Setelah proses pembersihan juga dianjurkan untuk scan komputer dengan antivirus, misalnya AVG untuk lebih meyakinkan komputer bebas virus.

Catatan: Waktu pertama kali mencoba tool ini pada komputerku, proses tidak dapat dilanjutkan karena terdapat virus yang “gentayangan” di memory dan menampilkan pesan bahwa pada proses booting Windows selanjutnya tool ini otomatis dijalankan. Tapi kenyataannya tidak begitu, tetap saja tool tidak dijalankan saat proses booting selesai, mungkin ada yang salah atau ada file lain yang dibutuhkan. Yang jelas untuk mengatasi masalah ini, aku mengakali dengan cara menambahkan entry pada registry pada HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce, buat entry dengan nama sembarang, dengan tipe string, yang isinya direktori dan nama file dimana file rmalman.exe berada. Tool rmalman.exe otomatis dijalankan saat booting hanya sekali saja, setelah itu entry pada registry akan dihapus. Cara ini cukup berhasil meski tidak semua file bisa dibuka.

Baca selengkapnya...

17 Juni 2009

Hal yang Aneh pada CreateParams dan WS_EX_APP_WINDOWS (Lanjutan)

Beberapa langkah ditempuh untuk menyelesaikan masalah seperti yang dijelaskan pada posting sebelumnya. Seletah beberapa lama mencari penyelesaian atas masalah ini akhirnya dapat terselesaikan juga.
Langkah pertama adalah menambahkan kode pada method CreateParams pada form utama seperti pada form lain (sebelumnya form utama tidak melakukan override method CreateParams).
procedure TForm1.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW;
  Params.WndParent := GetDesktopWindow;
end;

Dengan cara diatas memberikan efek yang tidak diinginkan. Saat aplikasi dijalankan pertama kali terdapat dua button pada taskbar, padahal hanya ada form utama yang ditampilkan. Pada kenyataannya memang Delphi membuat satu form lagi yang di sembunyikan tiap kita menjalankan aplikasi yang dibuat menggunakan Delphi, yang secara default tidak menampilkan button pada taskbar. Tapi dengan kode diatas berpengaruh pada behaviour program. Tidak itu saja, masalah timbul lagi karena form utama tidak bisa di minimize. Berarti kita harus menyelesaikan dua masalah, menghilangkan button yang tidak diinginkan pada taskbar dan membuat form utama bisa di minimize.
Masalah pertama bisa diselesaikan dengan kode dibawah ini.
ShowWindow(Application.Handle, SW_HIDE);

Dengan kode diatas saat aplikasi pertama kali dijalankan hanya ada satu button pada taskbar, yang merupakan button untuk form utama.
Untuk menyelesaikan masalah kedua kita memerlukan satu trik khusus yang melibatkan windows message, WM_SYSCOMMAND. Windows message ini dihasilkan saat kita melakukan minimize, maximize atau menutup form. Untuk itu pertama kita harus menambahkan deklarasi procedure yang menangkap windows message yang dimaksud.
procedure WMSysCommand(var aMsg: TWMSysCommand); message WM_SYSCOMMAND;

Procedure diatas bisa di deklarasikan sebagai private atau public method. Nama procedure dan nama parameter tidak harus seperti diatas, bebas tapi memiliki signature seperti diatas. Kemudian pada bagian implementasi, tambahkan kode berikut.
if (aMsg.CmdType and $FFF0 = SC_MINIMIZE) then
  Self.WindowState := wsMinimized
else
  inherited;

Setelah semua hal diatas dilakukan, selesai sudah, bisa dicoba dan sepertinya sesuai seperti yang diharapkan, setidaknya bagiku.

Baca selengkapnya...

16 Juni 2009

Hal yang Aneh pada CreateParams dan WS_EX_APP_WINDOWS

Seperti yang dijelaskan sebelumnya konstanta WS_EX_APPWINDOW yang diset pada method CreateParams pada form akan membuat form tersebut pada suatu aplikasi mempunyai button tersendiri pada taskbar. Hal ini berjalan lancar pada Delphi 7, tapi tidak pada Delphi 2007!
Karena alasan tertentu aku mengembangkan aplikasi pada dua versi Delphi yang berbeda tersebut. Dengan menggunakan Delphi 7 semuanya sesuai dengan rencana, tapi ketika mencoba pada Delphi 2007 tidaklah seperti yang diharapkan. Sebagai informasi pada tiap form yang ada dibuat button tersendiri pada taskbar, jadi pada tiap form akan melakukan override pada method CreateParams yang akan mengaktifkan flag WS_EX_APPWINDOW.
Masalah pertama adalah semua form selain form utama yang selalu berada diatas form utama meski fokus berada pada form utama. Masalahnya ada pada program utama (.dpr) pada kode berikut:
Application.MainFormOnTaskbar := True;

Dengan menghapus bagian kode tersebut, masalah diatas bisa diatasi. Kurang jelas kegunaan kode tersebut, tapi ada sumber yang menyatakan kode tersebut digunakan untuk fitur baru pada Windows Vista yang berhubungan dengan User Interface. Yang jelas hal itu tidak dibahas disini.
Langkah tersebut adalah langkah awal, selanjutnya masih ada beberapa masalah yang lebih menantang lagi. Masalah berikutnya jika ada form lain dan kita klik pada button form utama pada taskbar, fokus tidak juga berganti pada form utama. Solusi masalah ini ada pada parameter WndParent sebagai bagian dari parameter dengan tipe TCreateParams pada method CreateParams.
type
  TCreateParams = record
    Caption: PChar;
    Style: DWORD;
    ExStyle: DWORD;
    X, Y: Integer;
    Width, Height: Integer;
    WndParent: HWnd;
    Param: Pointer;
    WindowClass: TWndClass;
    WinClassName: array[0..63] of Char;
  end;

Pada method CreateParams kita perlu menambahkan kode yang mengisi nilai dari parameter WndParent, pada tiap form selain form utama, seperti yang ditunjukkan kode berikut yang dicetak tebal.
procedure TForm1.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW;
  Params.WndParent := GetDesktopWindow;
end;

Dengan kode yang dicetak tebal, berarti form yang bersangkutan mengarahkan parent ke Desktop dibanding sebelumnya ke form utama. Dengan cara ini sepertinya masalah terselesaikan. Tapi setelah beberapa lama timbul masalah lagi yang cukup mengganggu. Tiap kali form selain form utama menjalankan fungsi yang menampilkan window/form modal, seperti ShowMessage() atau MessageDlg(), form utama akan berpindah menjadi form paling atas. Jadi sepertinya fungsi tersebut dipanggil dari form utama.
Bersambung…

Baca selengkapnya...

15 Juni 2009

Mengungkap Kegunaan Method CreateParams (Bagian 4)

Selain parameter Style, ada satu lagi parameter yang juga berguna, ExStyle. Kegunaan parameter ini dapat kita lihat pada form yang kita buat.

Membuat Button Tersendiri pada Taskbar Untuk Tiap Form
Jika kita pernah membuat aplikasi pada lingkungan .NET Framework, tiap form yang dibuat pada satu aplikasi akan menambahkan satu button ke taskbar. Ini merupakan default behaviour pada aplikasi .NET. Jika pada Delphi hanya terdapat satu button tidak peduli berapa form yang ada. Kita bisa melakukan ini dengan mengubah flag WS_EX_APPWINDOW pada parameter ExStyle.
procedure TForm1.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW;
end;


Form Transparan
Untuk mengubah form menjadi transaparan, gunakan flag WS_EX_TRANSPARENT, seperti pada contoh ini.
procedure TForm1.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  Params.ExStyle := Params.ExStyle or WX_EX_TRANSPARENT;
end;






Form Model MDI
Pada form yang properti FormStyle diset fsMDIForm, border form tersebut akan terlihat menonjol. Pada form yang biasa dapat juga dibuat seperti itu dengan set flag WS_EX_OVERLAPPEDWINDOW.
procedure TForm1.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  Params.ExStyle := Params.ExStyle or WS_EX_OVERLAPPEDWINDOW;
end;










ScrollBar di Sebelah Kiri Form
Biasanya kita menggunakan scrollbar pada sebelah kanan form. Tapi pada kasus tertentu mungkin beberapa orang lebih memilih scrollbar pada sebelah kiri seperti bahasa Arab yang dibaca dari kanan ke kiri. Untuk keperluan ini flag yang dipakai adalah WS_EX_LEFTSCROLLBAR.
procedure TForm1.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  Params.ExStyle := Params.ExStyle or
WS_EX_LEFTSCROLLBAR;
end;











Form Stay On Top
Pada sebuah form ada properti FormStyle, dimana jika dengan nilai fsStayOnTop maka form tersebut akan selalu diatas form lain, meski fokus tidak pada form tersebut. Tapi jika kita fokus ke aplikasi lain, form tersebut tidak lagi stay on top. Supaya form tersebut dapat diatas form lain pada aplikasi lain kita set flag WS_EX_TOPMOST.
procedure TForm1.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  Params.ExStyle := Params.ExStyle or WS_EX_TOPMOST;
end;


Kesimpulan
Dengan memainkan parameter Style dan ExStyle pada method CreateParams, banyak macam kegunaan yang dapat kita dapat yang dapat membentuk form dengan berbagai gaya yang kita inginkan. Selain parameter diatas, masih banyak lagi konstanta yang ada untuk bermacam kegunaan yang lain.

Baca selengkapnya...

14 Juni 2009

Mengungkap Kegunaan Method CreateParams (Bagian 3)

Method CreateParams yang dijalankan sebelum membuat kontrol yang berbasis window, dapat kita manfaatkan untuk mengatur parameter-parameter yang dikirim ke fungsi CreateWindowEx. Sebagai contoh pada TForm terdapat properti WindowState yang bisa memiliki nilai wsMaximized, wsMinimized atau wsNormal. Selain mengubah properti dari TForm, kita dapat melakukannya dengan mengaktifkan flag WS_MAXIMIZE dari method CreateParams.
procedure TForm1.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  Params.Style := Params.Style or WS_MAXIMIZE;
end;

Contoh diatas tidaklah terlalu bermanfaat, tapi banyak hal yang bisa dilakukan dengan cara ini yang tidak bisa didapat dengan mengatur properti dari suatu komponen. Misalnya pada komponen standar Delphi TEdit. Komponen ini tidak bisa menampilkan teks rata kanan. Dengan CreateParams, itu bisa diatur. Sebelumnya perlu kita tahu bahwa kita harus melakukan perubahan tersebut dengan set parameter dari method CreateParams. Langkah pertama adalah dengan membuat class/komponen baru yang diturunkan dari class TEdit. Ini diperlukan supaya kita dapat override method CreateParams.
type
  TMyEdit = class(TEdit)
  protected
    procedure CreateParams(var Params: TCreateParams); override;
  end;

Langkah kedua pada bagian implementasi kita atur parameter Style dengan konstanta ES_RIGHT.
procedure TMyEdit.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  Params.Style := Params.Style or ES_RIGHT;
end;

Terakhir adalah menampilkan komponen baru yang kita buat tadi. Misalnya pada event Form.OnCreate:
with TMyEdit.Create(Self) do
begin
  Parent := Self;
  Left := 10;
  Top := 80;
  Text := 'Tes 123';
end;

Supaya lebih mudah kita bisa membuat komponen baru yang di register ke component pallete dengan salah satu properti yang bisa mengubah teks rata kiri, rata kanan atau ditengah. Ini merupakan satu contoh saja. Ada banyak konstanta yang bisa dipakai untuk mengubah parameter Style. Untuk mengingatkan lagi semua konstanta yang ada terdapat pada unit Windows.pas, jadi mungkin dengan melihat dan mengamati unit tersebut merupakan hal yang berguna. Atau bisa dengan melihat dokumentasi tentang Windows API untuk informasi yang lebih detail tentang konstanta yang ada dan kegunaannya.

Baca selengkapnya...

13 Juni 2009

Mengungkap Kegunaan Method CreateParams (Bagian 2)

Method CreateParams di definisikan pada class TWinControl pada unit Controls.pas, yang mempunyai sintaks sebagai berikut.
procedure CreateParams(var Params: TCreateParams); virtual;

Method tersebut di definisikan sebagai method protected, yang berarti hanya bisa diakses dari class yang bersangkutan atau class turunannya. Parameter dari method tersebut bertipe TCreateParams yang mempunyai struktur:
type
  TCreateParams = record
    Caption: PChar;
    Style: DWORD;
    ExStyle: DWORD;
    X, Y: Integer;
    Width, Height: Integer;
    WndParent: HWnd;
    Param: Pointer;
    WindowClass: TWndClass;
    WinClassName: array[0..63] of Char;
  end;

Tidak asing dengan tipe tersebut? Mirip dengan parameter-parameter yang terdapat pada fungsi CreateWindowEx, karena memang pada fungsi ini terdapat parameter yang nantinya akan dilemparkan ke fungsi CreateWindowEx sebagai parameter untuk membuat obyek yang bersangkutan.
Telah dijelaskan bahwa method CreateParams merupakan method protected, berarti kita bisa override method tersebut dari class turunannya. Dengan begitu kita bisa melakukan hal seperti ini pada aplikasi yang kita buat.
type
  TForm1 = class(TForm)
  private
    { Private declarations }
  protected
    procedure CreateParams(var Params: TCreateParams); override;
  public
    { Public declarations }
  end;

Kemudian pada bagian implementasinya:
procedure TForm1.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  //…
end;

Perhatikan pada procedure diatas pernyataan pada baris pertama setelah begin harus dibuat seperti itu untuk memanggil method CreateParams untuk class parent dan mengisi parameter dengan nilai default.

Baca selengkapnya...

12 Juni 2009

Mengungkap Kegunaan Method CreateParams (Bagian 1)

Delphi menyediakan banyak komponen visual yang bisa dipakai untuk pengembangan aplikasi berbasis GUI. Sering komponen-komponen standar yang disediakan Delphi tidak cukup untuk memenuhi kebutuhan kita. Misalnya komponen TEdit standar yang tidak bisa mengatur alignment teks selain rata kiri, atau membuat button tersendiri tiap kali kita membuka form baru. Keterbatasan tersebut bisa diatasi dengan adanya method CreateParams.
Semuanya berawal dari fungsi Windows API CreateWindowEx. Tiap komponen visual standar Delphi yang berbasis Window seperti TEdit, TButton, TComboBox dan sejenisnya diturunkan dari class TWinControl. Dari class TWinControl inilah fungsi CreateParams berasal. Fungsi CreateWindowEx merupakan fungsi yang diambil dari user32.dll. Fungsi CreateWindowEx ini tidak berarti bahwa selalu berhubungan dengan suatu Form, tetapi kenyataannya juga dipanggil oleh komponen-komponen yang diturunkan dari TWinControl saat komponen tersebut dibuat. Cara pemakaian fungsi ini, seperti diambil dari unit Windows.pas:
function CreateWindowEx(
  dwExStyle: DWORD;
  lpClassName: PChar;
  lpWindowName: PChar;
  dwStyle: DWORD;
  X, Y, nWidth, nHeight: Integer;
  hWndParent: HWND;
  hMenu: HMENU;
  hInstance: HINST;
  lpParam: Pointer): HWND;

Ada beberapa parameter yang menarik dari fungsi diatas:
  1. lpClassName. Merupakan class dari obyek yang dibuat, yang bisa berupa:
    • BUTTON
    • COMBOBOX
    • EDIT
    • LISTBOX
    • MDICLIENT
    • RICHEDIT
    • SCROLLBAR
    • STATIC
  2. dsStyle. Menentukan style dari obyek yang dibuat. Terdapat banyak sekali konstanta yang telah di definisikan di unit Windows.pas untuk kebutuhan ini, diantaranya:
    • WS_MAXIMIZE
    • WS_MINIMIZEBOX
    • WS_MAXIMIZEBOX
    • ES_LEFT
    • ES_RIGHT
    • BS_LEFT
    • BS_RIGHT
  3. dsExStyle. Menentukan extended style dari obyek yang dibuat, beberapa yang menarik diantaranya:
    • WS_EX_APPWINDOW
    • WS_EX_MDICHILD
    • WS_EX_TOOLWINDOW
    • WS_EX_TOPMOST
    • WS_EX_TRANSPARENT

Hubungan antara fungsi CreateWindowEx dan CreateParams adalah CreateParams dipanggil sebelum fungsi CreateWindowEx dijalakan. Didalam CreateParams dapat diatur parameter style dan extended style sesuai yang kita inginkan, seperti membuat teks pada TEdit rata kanan dan sebagainya.

Baca selengkapnya...

11 Juni 2009

Deteksi Memory Leak

Delphi sebagai Integrated Development Environment (IDE) pada tiap rilis versi menawarkan fitur-fitur baru yang tentunya lebih baik dibanding versi sebelumnya. Ini berlaku juga untuk versi 2007. Salah satu fitur menarik yang ditawarkan berhubungan dengan masalah yang menjadi momok bagi sebagian pengembang aplikasi menggunakan Delphi khususnya, yaitu Memory Leak, yang kadang sulit ditemukan dan menghabiskan banyak waktu untuk proses debug.
Fitur yang dapat membantu kita dalam menemukan Memory Leak atau kebocoran memory ini terdapat pada variabel global yang terdapat pada unit System.pas, ReportMemoryLeaksOnShutdown. Variabel ini mempunyai tipe Boolean, yang jika bernilai True (default = False), akan memberikan pesan kesalahan yang intinya melaporkan adanya Memory Leak pada saat aplikasi ditutup, jika memang terjadi. Variabel ini bisa ditentukan di bagian manapun pada kode program, tapi mungkin yang terbaik adalah pada bagian utama program (.dpr).
begin
  ReportMemoryLeaksOnShutdown := True;
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.

Sebenarnya fitur ini aku temukan secara “tidak sengaja” dan mungkin sebagian orang juga sudah tahu. Sejak kapan fitur ini diberikan juga tidak jelas bagiku, tapi dari sebuah sumber di internet fitur ini sudah ada sejak Delphi 2006 diluncurkan, yang berarti bukan hal baru pada versi 2007 dan yang pasti tidak didukung pada Delphi 7. Meskipun begitu tetap saja bisa menjadi sangat membantu. Kekurangannya adalah pada saat terjadinya event yang menampilkan pesan Memory Leak tidak bisa ditangkap, artinya fitur ini hanyalah menampilkan informasi saja. Kita tidak bisa melakukan, misalnya menampilkan pesan kesalahan sesuai dengan yang kita inginkan atau menyimpan event tersebut kedalam log. Oleh karena itu mungkin fitur ini lebih cocok digunakan pada saat debug program.
Potongan kode program ini akan menampilkan terjadinya pesan Memory Leak saat program ditutup.
uses Registry;

begin
  //…
  with TRegistry.Create do
  begin

  end;
end.


Baca selengkapnya...

08 Juni 2009

Tip dan Trik Delphi (8 Juni 2009)

Disable salah satu Radio Button pada TRadioGroup
Pada komponen TRadioGroup terdapat satu atau lebih item yang berupa Radio Button. Skrip berikut men-disable Radio Button kedua (indeks pertama adalah 0).
TRadioButton(RadioGroup1.Controls[1]).Enabled := False;

Pindah ke kontrol berikutnya dengan tombol Enter
Didalam suatu form terdapat banyak kontrol/komponen visual. Tiap user menekan tombol Enter pindah ke kontrol berikutnya. Ada cara mudah tanpa harus melakukan pengecekan per kontrol. Pertama set properti Form.KeyPreview ke True. Kedua pada event Form.OnKeyPress tambahkan skrip ini.
if Key = #13 then SelectNext(ActiveControl, True, True);

Mendapatkan direktori Windows
uses System, SysUtils, Windows;

function GetWindowsDir: string;
var
  dir: array [0..MAX_PATH] of Char;
begin
  GetWindowsDirectory(dir, MAX_PATH);
  Result := string(dir);
end;

Mendapatkan direktori sistem Windows
uses System, SysUtils, Windows;

function GetWindowsSystemDir: string;
var
  dir: array [0..MAX_PATH] of Char;
begin
  GetSystemDirectory(dir, MAX_PATH);
  Result := string(dir);
end;

Mendapatkan direktori Windows Temp
uses System, SysUtils, Windows;

function GetWindowsTempDir: string;
var
  dir: array [0..MAX_PATH] of Char;
begin
  GetTempPath(SizeOf(dir) - 1, dir);
  Result := string(dir);
end;

Mendapatkan direktori Application Data user
uses System, Windows, SHFolder;

function GetApplicationDataDir: string;
var
  dir: array [0..MAX_PATH] of Char;
begin
  SHGetFolderPath(0, CSIDL_LOCAL_APPDATA, 0, 0, dir);
  Result := string(dir);
end;

Memainkan file suara
Untuk memainkan file suara gunakan unit MMSystem.
Memainkan file suara:
PlaySound('C:\ sound.wav', 0, SND_NODEFAULT);

Untuk menghentikan sebelum selesai:
PlaySound(nil, 0, SND_NODEFAULT);

Memainkan file suara secara asynchronous:
PlaySound('C:\ sound.wav', 0, SND_ASYNC or SND_NODEFAULT);

Baca selengkapnya...

05 Juni 2009

Exception, try except, try finally

Exception
Exception merupakan kesalahan yang terjadi pada saat runtime. Kesalahan yang terjadi bisa berbagai macam, misalnya saat melakukan konversi nilai yang tidak valid dari string ke integer, atau saat melakukan pembagian dengan pembagi 0. Exception tidak hanya dibangkitkan untuk kejadian seperti diatas. Kita bisa juga membangkitkan kesalahan saat suatu kondisi yang diinginkan tidak terpenuhi. Misalnya saat kita meminta input berupa nilai integer yang lebih besar dari 1. Jika kurang dari 1, maka tampilkan pesan kesalahan.
Exception pada Delphi berupa class yang mempunyai properti dan method, seperti EConvertError, EDivByZero dan lain-lain. Jadi memanggil exception berarti memanggil obyek yang dihasilkan dari class.
Menampilkan pesan bisa dengan rutin yang disediakan seperti ShowMessage() atau MessageDlg(). Kelemahan dari rutin tersebut adalah tidak menjamin baris kode yang dibawahnya tidak akan dijalankan. Meskipun bisa dengan melakukan pengecekan kondisi dengan if then else, tapi tidak efektif. Dengan perintah raise, dijamin baris kode yang terdapat dibawahnya tidak akan dijalankan. Pada contoh ini, Proc3() dan Proc4() tidak akan dijalankan dan akan menampilkan pesan kesalahan jika isi variabel Nilai lebih kecil dari 1.
var
  Nilai: Integer;
begin
  Proc1();
  Proc2();
  if Nilai < 1 then
    raise Exception.Create('Nilai harus lebih besar dari 0');
  Proc3();
  Proc4();
end;

Try except
Blok try except digunakan untuk penanganan kesalahan pada Delphi dan dapat digunakan pada baris kode yang mempunyai potensi terjadi kesalahan saat dijalankan. Saat terjadi kesalahan pada saat runtime, Delphi akan membuat obyek, yaitu exception, kemudian akan mengembalikan stack ke posisi awal yang ditemukan dimana terdapat baris kode untuk penanganan kesalahan. Tanpa adanya blok try except, exception dapat menyebabkan keluar dari rutin atau pada jika terdapat pada main program dapat menyebabkan keluar dari program, yang berarti baris perintah/kode yang terdapat dibawahnya tidak dijalankan. Dengan adanya blok try except, kita bisa melakukan penanganan terhadap exception, misalnya dengan menampilkan pesan sesuai dengan yang kita inginkan.
try
  ShowMessage(IntToStr(StrToInt(Edit1.Text) div StrToInt(Edit2.Text)));
except
  on EConvertError do
    raise Exception.Create('Masukkan input berupa nilai integer');
  on EDivByZero do
    raise Exception.Create('Pembagi tidak boleh 0');
  on E: Exception do
  begin
    //...
    raise Exception.Create(E.Message);
  end;
end;


Try finally
Kadang kita ingin memastikan suatu perintah dijalankan, meski terdapat suatu exception. Blok try finally dapat memastikan suatu perintah dijalankan meskipun terdapat exception. Contoh dibawah terdapat fungsi yang membaca file teks pada baris pertama dan mengembalikan nilai dengan tipe integer. Jika terjadi exception pada blok try finally, misal kesalahan saat konversi, dipastikan perintah setelah kata kunci finally akan dijalankan.
function BacaFile: Integer;
var
  txtfile: TextFile;
  buf: string;
begin
  AssignFile(txtfile, 'C:\fileteks.txt');
  try
    Reset(txtfile);
    Readln(txtfile, buf);
    Result := StrToInt(buf);
  finally
    CloseFile(txtfile);
  end;
end;

Kita bisa juga menggabungkan blok try except dan try finally atau membuatnya bersarang.
try
  AssignFile(txtfile, 'C:\fileteks.txt');
  try
    Reset(txtfile);
    Readln(txtfile, buf);
    Result := StrToInt(buf);
  finally
    CloseFile(txtfile);
  end;
except
  on E: Exception do
    raise Exception.Create(E.Message);
end;

Catatan: Delphi mempunyai procedure Abort() yang membangkitkan exception EAbort, yang berfungsi seperti exception, tapi tanpa menampilkan pesan kesalahan pada user.

Baca selengkapnya...

04 Juni 2009

Tip, Trik dan Shortcut IDE Delphi

Esc (pada form)
Fokus ke kontrol/komponen parent, jika ada.
F1 (pada unit)
Mencari bantuan Delphi dengan topik sesuai dengan kata pada cursor, jika ada.
F3 (pada unit)
Search again.
F5 (pada unit)
Toggle breakpoint.
F7 (pada unit saat aplikasi dijalankan)
Berpindah ke baris kode progran selanjutnya, jika baris yang bersangkutan merupakan procedure/function yang kita buat, akan loncat ke baris kode program dari procedure/function tersebut.
F8 (pada unit saat aplikasi dijalankan)
Sama seperti F7 tapi tidak loncat ke procedure/function jika ditemukan.
F9
Menjalankan aplikasi.
F10
Fokus ke menu Delphi.
F11
Fokus ke Object Inspector.
F12
Berganti tampilan ke form/unit (Toggle).
Alt+F7 / Alt+F8 (pada unit)
Cari error/warning sebelumnya/berikutnya, jika ada.
Alt+F11
Menambahkan unit ke dalam klausa uses.
Alt+F12 (pada form)
Menampilkan form sebagai teks.
Alt+0
Daftar window.
Alt+<Drag Mouse> / Alt+Shift+<Panah Atas/Bawah/Kanan/Kiri> (pada unit)
Blok area tertentu. Kolom yang diblok hanya yang dilewati cursor saja.
Alt+<Drag Mouse> (komponen pada form)
Memindahkan posisi komponen per pixel.
Ctrl+F2
Keluar dari aplikasi.
Ctrl+F4 (pada unit)
Tutup unit.
Ctrl+F9
Compile project.
Ctrl+F11
Membuka project.
Ctrl+F12
Memilih unit.
Ctrl+E (pada unit)
Incremental Search.
Ctrl+F (pada unit)
Mencari teks.
Ctrl+K+C (pada unit)
Sama seperti Copy + Paste.
Ctrl+K+I / Ctrl+K+U (pada unit)
Menambah/mengurangi margin ke kanan/kiri sebanyak <Block indent> spasi pada baris yang di blok. <Block indent> bisa ditentukan dari Tools->Editor Options, tab Source Options.
Ctrl+K+N (pada unit)
Huruf besar semua pada baris yang di blok.
Ctrl+K+O (pada unit)
Huruf kecil semua pada baris yang di blok.
Ctrl+K+R (pada unit)
Menambahkan kode program dari file teks.
Ctrl+K+W (pada unit)
Menyimpan kode program yang di blok ke file teks.
Ctrl+M (pada unit)
Tambahkan baris kosong diatas cursor.
Ctrl+N (pada unit)
Tambahkan baris kosong dibawah cursor.
Ctrl+R (pada unit)
Mengganti teks.
Ctrl+S
Save As.
Ctrl+Y (pada unit)
Hapus 1 baris pada cursor.
Ctrl+<Angka 0-9> (pada unit)
Memindahkan cursor ke bookmark.
Ctrl+<Enter> (pada unit)
Jika cursor berada pada nama unit, akan membuka unit tersebut.
Ctrl+<Spasi> (pada unit)
Menampilkan daftar identifier, procedure, function, method, event.
Ctrl+<Drag Mouse> (pada form)
Memilih komponen-komponen pada komponen parent, misal memilih beberapa komponen pada panel (panel merupakan komponen parent).
Ctrl+<Klik mouse pada identifier> (pada unit)
Berpindah ke deklarasi pada item tersebut.
Ctrl+<Tab> / Ctrl+Shift+<Tab> (pada unit)
Pindah antar unit.
Ctrl+<Panah Atas> / Ctrl+<Panah Bawah> (pada unit)
Gulung (scroll) ke atas/bawah.
Ctrl+<Panah Kanan> / Ctrl+<Panah Kiri> (pada unit)
Pindah antar kata.
Ctrl+Shift+F11
Project Options.
Ctrl+Shift+S
Save All.
Ctrl+Shift+<Angka 0-9> (pada unit)
Toggle bookmark.
Ctrl+Shift+<Spasi> (pada unit)
Jika cursor berada diantara deklarasi parameter procedure/function, akan menampilkan informasi parameter procedure/function.
Shift+F12
Memilih Form.
Shift+<Klik> (komponen pada form)
Memilih/tidak memilih komponen.
Shift+<Panah Atas> / Shift+<Panah Bawah> (komponen pada form)
Mengurangi/menambah tinggi komponen.
Shift+<Panah Kanan> / Shift+<Panah Kiri> (komponen pada form)
Menambah/mengurangi lebar komponen.
Shift+Ctrl+C (pada unit)
Jika cursor berada pada baris deklarasi procedure/function pada suatu class, akan membuat definisi procedure/function jika belum ada.
Shift+Ctrl+<Panah Atas> / Shift+Ctrl+<Panah Bawah> (pada unit)
Berpindah antara deklarasi dan definisi procedure/function.

Catatan: Semua fungsi diatas sudah dicoba dan berjalan pada lingkungan IDE Delphi 7 Enterprise, dan semestinya juga pada versi yang lebih baru.

Baca selengkapnya...

03 Juni 2009

Binary Log MySQL (Bagian 3)

File Binary Log berisi data yang dinamakan “event”, merupakan deskripsi modifikasi database. Untuk menampilkan file log yang berupa file biner dalam bentuk teks, disediakan sebuah tool “mysqlbinlog.exe”. File ini terdapat pada direktori \bin. Cara pemakaian dari tool mysqlbinlog adalah sebagai berikut (jalankan dari command prompt).
mysqlbinlog [options] log_file ...

Contohnya perintah berikut ini akan menampilkan event pada file log “binlog.000001”.
mysqlbinlog binlog.0000001

Perintah diatas akan menampilkan event-event pada file log yang bersangkutan. Informasi yang terdapat pada event meliputi identitas server dimana perintah SQL dijalankan, waktu eksekusi perintah SQL, waktu yang dibutuhkan untuk eksekusi, dan lain-lain.


















Dari gambar diatas diperoleh informasi tentang perintah-perintah SQL yang terdapat pada file log:
CREATE DATABASE tesdb;
CREATE TABLE tbl (a INTEGER PRIMARY KEY, b CHAR(10) NOT NULL, c DATETIME NULL);
INSERT INTO tbl (a, b) VALUES (1, 'aaaaa');

Dengan file log tersebut kita bisa menjalankan perintah-perintah yang ada didalamnya. Bisa langsung dijalankan dengan menggunakan pipe yang diteruskan ke mysql.
mysqlbinlog binlog.0000001 | mysql –u root

Jika kita mempunyai lebih dari satu file log bisa menggunakan cara ini:
mysqlbinlog binlog.0000001 binlog.0000002 | mysql –u root

Bisa juga menyimpan perintah-perintah pada file log tersebut pada suatu file teks dan menjalankan skrip yang terdapat didalamnya.
mysqlbinlog binlog.000001 > C:\binlog.sql
mysqlbinlog binlog.000002 >> C:\binlog.sql
mysql -e "source C:\binlog.sql"

Baca selengkapnya...

02 Juni 2009

Binary Log MySQL (Bagian 2)

Terdapat beberapa format log pada Binary Log MySQL.
  • STATEMENT. File log menyimpan perintah-perintah SQL.
  • ROW. File log menyimpan “event” yang menandakan bagaimana pengaruh terhadap baris data pada suatu tabel.
  • MIXED. Menggunakan format STATEMENT sebagai default, tapi akan berganti ke format ROW pada beberapa kondisi.
Pengaturan format Binary Log diatur oleh parameter --binlog-format=type Misalnya untuk memilih format MIXED, parameternya menjadi --binlog-format=MIXED. Format log ini dapat diubah saat runtime. Terdapat variabel global binlog_format yang dapat digunakan untuk mengatur format log.
Untuk mengganti format log ke STATEMENT gunakan salah satu dari perintah ini:
SET GLOBAL binlog_format = ‘STATEMENT’;
SET GLOBAL binlog_format = 1;

Untuk mengganti format log ke ROW gunakan salah satu dari perintah ini:
SET GLOBAL binlog_format = ‘ROW’;
SET GLOBAL binlog_format = 2;

Untuk mengganti format log ke MIXED gunakan salah satu dari perintah ini:
SET GLOBAL binlog_format = ‘MIXED’;
SET GLOBAL binlog_format = 3;

Bisa juga tiap client yang terhubung mengganti format log dengan melakukan pengaturan terhadap nilai session dari binlog_format. Contohnya:
SET SESSION binlog_format = ‘STATEMENT’;
SET SESSION binlog_format = ‘ROW’;
SET SESSION binlog_format = ‘MIXED’;

Baca selengkapnya...

01 Juni 2009

Binary Log MySQL (Bagian 1)

Binary Log MySQL berisi semua pernyataan yang mengubah data. Tiap operasi INSERT, UPDATE, DELETE akan disimpan pada file log. Tidak hanya terbatas pada operasi tersebut saja, perintah yang melakukan perubahan terhadap struktur data seperti CREATE TABLE, ALTER TABLE dan lain-lain, juga disimpan pada file log. Sesuai dengan namanya, file log ini disimpan dalam bentuk biner, bukan dalam bentuk teks. Perintah yang tidak melakukan perubahan terhadap data seperti operasi SELECT tidak disimpan.
Supaya dapat menulis ke file log, berikan parameter --log-bin[=base-name] saat menjalankan server MySQL (mysqld). Jika pengaturan dilakukan dengan file konfigurasi MySQL (my.ini), tambahkan baris log-bin[=base-name] pada file konfigurasi MySQL.
[mysqld]
log-bin="C:/Program Files/MySQL/MySQL 5.1/binlog"

File yang dihasilkan mempunyai nama sesuai dengan paramater yang telah diberikan (dalam contoh diatas: binlog) ditambah dengan ektensi berupa angka. Angka ini dimulai dengan angka 1, 2, 3 dan seterusnya yang membentuk urutan angka. Tiap kali server MySQL dijalankan atau pada saat melakukan “flush” terhadap log, file log baru akan dihasilkan. Contohnya:
binlog.000001
binlog.000002
binlog.000003


Jika kita menambahkan ektensi pada parameter tersebut, ektensi tersebut otomatis akan diabaikan. Misalnya binlog.dat sama dengan binlog. Ada satu file lagi yang digunakan untuk mengatur file-file log yang ada. Nama file sama dengan base-name yang di -definisikan pada parameter dengan ekstensi .index. File ini berisi nama-nama file log yang pernah digunakan. Kita dapat mengubah nama file ini dengan menambahkan parameter --log-bin-index[=file-name]. Disarankan untuk tidak mengubah file ini supaya tidak terjadi masalah nantinya. Untuk menghapus semua file log yang ada, gunakan perintah RESET MASTER.

Baca selengkapnya...

25 Mei 2009

General Query Log MySQL

General Query Log pada MySQL berisi semua aktivitas pada saat client melakukan koneksi ke server atau pada waktu koneksi terputus dan query dari client yang dikirim ke server. Fasilitas ini sangat berguna untuk merekam segala aktivitas tiap client yang terhubung ke server. Bisa juga untuk mengetahui kesalahan yang mungkin terjadi dari perintah atau query yang dikirim client.
Sama seperti Slow Query Log, sebelum MySQL 5.1.6 tujuan penulisan log selalu ke file. Mulai MySQL 5.1.6 terdapat pilihan untuk menulis log ke file atau tabel atau keduanya.
Tujuan penulisan log ditentukan dengan pilihan --log-output yang bisa berisi nilai TABLE, FILE atau NONE (tidak menulis log). Jika tujuan penulisan ke tabel, maka tabel tujuan adalah mysql.general_log. Misalnya:
--log-output=TABLE
--log-output=FILE
--log-output=TABLE,FILE

Sebelum MySQL 5.1.6, untuk mengaktifkan General Query Log dengan menggunakan pilihan --log[=file_name]. Mulai MySQL 5.1.6 gunakan pilihan --general_log yang bisa memiliki nilai 0 (tidak aktif) atau 1 (aktif). Sedangkan pilihan --general_log_file[=file_name] digunakan untuk menentukan direktori tempat file log, jika tujuan penyimpanan log pada file.
Mulai MySQL 5.1.12 kita dapat mengaktifkan atau non aktifkan General Query Log pada saat MySQL sedang berjalan. Cara ini bisa digunakan misalnya untuk backup file log. Setelah General Query Log non aktif, ganti nama file log dan buat file log baru, kemudian aktifkan lagi General Query Log. Set ‘ON’ untuk mengaktifkan atau ‘OFF’ untuk non aktif.
SET GLOBAL general_log = 'OFF';
SET GLOBAL general_log = 'ON';

Bisa juga mengaktifkan General Query Log dengan melakukan pengaturan file konfigurasi MySQL (my.ini).
[mysqld]
general-log=1
log-output=FILE
general-log-file="C:/Program Files/MySQL/MySQL 5.1/log.log"

Baca selengkapnya...

22 Mei 2009

Slow Query Log MySQL

Slow Query Log pada MySQL berisi semua query SQL yang dijalankan (waktu eksekusi) melebihi selang waktu tertentu. Selang waktu yang dimaksud ditentukan pada variabel sistem server MySQL (mysqld). Saat menjalankan instance MySQL (mysqld.exe), terdapat pilihan long_query_time, yang digunakan untuk pengecekan apakah akan menulis ke log atau tidak. Isi dari pilihan tersebut merupakan nilai dalam detik, jika suatu query yang dikirim dari client dijalankan selama selang waktu lebih dari yang ditentukan dari pilihan long_query_time, maka query yang bersangkutan akan ditulis ke file log. Sebelum MySQL 5.1.21 nilai minimum dari pilihan long_query_time adalah 1 dan harus tipe integer, mulai MySQL 5.1.21 nilai minimum adalah 0 dan dimungkinkan mengisi nilai mikro detik, tapi hanya nilai integer yang diambil dan ditulis ke tabel jika tujuan penulisan log adalah ke tabel.
Sebelum MySQL 5.1.6 log selalu ditulis ke sebuah file. Mulai MySQL 5.1.6 dimungkinkan untuk menulis ke file, tabel atau keduanya. Untuk mengaktifkan Slow Query Log, gunakan parameter --log-slow-queries[=file_name]. Pilihan ini digunakan sebelum MySQL 5.1.29, mulai MySQL 5.1.29 gunakan pilihan --slow-query-log. Nilai dari pilihan ini bisa 0 (tidak aktif) atau 1 (aktif). Jika tujuan penulisan file log adalah ke file, gunakan pilihan --slow-query-log-file[=file_name]. Tujuan penulisan log bisa ditentukan dengan pilihan --log-output yang bisa berisi nilai TABLE, FILE atau NONE (tidak menulis log). Jika tujuan penulisan ke tabel, maka tabel tujuan adalah mysql.slow_log. Misalnya:
--log-output=TABLE
--log-output=FILE
--log-output=TABLE,FILE
Bisa juga dengan melakukan pengaturan file konfigurasi MySQL (my.ini).
[mysqld]
slow-query-log=1
log-output=FILE
slow-query-log-file="C:/Program Files/MySQL/MySQL 5.1/slowlog.log"

Catatan: Penulisan tanda - atau _ pada yang digunakan sebagai penghubung tiap kata (pada parameter maupun file konfigurasi MySQL) dapat digunakan untuk hasil yang sama. Parameter-parameter berikut memiliki arti dan hasil yang sama.
--log-output=TABLE
--log_output=TABLE

Baca selengkapnya...

21 Mei 2009

Error Log MySQL

Error log pada MySQL berisi kesalahan yang terjadi pada saat MySQL dijalankan atau dihentikan. Log ini juga berisi kesalahan yang terjadi saat MySQL sedang berjalan. Kesalahan yang dimaksud adalah kesalahan yang sifatnya kritis, misalnya jika terjadi masalah pada tabel yang memerlukan tindakan perbaikan pada tabel tersebut, MySQL akan menulis pesan ke log. MySQL tidak akan menulis pesan ke log untuk kesalahan seperti duplikasi data pada suatu tabel karena primary key, dan lain-lain.
Menentukan file log ini dapat dilakukan dengan menambahkan entry log-error pada file konfigurasi MySQL (file “my.ini”) pada bagian mysqld. Dari sini dapat kita tentukan nama file log dan direktori tempat penyimpanan file log. Default disimpan pada direktori data MySQL.
[mysqld]
log-error="C:/Program Files/MySQL/MySQL 5.1/errlog.err"

Bisa juga dengan menambahkan parameter --log-error[=file_name] pada saat menjalankan MySQL.

Baca selengkapnya...

20 Mei 2009

MySQL Server Logs

MySQL mempunyai mekanisme untuk mengetahui apa saja yang terjadi pada saat MySQL berjalan. Pada saat terjadi kesalahan atau terjadi masalah saat menjalankan atau menghentikan MySQL, atau saat terjadi penambahan atau pengubahan atau penghapusan data pada tabel, atau pada saat menjalankan query terhadap suatu tabel. Semua kejadian itu bisa kita ketahui dan disimpan pada suatu file log. Dari file log ini bisa kita ketahui apa saja yang terjadi pada MySQL. Pada log tertentu juga bisa menyimpan data pada tabel. Tipe-tipe log yang ada pada MySQL:
  • Error Log. Informasi yang ditulis ke log merupakan masalah yang terjadi saat server MySQL dijalankan, dihentikan atau saat sedang berjalan.
  • General Query Log. Informasi yang ditulis ke log adalah saat client melakukan koneksi ke server dan saat menjalankan query dari client.
  • Binary Log. Informasi yang ditulis ke log adalah saat menjalankan query dari client yang mengubah data. Juga digunakan untuk replikasi.
  • Slow Query Log. Informasi yang ditulis ke log adalah saat menjalankan query selama selang waktu tertentu.
Secara default semua file log dibuat pada direktori data MySQL. Kita dapat memaksa MySQL untuk menutup dan membuka lagi file log (atau berganti ke file log baru) dengan melakukan “flush” terhadap log. Caranya adalah dengan menjalankan perintah FLUSH LOGS atau menjalankan salah satu dari perintah-perintah berikut dari command prompt.
mysqladmin flush-logs
mysqladmin refresh

Pada General Query Log dan Slow Query Log, log dapat disimpan pada tabel (mulai MySQL 5.1.6). Untuk General Query Log disimpan pada tabel mysql.general_log, dan untuk Slow Query Log disimpan pada tabel mysql.slow_log. Tiap file log ditentukan dengan melakukan pengaturan pada file konfigurasi MySQL. Pada sistem operasi Windows, file yang dimaksud adalah file “my.ini” dan biasanya terletak pada direktori instalasi MySQL. Pada posting berikutnya akan dibahas lebih detail mengenai log pada MySQL.

Baca selengkapnya...

19 Mei 2009

Implementasi Run-Time Type Information / RTTI (Bagian 3)

Dengan mengetahui manfaat dari RTTI, kita bisa menggunakan fungsi-fungsi yang ada untuk mengubah properti dari komponen VCL yang ada pada sebuah form. Kita bisa mengubah properti yang mempunyai tipe integer, string, boolean, atau bahkan enumerasi. Contoh skrip ini minimum membutuhkan sebuah form (nama Form1) dan sebuah TEdit (nama Edit1). Parameter yang dibutuhkan adalah nama form, nama obyek/komponen, nama properti dan nilai dari properti.
uses Forms, StrUtils, SysUtils, TypInfo;

procedure SetObjectProperty(const aFormName, aObjectName, aPropName: string; aPropValue: Variant);
var
  frm: TForm;
  obj: TObject;
  i, j: Integer;
begin
  frm := nil;
  for i := 0 to Screen.FormCount - 1 do
    if UpperCase(Screen.Forms[i].Name) = UpperCase(aFormName) then
      frm := Screen.Forms[i];
  if (Assigned(frm)) and (frm.Name = aFormName) then
  begin
    obj := frm.FindComponent(aObjectName);
    j := 1;
    i := PosEx('.', aPropName, j);
    while i > 0 do
    begin
      obj := GetObjectProp(obj, Copy(aPropName, j, i - j));
      j := i + 1;
      i := PosEx('.', aPropName, j);
    end;
    SetPropValue(obj, Copy(aPropName, j, Length(aPropName)), aPropValue);
  end;
end;

Jalankan perintah-perintah berikut dan lihat hasilnya.
SetObjectProperty('Form1', 'Edit1', 'Text', 'Tes 123');
SetObjectProperty('Form1', 'Edit1', 'Enabled', False);
SetObjectProperty('Form1', 'Edit1', 'Color', clRed);
SetObjectProperty('Form1', 'Edit1', 'Font.Size', 12);
SetObjectProperty('Form1', 'Edit1', 'Font.Style', '[fsBold,fsItalic]');

Baca selengkapnya...