Membuat TStringGrid lebih menarik

Selama ini banyak saya melihat, programmer Delphi memakai komponen VCL yang indah-indah. Namun VCL ini bukan kepunyaan delphi sendiri, melainkan dibuat oleh pihak ke-tiga. Saya mencoba mencari-cari di internet, kebanyakan komponen ini berharga mahal. Sebagai contoh, anda bisa melihat Grid buatan TMS Software dibawah ini:


GAMBAR 1

                                                                  
sekarang bandingkan dengan TStringGrid, asli, milik Delphi dibawah ini

GAMBAR 2

                                                                

Semua pasti setuju, gambar 2 kurang menarik. Sekarang mari kita otak-atik gambar 2 agar persis sama dengan grid buatan TMS Software pada gambar 1. Jika kita berhasil, kita bisa menghemat ongkos pembuatan software, karena grid tersebut kita program sendiri.

Langkah-Langkah Pembuatan
  • Hal yang pertama-tama kita kerjakan. Ubah property DefaultDraw menjadi false. Dengan demikian, maka tanggung jawab penggambaran object terletak pada programmer. Sehingga tampilan menjadi seperti dibawah ini:


    GAMBAR 3
                                                         
    Lho? Bukankah gambar 3 lebih jelek dari gambar 2? Memang! Tunggu sebentar, kita masih belum menggambar object-nya sehingga object-nya masih merana.
  • Kita memulai dengan mengubah warna Fixed Column grid ke warna biru. Kita mulai menulis kode program berikut di event OnDrawCell:
    with stringgrid1 do
    begin                    
         if gdFixed in  State then          
         begin                      
             Canvas.Brush.Color := $00CD934B;                   
             Canvas.Font.Color := $00000;          
         end;         
         Canvas.FillRect(rect);
    end;
    dan gambarnya menjadi seperti gambar 4


    GAMBAR 4


  •  Nah! Kenapa juga gambarnya biru semua? Kan yang kita inginkan yang biru cuma Fixed Column, bukan semua. Itu     disebabkan kita cuma memberitahu apa yang digambar saat menjumpai Fixed Column, sementara yang bukan Fixed Column tidak kita definisikan.Sekarang tambahkan programnya menjadi seperti ini:
    with stringgrid1 do
    begin               
        if gdFixed in  State then              
       begin             
           Canvas.Brush.Color := $00CD934B;             
           Canvas.Font.Color := $00000;            
       end else      
       begin              
            Canvas.Brush.Color := $FFFFFF;              
            Canvas.Font.Color := $00000;      
        end;      
       Canvas.FillRect(rect);
    end;  
     Nah sekarang Grid-nya menjadi seperti ini:       


GAMBAR 5

  • Setelah warna Fixed Column selesai, tinggal tulisan. Seperti kita lihat, tulisan seperti pada gambar 2 hilang. Pada langkah 2, kita hanya menggambar background, sekarang kita menggambar tulisannya (foreground). Kita ubah kode programnya pada bagian setelah Canvas.FillRect(rect);    menjadi seperti ini:
   ................................... 
   Canvas.FillRect(rect);    
     DrawText(Canvas.Handle, PChar(S), Length(S), Rect, DT_LEFT or DT_VCENTER  or DT_SINGLELINE)
  end;

Kode program diatas akan membentuk gambar grid menjadi seperti dibawah ini:


GAMBAR 6


Masih ada kekurangan! Judul pada Fixed Column tidak di tengah-tengah, padahal pada contoh gambar 1, tulisan ada di tengah Cell. Sekarang kita ubah kode program pada bagian DrawText menjadi seperti ini:
    
    if ARow = 0 then
    DrawText(Canvas.Handle, PChar(S), Length(S), Rect, DT_CENTER or DT_VCENTER  or DT_SINGLELINE)
   else
    DrawText(Canvas.Handle, PChar(S), Length(S), Rect, DT_LEFT or DT_VCENTER  or DT_SINGLELINE)
  end;

Saat ini tulisan sudah di tengah, tetapi font tulisan masih hitam, bukan putih seperti gambar 1, maka marilah kita ubah sedikit program pada bagian gdFixed in state  menjadi seperti ini:

       if gdFixed in  State then              
      begin             
          Canvas.Brush.Color := $00CD934B;             
          Canvas.Font.Color := $FFFFFF;        
      end else     

Pada gambar 2, ada batas-batas jelas antar tiap cell, sementara grid yang kita buat tidak seperti itu. Sekarang mari kita otak-atik garis pada batas Cell. Letakkan baris kode berikut pada permulaan kode, setelah  with stringgrid1 do :
   with Rect do
   begin
             Top := Top + 1;
             Left := Left + 1;
             Bottom := Bottom - 1;
             Right := Right - 1;
         end;

grid kita menjadi seperti dibawah ini:


