Author: Joko Rivai


About Joko Rivai

I'm sharing Delphi things...

Tutorial Instalasi Komponen TPicShow



Sudah umum bahwa biasanya pembuat software menambahkan gambar ke form utama sebagai background, agar menarik dilihat dan tidak membosankan. Anda juga tentu tak mau ketinggalan dengan kreativitas mereka. Anda mungkin akan menambahkan fitur slideshow untuk melengkapi urusan tampilan ini.

Menjawab pertanyaan Anda tentang langkah-langkah instalasi komponen TPicShow yang digunakan dalam tutorial membuat smooth slideshow di Delphi, telah kami tulis dalam dua keluarga Delphi: Delphi 7, dan Delphi 2009/2010.

Sebelum memulai, silahkan download dulu komponen TPicShow dari www.delphiarea.com, lalu ekstrak ke sebuah folder, misalnya ke C:\DelphiComponents\PicShow.

Kemudian jalankan Delphi (Delphi 7, Delphi 2009/Delphi 2010).

Instalasi Komponen TPicShow Di Delphi 7

Buka Environment Options (menu Tools>Environment Options…). Di Window yang tampil, klik tab Library. Lihat combobox Library Path, klik tombol elipsis [...] di sisi kanan combobox itu.

Dialog Directories akan tampil. Masukkan path direktori C:\DelphiComponents\PicShow tadi ke edit box yang tersedia, lalu klik Add untuk menambahkan path tersebut ke listbox di atasnya.

Lihat gambar berikut:

Directories_2013-05-09_17-11-38

Klik OK untuk menyimpan perubahan dan menutup dialog Directories. Klik OK lagi untuk kembali ke Delphi.

Kini lewat menu File>New>Other… dan pilih Package. Ini untuk membuat package komponen baru.

New Items_2013-05-09_17-16-13

Di layar akan tampil window Package Editor. Klik menu File>Save As untuk menyimpan package. Simpan dalam folder yang sama, yaitu C:\DelphiComponents\PicShow dan beri nama picshowDelphi7.dpk.

Kembali ke Package Editor, klik Add, klik Browse dan pilih file ”PSReg.pas”, “PicShow.pas” dan “PSEffect.pas”. Klik Open. Klik OK.

Klik Compile untuk melakukan kompilasi terhadap package dan file-file di dalamnya. Bila selesai tanpa error, klik Install, tunggu sampai tampil message box bahwa instalasi selesai.

Information_2013-05-09_17-22-02

Instalasi Komponen TPicShow Di Delphi 2009/2010 Family

Ekstrak hasil download ke folder lain, misalnya C:\DelphiComponents\PicShow2009 karena file-filenya akan kita modifikasi, agar tidak mengganggu instalasi di Delphi 7 sebelumnya.

Buka Delphi Options (menu Tools>Options…). Di Window yang tampil, klik item Delphi Options di treeview sebelah kiri. Klik Library – Win32 di bawahnya. Lihat combobox Library Path, klik tombol elipsis [...] di sisi kanan combobox itu.

Dialog Directories akan tampil. Masukkan path direktori C:\DelphiComponents\PicShow tadi ke edit box yang tersedia, lalu klik Add untuk menambahkan path tersebut ke listbox di atasnya.

Directories_2013-05-09_17-11-38

Klik OK untuk menyimpan perubahan dan menutup dialog Directories. Klik OK lagi untuk kembali ke Delphi.

Kini lewat menu File>New>Other… Klik Delphi Projects dan pilih Package. Ini untuk membuat package komponen baru.

New Items_2013-05-09_17-29-03

Package baru akan dibuat dan ditampilkan di Project Manager. Klik kanan pada Package1.bpl di Project Manager, pilih File>Save As untuk menyimpan package. Simpan dalam folder yang sama, yaitu C:\DelphiComponents\PicShow dan beri nama picshowDelphi2009.dproj atau picshowDelphi2010.dproj. Sesuaikan dengan versi Delphi yang dipakai.

Klik dan perbesar gambar berikut untuk melihat Project Manager.

Package1 - CodeGear RAD Studio for Microsoft Windows - ProjectGroup1

Klik kanan lagi di package picshowDelphi2009.bpl, klik Add, klik Browse dan pilih file ”PSReg.pas”, “PicShow.pas” dan “PSEffect.pas”. Klik Open. Klik OK.

Masih di package yang sama. Klik kanan lagi pada item Requires, klik Add Reference… Klik Browse dan cari file DesignIDE.dcp. Bila Anda menggunakan Delphi 2009, file ini berada dalam folder C:\Program Files\CodeGear\RAD Studio\6.0\lib. Silahkan sesuaikan dengan versi Delphi Anda. Klik Open dan klik OK untuk kembali ke Delphi.

Klik kanan lagi dan pilih Compile untuk melakukan kompilasi terhadap package dan file-file di dalamnya. Bila selesai tanpa error, klik kanan dan Install, tunggu sampai tampil message box bahwa instalasi selesai.

Information_2013-05-09_17-54-50

 

Selesai.

Sekarang Anda sudah dapat membuat smooth slideshow dengan Delphi 7 atau Delphi 2009.

Sukses selalu :)

Incoming search terms:

Membuat Smooth Slideshow Dengan Delphi

Greenshot_2013-05-03_16-41-32

 

Kesulitan Instalasi TPicShow? Ikuti langkah-langkah instalasi komponen TPicShow pada Delphi.

Sudah umum bahwa biasanya pembuat software menambahkan gambar ke form utama sebagai background, agar menarik dilihat dan tidak membosankan. Anda juga tentu tak mau ketinggalan dengan kreativitas mereka. Anda mungkin akan menambahkan fitur slideshow untuk melengkapi urusan tampilan ini.

Contoh gambar di atas adalah tampilan form utama dari software yang sedang saya kembangkan (terbengkalai). Di situ saya menambahkan slideshow untuk membuat tampilan menjadi lebih enak. Saya tidak mau menggunakan TImage biasa untuk menampilkan slideshow, pakai timer, karena animasi terlihat kaku dan perlu kode yang banyak untuk menghaluskannya. Dan dari pada ribet dengan urusan animasi, mari saya perkenalkan sebuah komponen open source yang sangat ampuh untuk urusan slideshow ini: TPicShow dari www.delphiarea.com, kemudian mari sama-sama kita membuat smooth slideshow dengan Delphi.

Membuat Smooth Slideshow Dengan Delphi

Silahkan download TPicShow Component dan install sesuai petunjuk di situ. Bila Anda menggunakan Delphi 2009 ke atas, silahkan download TPicShow yang sudah saya buatkan packagenya untuk Delphi 2009. Bila ada yang kurang silahkan modifikasi atau tinggalkan komentar untuk didiskusikan. Saya sendiri menggunakan Delphi 7 dalam tulisan ini.

Download TPicShow Components For Delphi 7 – Delphi 2009 [800 KB]

Apabila instalasi sudah sukses, mari kita lanjut.

Buat sebuah projek baru di Delphi. Ubah property FormStyle pada Form1 (default) menjadi fsMDIForm, dan ubah property WindowState menjadi wsMaximized. Dengan demikian Form1 akan menjadi form MDI yang tampil full screen. Silahkan tambahkan TMainMenu dan TSatusBar agar berkesan benar-benar MDI. Toh kedua komponen ini tidak akan kita pakai.

Form1_2013-05-03_17-01-58

Kemudian tambahkan sebuah komponen TPicShow (dari page Delphi Area) ke form.

Form1_2013-05-03_17-03-26

Sehingga tampilan menjadi seperti berikut:

Form1_2013-05-03_17-05-15

Menyiapkan Gambar Untuk Slideshow

Anda boleh menggunakan gambar apa saja untuk ditampilkan dalam slideshow, yang menarik tentunya.

Di contoh ini, saya sarankan untuk menggunakan gambar ukuran sedang dengan latar belakang hitam agar menyatu dengan warna form yang juga akan kita beri warna hitam. Kemudian nama file kita batasi dengan tipe JPG dengan format nama file:

bg-XXX-YYY.jpg 

Di mana XXX adalah nomor urut penampilan gambar dalam slideshow, sedangkan YYY adalah lama waktu gambar ditampilkan – dalam satuan detik.

Contoh berikut adalah gambar yang akan ditampilkan dengan urutan pertama selama 5 detik:

bg-001-005.jpg

Ini gambarnya:

bg-001-005

Anda dapat mendownload contoh gambar slideshow yang saya pakai di sini:

Download Koleksi Wallpaper Untuk Slideshow Di Delphi [950 KB]

Koleksi Wallpaper Untuk Slideshow Di Delphi [950 KB] – berisi 15 buah gambar untuk slideshow.
Penggunaan dapat dilihat di
http://www.cenadep.org/2013/05/03/membuat-smooth-slideshow-dengan-delphi/

Kembali ke Delphi, silahkan save projek ke dalam sebuah folder, misalnya C:\SlideShow. Kemudian ekstrak dan copy file-file gambar hasil download ke dalam folder C:\SlideShow\Slides. Pastikan Anda tidak keliru mengcopynya. Untuk contoh gambar pertama di atas, seharusnya berada pada C:\SlideShow\Slides\bg-001-005-jpg.

Klik Form1 di Delphi, ubah property Color menjadi clBlack (hitam kelam sepekat malam tanpa sinar temaram).

Tambahkan sebuah TTimer ke Form1.

Mari kita lihat lagi tampilan sementara Form1:

Form1_2013-05-03_17-24-55

Menyiapkan Kode Untuk Slideshow

Nonaktifkan Timer1 dengan mengubah poroperty Enabled manjadi False.

Klik Form1. Aktifkan Code Editor dengan menekan F12 dan tambahkan sebuah variabel ke bagian Public dari deklarasi TForm1:

type
  TForm1 = class(TForm)
    MainMenu1: TMainMenu;
    File1: TMenuItem;
    Data1: TMenuItem;
    ransactions1: TMenuItem;
    Help1: TMenuItem;
    StatusBar1: TStatusBar;
    PicShow1: TPicShow;
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    Slides: TStringList;//Tambahkan Ini
  end;

Variabel Slides ini bertipe TStringList, untuk menampung gambar-gambar yang akan ditampilkan dalam slideshow.
Selanjutnya tambahkan sebuah fungsi di bawah clausa implementation untuk mengambil daftar file dalam sebuah folder dan memasukkannya ke dalam TStringList. Juga sebuah fungsi isNumbersOnly() untuk memeriksa apakah sebuah string hanya mengandung karakter angka (0 sampai 9). Fungsi ini akan mengembalikan nilai False apabila ada karakter non-angka ditemukan dalam string.

function ListFilesInFolder(const Folder: String; const FileMask: String): TstringList;
var
  sr: TSearchRec;
  p: String;
