11 Agustus 2011

Menampilkan Teks tercustom,tanpa Mengubah properti caption

Jika Anda  ingin tampilan beda dan menambahkan beberapa teks custom pada caption bar dari bentuk, tanpa mengubah properti Caption dari bentuk yang Anda butuhkan untuk menangani satu pesan khusus Windows: WM_NCPAINT.

Pesan WM_NCPAINT dikirim ke jendela saat dibutuhkan untuk memberi warna pada bingkainya. Sebuah aplikasi bisa menghentikan pesan ini dan warna bingkai jendela custom nya.

Catatan bahwa Anda juga perlu menangani pesan WM_NCACTIVATE yang dikirim ke jendela ketika akan diaktifkan atau dinonaktifkan. Tanpa penanganan WM_NCACTIVATE teks judul kustom akan hilang ketika bentuk kita kehilangan fokus.Sedikit penjelasan diharapkan anda paham dengan artikel ini,langsung saja ke contoh script-nya :
type
    TCustomCaptionForm = class(TForm)
    private
      procedure WMNCPaint(var Msg: TWMNCPaint) ; message WM_NCPAINT;
      procedure WMNCACTIVATE(var Msg: TWMNCActivate) ; message WM_NCACTIVATE;
      procedure DrawCaptionText() ;
    end;

 ...

 implementation


 procedure TCustomCaptionForm .DrawCaptionText;
 const
    captionText = 'Belajar.Delphi.Bersama';
 var
    canvas: TCanvas;
 begin
    canvas := TCanvas.Create;
    try
      canvas.Handle := GetWindowDC(Self.Handle) ;
      with canvas do
      begin
        Brush.Style := bsClear;
        Font.Color := clMaroon;
        TextOut(Self.Width - 110, 6, captionText) ;
      end;
    finally
      ReleaseDC(Self.Handle, canvas.Handle) ;
      canvas.Free;
    end;
 end;

 procedure TCustomCaptionForm.WMNCACTIVATE(var Msg: TWMNCActivate) ;
 begin
    inherited;
    DrawCaptionText;
 end;

 procedure TCustomCaptionForm.WMNCPaint(var Msg: TWMNCPaint) ;
 begin
    inherited;
    DrawCaptionText;
 end;


Selamat mencoba...




#2 Bagaimana Kirim Informasi (String, Gambar, Rekam) Antara Dua Aplikasi



Mengirim String, Rekam Custom atau sebuah gambar?
Kode sumber yang menyertainya menunjukkan bagaimana untuk mengirim string, catatan (kompleks tipe data) dan bahkan grafis (bitmap) ke aplikasi lain.

Jika Anda tidak bisa menunggu download, berikut adalah cara untuk mengirim grafis TBitmap :

    procedure TSenderMainForm.SendImage() ;
     var
     ms : TMemoryStream;
     bmp : TBitmap;
     copyDataStruct : TCopyDataStruct;
     begin
    ms := TMemoryStream.Create;
    try
    bmp := self.GetFormImage;
    try
    bmp.SaveToStream(ms) ;
     finally
     bmp.Free;
    end;

    copyDataStruct.dwData := Integer(cdtImage) ; // identify the data
    copyDataStruct.cbData := ms.Size;
    copyDataStruct.lpData := ms.Memory;

    SendData(copyDataStruct) ;
    finally
    ms.Free;
    end;
     end;
    
//untuk menampilkan data tsb

    procedure TReceiverMainForm.HandleCopyDataImage(
    copyDataStruct: PCopyDataStruct) ;
    var
    ms: TMemoryStream;
    begin
    ms := TMemoryStream.Create;
    try
    ms.Write(copyDataStruct.lpData^, copyDataStruct.cbData) ;
    ms.Position := 0;
    receivedImage.Picture.Bitmap.LoadFromStream(ms) ;
    finally
    ms.Free;
    end;
   end; 