GAMBAR 7


Sebentar! masih ada kekurangan. Bagaimana pointer sorot. Masih belum dibuat. Sekarang ubah kode program setelah gdFixed in state  menjadi seperti dibawah ini:

       if gdFixed in  State then              
      begin             
          Canvas.Brush.Color := $00CD934B;             
          Canvas.Font.Color := $FFFFFF;        

      end else    
       if gdSelected in State then
        begin
            Canvas.Brush.Color := $00E0BB8D;
            Canvas.Font.Color := $000000;
        end else
        begin
           canvas.Brush.Color := $FFFFFF;
           Canvas.Font.Color := $000000;
        end;

sehingga grid kita menjadi seperti dibawah ini:


GAMBAR 8



Membuat TStringGrid lebih menarik Rating: 4.5 Diposkan Oleh: Good Dreamer

11 comments:

  1. Gan, kok ad yg Error....

    Undeclared Identifier:'S';

    mohon pencerahannya.

    BalasHapus
    Balasan
    1. definisikan dahulu S sebagai variabel bertipe string seperti ini:

      var
      S: string;

      Hapus
    2. Gan Yohanes,

      blh minta coding n programny dak????
      klo blh tlng krmkan ke email sy,
      mulyadi.email@gmail.com

      td sy sdh coba pke var s:string, tapi tulisanny tetap dak mncl wlaupun dak ad error.
      Sangkyu.......

      Hapus
  2. Saya lagi di luar rumah. Sekarang coba lihat property DefaultDrawing punya TStringGrid. Defaultnya adalah True karena yang menggambar Komputer, karena kita menggambar sendiri, harus di set ke False

    BalasHapus
  3. Gan kalo string grid dibuat model form penjualan seperti di minimarket gimana ya .. ?

    BalasHapus
    Balasan
    1. bisa diberi gambarnya, agar saya tahu maksudnya. Saya rasa cuma sekedar layout saja

      Hapus
  4. kok masih tetep mas broew klu diganti property default drawing punya Tstringgrid defaultnya adalah false?mohon pencerahannya lagi

    BalasHapus
  5. Sebetulnya saya membuat artikel diatas dengan asumsi pembaca sudah mengenal dasar-dasar pemakaian TStringGrid, sehingga saya cuma menulis program ke tingkat lebih lanjut. Tetapi jika masih bingung, ini saya sertakan kode program lengkapnya:


    procedure TForm1.FormCreate(Sender: TObject);
    begin
    with stringgrid1 do
    begin
    Options := Options + [goRowSelect];

    RowCount := 6;
    ColCount := 3;

    ColWidths[0] := 50;
    ColWidths[1] := 100;
    ColWidths[2] := 100;

    Cells[0,0] := 'No';
    Cells[1,0] := 'Kode';
    Cells[2,0] := 'Pekerjaan';

    Cells[0,1] := '19';
    Cells[0,2] := '20';
    Cells[0,3] := '21';
    Cells[0,4] := '22';
    Cells[0,5] := '23';

    Cells[1,1] := '12000011';
    Cells[1,2] := '12000012';
    Cells[1,3] := '12000013';
    Cells[1,4] := '12000014';
    Cells[1,5] := '12000015';

    Cells[2,1] := 'Sprayer';
    Cells[2,2] := 'Staff HRD & Legal';
    Cells[2,3] := 'Marketing Analisis';
    Cells[2,4] := 'Operator';
    Cells[2,5] := 'Treatment';
    end;
    end;

    procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
    Rect: TRect; State: TGridDrawState);
    var
    S: String;
    begin

    with stringgrid1 do
    begin
    with Rect do
    begin
    Top := Top + 1;
    Left := Left + 1;
    Bottom := Bottom - 1;
    Right := Right - 1;
    end;

    if gdFixed in State then
    begin
    Canvas.Brush.Color := $00CD934B;
    Canvas.Font.Color := $FFFFFF;
    end else
    if gdSelected in State then
    begin
    Canvas.Brush.Color := $00E0BB8D;
    Canvas.Font.Color := $000000;
    end else
    begin
    Canvas.Brush.Color := $FFFFFF;
    Canvas.Font.Color := $00000;
    end;

    Canvas.FillRect(rect);
    S := Cells[ACol, ARow];

    if ARow = 0 then
    DrawText(Canvas.Handle, PChar(S), Length(S), Rect, DT_CENTER or DT_VCENTER or DT_SINGLELINE)
    else
    DrawText(Canvas.Handle, PChar(S), Length(S), Rect, DT_LEFT or DT_VCENTER or DT_SINGLELINE)
    end;
    end;

    BalasHapus
  6. gan klo menghapus beberapa baris dari stringgrid..bagaimana ya codingnya...! terima kasih..

    BalasHapus

Diberdayakan oleh Blogger.