Sunday, October 23, 2011

Perbedaan .ScaleWidth dan .Width pada Form - Tips dan Trik V

Apakah perbedaan property .ScaleWidth dan .Width pada Form? .Width adalah lebar dari ujung kiri sampai ujung kanan. Sedangkan .ScaleWidth adalah lebar ujung kiri sampai ujung kanan - border sisi kiri dan sisi kanan. Dengan kata lain .ScaleWidth adalah seluruh daerah Form yang bisa digunakan untuk menyimpan control, demikian pula .ScaleTop, .ScaleHeight, dan .ScaleLeft. Untuk memahaminya lebih baik maka:
  1. Buatlah project baru
  2. Tempatkan satu TextBox pada Form
  3. Copy dan pastekan kode di bawah ini:

  4. Option Explicit 

    Private Sub
    Form_Resize()
    With Text1
    .Top = Me.ScaleTop
    .Left = Me.ScaleLeft
    .Width = Me.ScaleWidth
    .Height = Me.ScaleHeight
    End With
    End Sub
  5. Jalankan.
dan tentu saja akan berbeda dengan kode di bawah ini:
Private Sub Form_Resize() 
With Text1
.Top = 0
.Left = 0
.Width = Me.Width
.Height = Me.Height
End With
End Sub
Catatan: Settinglah property Text1 .MultiLine = True dan .ScrollBar = 3 -Both

READ MORE - Perbedaan .ScaleWidth dan .Width pada Form - Tips dan Trik V

Agar Form Tidak Terpengaruh Resolusi Screen - Tips VB6

Setelah memahami perbedaan .Top, .Left, .Width, .Height dengan .ScaleTop, .ScaleLeft, .ScaleWidth, .ScaleHeight maka kita sekarang melangkah pada bagian selanjutnya mengenai tampilan yang tidak terpengaruh oleh resolusi layar. Sederhanya agar sebuah form memiliki ukuran relatif sama adalah membagi ukurannya lebar dan tinggi berdasarkan prosentase. Perhatikan 2 baris kode di bawah:
Option Explicit 

Private Sub Form_Resize()
With Form1
.Left = 0
.Top = 0
.Height = Screen.Height
.Width = Screen.Width
End With
End Sub
Kode di atas akan membuat sebuah form memiliki ukuran sama dengan tinggi dan lebar layar, berapapun resolusinya. Maka kode di bawah akan membuat form memiliki ukuran 1/2 dari ukuran layar baik tinggi maupun lebarnya, berapapun resolusi layar yang Anda setting.
Option Explicit 