begin
  Result := TStringList.Create;
  p := ExcludeTrailingPathDelimiter(Folder);
  if FindFirst(p + '\' + FileMask, faAnyFile, sr)<>0 then
    exit;
  repeat
    if sr.Attr <> faDirectory then
      Result.Add(p+'\'+sr.Name);
  until FindNext(sr)<>0;
  FindClose(sr);
end;

function  isNumbersOnly(const AText:String):Boolean;
var
  i: integer;
begin
  Result := False;
  for i:= 1 to Length(AText) do
  begin
    if not (AText[i] in ['0'..'9']) then
    begin
      exit;
    end;
  end;
  Result := True;
end;

Kita juga perlu sebuah fungsi untuk me-load gambar PNG, GIF, JPG dan mengubahnya ke Bitmap (BMP). Dalam contoh ini kita menggunakan tipe gambar JPG, tapi tidak menutup kemungkinan, lain waktu Anda mungkin akan menggunakan PNG, dengan dukungan alpha-channel (transparansi) sehingga lebih seksi dan nikmat :)

function LoadAsBitmap(const FileName:String): TBitmap;
var
  p: TPicture;
begin
  Result := TBitmap.Create;
  if FileExists(FileName) then
  begin
    p := TPicture.Create;
    try
      p.LoadFromFile(FileName);
      Result.Assign(p.Graphic);
      Result.PixelFormat := pf24bit;
    finally
      p.Free;
    end;
  end;
end;

Kembali ke Form1, klik Object Inspector, cari event OnDestroy dan isikan kode berikut:

procedure TFMain.FormDestroy(Sender: TObject);
begin
  if Assigned(Slides) then
    Slides.Free;
end;

Nantinya, variabel Slides akan digunakan untuk menampung output dari fungsi ListFilesInFolder(), yang bertipe TstringList. Untuk mencegah memory leak kita perlu membersihkan memory yang dipakai oleh variabel Slides ini, dengan kode pada event OnDestroy di atas.

Kita lanjutkan dengan mengambil isi folder.
Di event OnCreate dari Form1, isikan kode seperti ini:

procedure TForm1.FormCreate(Sender: TObject);
var
  F: String;
  bmp: TBitmap;
  i: integer;
begin
  Color := clBlack;
  Slides := ListFilesInFolder(ExtractFileDir(Application.ExeName)+'\slides', 'bg-*.*');
  PicShow1.Align    := alClient;
  PicShow1.Center   := True;
  PicShow1.Stretch  := False;
  if Slides.Count>0 then
  begin
    //validate cover files
    //name format: bg-[urut:3digit]-[interval:3digit(seconds)].ext';
    for i := Slides.Count-1 downto 0 do
    begin
      F := ExtractFileName(Slides[i]);
      F := copy(F,4,3);
      //Showmessage (F+': '+BoolToStr( isNumbersOnly(F), true));
      if not isNumbersOnly(F) then
      begin
        Slides.Delete(i);
        Continue;
      end;
      F := ExtractFileName(Slides[i]);
      F := copy(F,8,3);
      if not isNumbersOnly(F) then
      begin
        Slides.Delete(i);
        Continue;
      end;
    end;
    if Slides.Count>0 then
    begin
      Slides.Sort;
      bmp := LoadAsBitmap(Slides[0]);
      try
        PicShow1.Picture.Bitmap.Assign(bmp);
        //tampilkan style animasi acak:
        PicShow1.Style := Random(176);
        PicShow1.Execute;
      finally
        bmp.Free;
        F := ExtractFileName(Slides[0]);
        F := copy(F,8,3);
        Timer1.Tag := 0;
        //bila tidak ditentukan berapa detik,
        //set default ke 10 detik
        Timer1.Interval := StrToIntDef(F, 10) * 1000;
        Timer1.Enabled := True;
      end;
    end;
  end;
end;

Kode di atas bertujuan untuk mengambil gambar-gambar slide dalam folder Slide, memeriksa apakah nama-nama file sudah valid (format nomor urut dan delay/lama penampilan), kemudian mengatur property Timer1.Interval sesuai yang nilai yang diperoleh dari nama file, serta mengaktifkan Timer1 untuk menjalankan animasi. Sedangkan property Timer1.Tag digunakan untuk mencatat nomor urut gambar yang akan tampil berikutnya.

Sampai di sini Anda sudah boleh mencoba projek kita. Gambar pertama sudah tampil – tanpa animasi tentunya.

Form1_2013-05-03_17-48-54

Kita masih perlu satu langkah lagi…

Menulis Kode Untuk Smooth Slideshow

Sekarang klik ganda Timer1 dan lengkapi kodenya seperti berikut:


procedure TForm1.Timer1Timer(Sender: TObject);
var
  bmp: TBitmap;
  F: String;
  intv: Integer;
begin
  if Slides.Count<=1 then     exit;   Randomize;   Timer1.Tag := Timer1.Tag + 1;   if Timer1.Tag>=Slides.Count then
    Timer1.Tag := 0;
  //exchange with old style:
  {
  PicShow1.Visible := MDIChildCount = 0;
  PicShow1x.Visible:= not PicShow1.Visible;
  }
  F := ExtractFileName(Slides[Timer1.Tag]);
  intv := StrToIntDef(copy(F,8,3),10); //10 seconds as default.
  bmp  := LoadAsBitmap(Slides[Timer1.Tag]);
  Timer1.Enabled := False;
  Timer1.Interval := intv * 1000;
  try
    PicShow1.Align    := alClient;
    PicShow1.Center   := True;
    PicShow1.Stretch  := False;

    PicShow1.Picture.Bitmap.Assign(bmp);
    PicShow1.Style := Random(176);
    PicShow1.Execute;
  finally
    bmp.Free;
    Timer1.Enabled := True;
  end;
end;

Potongan kode di atas untuk menjalankan animasi slideshow.

Sampai di sini, animasi smooth slideshow sudah dapat dijalankan. Tapi bila Anda membuat sebuah form MDI Child dan memanggilnya, form MDI Child ini tidak akan tampil. Ini disebabkan karena PicShow1 yang menggunakan property PicShow1.Align := alClient (lihat event FormCreate() di atas). Lantas?
Kalau Form1 bukan MDI Form, hal ini tak akan terjadi. Tapi karena kita membuat Form1 menjadi MDI Form maka kondisi ini harus diakali, yaitu dengan menambahkan sebuah TImage biasa ke Form1. TImage, walaupun diberi property Align := alClient, tidak akan menghalangi MDI Child untuk tampil, karena TImage bukan turunan dari TWinControl (control yang memiliki window), melainkan turunan dari TGraphicControl yang berasal dari TControl langsung.

Dengan begitu, kita akan mengakali dengan mengubah kode pada Timer1.OnTimer.
Apabila ada MDI Child yang aktif, kita sembunyikan PicShow1 dan kita tampilkan Image1 dengan gambar yang sama. Sebaliknya apabila tidak ada MDI Child yang aktif, PicShow1 ditampilkan sedangkan Image1 di-hidden. Mari kita ubah sama-sama..

Tambahkan sebah TImage ke Form1, beri nama Image1. Lalu edit kode untuk Timer1.OnTimer di atas dengan mengubah potongan kode

 

{
  PicShow1.Visible := MDIChildCount = 0;
  PicShow1x.Visible:= not PicShow1.Visible;
}

Menjadi

  PicShow1.Visible := MDIChildCount = 0;
  Image1.Visible:= not PicShow1.Visible;

Sedangkan kode untuk menampilkan slideshow

try
    PicShow1.Align    := alClient;
    PicShow1.Center   := True;
    PicShow1.Stretch  := False;

    PicShow1.Picture.Bitmap.Assign(bmp);
    PicShow1.Style := Random(176);
    PicShow1.Execute;
  finally
    bmp.Free;
    Timer1.Enabled := True;
  end;

Kita ubah menjadi

try
    if PicShow1.Visible then
    begin
      PicShow1.Align    := alClient;
      PicShow1.Center   := True;
      PicShow1.Stretch  := False;

      PicShow1.Picture.Bitmap.Assign(bmp);
      PicShow1.Style := Random(176);
      PicShow1.Execute;
    end
    else
    begin
      Image1.Align    := alClient;
      Image1.Center   := True;
      Image1.Stretch  := False;
      Image1.Picture.Bitmap.Assign(bmp);
    end;
  finally
    bmp.Free;
    Timer1.Enabled := True;
  end;

Sehingga kode lengkapnya untuk Timer1.OnTimer() adalah:

procedure TForm1.Timer1Timer(Sender: TObject);
var
  bmp: TBitmap;
  F: String;
  intv: Integer;
begin
  if Slides.Count<=1 then     exit;   Randomize;   Timer1.Tag := Timer1.Tag + 1;   if Timer1.Tag>=Slides.Count then
    Timer1.Tag := 0;
  //exchange with old style:

  PicShow1.Visible := MDIChildCount = 0;
  Image1.Visible:= not PicShow1.Visible;

  F := ExtractFileName(Slides[Timer1.Tag]);
  intv := StrToIntDef(copy(F,8,3),10); //10 seconds as default.
  bmp  := LoadAsBitmap(Slides[Timer1.Tag]);
  Timer1.Enabled := False;
  Timer1.Interval := intv * 1000;
  try
    if PicShow1.Visible then
    begin
      PicShow1.Align    := alClient;
      PicShow1.Center   := True;
      PicShow1.Stretch  := False;

      PicShow1.Picture.Bitmap.Assign(bmp);
      PicShow1.Style := Random(176);
      PicShow1.Execute;
    end
    else
    begin
      Image1.Align    := alClient;
      Image1.Center   := True;
      Image1.Stretch  := False;
      Image1.Picture.Bitmap.Assign(bmp);
    end;
  finally
    bmp.Free;
    Timer1.Enabled := True;
  end;
end;

Mari kita simpulkan. Saat tidak MDI Child yang aktif di layar, animasi slideshow akan ditampilkan di PicSHow1 dengan efek-efek yang ada, sedangkan bila ada MDI Child yang aktif, slideshow ditampilkan tanpa animasi ke Image1.

Untuk menguji, tambahkan sebuah form dan namakan Form2. Ubah property FormStyle menjadi fsMDIChild. Lalu hapus Form2 dari daftar auto create form dengan cara klik menu Project>Options… (atau tekan Ctrl+Alt+F11) dan drag form Form2 dari listbox Auto-Create Forms ke listbox Available Forms.

Kenapa haus dihapus dari auto create forms? Karena form-form MDI Child yang auto-created akan membuat slideshow dijalankan tanpa animasi via Image1. Nah untuk menampilkan animasi saat apilasi dijalankan sebelum ada form-form MDI Child dibuka, langkah di atas perlu kita lakukan.

Sekarang untuk memanggil Form2, misalnya via event OnClick dari sebuah Menu Item pada TMainMenu, tambahkan unit2 ke clausa uses(lewat menu File>Use Unit… dan pilih unit2).

  Form2 := TForm2.Create(Application);
  Timer1Timer(Timer1);
  Form2.show;

Intinya, setiap pemanggilan for-form MDI Child, harus disertai dengan memanggil prosedur Timer1Timer() untuk memastikan bahwa PicShow1 digantikan oleh Image1. Begitu juga sebaliknya.

Kini pindah ke Form2, isikan event OnClose dengan kode berikut untuk mem-free (membuang) instance Form2 dari memory apabila ditutup oleh user.

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
end;

Silahkan dijalankan (F9). Ini tampilan awal dan tampilan saat Form2 diaktifkan:

_2013-05-03_18-32-52

_2013-05-03_18-34-33

Dan ini previewnya:

http://www.youtube.com/watch?v=LvMfOi2MO2c

Download Source Code Slideshow

Download Source Code Smooth Slideshow Dengan Delphi

Telah dilengkapi dengan source code, EXE dan contoh gambar-gambar slide sesuai format.

Sukses selalu :)

Incoming search terms:

Membuat Custom Exception (Error) Handler Di Delphi

Delphi telah menyediakan built-in error handler yang akan menampilkan runtime error message apabila ada kode yang menyebabkan exception. Komponen-komponen VCL baik bawaan Delphi maupun yang dibuat oleh pihak ketiga, hampir semua sudah menyediakan fitur exception handler yang sesuai dengan kebutuhan komponen-komponen tersebut. Tinggal dipakai.

Berikut contoh kode yang menimbulkan exception berupa Error Access Violation (read of address 0000000). Error Access Violation (EAV) ini biasanya disebabkan karena kode mengakses alamat memory yang tidak valid/tidak diijinkan.

 procedure TForm1.Button1Click(Sender: TObject);
var
 MemS: TMemoryStream;
begin
 MemS.Position := 0;
end;

Error Access Violation di atas terjadi pada saat kode mengakses property Position dari objek TMemoryStream (MemS) sedangkan objek MemS sendiri belum di-create. Tampilan errornya seperti ini:

Debugger Exception Notification_2013-05-01_17-12-34

Custom Exception Handler Di Delphi

Dengan fitur built-in exception handler di Delphi ini, kita akan memperoleh informasi apabila ada kesalahan atau bug dalam kode, sehingga kualitas aplikasi kita dapat ditingkatkan dan meminimalisir error-error yang mengganggu.

Tapi alangkah nikmatnya apabila tampilan message box di atas dapat kita modifikasi menjadi lebih menarik – dengan menambahkan gambar dan beberapa informasi yang sekira penting.