#1 Bagaimana Kirim Informasi (String, Gambar, Rekam) Antara Dua Aplikasi

  Ada banyak pilihan ketika Anda perlu untuk memungkinkan dua aplikasi untuk berkomunikasi. Jika Anda tidak ingin main dengan soket TCP dan komunikasi (karena kedua aplikasi yang berjalan pada mesin yang sama), Anda dapat  *simply* mengirim (dan benar menerima) sebuah pesan Windows khusus: WM_COPYDATA.

Karena penanganan pesan Windows dalam Delphi sederhana, menerbitkan API SendMessage panggilan bersama dengan WM_COPYDATA diisi dengan data yang akan dikirim cukup lurus ke depan.
WM_COPYDATA dan TCopyDataStruct
Pesan WM_COPYDATA memungkinkan Anda untuk mengirim data dari satu aplikasi ke aplikasi lainnya. Aplikasi menerima menerima data dalam catatan TCopyDataStruct. TCopyDataStruct didefinisikan di unit Windows.pas dan membungkus struktur COPYDATASTRUCT yang berisi data yang akan berlalu.

Berikut deklarasi dan deskripsi dari catatan TCopyDataStruct:


    type
    TCopyDataStruct = packed record
    dwData: DWORD; //up to 32 bits of data to be passed to the receiving application
    cbData: DWORD; //the size, in bytes, of the data pointed to by the lpData member
    lpData: Pointer; //Points to data to be passed to the receiving application. This member can be nil.
    end; 

Kirim String atas WM_COPYDATA
Untuk aplikasi "Pengirim" untuk mengirim data ke "Penerima" CopyDataStruct harus diisi dan diteruskan menggunakan fungsi SendMessage. Berikut adalah cara untuk mengirim nilai string dari WM_COPYDATA:

      

     procedure TSenderMainForm.SendString() ;
     var
     stringToSend : string;
     copyDataStruct : TCopyDataStruct;
     begin
     stringToSend := 'About Delphi Programming';

     copyDataStruct.dwData := 0; //use it to identify the message contents
     copyDataStruct.cbData := 1 + Length(stringToSend) ;
     copyDataStruct.lpData := PChar(stringToSend) ;

     SendData(copyDataStruct) ;
     end; 

SendData menempatkan fungsi kustom penerima menggunakan panggilan FindWindow API:



    procedure TSenderMainForm.SendData(const copyDataStruct: TCopyDataStruct) ;
     var
       receiverHandle : THandle;
       res : integer;
     begin
       receiverHandle := FindWindow(PChar('TReceiverMainForm'),PChar('ReceiverMainForm')) ;
       if receiverHandle = 0 then
       begin
         ShowMessage('CopyData Receiver NOT found!') ;
         Exit;
       end;

      res := SendMessage(receiverHandle, WM_COPYDATA, Integer(Handle), Integer(@copyDataStruct)) ;
     end;

Pada kode di atas, "Receiver" aplikasi ditemukan menggunakan panggilan FindWindow API dengan melewatkan nama kelas form utama ("TReceiverMainForm") dan keterangan dari jendela ("ReceiverMainForm").


Catatan  : SendMessage mengembalikan sebuah nilai integer yang diberikan oleh kode yang menangani pesan WM_COPYDATA.
Penanganan WM_COPYDATA - Menerima String
The "Receiver" aplikasi menangani mesage WM_COPYDATA seperti dalam:




     type
     TReceiverMainForm = class(TForm)
    private
     procedure WMCopyData(var Msg : TWMCopyData) ; message WM_COPYDATA;
     ...
     implementation
     ...
     procedure TReceiverMainForm.WMCopyData(var Msg: TWMCopyData) ;
     var
     s : string;
     begin
     s := PChar(Msg.CopyDataStruct.lpData) ;

    //Kirim sesuatu kembali


     msg.Result := 2006;
     end; 

    Catatan TWMCopyData dinyatakan sebagai  :

     TWMCopyData = packed record
    Msg: Cardinal;
     From: HWND;//Handle of the Window that passed the data
     CopyDataStruct: PCopyDataStruct; //data passed
     Result: Longint;//Use it to send a value back to the "Sender"
     end;
















