15 March 2016

Input di Cell Flexgrid




Dim baris, kolom As Integer 'Untuk menyimpan informasi baris dan kolom yang dipilih user
Dim i, j As Integer 'Untuk keperluan looping
    
Private Sub cbTes_KeyPress(KeyAscii As Integer)
    If KeyAscii = 13 Then
        'Isi kolom flexgrid sesuai isi teks combo yang dipilih
        Call isiFlexGrid
        
        'Combo dihide dulu
        cbTes.Visible = False
        
        'Jika baris dan kolom yang dipilih adalah baris dan kolom yang terakhir
        If flexTes.Row = flexTes.Rows - 1 And flexTes.Col = flexTes.Cols - 1 Then
            'Cek, apakah ada kolom yang belum terisi
            For i = 1 To flexTes.Col
                If flexTes.TextMatrix(flexTes.Row, i) = "" Then Exit Sub 'Jika ada kolom yang belum terisi, maka jangan buat baris baru
            Next i
            
            'Buat baris baru
            flexTes.Rows = flexTes.Rows + 1
            
            'Pindah fokus ke baris yang baru
            flexTes.Row = flexTes.Row + 1
            
            'Pindah fokus ke kolom pada baris yang baru
            flexTes.Col = 1
            
            'Fungsi untuk seolah-olah tombol panah bawah keyboard ditekan
            'Ini berguna ketika baris flexgrid sudah mencapai batas bawah flexgrid, maka baris paling atas seolah-olah akan dihide
            'sehingga posisi baris yang baru akan dinaikkan agar lebih kelihatan
            SendKeys "{DOWN}"
                    
        'Jika kolom yang dipilih adalah kolom yang terakhir tetapi barisnya bukan baris terakhir(baris-baris sebelum baris yang terakhir)
        ElseIf flexTes.Col = flexTes.Cols - 1 And flexTes.Row < flexTes.Rows - 1 Then
            'Pindah ke baris berikutnya(tidak membuat baris baru, tetapi pindah ke baris berikutnya)
            flexTes.Row = flexTes.Row + 1
            
            'Pindah ke kolom berikutnya
            flexTes.Col = 1
        
        Else
            'Pindah ke kolom berikutnya
            flexTes.Col = flexTes.Col + 1
        End If
        
        
    End If
End Sub


Private Sub flexTes_KeyDown(KeyCode As Integer, Shift As Integer)
    'Jika ditekan tombol ennter
    If KeyCode = 13 Then
        'Tampilkan combobox
        Call tampilCombo
        
    'Jika ditekan tombol delete
    ElseIf KeyCode = vbKeyDelete Then
        'Tidak boleh melakukan hapus pada baris yang merupakan satu-satunya baris yang tersisa
        If flexTes.Rows = 2 Then Exit Sub
        
        'Hapus baris yang dipilih
        flexTes.RemoveItem flexTes.Row
    End If
    
End Sub

Private Sub Form_Load()
    'Default combobox dihide dulu
    cbTes.Visible = False
    
    'Tambahkan item(daftar isi) combobox
    cbTes.AddItem "Item 1"
    cbTes.AddItem "Item 2"
    
    'Setting flexgrid
    Call setGrid
End Sub

Private Sub tampilCombo()
    
    cbTes.Visible = True
    
    'Inisialisasi default koordinat kiri dan atas combo
    cbTes.Left = flexTes.Left 'Koordinat kiri combo disamakan dengan koordinat kiri flexgrid
    cbTes.Top = flexTes.Top 'Koordinat atas combo disamakan dengan koordinat atas flexgrid
    
    'Looping untuk menentukan koordinat kiri combo
    'Jika kita memilih kolom ke 3, maka looping akan dilakukan mulai dari kolom ke 0 sampai kolom ke 2
    For i = 0 To flexTes.Col - 1
        cbTes.Left = cbTes.Left + flexTes.ColWidth(i) 'Pada setiap looping koordinat kiri combo akan ditambah dengan lebar cell
    Next i
    
    'Looping untuk menentukan koordinat atas combo
    'Jika kita memilih baris ke 3, maka looping akan dilakukan mulai dari baris ke 0 sampai baris ke 2
    For j = 0 To flexTes.Row - 1
        cbTes.Top = cbTes.Top + flexTes.RowHeight(j) 'Pada setiap looping koordinat atas combo akan ditambah dengan tinggi cell
    Next j
    
    
    '***Setelah melakukan kedua looping diatas, combo akan berada pada koordinat atas dan kiri kolom yang dipilih***
    
    'Jika baris paling atas yang nampak di grid merupakan baris yang lebih dari baris ke 1, koordinat top dari cbTes dikurangi akumulasi lebar baris-baris
    'sebelum baris paling atas yang nampak di grid
    If flexTes.TopRow > 1 Then
        cbTes.Top = cbTes.Top - ((flexTes.TopRow - 1) * flexTes.RowHeight(1))
    End If
    
    'Munculkan combo yang sebelumnya dihide
    cbTes.Visible = True
     
    'Sesuaikan lebar combo dengan lebar cell yang dipilih
    cbTes.Width = flexTes.ColWidth(flexTes.Col)
    
    'Fokus ke combo
    cbTes.SetFocus
    
End Sub

Private Sub setGrid()
    'Setting baris dan kolom flexgrid
    flexTes.Rows = 2 '2 baris
    flexTes.Cols = 4 '4 kolom
    
    'Lebar untuk kolom 0 langsung dipatok 500
    'Kolom 0 akan diisi nomor baris
    flexTes.ColWidth(0) = 500
    
    'Teks akan ditaruh ditengan-tengah kolom
    flexTes.ColAlignment(0) = flexAlignCenterCenter
    
    'Judul baris ke 0 pada kolom ke 1,2 dan 3
    flexTes.TextMatrix(0, 1) = "Kolom 1"
    flexTes.TextMatrix(0, 2) = "Kolom 2"
    flexTes.TextMatrix(0, 3) = "Kolom 3"
    
    'Inisialisasi awal lebar flexgrid
    flexTes.Width = 0
    
    'Looping untuk menentukan lebar flexgrid agar sesuai dengan lebar seluruh cell
    For i = 0 To flexTes.Cols - 1
        flexTes.Width = flexTes.Width + flexTes.ColWidth(i)
    Next i
    
    'Menambah lebar flexgrid agar ada celah sedikit pada ujung sebelah kanannya
    flexTes.Width = flexTes.Width + 100

    
End Sub

Private Sub isiFlexGrid()
    'Informasi baris yang dipilih user disimpan di variabel baris
    baris = flexTes.Row
    
    'Informasi kolom yang dipilih user disimpan di variabel kolom
    kolom = flexTes.Col
    
    'Beri nomor Pada setiap baris pada kolom ke 0
    flexTes.TextMatrix(baris, 0) = flexTes.Row
    
    'Pada baris dan kolom yang dipilih user, setelah user melakukan enter, akan diisi dengan teks dari combo
    flexTes.TextMatrix(baris, kolom) = cbTes.Text
End Sub

Pengumuman