Bila Anda sering menggunakan HeidiSQL untuk mengakses database MySQL, kemungkinan Anda pernah menemukan exception yang ditampilkan dalam bentuk form, dengan tiga opsi: Continue Application, Restart Application dan Stop Application. Kalau saya tidak salah, exception handler yang dipakai adalah custom exception handler dengan nama MadExcept dari MadShi (komersil).

ss1

Di lain contoh, Windows XP menampilkan pesan exception dengan tiga tombol: Debug, Send Error dan Don’t Send.

xp_frets_on_fire_crash

Di tutorial ini kita akan membuat custom exception handler sederhana seperti contoh di atas. Kita akan menambahkan fitur screenshooter untuk meng-capture gambar saat terjadi error. Anda selanjutnya dapat mengembangkannya dengan membuat fitur Send Error untuk mengirim informasi error dan gambar tadi ke email Anda untuk diperbaiki.

Pertama, buat sebuah projek baru di Delphi – saya menggunakan Delphi 7 dalam tutorial ini. Berikut tampilannya:

Form1_2013-05-01_17-30-58

Untuk Button1 di atas, isikan event OnClick dengan kode seperti berikut untuk menciptakan error:

 procedure TForm1.Button1Click(Sender: TObject);
var
 MemS: TMemoryStream;
begin
 MemS.Position := 0;
end;

Lalu save project dalam sebuah folder. Kemudian tambahkan sebuah form baru. Form ini akan menjadi exception message window di mana pesan error ditampilkan. Anda boleh mengkustomasi form ini sesuai kebutuhan Anda. Berikut contoh punya saya:

Lihat di Object Inspector, ubah property Position dari form ini ke poScreenCenter agar form ini selalu tampil di tengah layar. Ubah property Name menjadi “FExceptionHandler” dan save dengan nama unit “u_exception_handler.pas.” Form FExceptionHandler ini hanya di-create saat terjadi error/exception, shingga kita perlu membuangnya dari daftar Auto-Create Forms untuk menghemat memory. Klik menu Project>Options… (atau tekan Ctrl+Alt+F11) dan drag form FExceptionHandler dari listbox Auto-Create Forms ke listbox Available Forms. Lihat gambar berikut:

Project Options for exceptionhandler

Kembali ke form FExceptionHandler, tambahkan beberapa komponen seperti gambar berikut:

httpCenadep-excptionhandler

Ubah nama komponen sesuai pada gambar (dengan tulisan merah). Untuk ImgError, ubah property Proportional menjadi True, property AutoSize menjadi False, property Align menjadi alClient dan property Center menjadi True. Ini untuk membuat tampilan gambar tetap proporsional setelah di-resize.

Kini beralih ke Form1 (form utama). Tekan F12 untuk pindah ke Code Editor, tambahkan sebuah procedure OnCustomException dengan type TExceptionEvent ke bagian public pada deklarasi class TForm1, seperti berikut:

TForm1 = class(TForm)
    //......................
  private
    { Private declarations }
  public
    { Public declarations }
    procedure OnCustomException(Sender: TObject; E: Exception);
  end;

TExceptionEvent adalah type procedure of object sehingga harus dideklarasikan dalam sebuah class, yang dalam contoh di atas telah kita deklarasikan dalam TForm1, bagian public.
Tekan Ctrl+C untuk membuat Class Completion, dan lengkapi prosedur OnCustomException dengan kod seperti berikut:

procedure TForm1.OnCustomException(Sender: TObject; E: Exception);
begin
  RaiseException(Sender, E);
end;

Jadi apabila terjadi exception/error dalam aplikasi, prosedur RaiseException() akan dipanggil dengan parameter Sender:TObject di mana error terjadi dan parameter E:Exception yang merupakan class Exception yang membawa informasi error. Sebelum Anda bertanya dari mana prosedur RaiseException() ini berasal, saya jawab bahwa prosedur ini akan kita buat dalam unit u_exception_handler (unit form FExceptionHandler). Untuk mengakses prosedur RaiseException() ini, tambahkan unit u_exception_handle ke clausa uses pada unit1. Jangan sampai lupa!

Jadi kita pindah lagi ke form FExceptionHandler dan tekan F12 untuk pindah ke Code Editor. Deklarasikan sebuah prosedur RaiseException di bagian interface dari unit u_exception_handle, di atas clausa implementation:

var
  FExceptionHandler: TFExceptionHandler;

procedure RaiseException(Sender: TObject; E: Exception);

implementation

{$R *.dfm}

end.

Dan buat implementasi kodenya:

procedure RaiseException(Sender: TObject; E: Exception);
var
  tempEvent: TExceptionEvent;
  bmp: TBitmap;
begin
  //save Exception Handler yang aktif ke variabel temporer:
  tempEvent := Application.OnException;
  Application.OnException := FExceptionHandler.DummyException;
  FExceptionHandler := TFExceptionHandler.Create(Application);
  bmp := CaptureErrorScreen();
  with FExceptionHandler do
  begin
    //class objek di mana error terjadi:
    EClassName.Text := Sender.ClassName;
    //instance di mana error terjadi:
    if assigned(Screen.ActiveControl) then
      EInstance.Text := Screen.ActiveControl.Name +
      ' ('+Screen.ActiveControl.ClassName+') @ '+
      Screen.ActiveForm.ClassName
    else
      EInstance.Text := 'Unknown';
    //pesan error:
    EMessage.Text := e.Message;
    //tampilan screen saat error:
    ImgError.Picture.Bitmap.Assign(bmp);
    ShowModal;
    Free;
  end;
  bmp.Free;
  //Kembalikan Exception Handler yang aktif:
  Application.OnException := tempEvent;
end;

Variabel tempEvent digunakan untuk menampung exception handler yang sedang aktif, kemudian exception handler yang aktif diganti dengan exception handler kosong (prosedur DummyException). Setelah proses selesai, exception handler aktif dikembalikan ke exception handler yang ditampung dalam variabel tempEvent tadi. Ini untuk mencegah error bertingkat (nested exception) saat kode dalam prosedur RaiseException di atas dijalankan.

 

Selanjutnya adalah prosedur DumyException itu sendiri yang dideklarasikan dalam bagian private dari class TFExceptionHandler:

 private
    { Private declarations }
    procedure DummyException(Sender: TObject; E: Exception);
  public
    { Public declarations }
  end;

Dengan implementasi sebagai berikut:

procedure TFExceptionHandler.DummyException(Sender: TObject; E: Exception);
begin
  //kosong saja...
end;

Sedangkan fungsi CaptureErrorScreen() adalah fungsi untuk mengcapture screen yang sedang aktif, menangkap gambar tampilan layar di mana error terjadi. Anda dapat mengikuti tutorial membuat screen capture dengan Delphi di mana tersedia contoh untuk di-download.

function CaptureErrorScreen: TBitmap;
var
  DC: TCanvas;
  HDesk: THandle;
  HCanvas: HDC;
  w, h: integer;
begin
  HDesk := GetDesktopWindow;
  //RefreshDesktop;
  DC:= TCanvas.Create;
  Result := TBitmap.Create;
  try
    dc.Handle := GetWindowDC(hdesk);
    w := Screen.Width;
    h := Screen.Height;
    Result.Width := w;
    Result.Height := h;
    BitBlt(Result.Canvas.Handle, 0,0,w, h, dc.Handle, 0, 0, SRCCOPY);
  finally
   DC.Free;
  end;
end;

Setelah selesai dengan kode di atas, silahkan beri kode untuk tombol-tombol yang ada. Tombol paling atas, btnClose dapat diisi dengan kode untuk menutup form FExceptionHandler, sedangkan tombol paling bawah – btnTerminate – dapat digunakan untuk menutup aplikasi. Tombol yang tengah (btnReport) silahkan dikembangkan untuk mengirim error dan gambarnya ke pembuat aplikasi – dengan memanfaatkan Indy SMTP Client untuk mengirim email, misalnya.

Kode selengkapnya untuk unit u_exception_handler seperti berikut:

unit u_exception_handler;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;

type
  TFExceptionHandler = class(TForm)
    Panel1: TPanel;
    Image1: TImage;
    Label1: TLabel;
    Label2: TLabel;
    EMessage: TMemo;
    EInstance: TEdit;
    EClassName: TEdit;
    Panel2: TPanel;
    ImgError: TImage;
    btnClose: TButton;
    btnReport: TButton;
    btnStop: TButton;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    procedure btnCloseClick(Sender: TObject);
    procedure btnStopClick(Sender: TObject);
  private
    { Private declarations }
    procedure DummyException(Sender: TObject; E: Exception);
  public
    { Public declarations }
  end;

var
  FExceptionHandler: TFExceptionHandler;

procedure RaiseException(Sender: TObject; E: Exception);

implementation

{$R *.dfm}

function CaptureErrorScreen: TBitmap;
var
  DC: TCanvas;
  HDesk: THandle;
  HCanvas: HDC;
  w, h: integer;
begin
  HDesk := GetDesktopWindow;
  //RefreshDesktop;
  DC:= TCanvas.Create;
  Result := TBitmap.Create;
  try
    dc.Handle := GetWindowDC(hdesk);
    w := Screen.Width;
    h := Screen.Height;
    Result.Width := w;
    Result.Height := h;
    BitBlt(Result.Canvas.Handle, 0,0,w, h, dc.Handle, 0, 0, SRCCOPY);
  finally
   DC.Free;
  end;
end;

procedure RaiseException(Sender: TObject; E: Exception);
var
  tempEvent: TExceptionEvent;
  bmp: TBitmap;
begin
  //save Exception Handler yang aktif ke variabel temporer:
  tempEvent := Application.OnException;
  Application.OnException := FExceptionHandler.DummyException;
  FExceptionHandler := TFExceptionHandler.Create(Application);
  bmp := CaptureErrorScreen();
  with FExceptionHandler do
  begin
    //class objek di mana error terjadi:
    EClassName.Text := Sender.ClassName;
    //instance di mana error terjadi:
    if assigned(Screen.ActiveControl) then
      EInstance.Text := Screen.ActiveControl.Name +' ('+Screen.ActiveControl.ClassName+') @ '+ Screen.ActiveForm.ClassName
    else
      EInstance.Text := 'Unknown';
    //pesan error:
    EMessage.Text := e.Message;
    //tampilan screen saat error:
    ImgError.Picture.Bitmap.Assign(bmp);
    ShowModal;
    Free;
  end;
  bmp.Free;
  //Kembalikan Exception Handler yang aktif:
  Application.OnException := tempEvent;
end;

{ TFExceptionHandler }

procedure TFExceptionHandler.DummyException(Sender: TObject; E: Exception);
begin
  //kosong saja...
end;

procedure TFExceptionHandler.btnCloseClick(Sender: TObject);
begin
  Close;
end;

procedure TFExceptionHandler.btnStopClick(Sender: TObject);
begin
  Application.Terminate;
end;

end.

Sebelum mengetes projek kita, kembali dulu ke Form1 dan klik ganda di Form1, isikan kode untuk event OnCreate() seperti berikut untuk mengaktifkan custom exception handler yang telah kita buat di atas:

procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.OnException := OnCustomException;
end;

Anda boleh menambahkan sebuah button lagi di Form1 untuk menguji error yang lain, misalnya:

procedure TForm1.Button2Click(Sender: TObject);
var
  ss: TStringList;
begin
  ss := TStringList.Create;
  ss.LoadFromFile('c:\file ini tidak ada.txt');
  ss.free;
end;

Sekarang compile projek kita.

Bila Anda menjalankan projek dengan perintah debug (F9) di Delphi, Delphi akan mengaktifkan debugger dan menampilkan internal exception handling saat terjadi error. Dengan demikian Anda perlu menekan F9 sekali lagi untuk kembali mengeksekusi kode dalam projek dan menampilkan custom error handling.

Saya persingkat, bila ada error saat mendebug projek dengan F9, Delphi akan menampilkan internal exception handling sebelum custom exception handling ditampilkan.

Dengan demikian, untuk mengetes projek ini sebaiknya lakukan kompilasi (Ctrl+F9) dan jalankan projek lewat Windows Explorer.

Jadi silahkan jalankan projek lewat Windows Explorer dan klik tombol yang menyebabkan error. Berikut tampilannya:

Cenadep Exception Handler in Action