9 Agustus 2011

Memformat Nilai Date Time untuk Akses SQL di Delphi

Pernahkah anda mendapatkan sesuatu yang mengerikan seperti, "Parameter objek dengan benar didefinisikan namun informasi yang disampaikan tidak konsisten atau tidak lengkap diberikan."apakah itu merupakan Kesalahan JET?

Bila Anda perlu membuat  query againts SQL Access database di mana tanggal (atau waktu tanggal) nilai digunakan Anda perlu memastikan bahwa format yang benar digunakan(harus sesuai dengan format waktu pada komputer anda).

Sebagai contoh, dalam sebuah query SQL: "SELECT * FROM TBL MANA DateField = '10 / 12/2008 '" Anda ingin mendapatkan semua catatan dari tabel bernama Tbl mana tanggal yang umum bidang DateField sama dengan 10/12/2008.

Apakah baris di atas jelas? Apakah itu Desember, 10 atau Oktober, 12? Untungnya kami cukup yakin tahun dalam query adalah 2008:)

Haruskah bagian tanggal dari query ditetapkan sebagai MM / DD / YYYY atau DD / MM / YYYY atau mungkin YYYYMMDD? Melakukan pengaturan daerah berperan di sini?
MS Access, Jet, Tanggal Format Waktu
Bila menggunakan Akses dan JET (dbGo - ADO Delphi kontrol) format SQL untuk field tanggal harus * selalu * menjadi:
#YYYY-MM-DD#

Ada lagi yang mungkin bekerja dalam pengujian terbatas, tetapi sering dapat menyebabkan hasil yang tidak diharapkan atau kesalahan pada mesin pengguna.

Berikut adalah fungsi kustom Delphi dapat Anda gunakan untuk memformat nilai tanggal untuk permintaan akses SQL :
        function DateForSQL(const date : TDate) : string;   var   y, m, d : word; begin   DecodeDate(date, y, m, d) ;     result := Format('#%.*d-%.*d-%.*d#',[4, y, 2, m, 2, d]) ;
  end;

 Untuk "January 29, 1973" fungsi akan mengembalikan string '#1973-01-29#'.


SQL pada Delphi


SQL(Structured Query Language) adalah bahasa standar untuk mendefinisikan dan memanipulasi data dalam database relasional. Sesuai dengan model relasional data, database dianggap sebagai satu set tabel, hubungan diwakili oleh nilai-nilai dalam tabel, dan data diambil dengan menetapkan tabel hasil yang dapat diperoleh dari satu atau lebih base tables.
Pertanyaan mengambil bentuk bahasa perintah yang memungkinkan Anda pilih, insert, update, mengetahui lokasi data, dan sebagainya.


          Pada Delphi ... TQuery
Jika Anda akan menggunakan SQL pada aplikasi Anda, Anda akan menjadi sangat akrab dengan komponen TQuery. Delphi memungkinkan aplikasi Anda untuk menggunakan sintaks SQL langsung meskipun komponen TQuery untuk mengakses data dari: tabel Paradox dan dBase (menggunakan SQL lokal - subset dari standar ANSI SQL), Database pada Server Lokal Interbase, dan Database pada server basis data jauh.
Delphi juga mendukung query heterogen terhadap lebih dari satu server atau jenis tabel (misalnya, data dari tabel Oracle dan meja Paradox).

TQuery memiliki properti yang disebut SQL, yang digunakan untuk menyimpan pernyataan SQL.
TQuery merangkum satu atau lebih pernyataan SQL, mengeksekusi mereka dan menyediakan metode dengan mana kita dapat memanipulasi hasil. Query dapat dibagi menjadi dua kategori: orang-orang yang menghasilkan hasil set (seperti perintah SELECT), dan mereka yang tidak (seperti UPDATE atau INSERT pernyataan). Gunakan TQuery.Open untuk mengeksekusi sebuah query yang menghasilkan satu set hasil, gunakan TQuery.ExecSQL untuk mengeksekusi query yang tidak menghasilkan hasil set.