Private Sub Form_Resize()
With Form1
.Left = 0
.Top = 0
.Height = (Screen.Height * 0.5) 'Ini akan membuat tinggi Form setengahnya dari layar
.Width = (Screen.Width * 0.5) 'Ini akan membuat lebar Form setengahnya dari layar.
End With
End Sub
Sekarang coba Anda rubah resolusi layar ke posisi paling ektrim terbesar atau ke posisi ektrim terendah, Apakah tinggi dan lebar Form tersebut berubah? tidak, dia tetap setengahnya dari layar. Lalu apa yang harus Anda lakukan selanjutnya, melakukan resize terhadap seluruh control (CommandButton, TextBox, Label, dan lain-lain. Nah, bagaimana caranya?
READ MORE - Agar Form Tidak Terpengaruh Resolusi Screen - Tips VB6

Control Yang Tidak Terpengaruh Oleh Resolusi Screen - Trik V

Apabila Form diiperbandingkan kepada Screen, maka control harus diperbandingkan kepada Form. Maksudnya kepada .ScaleTop, .ScaleLeft, .ScaleWidth, .ScaleHeight seperti yang telah kita pelajari sebelumnya.

Baiklah, sekarang saya akan membuat sebuah contoh control yang tidak terpengaruh oleh perubahan resolusi screen. Dalam hal ini control diwakili oleh satu CommandButton.
Option Explicit 

Private Sub
Form_Resize()
On Error Resume Next
With
Form1
.Left = 0
.Top = 0
.Height = (Screen.Height * 0.5)
.Width = (Screen.Width * 0.5)
End With
With
Command1
.Left = (Me.ScaleWidth * 0.68)
.Top = (Me.ScaleHeight * 0.78)
.Width = (Me.ScaleWidth * 0.2)
.Height = (Me.ScaleHeight * 0.1)
End With
End Sub

Nah, sekarang bagaimana jika di dalam Form tersebut terdapat 31 control, Apakah kita harus mengkodenya satu persatu? tentu saja tidak, di atas hanyalah dasar-dasar atau kode dasar untuk memudahkan pemahaman bagaimana agar form dan control tidak terpengaruh oleh resolusi screen. Adapun dalam kenyataanya, Anda harus memodifikasi dan membuatnya menjadi .Class, .Module, .OCX, .DLL agar mudah digunakan.

READ MORE - Control Yang Tidak Terpengaruh Oleh Resolusi Screen - Trik V

Cara Sederhana Mendeteksi Perubahan Resolusi Screen - Trik V

Bagaimana kita mengetahui perubahan resolusi screen dengan hanya menggunakan beberapa baris kode saja? Mendeteksi Current OS (operating system yang sedang digunakan), mendeteksi Plug n Play Device (external hardisk, flashdisc, webcam, dll), screen client area, perubahan konfigurasi system, mendeteksi perubahan waktu, dan sebagainya?.

Untuk keperluan yang telah dijelaskan di atas, kita bisa menggunakan SysInfo.OCX (Microsoft SysInfo Control 6.0). Sysinfo seakan-akan sesuatu yang mutlak diperlukan dalam membuat sebuah aplikasi yang baik. Mengapa demikian?

Di bawah ini merupakan contoh sederhananya:
Option Explicit 

Dim
strOldResolution As String

Private Sub
Form_Load()
With Timer1
.Enabled = False
.Interval = 100
End With
strOldResolution = "Resolution: " & Screen.Width / Screen.TwipsPerPixelX & _
" x " & Screen.Height / Screen.TwipsPerPixelY
Me.Caption = strOldResolution
Text1.Text = strOldResolution & vbCrLf
End Sub

Private Sub
SysInfo1_DisplayChanged()
Timer1.Enabled = True 'delay time
End Sub

Private Sub
Timer1_Timer()
Dim strText As String 'buffer variable
strText = Text1.Text
strText = strText & "Resolusi berubah menjadi: " & Screen.Width / Screen.TwipsPerPixelX & _
" x " & Screen.Height / Screen.TwipsPerPixelY & vbCrLf
Text1.Text = strText
Timer1.Enabled = False
End Sub

Dan tentu saja Anda bisa membuat modifikasi untuk disesuaikan dengan kebutuhan, misalnya seperti kode di bawah ini (kode yang berasal dari posting sebelumnya):
Option Explicit 

Private Sub
Form_Resize()
On Error Resume Next
With
Form1
.Left = 0
.Top = 0
.Height = (Screen.Height * 0.5)
.Width = (Screen.Width * 0.5)
End With
With
Command1
.Left = (Me.ScaleWidth * 0.68)
.Top = (Me.ScaleHeight * 0.78)
.Width = (Me.ScaleWidth * 0.2)
.Height = (Me.ScaleHeight * 0.1)
End With
End Sub

Private Sub
SysInfo1_DisplayChanged()
If chkNonAktif.Value = vbChecked Then Exit Sub
Timer1.Enabled = True
End Sub

Private Sub
Timer1_Timer()
Form_Resize
Timer1.Enabled = False
End Sub

Selain Sysinfo.OCX yang dibuat oleh Microsoft, Anda bisa juga menggunakan SysInfo yang dibuat oleh Karl E. Peterson, dan menurut saya ini lebih baik. Terakhir, mengapa SysInfo yang dibuat Karl E. Peterson saya anggap lebih baik?
READ MORE - Cara Sederhana Mendeteksi Perubahan Resolusi Screen - Trik V

Menambahkan Item Ke dalam ListBox tanpa Duplikat - VB6

Menggunakan fungsi API, sehingga kecepatannya bisa dikatakan sangat baik. Adapun kodenya adalah seperti di bawah ini:
Option Explicit 

Private Declare Function
SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Const
LB_FINDSTRINGEXACT As Long = &H1A2

Private Function
AddItemListUnix(lst As ListBox, ByVal sItem As String) As Boolean
If
(SendMessage(lst.hwnd, LB_FINDSTRINGEXACT, -1&, ByVal sItem) > -1) Then Exit Function
lst.AddItem sItem
End Function
Mengenai contoh penggunaannya:
Private Sub Command1_Click() 
AddItemListUnix List1, "Test"
AddItemListUnix List1, "Test"
AddItemListUnix List1, "Form"
AddItemListUnix List1, "Test"
AddItemListUnix List1, "CommandButton"
AddItemListUnix List1, "CommandButton"
End Sub
READ MORE - Menambahkan Item Ke dalam ListBox tanpa Duplikat - VB6

ListBox Load Table - 10 s/d 20 X Lebih Cepat - Tips dan Tric

Option Explicit

Tentu Anda sudah tidak asing lagi dengan potongan kode di bawah:
Do While Recordset.EOF = False 
ListBox.AddItem Recordset!Field
Recordset.MoveNext
Loop

Atau kode di bawah ini:
For i = 1 To Recordset.RecordCount 
ListBox.AddItem Recordset!Field
Recordset.MoveNext
Next

Kedua kode di atas digunakan untuk mem-populate (mengisi) ListBox atau ComboBox dengan Field dari sebuah database. Kode di atas bisa menjadi 10 s/d 20 kali lebih cepat dengan sedikit memodifikasi kodenya yakni dengan membuat satu variable yang diperlakukan sebagai buffer. Coba Anda bandingkan dua kode di bawah ini:
Private Sub Command2_Click() 

Dim L As Long
Dim v As Variant
Dim t As Double

t =
GetTickCount
Set adoPrimaryRS = New Recordset
adoPrimaryRS.Open "SELECT isbn FROM [Title Author] ORDER BY isbn", db, adOpenStatic, adLockOptimistic

List1.Clear
List1.Visible = False

For L =
0 To adoPrimaryRS.RecordCount - 1
List1.AddItem adoPrimaryRS!isbn
adoPrimaryRS.MoveNext
Next

List1.Visible = True
Me.Caption = GetTickCount - t & " milliseconds"

End Sub

Dengan kode di bawah ini:
Private Sub Command1_Click() 

Dim L As Long
Dim v As Variant
Dim t As Double

t =
GetTickCount
Set adoPrimaryRS = New Recordset
adoPrimaryRS.Open "SELECT isbn FROM [Title Author] ORDER BY isbn", db, adOpenStatic, adLockOptimistic

List1.Clear
List1.Visible = False
v =
adoPrimaryRS.GetRows

For L =
0 To adoPrimaryRS.RecordCount - 1
List1.AddItem v(0, L)
Next

v = Empty

List1.Visible = True
Me.Caption = GetTickCount - t & " milliseconds"

End Sub

Catatan: Dua kode di atas digunakan untuk mengakses database BIBLIO.MDB.
READ MORE - ListBox Load Table - 10 s/d 20 X Lebih Cepat - Tips dan Tric