Download Contoh Kode Custom Exception Handler Delphi

Download Contoh Kode Penggunaan Custom Exception Handler Di Delphi.7z – 172 KB

Contoh Kode Penggunaan Custom Exception Handler Di Delphi, berisi file-file projek dan EXE.
Dibuat dengan Delphi 7.
Didedikasikan untuk Komunitas Penggemar Pemrograman Delphi Indonesia.

Sukses selalu :)

Incoming search terms:

Membuat DB Treeview Dengan Delphi, MySQL dan DBGridEh

Setelah search di google dan tidak menemukan komponen untuk menampilkan data dalam bentuk treeview di Delphi, akhirnya ada juga cara yang cukup bagus dan tidak terlalu ribet. Yaitu dengan memanfaatkan DBGridEh dari EhLib.com yang setidaknya cukup membantu dalam menghindari looping dan fill data dari database ke treeview. Seorang rekan di Komunitas Penggemar Pemrograman Delphi Indonesia yaitu bang Endra Wijaya telah menulis banyak tentang DBGridEh ini di blognya, namun saya memutuskan menulis juga tentang menampilkan data dalam bentuk treeview ini karena rupanya belum sempat ditulis di sana.

Manfaat dari DBGridEh dalam  menampilkan data dalam bentuk treeview ini sangat terasa saat kita memerlukan tampilan data dalam bentuk bertingkat, seperti menampilkan data Chart Of Acount (yang akan saya jadikan contoh dalam tulisan ini), pengelompokan barang/aset sesuai kodifikasi standar dalam Sistem Informasi Manajemen Barang Daerah (Simbada), tabulasi bagan struktur organisasi dalam Sistem Informasi Kepegawaian, atau beragama kasus lain yang mirip.

Saya akan menggunakan DBGridEh bersama dengan database MySQL dan MyDAC dari devart.com. Saya menggunakan Delphi 2009 dan dapat saya katakan bahwa cara ini dapat juga digunakan dengan Delphi 7 dan keluarga Delphi lainnya. Demikian juga dengan komponen akses data, Anda dapat mengganti MyDAC dengan Zeos DBO. Sebagai antarmuka (GUI) untuk MySQL saya menggunakan HeidiSQL yang ringan, tangguh dan gratis.

Saya garis bawahi bahwa saya tidak menulis lagi tentang prosedur instalasi DBgridEh dari EhLib Component Pack ini karena sudah tersedia di situs resminya. Demikian juga halnya dengan MyDAC (atau Zeos DBO).

Membuat Sampel Data MySQL Dengan HeidiSQL

Hal pertama adalah menyiapkan database MySQL untuk digunakan dengan aplikasi.

Silahkan jalankan HeidiSQL, login dan pilih salah satu database yang akan digunakan. Kemudian buat sebuah tabel seperti di gambar berikut dan isilah beberapa data chart of account (daftar rekening akuntansi) untuk kita jadikan sampel data.

desain-tabel-di-database-mysql

Bila Anda merasa repot (atau malas :) ), silahkan download file script SQL berikut ini dan buka lewat HeidiSQL lalu jalankan. Script ini berisi perintah untuk membuat tabel dengan nama “chart_of_account” dan beberapa data sampel:

Script SQL untuk membuat tabel Chart Of Account dan mengisi beberapa data. (18.0 KiB)

Dari desain tabel di atas kita dapat saya jelaskan bahwa setiap record data memiliki field kode yang dapat menjadi induk bagi record lainnya. DBgridEh nantinya akan menggunakan field induk untuk mengelompokkan record-record menjadi sub-record bagi record lain yang memiliki nilai field kode sama dengan nilai field induk dari record-record tadi.

contoh-data-chart-of-acount

Di atas adalah contoh data yang akan digunakan. Di situ terlihat bahwa rekening “Aset Lancar” memiliki induk “1″, yang berarti “Aset Lancar” akan menjadi sub-record dari “Aset”, atau dengan kata lain “Aset” adalah induk dari “Aset Lancar”. Sedangkan “Aset Lancar” sendiri akan menjadi induk dari “Kas”, “Bank” dan “Piutang”. Lebih jauh, “Bank” menjadi induk dari “Bank Tabungan” dan “Bank Deposito”. Demikian seterusnya.

Setelah desain database ini jadi, mari kita lanjut dengan membuat desain antarmuka aplikasi kita di Delphi…

Membuat Projek Untuk Menampilkan Data Dalam Bentuk Treeview

Buatlah sebuah projek baru di Delphi. Di form utama, tambahkan sebuah TDBGridEh, sebuah komponen TMyConnection dan TMyQuery, sebuah TMemTableEh dan sebuah TDataSource. TMemTableEh adalah komponen bawaan EhLib dan ada dalam satu paket dengan DBGridEh. Komponen ini bermanfaat sebagai engine pengelompok data (data grouping) yang tidak terdapat pada MyQuery dan akan melakukan proses grouping data sebelum ditampilkan di DBGridEh.

desain aplikasi untuk menampilkan data dalam bentuk treeview

Aturlah komponen MyConnection (dalam contoh di atas, saya sudah mengganti namanya menjadi “Koneksi”), lalu atur property Connection milik MyQuery1 agar menunjuk ke komponen Koneksi (MyConnection) tadi.  Atur property-porperty milik Koneksi (MyConnection) agar dapat terkoneksi ke MySQL Server dan menunjuk ke database yang Anda pilih saat menjalankan script contoh data di atas. Aktifkan koneksi dan pastikan bahwa aplikasi sudah terkoneksi ke MySQL Server.

Lalu klik kanan pada MyQuery1 dan klik MyQuery Editor, dan isikan query seperti gambar berikut. desain query

Setelahnya, klik Execute untuk memastikan bahwa tidak ada error ada query yang diisi di atas. Kalau sudah aman, klik OK untuk memasukkan query ini ke property MyQuery1.SQL.Text. Kini klik kanan lagi pada MyQuery1 dan klik Fields Editor… Di window Fields Editor yang tampil, klik kanan dan pilih Add All Fields untuk menambahkan semua field dari query tadi.

fields editor

Kembali ke form, klik MyQuery1 dan aktifkan property Active agar data di-load dari server MySQL.

Membuat Pengelompokan Data (Data Grouping) dengan MemTableEh

Kita akan membuat grouping data dengan memanfatkan MemTableEh. Klik kanan pada MemTableEh1 dan pilih Assign Local Data.

Assign Local Data

Pilih MyQuery1 (karena cuma itu yang ada :D ).

Jangan lupa di-share :D

 

“Assign Local Data” ini akan mengcopy struktur dataset dan data dari MyQuery1 ke MemTableEh1, membuat definisi field-field dalam collection TFieldDefs dan menyediakan akses data bagi komponen-komponen data control, dalam hal ini DBGridEh1.

Klik DataSource1 dan set property Dataset ke MemTableEh1. Klik DBGridEh1 dan set property DataSource ke DataSource1. Bila property Active milik MemTableEh1 masih False, ubah ke True untuk mengaktifkannya.

Sampai di sini, tampilan antarmuka projek kita kira-kira seperti ini:

desain antarmuka dengan koneksi aktif

Biasa saja tampilannya.

Klik kanan pada DBGridEh1, pilih Columns Editor. Klik kanan pada window Columns Editor ini dan klik Add All Fields untuk menambahkan semua field sebagai kolom pada DBgridEh1. Lalu hapus field “kode” dan field “induk” karena memang tidak perlu ditampilkan.

Klik MemTableEh1, dan di Object Inspector, klik property [+]TreeList. Isi property KeyFieldName dengan “kode”, RefParentFieldName dengan “induk” dan set property Active ke True. Lihat gambar:

MemTableEh TreeList Editor

Kembali ke form, klik DBGridEh1 dan atur property [+]Options menjadi seperti gambar berikut:

DBGridEh property

Setelah semua langkah di atas dilakukan dengan benar, kita akan mendapatkan hasil akhir tampilan aplikasi kita sebagai berikut:

final design DBTreeView using MemTableEh and BGridEh

Selanjutnya silahkan jalankan projek untuk melihat hasilnya.

Gambar berikut adalah tampilan aplikasi yang menampilkan data dalam bentuk treeview dengan DBgridEh dan MemTableEh di monitor saya.

DBtreeview dengan MemTableEh dan DBgridEh sudah jadi

Demikian tutorial kali ini, semoga bermanfaat.

Selamat mencoba.

Incoming search terms:

Tutorial Menampilkan Rumus Matematika Di Delphi

Tutorial Menampilkan Rumus Matematika Di Delphi sebenarnya masih jarang kita temui. Maksud menampilkan rumus Matematika di Delphi ini bukan berarti menampilkan kumpulan fungsi-fungsi Matematika yang tersedia di Delphi (terutama fungsi-fungsi dalam  unit Math). Posting ini saya maksudkan untuk berbagi pengalaman menggunaan library dari Rusia untuk menampilkan persamaan/rumus matematika di Delphi.

Rumus-rumus yang akan saya tulis contohnya antara lain integral & differensial, Summa, Limit, Akar Kuadra (Square Root), dan rumus-rumus lain yang banyak dijumpai dalam Matematika. Posting ini juga sebagai jawaban atas pertanyaan seorang member di group Komunitas Penggemar Pemrograman Delphi Indonesia.

Menampilkan Rumus/Persamaan Matematika Di Delphi Menampilkan Rumus/Persamaan Matematika Di Delphi
Saya sendiri, dulu, sangat kesulitan dengan penampilan rumus matematika ini, sampai saya temukan sebuah library Delphi berbahasa Rusia.

Di Delphi, ketika kita diminta menampilkan nilai “x kuadrat”, dengan mudah kita menulisnya sebagai :

y := x * x ; {x dikali x)

Dan ketika diminta menulis “x pangkat 3″, kita bisa menulis lagi:

y := x * x * x;

Atau, “x pangkat 1000″, maka kita tulis

y := power(x, 1000) ; {dari unit Math)

Sebagaimana di contoh, “x pangkat 1000″ bisa dihitung dengan fungsi Power() dari unit Math. Namun ini adalah hal umum, kita dapat memperoleh daftar fungsi matematik sejenis dari dokumentasi (Help) Delphi.

Sekarang semisal kita diminta, tampilkan “x kuadrat” seperti pada gambar berikut, di Delphi:

Persamaan Matematika Di Delphi

Atau “rumus luas lingkaran” seperti ini:
Persamaan Matematika Di Delphi

Atau, “persamaan kuadrat”, sedikit lebih rumit lagi :
Persamaan Matematika Di Delphi 1

Hayoooo…

Mendapatkan Library Yang Diperlukan Mendapatkan Library Yang Diperlukan
Pertama, silahkan download Mathematic Formulas Drawing Library (maaf, sebagaimana saya sebut di atas, library ini dibuat oleh orang Rusia, jadi silahkan gunakan Google Translate dengan bijak :D ).

Kemudian silahkan ekstrak file hasil download [ expr.zip ] ke sebuah folder, lalu tambahkan folder tadi Library Path Delphi. Pastikan dalam folder ini ada dua file: ExprMake.pas dan ExprDraw.pas. Ada? Ada gak…

Well, ternyata ada. Berarti kita sudah dapat membuat sebuah contoh aplikasi untuk menampilkan formula/rumus/persamaan Matematika di Delphi dalam bentuk gambar. Ada dua class utama yang akan kita butuhkan nanti, yaitu

  • TExprClass dari unit ExprDraw, dan
  • TExprBuilder dari unit ExprMake

TExprBuilder merupakan engine utama untuk mem-parse dan meng-generate format yang diperlukan, hasil konversi formula tekstual ke formula matematikal. Sedang TExprClass adalah drawing engine, untuk menggambar hasil konversi tadi ke gambar, yang kemudian ditampilkan ke VCL Canvas (class TCanvas). Saya singgung sedikit, TCanvas adalah VCL wrapper untuk Windows Device Context (Windows DC). Karena hampir semua kontrol (objek) dalam antarmuka aplikasi Windows memiliki Device Context, boleh saya katakan bahwa hasil konversi library ini dapat ditampilkan hampir di semua kontrol GUI yang ada di Delphi (class-class turunan TWinControl), seperti TEdit, TButton, TForm, TPaintBox, dan beragam kontrol lainnya.