Pernyataan SQL dapat berupa statis atau dinamis, yaitu, mereka dapat diatur pada saat desain atau termasuk parameter (TQuery.Params) yang bervariasi pada waktu berjalan. Menggunakan query parameter sangat fleksibel, karena Anda dapat mengubah tampilan pengguna dan akses ke data on the fly pada saat run time.

Semua pernyataan SQL dieksekusi harus dipersiapkan sebelum mereka dapat dieksekusi. Hasil dari persiapan adalah bentuk eksekusi atau operasional pernyataan. Metode mempersiapkan pernyataan SQL dan kegigihan bentuk operasional membedakan SQL statis dari SQL dinamis. Pada waktu desain query dipersiapkan dan dijalankan secara otomatis ketika Anda mengeset properti Aktif komponen query untuk Benar. Pada waktu berjalan, query dipersiapkan dengan panggilan untuk Siapkan, dan dijalankan ketika aplikasi panggilan metode komponen Terbuka atau ExecSQL.

TQuery dapat kembali dua macam hasil set: "hidup" sebagai dengan komponen ttabel (pengguna dapat mengedit data dengan kontrol data, dan bila panggilan untuk Memberikan terjadi perubahan dikirim ke database), "hanya membaca" hanya untuk tampilan. Untuk meminta satu set hasil hidup, mengatur properti RequestLive komponen query untuk Benar, dan menyadari bahwa pernyataan SQL harus memenuhi beberapa persyaratan tertentu (tidak ada ORDER BY, SUM, AVG, dll)

Sebuah permintaan berperilaku dalam banyak hal sangat banyak seperti filter meja, dan dalam beberapa hal query bahkan lebih kuat daripada filter karena memungkinkan Anda mengakses:
  • Lebih dari satu tabel pada suatu waktu ("bergabung" di SQL),
  • Subset tertentu dari baris dan kolom dari tabel yang mendasarinya (s), daripada selalu kembali mereka semua. 
  Contoh :
Sekarang mari kita lihat beberapa SQL dalam eksekusinya. Meskipun kita bisa menggunakan Form Wizard Database untuk membuat beberapa contoh SQL untuk contoh ini kita akan melakukannya secara manual, langkah demi langkah yang harus dilakukan :
  1. Tempatkan TQuery, TDataSource, TDBGrid, TEdit, dan komponen TButton pada form utama.
  2. Set TDataSource DataSet properti komponen untuk Query1.
  3. Set properti DataSource TDBGrid komponen untuk DataSource1.
  4. Mengatur komponen TQuery DatabaseName properti untuk DBDEMOS.
  5. Double-klik pada properti SQL TQuery untuk menetapkan pernyataan SQL untuk itu.
     
    6. Untuk membuat data yang menampilkan grid pada saat desain, mengubah properti Aktif TQuery komponen menjadi True.

     
    Seperti yang Anda lihat, grid menampilkan data dari tabel Employee.db dalam tiga kolom (FirstName, LastName, Gaji) bahkan jika Emplyee.db memiliki 7 bidang, dan set hasil dibatasi untuk catatan-catatan mana Nama_belakang dimulai dengan 'R' .
    7. Sekarang menetapkan kode berikut untuk event OnClick Tombol1 tersebut.
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    Query1.Close;{close the query}
    //assign new SQL expression
    Query1.SQL.Clear;
    Query1.SQL.Add ('Select EmpNo, FirstName, LastName');
    Query1.SQL.Add ('FROM Employee.db');
    Query1.SQL.Add ('WHERE Salary > ' + Edit1.Text);
    Query1.RequestLive := true;
    Query1.Open; {open query + display data}
    end;
           
 
       8. Jalankan aplikasi Anda. Ketika Anda mengklik pada tombol (selama Edit 1 memiliki nilai mata uang  yang valid di dalamnya), grid akan menampilkan empno, FirstName dan bidang LastName untuk semua catatan di mana Gaji lebih besar dari nilai mata uang tertentu.