Mari kita buat sebuah projek baru, agar tidak bosan. Silahkan berkreasi dan bandingkan dengan punya saya:

Form1_2013-04-01_20-55-53

Kasus terjelek, bila Anda lupa di mana komponen TPaintBox berada, saya kasih bocoran: Di Component Palette, page/tab “System”, dekat dengan TTimer…

Setelah Anda dapat desain yang pas, mari kita lihat kodenya. Silahkan tekan F12 untuk berpindah ke source code. Hal pertama yang perlu diingat adalah, tambahkan kedua unit di atas, yaitu ExprMake dan ExprDraw ke clausa uses. Silahkan bandingkan:


interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, ExprMake, ExprDraw, ExtCtrls;

type
 TForm1 = class(TForm)
 Button1: TButton;
 Panel1: TPanel;
 Memo1: TMemo;
 Label1: TLabel;
 PaintBox1: TPaintBox;
//.................................

Bila sudah, mari kita tambahkan lagi sebuah button untuk mengekspor gambar hasil konversi ke file. Untuk ekspor ke file, kita perlu menambahkan pula sebuah TSavePictureDialog untuk memilih file untuk diekspor.

Plus, kita perlu sebuah TComboBox untuk menampung daftar rumus/formula yang sering digunakan, sebagai panduan.

Silahkan lihat perubahan berikut:

Form1_2013-04-05_16-50-21

Hasil ekspor akan kita batasi menjadi tipe JPEG dan BITMAP, sehingga property Filter pada SaveDialog1 perlu kita ubah, sehingga hanya tinggal BMP dan JPG saja. Jangan lupa tambahkan JPEG ke clausa uses.

Filter Editor_2013-04-05_16-51-06

Saatnya Kita Coding Saatnya Kita Coding
Setelah tampilan jadi, kita siap membuat kode untuk proses konversi, export, dsb….

Kita mulai dengan sebuah variabel global, yang merupakan field dari TForm1. Variabel ini akan digunakan sebagai buffer untuk menampung  hasil konversi bertipe TBitmap:

  private
    { Private declarations }
    BufferBitmap: TBitMap;
  public
    { Public declarations }
  end;

Selanjutnya, kita meng-create buffer ini saat event FormCreate dan membuangnya saat event FormDestroy. Berikut kode saat FormCreate:

procedure TForm1.FormCreate(Sender: TObject);
var
  i: integer;
begin
  BufferBitmap := TBitmap.Create;
  //daftar pustaka formula:
  for i:= 0 to Length(_Expressions)-1 do
  begin
    ComboBox1.Items.Add(_Expressions[i][0]);
  end;
  ComboBox1.ItemIndex := 0;
  ComboBox1Change(ComboBox1);
end;

Nah, Anda tentu bertanya. Di situ kenapa ada identifier dengan nama _Expressions. Baiklah, itu adalah sebuah konstanta array dua dimensi untuk menampung daftar formula dan simbol standar dalam Matematika. Kita akan melihat konstanta ini nanti. Kita lanjut saja dulu dengan FormDestroy:

procedure TForm1.FormDestroy(Sender: TObject);
begin
  if Assigned(BufferBitmap) then
    FreeAndNil(BufferBitmap);
end;

Kini, seperti janji saya, mari kita lihat konstant _Expressions:

const
  _Expressions: array [0..91] of array [0..1] of String =
  (
    //Maaf mas berow, saya malas menulis semuanya. Silahkan tanyakan di komentar kalau ada yang kurang...

    //dasar:
    ('Operasi Dasar', 'a+b/c'),
    ('Simbol Alpha', 'Alpha'),
    ('Simbol alpha', 'alpha'),
    ('Simbol EnglEnc', 'EnglEnc'),
    ('Simbol Beta', 'beta'),
    ('Simbol Beta0', 'beta0'),
    ('Simbol Angle 90 derajat', 'Angle**90'),
    ('Simbol Asterix (Bintang) 1', 'Asterix'),
    ('Simbol Asterix (Bintang) 2', 'a_n^Asterix'),
    ('Simbol Psilon 1', 'Psi^Asterix'),
    ('Simbol Psilon 2', 'Psi_Asterix'),
    ('Simbol Integral & Differensial', 'Int(Diff(y)/Diff(x))'),
    ('Simbol Chi', 'chi'),
    ('Simbol Koma x,y', 'x&comma&y'),
    ('Simbol Delta 1', 'Delta'),
    ('Simbol Delta 2', 'delta'),
    ('Simbol Epsilon 1', 'Epsilon'),
    ('Simbol Epsilon 2', 'epsilon'),
    ('Simbol Eta 1', 'Eta'),
    ('Simbol Eta 2', 'eta'),
    ('Simbol Gamma 1', 'Gamma'),
    ('Simbol Gamma 2', 'gamma'),
    ('Simbol Iota 1', 'Iota'),
    ('Simbol iota 2', 'iota'),
    ('Simbol Kappa 1', 'Kappa'),
    ('Simbol kappa 2', 'kappa'),
    ('Simbol Lambda 1', 'Lambda'),
    ('Simbol lambda 2', 'lambda'),
    ('Simbol Minus', 'a_Minus&comma&a^Minus'),
    ('Simbol Myu', 'mu'),
    ('Simbol Nabla 1', 'Nabla*f'),
    ('Simbol Nabla 2', 'Nabla*_a'),
    ('Simbol Nabla 3', 'Nabla*Vect(a)'),

    ('Simbol nyu', 'nu'),
    ('Simbol Omega 1', 'Omega'),
    ('Simbol Omega 2', 'omega'),
    ('Simbol Omicron', 'omicron'),
    ('Simbol Parallel 1', '_a & Parallel & _b'),
    ('Simbol Parallel 2', 'a_Parallel'),

    ('Simbol Perpendicular 1', '_a & Perpendicular & _b'),
    ('Simbol Perpendicular 2', 'x_Perpendicular'),
    ('Simbol Phi 1', 'Phi'),
    ('Simbol Phi 2', 'phi'),
    ('Simbol Pi 1', 'Pi'),
    ('Simbol Pi 2', 'pi'),
    ('Simbol PLambda', 'PLambda=lambda/(2*pi)'),
    ('Simbol rho', 'rho)'),
    ('Simbol Sigma 1', 'Sigma'),
    ('Simbol Sigma 2', 'sigma'),
    ('Simbol Tau, Theta, Upsilon, upsilon', 'Tau&comma&tau&comma&Theta&comma&theta&comma&Upsilon&comma&upsilon'),

    ('F(x,y,z)','f(x,y,z)'),
    ('Sinus','sin(pi/2+x)'),
    ('Cosinus','cos(x)'),
    ('Tangen','tg(1/pi)'),
    ('Contoh Cosinus', 'f(x)_n,cos(x)^2'),
    ('Absoulut','Abs(x^2)=Abs(x)^2'),
    ('Contoh At','At(DiffRF(f,x),x=0)=1'),
    ('Cap ', 'Cap(x)'),
    ('Case ','|x|=Case(-x,x=0,0,x=0,x,x>0)'),

    ('Simbol Infinity (Inf)', 'Inf'),
    ('Simbol Infinity & Limit', 'lim(x->0,1/x)=+-Inf'),

    ('Contoh Integral', 'Int(x*Diff(x))=sqr(x)/2'),
    //lanjutan

    ('Kuadrat (Pangkat 2)', 'sqr(x)'),
    ('Pangkat 3', 'x^3'),
    ('Pangkat n', 'pow(x+y,r/5)'),
    ('Square Root (Akar Pangkat 2)', 'sqrt(x^2-pow(y,1/n))'),
    ('Root (Akar Pangkat n)', 'root(n,x)'),

    ('Vector a ', 'vect(a)'),
    ('Tilde a ', 'tilde(a)'),
    ('System (x+b = 7, x.b = 12) ', 'system(x+y=7,x*b=12)'),
    ('Summa 1 ', 'summa(a_i)'),
    ('Summa 2 (batas bawah)', 'summa(a_i,i<>j)'),
    ('Summa 3 (batas bawah & batas atas)', 'summa(a_i,i=0,n)'),
    ('Stroke (Petik) 1', 'strokes(f(x))'),
    ('Stroke (Petik) 2', 'strokes(f(x),2)'),
    ('Stroke (Petik) 3', 'strokes(y,3)'),

    ('Stand (Center)', 'StandC(0<=i<n,i<>j)'),
    ('Stand (Left)', 'StandL(0<=i<n,i<>j)'),
    ('Stand (Right)', 'StandR(0<=i<n,i<>j)'),
    ('Circle', 'Circ(_E*Diff(_l),L)'),
    ('Diff(x)', 'Diff(x)'),
    ('Diff(x,n)', 'Diff(x,n)'),
    ('DiffN(x)', 'DiffN(x)'),
    ('DiffN(x,v)', 'DiffN(x,v)'),
    ('DiffR(x)', 'DiffR(x)'),
    ('DiffR(x,v)', 'DiffR(x,v)'),
    ('Contoh DiffR', 'DiffR(x,2)*f(x)=DiffR(x)*DiffR(x)*f(x)'),
    ('DiffRF(f,x)', 'DiffR(f,x)'),
    ('DiffRF(f(x),x,v)', 'DiffRF(f(x),x,v)'),
    ('Faktorial 1', 'Fact(n)'),
    ('Faktorial 2', 'Fact(k+1)'),
    ('Func(x)', 'Func(PDiffRF(f,x,3),x)')

  );

Konstanta array _Expressions ini kita deklarasian tepat di bawah keyword implementation, sehingga dapat diakses oleh semua bagian program di bawahnya. Perhatikan, saya tiap item di dimensi kedua array tersebut ke dalam dua bagian: pertama saya sebut caption, akan dimasukkan dalam ComboBox. Kedua, saya sebut formula, akan digunakan saat konversi bila caption pasangannya dipilih user.

Jadi kini kita tau bahwa saat Form di-create, array _Expressions di atas akan dimasukkan ke dalam ComboBox1 untuk dipilih oleh user. Bila user memilih salah satu caption dari item ini, formula yang terkait dengan caption tersebut akan dimasukkan ke dalam Memo1, untuk dimodifikasi, di-copy atau sekadar nampang saja. Pokoknya user bisa melihat apa yang dipilihnya sebelum program melakukan konversi. Berikut kodenya:

procedure TForm1.ComboBox1Change(Sender: TObject);
var
  i: integer;
begin
  i := TComboBox(Sender).ItemIndex;
  Memo1.Text := _Expressions[i][1];
end;

Coba perhatikan lagi kode pada event FormCreate. Di situ ada pemanggilan ComboBox1Change(ComboBox1) yang bermaksud menampilkan formula dari item pertama ke Memo1, sebagai default.

Setelah user memilih salah satu item dan formulanya sudah masuk ke Memo1, user dapat mengklik button “Konversi Ke Expresi Matematika” untuk menampilkan hasilnya. Untuk button ini, kita perlu membuat beberapa prosedur global dulu, yaitu prosedur untuk mengambil ukuran canvas, mengubah gambar BMP menjadi JPG, dan Mengkonversi formula Matematika menjadi gambar.

Ini kodenya:

function BMPToJPEG(bitmap: TBitmap): TJPEGImage;
begin
  Result := TJPEGImage.Create;
  Result.Assign(bitmap);
end;
//
procedure GetSizes(const Expression: String; var W, H: Integer);
var
  vExprC : TExprClass;
  vExprB : TExprBuilder;
  cv: TBitmap;
begin
  w := 0;
  h := 0;
  if trim(Expression) = '' then
    exit;
  vExprB := TExprBuilder.Create;
  cv := TBitmap.Create;
  try
    //vExprC := vExprB.BuildExpr('(X^2+3)/vX');
    vExprC := vExprB.BuildExpr(expression);
    vExprC.Canvas := cv.Canvas;
    vExprC.Font.Size := 50;
    vExprC.Draw(10,10,ehLeft,evTop);
    w := vExprC.Width  + 20; //margin left, right 10px;
    h := vExprC.Height + 20; //margin top, bottom 10px;
  finally
    cv.free;
    vExprC.Free;
    vExprB.Free;
  end;
end;
//
procedure DrawFormula(const Expression: String; Canvas: TCanvas);
var
  vExprC : TExprClass;
  vExprB : TExprBuilder;
begin
  if trim(Expression) = '' then
    exit;
  vExprB := TExprBuilder.Create;
  try
    //vExprC := vExprB.BuildExpr('(X^2+3)/vX');
    //kosongkan canvas:
    with Canvas.Brush do
    begin
      Style := bsSolid;
      Color := clWhite;
    End;
    with Canvas.Pen do
    begin
      Style := psSolid;
      Color := clBlack;
    End;
    //Draw formula ke canvas:
    Canvas.FillRect(Canvas.ClipRect);
    vExprC := vExprB.BuildExpr(expression);
    vExprC.Canvas := Canvas;
    vExprC.Font.Size := 50;
    vExprC.Draw(10,10,ehLeft,evTop);
  finally
    vExprC.Free;
    vExprB.Free;
  end;
end;

Dengan prosedur GetSizes(), kita bisa tau berapa lebar dan tinggi canvas yang akan digunakan, jadi gambar hasil konversi nanti tidak terpotong.

Sedangkan kode untuk konversi adalah:

procedure TForm1.Button1Click(Sender: TObject);
var
  w, h: Integer;
  Expr: String;
begin
  Expr := Memo1.Text;
  //Ambil width & Height
  GetSizes(Expr, w, h);
  //set ukuran canvas pada buffer:
  BufferBitmap.Width := w;
  BufferBitmap.Height:= h;
  //konversi formula & gambar ke canvas buffer (buat export):
  DrawFormula(Expr, BufferBitmap.Canvas);
  //konversi juga ke PaintBox1 untuk ditampilkan
  DrawFormula(Expr, PaintBox1.Canvas);

end;

Di situ ada dua kali pemanggilan prosedur DrawFormula(), yang satu untuk menggambar ke buffer untuk diekspor nanti (bila user mengklik button Export) dan yang kedua untuk menampilkan ke PaintBox1.

Selanjutnya saat user mengklik button Export, program akan meminta user memilih nama file. Memeriksanya apakah valid (JPG atau BMP) dan melakukan ekspor gambar ke file yang dipilih.

procedure TForm1.Button3Click(Sender: TObject);
var
  JPG: TJPEGImage;
  ext: String;
begin
  //Extensi default. Akan dipakai jika user tidak memilih jenis file:
  SavePictureDialog1.DefaultExt := '.jpg';
  if not SavePictureDialog1.Execute then
    exit;
  //cek apakah target export adalah JPG atau BMP:
  ext := LowerCase( ExtractFileExt(SavePictureDialog1.FileName) );
  if ext = '.bmp' then
  begin
    //save hasil konversi (bitmap) ke file:
    BufferBitmap.SaveToFile(SavePictureDialog1.FileName);
    MessageBox(Handle, 'Gambar telah dieskpor.', 'Sukses', MB_ICONINFORMATION);
  end
  else
  if ext = '.jpg' then
  begin
    //convert ke JPG dan save ke file:
    jpg := BMPToJPEG(BufferBitmap);
    try
      JPG.SaveToFile(SavePictureDialog1.FileName);
      MessageBox(Handle, 'Gambar telah dieskpor.', 'Sukses', MB_ICONINFORMATION);
    finally
      jpg.Free;
    end;
  end
  else
  begin
    MessageBox(Handle, 'Maaf. Ekstensi file tidak dikenali.', 'Error', MB_ICONHAND);
  end;
end;

Sampai sini, mari kita jalankan program dan lihat hasilnya:

Form1_2013-04-05_19-20-51

Berhasil!

Sayangi dengan berbagi

 

Oh iya, Anda adalah orang yang sangat malas dan lebih suka mendownload daripada membaca? Berarti sama dengan saya… :D

Download Program Tutorial Menampilkan Rumus Matematika Di Delphi Download Program Tutorial Menampilkan Rumus Matematika Di Delphi
Silahkan. Bila ada masalah download di Mediafire, silahkan lihat trik mengatasi masalah download Mediafire ini.

Download Contoh Program Tutorial Menampilkan Rumus Matematika Di Delphi – cenadep.org [ 250KB ]

Sering kita terkendala saat ingin menampilkan rumus/formula Matematika dalam aplikasi kita. Bila Anda sependapat, tentu saja Tutorial Menampilkan Rumus Matematika Di Delphi ini pantas Anda baca!

Sampai di sini, Tutorial Menampilkan Rumus Matematika Di Delphi ini sudah jadi. Silahkan dikembangkan.
Anda boleh kasih komentar bila ada pertanyaan atau ada yang kurang jelas.

Salam Delphier Indonesia :) .

Incoming search terms:

Trik Mengekspor Dataset Ke Excel Melalui XML

Delphi Export Dataset To XML Excel

Sekadar akal-akalan buat generate XML menggunakan TClientDataset. Kode ini sederhana dan telah ditulis agar semudah mungkin dibaca.

TClientDataset memiliki fitur untuk mengkonversi baris-baris data dan definisi field dari sebuah TDataset ke Data Packet XML, sehingga bisa kita pake buat menggenerate data untuk dibaca oleh Microsoft Excel.

Karena sumber data adalah TDataset, kode berikut ini akan dapat menggenerate Data Packet XML dari berbagai sumber: ADO, Zeos, MyDAC, UniDAC, IBDataset, dsb. Pokoknya asalkan sumber data berupa turunan TDataset, Insya Allah bisa dikonversi.

* Fungsi ini menggunakan midas.dll, yang sebaiknya dicopy ke folder aplikasi

* Untuk aplikasi DLL-based (seperti UniGUI/Raudus module for ISAPI), midas.dll dicopy ke direktori System32.

* Sebagai alternatif midas.dll (dynamic lingking), bisa dicoba menggunakan unit midaslib, ditambahkan ke clausa uses.

function JadikanXMLKeExcel(Dataset: TDataset; FileName: TFileName): Boolean;
{tambah ke uses: Provider, DBClient, midaslib }
var
  prov: TDataSetProvider;
  cds : TClientDataSet;
  ls  : TStringList;
  st  : TMemoryStream;
  tmp : String;
  i,j : integer;
begin
  Result := False;
  if not Dataset.Active then
    raise Exception.Create('Dataset belum dibuka.');
  if Dataset.IsEmpty then
    raise Exception.Create('Data kosong.');
  if FileExists(FileName) then
    raise Exception.Create('File sudah ada.');
  if lowercase(ExtractFileExt(FileName))<>'.xml' then
    raise Exception.Create('File harus berekstensi XML.');

  prov  := TDataSetProvider.Create(Application);
  cds   := TClientDataSet.Create(Application);
  try
    prov.dataset := Dataset;
    cds.SetProvider(prov);
    cds.Open;
    st := TMemoryStream.Create;
    try
      st.Clear;
      cds.SaveToStream(st, dfXML);
      st.Position := 0;
      ls    := TStringList.Create;
      try
        ls.LoadFromStream(st);
        tmp := ls.Text;
        i := pos('<METADATA>', UpperCase(tmp));
        j := pos('</METADATA>', UpperCase(tmp))+length('</METADATA>');
        Delete(tmp,i,j-i);
        ls.Text := tmp;
        ls.SaveToFile(FileName);
        Result := FileExists(FileName);
      finally
        ls.Free;
      end;
    finally
      st.Free;
    end;
  finally
    prov  .Free;
    cds   .Free;
  end;
end;
Sayangi Dengan Berbagi Sayangi Dengan Berbagi
You share, you care…
 

Dengan kode di atas, secara sederhana, kita bisa melakukan konversi dan export data ke Excel. Bila data sudah tampil di DBGrid dan ingin dieskpor, cukup ekspor saja dataset yang terhubung ke DBgrid tersebut. Dengan cara ini kita telah dapat melakukan export DBGrid ke Excel.

Contoh penggunaan:

procedure TForm3.Button1Click(Sender: TObject);
begin
  MyQuery1.Open;
  JadikanXMLKeExcel(MyQuery1, 'c:\tested2.xml');
end;

Hasilnya, bila dibuka di Excel (saya menggunakan Excel 2007) akan ditanyakan mengenai bagaimana Excel memperlakukan file XML kita. Pilih yang pertama, As an XML Table.
Open XML_2013-03-21_01-51-48

Kemudian akan diinformasikan bahwa XML tidak memilik skema, dan Excel akan membuatnya. Klik OK.

Microsoft Office Excel_2013-03-21_01-53-08

Hasilnya dapat dilihat pada gambar di awal post ini.

Incoming search terms:

Inno Script Studio & Inno Form Designer

Inno Script Studio And New Project Options

Waktu lalu kita sudah bisa download Inno Setup Form Designer dari Marc Hoffmann yang setelah lama menghilang akhirnya ketemu juga di Wayback Machine. Versi yang ada sudah lawas benar, meskipun sangat membantu membuat custom form di Inno Setup.

Melanjut dari Inno Setup Form Designer ini, sebuah pengembang software asal Jepang yang berdiri tahun 2004, Kymoto Solution telah mengembangkan Inno Script Studio sebagai penyempurnaan terhadap IDE (Integrated Development Environment) untuk InnoSetup Compiler yang sudah ada. Dibandingkan dengan produk sejenis, Inno IDE (maaf, website www.innoide.org tidak lagi berfungsi, bila tertarik, silahkan download Inno IDE di sini), Inno Script Studio dari Kymoto ini jauh lebih enak dipakai.

Mengikut serta dengan Inno Script Studio ini, Kymoto juga sedang melakukan beta testing terhadap produk yang ditunggu oleh developer Delphi, GUI designer untuk Inno Setup. Produk ini diberi nama Inno Form Designer yang sayang sekali belum dipublikasikan. Menurut Kymoto, Inno Form Designer masih terbatas pada beberapa developer yang diinvite saja untuk melakukan testing.

Sayangi Dengan Berbagi Sayangi Dengan Berbagi
Daun kering terbang melayang
Yang sharing pertanda sayang
 

Soal fitur, berani saya bilang bahwa Inno Script Studio mendukung semua fitur Inno Setup, mulai dari setup scripting, GUI, sampai pascal scripting. Inno Script Studio jga mendukung fungsi debugging baik untuk [target:setup] maupun [target:uninstaller]. Berikut beberapa fitur yang ditawarkan Inno Script Studio:

  • IDE dengan mode MDI dan navigasi yang mudah
  • Integrated Debugging (sangat mirip dengan debugging di Delphi)
  • Mendukung kompilasi mode Unicode maupun ANSI
  • Pre & Post Compile Actions, yaitu rentetan perintah yang dijalankan secara batch sebelum/setelah proses kompilasi setup
  • Syntax Engine yang dapat dikustomasi, Inno Script Studio, dengan komponen dari Scintilla
  • Plugin Framework untuk mendukung plugin/package external
  • Logging yang mendetail
  • Membuat installer dengan beragam theme/skin (tidak bergantung pada theme OS), dengan engine dari  ISSkin by Codejock

Cek fitur lainnya di sini.

Sedangkan Inno Form Designer tentu saja saya belum berani berkata apa-apa. Meski begitu, dari Inno Script Studio yang jauh meninggalkan produk sejenis terdahulu, saya berharap Inno Form Designer kelak juga jauh lebih baik dari seniornya, Inno Setup Form Designer.

Harga? Ini yang penting dibahas. Inno Script Studio dirilis sebagai freeware.

Inno Script Studio And Project Options Inno Script Studio And Pascal ScriptingDan bila tertarik, silahkan download Inno Script Studio di sini, yang saat ini telah dirilis versi 2.0. Untuk download Inno Form Designer, saat ini belum tersedia.

Incoming search terms:

Koneksi Delphi Ke Cloud Database MySQL

XeRound.com Cloud Database Service

Bagi yang sudah ahli, gak usah dibaca lagi, langsung like/share saja :D

Sedang yang belum pernah atau belum ketemu layanan cloud database hosting (MySQL), semoga ini jadi bahan bacaan yang ada manfaat.

Adalah XeRound Cloud Database Service yang menyediakan hosting gratis cloud-based MySQL, sehingga dapat diakses dari mana saja. Layanan gratis ini dibatasi pada size database yang hanya 10 MB saja, dengan maksimum 5 kongkuren koneksi dan troughput sebesar 1 MB saja. Ini adalah angka-angka yang kecil. Tapi dari sisi ketersediaan, gratis dan kestabilan, saat ini XeRound sudah sangat menarik.

Layanan lain yang cukup dikenal adalah PHPCloud.com dengan fitur yang mirip, tapi menggunakan SSL untuk koneksi sehingga sedikit merepotkan yang belum terbiasa. Untuk saat ini, saya tidak akan melihat perbandingan kedua layanan ini, tapi memilih yang mudah, yaitu XeRound dan memfokuskan diskusi pada topik utama: Koneksi ke database cloud MySQL melalui Delphi.

Komponen Koneksi Database Cloud MySQL

Komponen yang dipakai boleh menggunakan yang standar, semisal koneksi Delphi ke MySQL dengan DBExpress atau menggunakan komponen pihak ketiga semisal Zeos. Untuk koneksi Delphi ke MySQL menggunakan Zeos sudah saya tulis sebelumnya. Yang akan saya pakai untuk koneksi Delphi ke cloud database MySQL dalam tulisan ini adalah Zeos dan Delphi 7, mengingat Delphi 7 sangat terkenal dan banyak digunakan, serta Zeos yang merupakan komponen akses database gratis dan open source.

Membuat Cloud Database MySQL

Silahkan mengunjungi XeRound.com, dan daftarkan diri Anda untuk layanan gratis cloud hosting MySQL.

Setelah selesai, silahkan login ke service manager yang berada di alamat ini: https://cloud.xeround.com/service/management.

Buatlah sebuah Database Instance. Lihat gambar berikut. Klik Create New.

Pilih yang free saja. Yang lain musti bayar…

Pilih lokasi Datacenter yang paling dekat dengan Anda. Karena semuanya jauh, pilih aja mana suka :D

Isikan konfigurasi instance database yang akan dibuat.

Monggo dicatat Username dan Password di atas. Ini perlu untuk melakukan koneksi Delphi ke cloud database MySQL yang telah kita buat nantinya.

Klik Create untuk membuat instance database. Tunggu sampai sampai selesai.

Belum selesai juga? Sabaaaarr… sudah gratis banyak menuntut pula. Sabar…

Dan…. plong..! Sudah jadi:

Perhatikan item-item yang saya tandai di atas:

  • Hostname/Server
  • Port
  • Username
  • Password tidak ditampilkan, ini sama dengan password waktu Anda mendaftar ke XeRound.com
  • Nama Database, mari kita buat….
Klik hostname:port di bawah item External DNS hostname, yaitu instance38864.db.xeround.com:6761 untuk membuka PHPMyAdmin. Kita perlu membuat sebuah database di sana. Sebagai informasi, hal ini dapat pula dilakukan dengan HeidiSQL, GUI gratis untuk MySQL dan MariaDB.
Sekarang di PHPMyAdmin, loginlah dengan username dan password Anda. Jangan bilang lupa!
Setelah masuk, klik tab Databases, dan buat sebuah database baru. Lihat urutan nomor yang saya tandai:
Setelah berhasil, berikut database kita yang baru:
Klik database delphi_cloud_mysql  dan buat sebuah tabel baru, misalnya dengan nama daftar_user.
Klik Go untuk membuka field editor. Buatlah field-field seperti berikut:
Bila repot, silahkan gunakan SQL hasil eksport dari tabel di atas:
Sayangi Dengan Berbagi Sayangi Dengan Berbagi
 

CREATE TABLE IF NOT EXISTS `daftar_user` (
  `id` int(20) NOT NULL AUTO_INCREMENT,
  `uid` varchar(30) COLLATE utf8_bin NOT NULL,
  `pwd` varchar(30) COLLATE utf8_bin NOT NULL,
  `last_login` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uid` (`uid`)
) ENGINE=Xeround DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='daftar user' AUTO_INCREMENT=1 ;

Koneksi Delphi Ke Cloud Database MySQL

Setelah membuat sebuah database dan sebuah tabel, mari kita coba koneksi ke database kita dari Delphi.

Buatlah sebuah aplikasi baru di Delphi. Saya menggunakan Delphi 7 dan Zeos DBO 7.0.0.

Tambahkan sebuah ZConnection, sebuah ZQuery, sebuah Datasource dan sebuah DBGrid ke form utama. Untuk ZConnection1, atur property seperti berikut (kecuali property Connected, property ini harus di-set paling akhir setelah property-property yang lain telah di-setting dengan benar agar tidak mengakibatkan error):

Aktifkan property Connected. Bila tidak dapat terhubung, periksa apakah ada kesalahan pengetikan. Cek juga jangan sampai koneksi internet sedang tidak aktif. Kalau sudah berubah menjadi True, silahkan dinonaktifkan lagi jadi False. Maaf mutar-mutar…. :)

Kemudian hubungkan ZQuery1.Connection ke ZConnection1. Lalu isi property SQL dengan query berikut:

select * from daftar_user limit 0,10

Limit 0,10 akan membatasi jumlah record data sebanyak sepuluh baris, dimulai dari offset 0 (baris pertama). Ini bermanfaat untuk menghemat bandwith mengingat database kita berada di awan. Data di baris selanjutnya tentu dapat diakses dengan mengubah parameter LIMIT ini. Hal ini dikenal dengan sebutan Paginating -pake P, bukan V !

Trus hubungkan Datasource1.Dataset ke ZQuery1. Selanjutnya hubungkan DBgrid1.Datasource ke Datasource1.

Untuk tombol Button1 dengan Caption “Test”, kita isi kode berikut:

procedure TForm1.Button1Click(Sender: TObject);
begin
  ZConnection1.Connect;
  ZQuery1.Open;
end;

Kode di atas untuk membuka koneksi dan melakukan query data. Silahkan jalankan projek dan coba inputkan data.

Akses Database Cloud MySQL Dengan Delphi

Kalau sudah berhasil, silahkan buat tabel-tabel lain dan silahkan kembangkan projek Anda.

Selamat mencoba.

Incoming search terms:

RAD Studio Mobile Roadmap To Android

Dari RAD Studio Mobile Roadmap yang dipublikasi September 2012 lalu, Embarcadero menjadwalkan dukungan pengembangan aplikasi Android di pertengahan 2013 nanti. Saat ini, Native ARM Toolchains (compiler, linker dan debugger) sedang dalam pengembangan. Begitu juga dengan Mobile Form Designer.

RAD Studio Mobile Roadmap

Sayangi dengan berbagi

 

Fitur-fitur mobile yang juga sedang dikembangkan antara lain Mobile Sensor (GPS, Kamera, Accelerometer, Gyro), Native UI Styles, Custom UI Styles, Mobile DAC untuk database-database RDBMS populer dan DataSnap. Khusus iOS, juga disediakan Interbase For iOS.

Tidak lupa, RAD Studio Mobile bakal mendukung Apple AppStore dan Android Market/Google Play

Bila Anda saat ini sedang bingung memilih toolchain yang tepat untuk develop di Android, berarti Anda sama dengan saya. Saya sudah memulai dari Eclipse (Java), trus pindah ke Oxygene (with Object Pascal) for Java serta Lazarus/FPC (termasuk rilis CodeTyphon) untuk pengembangan Android NDI yang menurut saya cukup ribet dan kurang dokumentasi. Oxygene for Java sudah cukup enak, tapi benar-benar menjadi masalah karena UI designer yang tidak dimilikinya, sehingga untuk lay-outting UI yang kompleks, saya musti kerepotan dengan bolak-balik Eclipse atau DroidDraw.

Terakhir dengan Smart Mobile Studio, saya malah merasa seperti baru mengenal Pascal, di mana untuk membuat event OnClick dari sebuah button pun mesti di-coding manual, tanpa ada event inspector yang mempermudah coding. Jadi, kecepatan development yang harusnya diusung oleh sebuah RAD IDE justru memperlambat, ditambah dokumentasi yang tidak lengkap.

Nah, dengan adanya kabar gembira dari Embarcadero ini, semoga saja penantian kita selama ini berbuah manis, dengan hadirnya dukungan penuh Embarcadero ke Android, di bawah nama RAD Studio Mobile ini.

Incoming search terms:

Tutorial Membuat Aplikasi Upload File Dengan UniGUI dan Delphi

Setelah pembuatan aplikasi berbasis web dengan UniGUI dan juga langkah-langkah pembuatan aplikasi database uniGUI, mari kita lihat  langkah-langkah membuat fasilitas upload file dengan UniGUI. Posting ini sebagai jawaban seorang member di group Komunitas Penggemar Pemrograman Delphi Indonesia.

Membuat  Aplikasi UniGUI Membuat Aplikasi UniGUI
Pertama, silahkan buat sebuah aplikasi UniGUI yang baru.

Silahkan pilih opsi pertama pada pilihan Select Project Type. Kita tidak akan merepotkan diri dulu dengan hal ini dan tetap fokus ke bagaimana mengupload file dengan UniGUI. Silahkan isi Project Name dan Project Folder sesuai kondisi Anda.

Opsi Project Type yang lain, salah satunya VCL Application/Standalone Server/ISAPI Module sudah kita bahas sebelumnya.

Di project baru kita, aktifkan form Main (Main.pas) dan tambahkan sebuah komponen TUniFileUpload dan TUniButton. Agar mempersingkat waktu, kta batasi fasilitas upload file ini hanya mengijinkan file gambar dengan ekstensi JPG.

Dan agar lebih menarik, gambar hasil upload akan kita tampilkan ke form (browser) untuk dilihat user. Jadi kita perlu menambahkan juga sebuah komponen TUniImage ke form.

Berikut tampilan saat desain untuk Anda jadikan perbandingan:

Gambar Desain Aplikasi Upload File dengan UniGUI dan Delphi

Ganti caption UniButton1 agar menarik untuk diklik.

Koding Aplikasi UniGUI Koding Aplikasi UniGUI
Dan kini mari kita buat kodenya…

Pertama, tentu saja kode untuk event OnClick untuk UniButon1:

procedure TMainForm.UniBitBtn1Click(Sender: TObject);
begin
UniFileUpload1.Execute;
end;

Kode di atas akan menampilkan window popup untuk memilih dan mengirim file ke server.
Memilih File Untuk Diupload dengan aplikasi UniGUI dan Delphi

Bila user telah memilih file dan menekan upload, proses pengiriman akan dimulai. Begitu selesai, UniFileUpload1 akan mengeksekusi mentrigger event OnUploadComplete, yang dapat kita manfaatkan untuk melakukan manipulasi file hasil download.

//Kode ini dibuat oleh: http://www.cenadep.org/
procedure TMainForm.UniFileUpload1Completed(Sender: TObject;
  AStream: TFileStream);
var
  srcFile,
  tmpFile,
  targetFolder,
  targetFile: String;
  ms: TFileStream;
begin
  //Nama File Sesuai yang dipilih
  srcFile :=  UniFileUpload1.FileName;

  //Ijinkan gambar JPG saja
  if LowerCase(ExtractFileExt(srcFile))<> '.jpg' then
  begin
    ShowMessage('Maaf. Hanya gambar JPG yang dijinkan.');
    exit;
  end;
  //target folder. Belum ada? dibuat dulu
  targetFolder := ExtractFileDir(Application.ExeName)+'\gambar_diupload';
  if not DirectoryExists(targetFolder) then
    ForceDirectories(targetFolder);
  //target file:
  targetFile := targetFolder +'\'+ExtractFileName(srcFile);
  //Temp file hasil upload
  tmpFile := AStream.FileName;
  if FileExists(targetFile) then
    DeleteFile(targetFile);
  //fs := TFileStream.Create(targetFile, fmCreate);
  if CopyFile(PChar(tmpFile), pchar(targetFile), False) then
  begin
    UniImage1.Picture.LoadFromFile(targetFile);
  end;
end;

Silahkan baca komentar pada kode di atas untuk mendapatkan gambaran ringkasnya.

Sayangi dengan berbagi

 

Kemudian untuk menguji, jalankan aplikasi dengan F9 dan buka browser. Browse ke alamat http://localhost:8077, di mana 8077 ini adalah port default aplikasi UniGUI.
Klik button dan pilih sebuah file bitmap (ekstensi *.BMP):

Menguji aplikasi upload file unigui dengan Delphi

Klik upload dan tunggu sampai selesai.

Aplikasi Unigui Delphi untuk Upload FIle

Oke, artinya gambar BMP ditolak. Kini kita coba gambar yang diijinkan. Silahkan pilih file gambar lagi dan kali ini, pilih yang berekstensi *.JPG. Lalu upload…

Hasil upload file gambar dengan UniGUI dan Delphi

Berhasil!

Sampai di sini, contoh aplikasi penggunaan fasilitas upload file dengan UniGUI dan Delphi sudah jadi. Silahkan dikembangkan.

Bila Anda tertarik dan perlu pembahasan lebih lanjut, seperti upload file selain gambar atau ada topik lain, silahkan tinggal komentar.

Salam hangat.

Incoming search terms:

Membuat Stored Procedure Di PostgreSQL

Kita telah melihat sepintas tentang stored procedure dalam PostgreSQL dan kegunaan-kegunaanya. Kini saatnya kita diskusi lebih jauh tentang stored procedure ini. Yang pertama kita akan melihat tentang…

Membuat Stored Procedure Di PostgreSQL

=== sudah ngantuk== besok kita lanjut…

Stored procedure selain dipanggil langsung oleh perintah SQL, juga dapat dipanggil khusus oleh tigger yang disebut sebagai Trigger Function Dalam PostgreSQL.

Incoming search terms:

Happy New Year 2013

Mereka bilang akhir tahun 2012 adalah akhir dunia, menurut ramalan bangsa Maya. Kita sudah lihat bahwa mereka salah. Bahwa mereka menciptakan kepanikan untuk memainkan harga saham. Bahwa manusia tidak satu pun yang tahu kapan akhir dunia tiba.

Yang kita tahu, Desember 2012 ini hanya akhir sebuah tahun, bukan akhir dunia. Yang kita tahu, kita segera akan memulai dunia baru, cinta yang baru, semangat yang baru dan meraih impian yang baru.

Mari kita jadikan 2013 sebagai tahun terbaik yang pernah kita lewati.

Selamat Tahun Baru 2013!

Kru Cenadep.org mengucapkan selamat tahun baru 2012. Semoga menjadi tahun yang lebih baik buat Anda daripada tahun-tahun sebelumnya.

Perindah hidup Anda dengan inspirasi baru, download wallpaper dan kartu ucapan Selamat Tahun Baru 2013 di sini. Share ke teman Anda di Facebook, Twitter atau Google+1. Setidaknya, jangan lupa beri jempol :)

Untuk mendownload wallpaper ucapan selamat tahun baru 2013 di atas, klik pada thumbnail. Tunggu sampai tampil ukuran asli. Klik kanan pada gambar dan Save As…

Ribet Download Satu-Satu?
Download seluruh wallpaper di atas sebagai file arsip (7z)

Download Wallpaper Dan Kartu Ucapan Selamat Tahun Baru 2013 Set-01

Download koleksi Wallpaper Dan Kartu Ucapan Selamat Tahun Baru 2013 Set-01


Incoming search terms:

Kumpulan Download Contoh Program Menggunakan Delphi

Kumpulan Download Contoh Program Menggunakan Delphi dari grup Komunitas Penggemar Pemrograman Delphi Indonesia yang diupload oleh member. Selain download, daftar di bawah juga berisi link ke tutorial atau referensi pemrograman Delphi.

Bila Anda menemukan kesulitan dengan download dari mediafire, lihat cara mengatasi masalah download dengan mediafire.

Spoiler – Klaim Hak Cipta/Pertanyaan
Bila ada keberatan atas salah satu item/keseluruhan daftar ini, silahkan hubungi kami via e-mail:
moc.koobecaf@iavir.okoj (Dibaca terbalik).
Saran dan kritik sangat diterima. Pertanyaan juga boleh.
Ampe tumpe-tumpeh juga bolehhh..



KPPDI – Delphi Downloads

Download KPPDI – Focus Control dengan Tombol Enter
By Achmad Taufik di Komunitas Penggemar Pemrograman Delphi Indonesia

Standar perpindahan fokus antar kontrol (Focus Control) dalam sistem operasi windows dikendalikan melalui penekanan tombol Tab. Bagaimana seandainya kita menghendaki perpindahan fokus tersebut dikendalikan melalui penekanan tombol Enter.
Perhatikan ilustrasi berikut:

Sebuah Form (Form1) dengan 3 buah Edit kontrol (Edit1, Edit2, dan Edit3) dan 1 buah ComboBox (ComboBox1) yang perpindahan antar kontrolnya dikendalikan melalui penekanan tombol Enter. Seperti kita ketahui bersama bahwa untuk melaksanakan proses perpindahan kontrol tersebut adalah dengan menambahkan event OnKeyPress pada setiap kontrolnya


Download KPPDI – DBNavigator Plus
By Joko Rivai di Komunitas Penggemar Pemrograman Delphi Indonesia

Contoh modifikasi TDBNavigator. Awalnya dibuat oleh William R. Florac, dengan fitur ada glyph (gambar) di tiap button. Karena fitur ini sudah umum, source codenya Fitco saya modifikasi lagi sehingga glyph (gambar) dan hint tiap button dapat diganti (design time maupun run time).


Download Google Maps pada Aplikasi Desktop
By Achmad Taufik di Komunitas Penggemar Pemrograman Delphi Indonesia

“Jalan Ujung Menteng”. Setahuku menteng itu di jakarta pusat. Memang ada ujungnya tuh jalan?
Alamat undangan pernikahan kok nggak jelas begitu sih? Ada di peta nggak ya?….. Malas datang ah.

Mungkin akan seperti itulah pemikiran kita sepuluh tahun lalu.

Bagaimana kalau hal tersebut terjadi pada saat ini? Gampang! Minimalnya meluncur saja ke warnet, buka Google Maps, cari alamat yang dimaksud, siapkan uang transport, beli kado, berangkat, selesai.
Fakta bahwa Google selain sebagai mesin pencari, aplikasi Maps-nya sangat membantu sekali dalam proses pencarian sebuah lokasi yang masih asing.
Tapi itu semua kan hanya bisa dilihat dan dilakukan melalui web browser. Bisa tidak ya kalau Google Maps diintegrasikan di aplikasi desktop kita? Kalau bisa kan lumayan buat menyimpan lokasi teman2 kita, terus kita simpan deh datanya ke database.


Download Extract SQL From MySQL Table
By Joko Rivai di Komunitas Penggemar Pemrograman Delphi Indonesia

Langsung saja ke prosedurnya (Pake ADO). Untuk library koneksi lain, silahkan sesuaikan saja tipe class dataset untuk variabel Query dan Query := TXXXX.Create(nil); serta tipe class untuk parameter Connection…


Download Menambah Splash Screen pada Aplikasi (Delphi)
By Kadek Suwena di Komunitas Penggemar Pemrograman Delphi Indonesia

Berikut salah satu tip dari sekian banyak tip yang ada di internet untuk menambahkan splash screen pada aplikasi yang dibuat dengan Delphi. Mudah-mudahan menjawab salah satu anggota yang menanyakan pembuatan splash screen seperti pada Photoshop dll.


Incoming search terms:

Mendeteksi Adanya Record Baru Dengan SQL Monitor (TZSQLMonitor)

Pertanyaan terkait dengan

Koneksi Database Dengan Delphi, MySQL & ZEOS

Maaf, numpang tanya Mas, gimana ya caranya saya mendeteksi adanya record baru di mysql (pakai timer atau ada event khusus?..) di delphi ?… , jadi ketika ada record baru program akan memberitahukan dalam bentuk ‘alert’ lalu langsung menampilkan record baru tersebut saat itu juga secara realtime. Terima kasih…

Ditanyakan oleh yunidotcom di Koneksi Database Dengan Delphi, MySQL & ZEOS pada 2011-08-21 08:50:37

Maaf, numpang tanya Mas, gimana ya caranya saya mendeteksi adanya reco…

Tergantung tujuannya.
Tempo hari saya paka SQL Logger (Di Zeos ada namanya TZSQLMonitor, jangan lupa tambahkan unit ZSQLMonitor ke uses list…). Jadi tiap ada eksekusi perintah sql, SQLMonitor akan mentrace SQL. SQL ini diparse untuk memeriksa jenis SQL (apakah update, insert, delete atau select). Kemudian baru ditampilkan warningnya.

Sekarang, di MySQL versi baru, saya cenderung memilih trigger. Cara ini agak repot karena di semua tabel harus dipasang trigger, tapi akurasi lebih terjamin. Cara SQL Monitor akan keliru jika SQL sudah dieksekusi dan ditrace, tapi ternyata gagal di database (back-end).

Untuk memulai, cobalah pake TZSQLMonitor.

Set Active ke True. Trus event OnTrace:

procedure TForm3.ZSQLMonitor1Trace(Sender: TObject; Event: TZLoggingEvent;
var LogTrace: Boolean);
var
tmp:String;
begin
LogTrace := False;
tmp := uppercase(copy(Trim(Event.Message), 1, 6));
if (tmp = ‘INSERT’) then
ShowMessage(Event.Message);
end;

Semoga dapat membantu..

Incoming search terms:

Mengatasi Format Tanggal Saat Input Database Mengunakan Zeos

Pertanyaan terkait dengan

Koneksi Database Dengan Delphi, MySQL & ZEOS

makasih mas sekarang sudah bisa…. tapi ada yang lain nih mas, dalam penginputan data sebaiknya menggunakan dbEdit atau Edit ya mas… terus kalau saya memfilter data dengan perintah:
ZQuery1.Filtered:=False;
ZQuery1.Filter:=’tgl_layanan like’+QuotedStr(‘%’+Edit1.Text+’%');
ZQuery1.Filtered:=True;


kok error ya mas… “…Access violation at address 005D6529…” padahal sebelum saya pindah menggunakan mysql lancar-lancar aja. sebelumnya saya pakai database access dan ado sebagai koneksinya, tapi sesuai panduan dan komentar dari blok anda saya sekarang coba dan bisa pakai zeos dan mysql server. tapi tetap saja banyak kendalanya… o’ya mas… ada ngga buku yang menjelaskan database mysql server dengan delphi.
makasih ya atas penjelasannya

Ditanyakan oleh saiful anwar di Koneksi Database Dengan Delphi, MySQL & ZEOS pada 2011-06-30 12:41:04

makasih mas sekarang sudah bisa…

Pastikan data tanggal dalam Edit1.Text berformat “yyyy-MM-dd”, misalnya “2011-06-29″..
Makasih mas joko sekarang sudah bisa, makasih ya… sukses untuk anda dan team

Incoming search terms:

Refresh Data Pada FastReport UniGUI

Pertanyaan terkait dengan

Creating Web Application Using UniGUI – Utilizing FastReport

Ane ada satu pertanyaan ne bang…gmn caranya supaya apabila kita update field data ditabelnya kemudian direportnya juga ikutan update fieldnya..??

Ditanyakan oleh Arfian di Creating Web Application Using UniGUI – Utilizing FastReport pada 2012-01-24 15:16:37

Ane ada satu pertanyaan ne bang…

Yang HTML atau PDF bang?
Untuk refresh data, kasih ZQuery1.Refresh dulu sebelum ekspor.
Bila masih belum update, saya pikir karena cache browser.
Coba kode berikut di nama file:

HTML  := ExtractFileDir(Application.ExeName)+'\reports\bukutamu-'+IntToStr(Random(999888))+'.html';

*Catatan: Setiap kali tampil report HTML, akan dibuat file dan folder baru. FIle dan folder ini harus dihapus manual saat report sudah ditampilkan agar tidak memenuhi harddisk…

Maaff, saya lagi menguji-coba WordPress Plugin Comment-To-Post untuk mengkonversi komentar menjadi post baru.

Incoming search terms:

Page 1 of 1112345...10...Last »