Bagaimana saya bisa menggunakan warna khusus di editor Microsoft VBA?

33

Saya sedang mengerjakan beberapa proyek untuk bekerja menggunakan Excel dan VBA, jadi saya tidak punya pilihan selain menggunakan Microsoft Visual Basic editor. Saya biasanya tidak keberatan, tetapi saya tidak tahu cara mengatur warna khusus untuk editor (saya hanya dapat memilih dari palet default).

Untuk mengubah warna saat ini, saya pergi ke Tools -> Options -> Editor Format... Namun, pilihan Anda hanya terbatas pada 16 warna default (dan dasar) - dan ketika saya mengatakan dasar, maksud saya dasar , seperti pink, biru, hitam, putih, dll. ..

Adakah yang tahu bagaimana cara menentukan warna khusus, atau paling tidak, mengubah beberapa warna yang muncul di palet default?

Penerobosan
sumber
Saya pikir apa yang coba diceritakan oleh Microsoft kepada kami adalah bahwa mereka tidak ingin orang-orang memprogram dalam VBA. Atau mungkin Bill Gates giat menjadi produsen pembunuh rasa sakit.
Holene

Jawaban:

19

VBA membaca pengaturan untuk warna dari kunci registri ini:

HKEY_CURRENT_USER \ Software \ Microsoft \ VBA \ 6.0 \ Common \ CodeForeColors HKEY_CURRENT_USER \ Software \ Microsoft \ VBA \ 6.0 \ Common \ CodeBackColors

Masing-masing tombol ini berisi daftar nilai (dipisahkan oleh spasi) untuk setiap entri di dalam Alat -> Opsi -> Format Editor. Misalnya, nilai pertama di dalam CodeBackColors adalah warna latar belakang dan nilai pertama di dalam CodeForeColors adalah warna latar depan untuk teks normal. Nilainya adalah id internal untuk warna, 0 berarti pewarnaan AUTO, 11 menunjukkan cyan, 5 merah dll.

Untuk mencobanya: Tutup Excel, ubah nilai pertama CodeBackColors menjadi 5 dan mulai ulang Excel. Latar belakang editor kode sekarang akan berwarna merah.

Masalahnya adalah bahwa Editor VBA hanya mendukung nilai-nilai internal ini dan angka tertinggi yang dipahami adalah 16. Nilai lainnya tidak akan diterima dan defaultnya kembali ke AUTO.

Saya telah mencoba beberapa opsi untuk memasukkan nilai yang berbeda (mis. 128255128, 16777215, #aaffee, 255 atau "170.255.238") dan tidak ada yang bekerja.

Karena itu saya pikir secara teknis tidak mungkin untuk menetapkan warna lain.

Tex Hex
sumber
1
Terima kasih atas jawabannya. IIRC, Anda tidak dapat menarik hadiah, tetapi jika Anda benar-benar tidak dapat melakukan ini, maka saya akan memberikannya kepada Anda untuk jawaban yang paling benar. Saya ingin menunggu lebih lama untuk melihat apakah ada lebih banyak jawaban yang diposting, tetapi terima kasih atas tanggapan Anda, +1.
Terobosan
1
Saya harus akui, kedengarannya lebih baik :)
Tex Hex
"Total Visual CodeTools" ( fmsinc.com/vb6/CodingTools.html ) dari FMS memiliki alat "Manajer Skema VBE Warna untuk dengan mudah melihat dan mengatur warna untuk editor Anda". Jika Anda mengunduh manual pengguna (PDF) itu menunjukkan tangkapan layar itu sementara membuatnya lebih mudah untuk mengatur warna masih terbatas pada 16 palet warna. Akan berpikir jika ada cara langsung untuk menggunakan warna kustom mereka akan memasukkannya ke dalam alat ini. Sepertinya Tex Hex benar.
Brian
Seperti yang sekarang telah ditunjukkan dengan jawaban di bawah ini bahwa itu mungkin, jawaban ini harus diubah. Dimungkinkan untuk secara andal mengubah warna dalam VBA Editor menggunakan editor HEX.
Steven Martin
16

Saya membuat aplikasi berdasarkan informasi yang ditemukan di sini: https://github.com/dimitropoulos/VBECustomColors

Ini pada dasarnya membuat cadangan file .dll VBE6 / VBE7 dan memungkinkan penggunaan warna kustom tanpa harus menggunakan hex editor.

ss

Anda dapat mengunduhnya di sini: https://github.com/gallaux/VBEThemeColorEditor

Nikmati

Sunting: Kode sumber sekarang tersedia!

Gallaux
sumber
Wow super cool, terima kasih sudah berbagi @allall - Saya pasti akan memeriksanya. Apakah Anda berencana merilis kode sumber karena penasaran?
Terobosan
Ya saya akan segera, saya hanya perlu membersihkannya sedikit;)
gallaux
Terima kasih Gallaux, saya bermaksud melakukan hal yang sama, tetapi begitu saya mendapatkan editor vba saya untuk skema warna yang saya sukai, saya kehilangan motivasi itu karena saya tidak lagi sebagai "ketegangan warna 16 mata" lagi!
Steven Martin
1
Maaf bagaimana menerapkan ini, saya butuh bantuan
Pedro Miguel Pimienta Morales
1
@YouCrackedMeUp Anda perlu memperbarui kunci registri menggunakan regedit (berdasarkan github.com/dimitropoulos/VBECustomColors ): [1] Navigasi di regedit ke HKEY_CURRENT_USER\Software\Microsoft\VBA\7.1\Common. [2] Perubahan CodeBackColorske: 2 7 1 13 15 2 2 2 11 9 0 0 0 0 0 0. [3] Perubahan CodeForeColorske: 13 5 12 1 6 15 8 5 1 1 0 0 0 0 0 0. [4] perubahan FontFaceke: Consolas.
Tigregalis
7

TeX HeX sangat tepat. Namun, itu mungkin untuk mengubah 16 warna bawaan dengan Anda sendiri. Itu hanya membutuhkan sedikit pengeditan hex. Berikut panduan langkah demi langkah. (Catatan: Ini untuk VB6 SP6, versi file 6.0.97.82).

  1. Cadangkan file VB6.EXE Anda di folder program VB98 Anda. (Opsional, tetapi disarankan).

  2. Jalankan hex editor favorit Anda (berteriak ke HxD) dan buka VB6.EXE.

  3. Langsung ke alamat 0xE22F4. Ini adalah awal dari tabel warna.

Anda akan melihat empat nol. Ini mewakili warna hitam dalam format RRGGBBAA (alpha tidak didukung jadi itu benar-benar hanya format RRGGBB00). Empat byte berikutnya menentukan warna berikutnya dan seterusnya hingga Anda mendapatkan FFFFFF00 (putih) yang berakhir pada offset 0xE2333.

  1. Edit salah satu dari nilai empat-byte ini ke pilihan Anda. Cukup gunakan nilai hex yang sesuai dalam format RGB, diikuti oleh byte nol. Misalnya, RGB (64, 128, 192) akan menjadi 40 80 C0 00.

  2. Simpan perubahan Anda ke EXE dan jalankan VB6. Anda harus melihat warna baru Anda di slot yang sebelumnya ditempati oleh warna VB bawaan.

Obligasi
sumber
1
Hmm, saya mencari dengan alat semuanya pada sistem dengan office 2003 dan tidak menemukan file bernama VB6.exe atau folder VB98. Apakah jawaban ini hanya untuk Office 2007 seperti yang dimiliki OP? Namun versi 6.0.97.82 lebih tua dari saya dengan Office 2003.
nixda
1
@nixda Tidak ada di sistem saya juga - Saya pikir Bond mengacu pada aplikasi VB6 pada sistemnya, bukan VBA yang terintegrasi ke dalam Excel. Saya akan melihat melalui executable Excel dan beberapa DLL VBA, dan melihat apakah saya dapat menemukan tabel warna.
Terobosan
1
Saya memiliki Office 2010 di PC saya jadi saya punya VBE7.DLL, bukan VBE6.DLL, tetapi harus proses yang sama. Warnanya sama. Jika Anda melihat warna dalam urutan yang ditampilkan, mereka harus: Hitam = 00 00 00 00 Angkatan Laut = 00 00 80 00 Hijau = 00 80 00 00 Turqoise = 00 80 80 00 Magenta = 80 00 00 00 Violet = 80 00 80 00 Zaitun = 80 80 00 00 Lgt Gray = C0 C0 C0 00 Drk Gray = 80 80 80 00 ... Saya telah menambahkan kode warna hex di sebelah masing-masing. Jadi cukup buka VBE6.DLL dalam hex editor dan cari hex string berikut:
Bond
1
00000000000080000080000000808000800000008000800080800000C0C0C00080808000 Mungkin terjadi beberapa kali tapi saya telah menemukan bahwa tabel warna pertama adalah semua yang perlu dimodifikasi. Lihat apakah itu cocok untuk Anda.
Obligasi
1
Jawaban yang luar biasa, Bond. Untuk pembaca masa depan, kunci yang perlu saya ubah adalah yang kedua (Office 2013, Windows 8.1), yang terletak di `12 50B4 'menggunakan Hex Edit (Byte No. 1.200.308)
Andy Terra
5

Seperti yang sudah banyak dicatat, solusi Bond (hex mengedit tabel warna di VB6.exe) akan berfungsi tetapi Anda harus masuk dan mengatur ulang warna Anda dalam dialog opsi setiap kali Anda memulai VB6. Saya telah membuat skrip AutoIt yang akan melakukan semua pekerjaan untuk Anda, cukup edit seperlunya jika semua panggilan ke SetSyntaxColoring () dibuat:

Opt("WinTitleMatchMode", 2)
Opt("MouseClickDelay", 1)
Opt("MouseClickDownDelay", 1)
Opt("MouseClickDragDelay", 1)
Opt("SendKeyDelay", 1)
Opt("SendKeyDownDelay", 1)

Const $NORMALTEXT = 0
Const $SELECTIONTEXT = 1
Const $SYNTAXERRORTEXT = 2
Const $EXECUTIONPOINTTEXT = 3
Const $BREAKPOINTTEXT = 4
Const $COMMENTTEXT = 5
Const $KEYWORDTEXT = 6
Const $IDENTIFIERTEXT = 7
Const $BOOKMARKTEXT = 8
Const $CALLRETURNTEXT = 9

Const $AUTO = 0
Const $BLACK = 1
Const $DARKBLUE = 2
Const $DARKGREEN = 3
Const $DARKRED = 4
Const $DARKBABYBLUE = 5
Const $DARKPINK = 6
Const $DARKYELLOW = 7
Const $LIGHTGRAY = 8
Const $DARKGRAY = 9
Const $BLUE = 10
Const $GREEN = 11
Const $BABYBLUE = 12
Const $RED = 13
Const $PINK = 14
Const $YELLOW = 15
Const $WHITE = 16

If WinExists( "Microsoft Visual Basic" ) Then
   WinActivate("Microsoft Visual Basic") ; activates the visual basic window
   Send("!+to") ; opens the options menu
   Sleep(10)
   WinMove("Options", "", 0, 0) ; moves the options menu to the upper left corner of the screen
   MouseClick("primary", 100, 50, 1, 0) ; clicks the editor tab

   SetSyntaxColoring($NORMALTEXT, $WHITE, $BLACK)
   SetSyntaxColoring($SELECTIONTEXT, $AUTO, $AUTO)
   SetSyntaxColoring($SYNTAXERRORTEXT, $BLACK, $YELLOW)
   SetSyntaxColoring($EXECUTIONPOINTTEXT, $AUTO, $YELLOW)
   SetSyntaxColoring($BREAKPOINTTEXT, $WHITE, $DARKRED)
   SetSyntaxColoring($COMMENTTEXT, $DARKGREEN, $BLACK)
   SetSyntaxColoring($KEYWORDTEXT, $GREEN, $BLACK)
   SetSyntaxColoring($IDENTIFIERTEXT, $WHITE, $BLACK)
   SetSyntaxColoring($BOOKMARKTEXT, $WHITE, $BLACK)
   SetSyntaxColoring($CALLRETURNTEXT, $WHITE, $GREEN)

   MouseClick("primary", 210, 340, 1, 0) ; hit the ok button to apply the changes
EndIf

Func SetSyntaxColoring($syntax, $forecolor, $backcolor)
   SelectSyntax($syntax)
   SelectForecolor($forecolor)
   SelectBackcolor($backcolor)
EndFunc

Func SelectSyntax($syntax)
   ResetSyntaxList()
   RptSend("{DOWN}", $syntax)
EndFunc

Func SelectForecolor($color)
   ResetForecolorCbo()
   RptSend("{DOWN}", $color)
EndFunc

Func SelectBackcolor($color)
   ResetBackcolorCbo()
   RptSend("{DOWN}", $color)
EndFunc

Func ResetSyntaxList()
   MouseClick("primary", 50, 95, 1, 0)
   RptSend("{UP}", 9)
EndFunc

Func ResetForecolorCbo()
   MouseClick("primary", 50, 235, 1, 0)
   MouseClick("primary", 50, 235, 1, 0)
   RptSend("{UP}", 16)
EndFunc

Func ResetBackcolorCbo()
   MouseClick("primary", 125, 235, 1, 0)
   MouseClick("primary", 125, 235, 1, 0)
   RptSend("{UP}", 16)
EndFunc

Func RptSend($text, $rpt)
   For $i = 1 To $rpt
      Send($text)
   Next
EndFunc

Saya hanya menyimpannya di desktop saya dan sekarang setiap kali saya harus membuka vb6 saya hanya klik dua kali dan hanya saja pewarnaan sintaks di bawah kendali saya.

Sunting 1: Dioptimalkan skrip sedikit untuk membuatnya berjalan lebih cepat. Saya berpikir untuk menyusun program yang akan mengedit VB6.EXE untuk Anda secara otomatis untuk membuat pemilihan warna lebih mudah. Saya ingin tahu apakah ada cara untuk membuang skrip AutoIt dengan membuat plugin untuk VS?

Sunting 2: Membuat utilitas yang memungkinkan Anda untuk mengedit warna di exe tanpa harus menggunakan hex editor: VbClassicColorEditor . Tautan itu menuju repositori publik di bitbucket.

Dylan Nissley
sumber
Terima kasih atas skrip dan kontribusinya! Apakah ada kemungkinan kita bisa mendapatkan tautan yang diperbarui di VbClassicColorEditor? Yang Anda poskan memiliki 404d ...
Andy Terra
3

Saya hanya ingin memposting ringkasan dari jawaban sebelumnya karena tidak sepenuhnya jelas apa yang perlu dilakukan untuk mengubah warna di Excel VBA Editor

Dalam contoh di bawah ini saya menambahkan skema warna untuk Solarized dan saya mengasumsikan penggunaan Office 2010

Langkah 0: Buat cadangan VBE7.dll sebelum memodifikasinya - Anda telah diperingatkan !!!

Langkah 1: Di Hex Editor, buka VBE7.dll terletak @

"C:\Program Files\Common Files\microsoft shared\VBA\VBA7\VBE7.DLL" untuk 64bit

atau

"C:\Program Files( x86)\Common Files\microsoft shared\VBA\VBA7\VBE7.DLL" untuk 32bit

Langkah 2: Cari 1st terjadinya

ff ff ff 00 c0 c0 c0 00 80 80 80 00 00 00 00 00
ff 00 00 00 80 00 00 00 ff ff 00 00 80 80 00 00
00 ff 00 00 00 80 00 00 00 ff ff 00 00 80 80 00
00 00 ff 00 00 00 80 00 ff 00 ff 00 80 00 80 00`

dan ganti dengan

00 2b 36 00 07 36 42 00 58 6e 75 00 65 7b 83 00
83 94 96 00 93 a1 a1 00 ee e8 d5 00 fd f6 e3 00
b5 89 00 00 cb 4b 16 00 dc 32 2f 00 d3 36 82 00
6c 71 c4 00 26 8b d2 00 2a a1 98 00 85 99 00 00

Langkah 3: Temukan kejadian ke - 2 ini (pastikan Anda mencari dari atas file)

00 00 00 00 00 00 80 00 00 80 00 00 00 80 80 00
80 00 00 00 80 00 80 00 80 80 00 00 c0 c0 c0 00
80 80 80 00 00 00 ff 00 00 ff 00 00 00 ff ff 00
ff 00 00 00 ff 00 ff 00 ff ff 00 00 ff ff ff 00

dan ganti dengan

00 2b 36 00 07 36 42 00 58 6e 75 00 65 7b 83 00
83 94 96 00 93 a1 a1 00 ee e8 d5 00 fd f6 e3 00
b5 89 00 00 cb 4b 16 00 dc 32 2f 00 d3 36 82 00
6c 71 c4 00 26 8b d2 00 2a a1 98 00 85 99 00 00

Langkah 4: Simpan file dll dan kemudian buka Excel> VBA Editor> Tools> Options> Format Editor dan atur warna kode.

Mengubah kedua string itu perlu karena memungkinkan untuk warna untuk menyimpan dengan benar pada shutdown dan memungkinkan editor warna untuk membuka tanpa menabrak excel.

Terima kasih kepada semua penjawab sebelumnya untuk meluangkan waktu untuk mencari tahu!

Steven Martin
sumber
3

Saya telah membuat program yang mengotomatiskan semua ini, menghabiskan waktu terlalu lama untuk itu, bersenang-senang membuat pemetik warna. Dibuat di VB6 karena mengapa tidak. Program dan kode sumber yang dikompilasi tersedia di sini . Diuji hanya pada versi DLL dan VB6 saya, harap buat cadangan sebelum mengubah apa pun - lokasi ditetapkan dalam kode.



Ini adalah pertanyaan yang sangat lama tetapi saya ingin menimbang untuk kelengkapan

Untuk Warna VS2012 dalam VBA atau VB6 IDE: Buka VBE6.DLL / VBE7.DLL atau VBA6.DLL di

C:\Program Files (x86)\Common Files\microsoft shared\VBA\
or
C:\Program Files (x86)\VB98\ (Your VB6 install location)

dengan hex editor Anda

Ganti kemunculan pertama

ff ff ff 00 c0 c0 c0 00 80 80 80 00 00 00 00 00
ff 00 00 00 80 00 00 00 ff ff 00 00 80 80 00 00
00 ff 00 00 00 80 00 00 00 ff ff 00 00 80 80 00
00 00 ff 00 00 00 80 00 ff 00 ff 00 80 00 80 00

Dengan

ff ff ff 00 1e 1e 1e 00 d4 d4 d4 00 00 00 00 00
ff 00 00 00 26 4f 78 00 ff ff 00 00 d6 9d 85 00
00 ff 00 00 60 8b 4e 00 00 ff ff 00 00 80 80 00
00 00 ff 00 56 9c d6 00 ff 00 ff 00 9f 74 b1 00

Kemudian kembali ke atas dan ganti kemunculan kedua

00 00 00 00 00 00 80 00 00 80 00 00 00 80 80 00
80 00 00 00 80 00 80 00 80 80 00 00 c0 c0 c0 00
80 80 80 00 00 00 ff 00 00 ff 00 00 00 ff ff 00
ff 00 00 00 ff 00 ff 00 ff ff 00 00 ff ff ff 00

dengan

00 00 00 00 56 9c d6 00 60 8b 4e 00 d6 9d 85 00
26 4f 78 00 9f 74 b1 00 d6 9d 85 00 1e 1e 1e 00
d4 d4 d4 00 00 00 ff 00 00 ff 00 00 00 ff ff 00
ff 00 00 00 ff 00 ff 00 ff ff 00 00 ff ff ff 00

Kemudian modifikasi berikut ini di registri

(For VBA)
HKEY_CURRENT_USER\Software\Microsoft\VBA\6.0\Common    
HKEY_CURRENT_USER\Software\Microsoft\VBA\7.1\Common

(For VB6)
HKEY_CURRENT_USER\Software\Microsoft\VBA\Microsoft Visual Basic 

FontFace = 'Consolas'
CodeForeColors = '8 3 5 4 1 10 14 3 4 4 0 0 0 0 0 0 '
CodeBackColors = '2 6 4 8 10 2 2 2 16 10 11 12 13 14 15 0 '

Jika Anda memodifikasi untuk VBA Anda selesai, untuk VB6 sekarang buka 'VB6.exe' di Hex editor Anda dan modifikasi kejadian pertama

00 00 00 00 00 00 80 00 00 80 00 00 00 80 80 00
80 00 00 00 80 00 80 00 80 80 00 00 c0 c0 c0 00
80 80 80 00 00 00 ff 00 00 ff 00 00 00 ff ff 00
ff 00 00 00 ff 00 ff 00 ff ff 00 00 ff ff ff 00

dengan

00 00 00 00 56 9c d6 00 60 8b 4e 00 d6 9d 85 00
26 4f 78 00 9f 74 b1 00 d6 9d 85 00 1e 1e 1e 00
d4 d4 d4 00 00 00 ff 00 00 ff 00 00 00 ff ff 00
ff 00 00 00 ff 00 ff 00 ff ff 00 00 ff ff ff 00

Ini mengoreksi warna yang ditampilkan di antarmuka VB6 sehingga jika Anda ingin membuat perubahan lain pada warna yang Anda bisa.

Terima kasih untuk semua jawaban yang lain, saya sendiri tidak menemukan ini, saya pikir berguna untuk memiliki semua informasi yang diperlukan dalam satu posting (tidak pernah saya melihat memodifikasi VB6.exe dan VBA6.dll bersama-sama). Dengan menggunakan metode ini Anda harus dapat dengan bebas memilih dari warna yang tersedia.

Saya juga menata ulang warna dari beberapa jawaban lain sehingga tidak mengubah vbRed, vbBlue, vbWhite dll sehingga Anda masih harus mendapatkan hasil yang diinginkan dalam kode. Ini belum sepenuhnya diuji sehingga selalu memodifikasi program dengan risiko Anda sendiri.

Akan menyenangkan untuk menyusun sebuah program kecil yang akan melakukan ini untuk Anda (seperti Gallaux lakukan), saya punya masalah dengan menulis ke registri dan VB6 IDE menggunakan program itu, dan datang semacam jendela pratinjau akan menyenangkan.

Keterbatasan yang saya temukan: ini tidak mengubah warna ikon indikator, Anda harus melakukannya sendiri.

Sam
sumber
2

Mengambil umpan dari respons dnissley (di mana dia bertanya apakah seseorang dapat membuat add-in), saya telah membuat add-in untuk VB6. Ini sedikit kasar (dan saya akan menjelaskan mengapa sebentar lagi), tetapi itu memang berhasil.

Saya membuat proyek Add-In baru di VB6 yang memberi saya bentuk "frmAddin" default (yang tidak saya gunakan) dan desainer "Connect". Saya sendiri telah menambahkan kelas Warna yang berisi yang berikut:

Opsi Eksplisit

Dim m_iForeColour Sebagai Integer
Dim m_iBackColour Sebagai Integer
Dim m_iIndicatorColour Sebagai Integer

Properti Publik Biarkan ForeColour (ByVal iID Sebagai Integer)
    m_iForeColour = iID
Akhiri Properti
Properti Publik Dapatkan ForeColour () Sebagai Integer
    ForeColour = m_iForeColour
Akhiri Properti

Properti Publik, Biarkan BackColour (ByVal iID Sebagai Integer)
    m_iBackColour = iID
Akhiri Properti
Properti Publik Dapatkan BackColour () Sebagai Integer
    BackColour = m_iBackColour
Akhiri Properti

Properti Publik Biarkan IndicatorColour (ByVal iID Sebagai Integer)
    m_iIndicatorColour = iID
Akhiri Properti
Properti Publik Dapatkan IndicatorColour () Sebagai Integer
    IndicatorColour = m_iIndicatorColour
Akhiri Properti

Dan kemudian saya telah mengubah kode di "Connect" Designer menjadi sebagai berikut:

Opsi Eksplisit

Form Publik Ditampilkan sebagai Boolean
VBInstance Publik Sebagai VBIDE.VBE
Redup mcbMenuCommandBar Sebagai Office.CommandBarControl
Dim mfrmAddIn As New frmAddIn
Public WithEvents MenuHandler Sebagai pengendali event perintah CommandBarEvents '

Dim mcbToolbar Sebagai Office.CommandBarControl
Public WithEvents MenuHandler2 Sebagai CommandBarEvents

Redup codeColours () As Color

'************************************************* ****************************
'RunScript Sub
'------------------------------------------------- ----------------------------
'DESCRIPTION:
'Menjalankan kode yang menetapkan warna yang diperlukan untuk jendela kode di
'IDE aktif.
'*** SEBUAH PROYEK HARUS DIBERI SEBELUM INI AKAN SEBENARNYA BEKERJA ***
'************************************************* ****************************
Sub RunScript ()
    BacaColoursFile

    'Pilih Alat> Opsi
    SendKeys "% to", 5
    'Buka tab, pilih "Opsi"
    SendKeys "+ {TAB}"
    SendKeys "{RIGHT}"

    'Pilih kotak daftar
    SendKeys "{TAB}"

    Dim colourSetting As Color
    Dim iColour Sebagai Integer

    Untuk iColour = 0 Sampai 9
        SetColours iColour, codeColours (iColour)
    IColour berikutnya

    SendKeys "~"
End Sub

'************************************************* ****************************
'BacaColoursFile Sub
'------------------------------------------------- ----------------------------
'DESCRIPTION:
'Membaca file warna dari disk dan mengisi array codeColours yang
'digunakan oleh metode SetColour * untuk memilih warna yang benar
'Layar opsi.
'************************************************* ****************************
Sub ReadColoursFile ()
    Dim colourLine As String
    Dim colourArray () As String
    Dim colourSetting As Color
    Redupkan OFSO Sebagai FileSystemObject

    Set oFSO = FileSystemObject Baru

    Jika Tidak oFSO.FileExists (App.Path & "\ VB6CodeColours.dat") Lalu
        MsgBox "VB6CodeColours.dat tidak ditemukan di" & App.Path, vbOKHanya, "File Pengaturan VB6CodeColours tidak ditemukan!"
        Keluar Sub
    Berakhir jika

    Set oFSO = Tidak Ada

    Buka App.Path & "\ VB6CodeColours.dat" Untuk Input Sebagai # 1
    ReDim codeColours (9) As Color

    While Not EOF (1)
        Input Baris # 1, colourLine
        colourArray = Berpisah (colourLine, ",")

        If IsNumeric (colourArray (0)) Kemudian
            Jika codeColours (colourArray (0)) Tidak Ada Maka
                Set colourSetting = Warna Baru

                If IsNumeric (colourArray (1)) Kemudian
                    colourSetting.ForeColour = CInt (colourArray (1))
                Berakhir jika

                If IsNumeric (colourArray (2)) Kemudian
                    colourSetting.BackColour = CInt (colourArray (2))
                Berakhir jika

                If IsNumeric (colourArray (3)) Lalu
                    colourSetting.IndicatorColour = CInt (colourArray (3))
                Berakhir jika

                Set codeColours (colourArray (0)) = colourSetting
            Berakhir jika
        Berakhir jika
    Pergi ke

    Tutup # 1

    Set colourSetting = Tidak Ada
End Sub

'************************************************* ****************************
'SetColours Sub
'------------------------------------------------- ----------------------------
'DESCRIPTION:
'Memilih item warna dari daftar dan kemudian beralih ke pemilih warna
Kontrol terkait dengan item itu dan menetapkannya sesuai dengan nilai
diatur dalam file VB6CodeColours.dat.
'************************************************* ****************************
Sub SetColours (ByVal iColour As Integer, ByRef colourSetting As Color)
    Dim iKey As Integer

    SendKeys "{HOME}"

    Untuk iKey = 1 Ke iColour
        SendKeys "{BAWAH}"
    IKey selanjutnya

    SetColourSelector colourSetting.ForeColour
    SetColourSelector colourSetting.BackColour
    SetColourSelector colourSetting.IndicatorColour

    SendKeys "+ {TAB}"
    SendKeys "+ {TAB}"
    SendKeys "+ {TAB}"
End Sub

'************************************************* ****************************
'SetColourSelector Sub
'------------------------------------------------- ----------------------------
'DESCRIPTION:
'Atur warna dalam combo pemilih. Mengasumsikan fokus ada pada
kontrol sebelumnya sebelum kode dijalankan (tab baris pertama ke
(asumsi kendali).
'************************************************* ****************************
Sub SetColourSelector (ByVal iColour As Integer)
    Dim iKey As Integer

    SendKeys "{TAB}"
    SendKeys "{HOME}"

    Untuk iKey = 1 Ke iColour
        SendKeys "{BAWAH}"
    IKey selanjutnya
End Sub

'************************************************* ****************************
'AddinInstance_OnConnection Sub
'------------------------------------------------- ----------------------------
'DESCRIPTION:
'Metode ini berjalan ketika addin dimuat oleh IDE
'************************************************* ****************************
Private Sub AddinInstance_OnConnection (Aplikasi ByVal Sebagai Objek, ByVal ConnectMode Sebagai AddInDesignerObjects.ext_ConnectMode, ByVal AddInInst Sebagai Object, custom () Sebagai Variant)
    On Error GoTo ErrorHandler

    'simpan instance vb
    Set VBInstance = Aplikasi

    Jika ConnectMode ext_cm_External Lalu
        Set mcbMenuCommandBar = AddToAddInCommandBar ("VB6 Code Coloring")
        tenggelamkan acara
        Setel Me.MenuHandler = VBInstance.Events.CommandBarEvents (mcbMenuCommandBar)

        Dim oStdToolbar Sebagai Office.CommandBar
        Redup oStdToolbarItem Sebagai Office.CommandBarControl

        Set oStdToolbar = VBInstance.CommandBars ("Standard")
        Set oStdToolbarItem = oStdToolbar.Controls.Add (Jenis: = msoControlButton)
        oStdToolbarItem.Style = msoButtonCaption
        oStdToolbarItem.Caption = "Atur Warna IDE"
        oStdToolbarItem.BeginGroup = Benar
        Setel Me.MenuHandler2 = VBInstance.Events.CommandBarEvents (oStdToolbarItem)
    Berakhir jika

    Keluar Sub
ErrorHandler:
    MsgBox Err.Deskripsi
End Sub

'************************************************* ****************************
'AddinInstance_OnDisconnection Sub
'------------------------------------------------- ----------------------------
'DESCRIPTION:
'Metode ini berjalan ketika addin dihapus oleh IDE dan membersihkan apa pun
referensi dll
'************************************************* ****************************
Private Sub AddinInstance_OnDisconnection (ByVal RemoveMode Sebagai AddInDesignerObjects.ext_DisconnectMode, custom () Sebagai Variant)
    On Error Resume Selanjutnya

    'hapus entri bilah perintah
    mcbMenuCommandBar.Delete

    matikan Add-In
    Jika FormDisplayed Maka
        SaveSetting App.Title, "Pengaturan", "DisplayOnConnect", "1"
        FormDisplayed = Salah
    Lain
        SaveSetting App.Title, "Pengaturan", "DisplayOnConnect", "0"
    Berakhir jika

    Bongkar mfrmAddIn
    Setel mfrmAddIn = Tidak Ada

    Set MenuHandler = Tidak Ada
    Set MenuHandler2 = Tidak Ada
End Sub

'************************************************* ****************************
'MenuHandler_Klik Sub
'------------------------------------------------- ----------------------------
'DESCRIPTION:
'Metode ini melakukan tugas yang diperlukan ketika item menu diklik.
'************************************************* ****************************
Sub Menu PribadiHandler_Click (ByVal CommandBarControl Sebagai Objek, ditangani Sebagai Boolean, CancelDefault Sebagai Boolean)
    RunScript
End Sub

'************************************************* ****************************
'MenuHandler2_Klik Sub
'------------------------------------------------- ----------------------------
'DESCRIPTION:
'Metode ini melakukan tugas yang diperlukan ketika tombol bilah alat diklik.
'************************************************* ****************************
Sub Menu PribadiHandler2_Click (ByVal CommandBarControl Sebagai Objek, ditangani Sebagai Boolean, CancelDefault Sebagai Boolean)
    RunScript
End Sub

'************************************************* ****************************
'AddToAddInCommandBar Sub
'------------------------------------------------- ----------------------------
'DESCRIPTION:
'Menambahkan item yang ditentukan ke daftar menu.
'************************************************* ****************************
Fungsi AddToAddInCommandBar (sCaption As String) Sebagai Office.CommandBarControl
    Dim cbMenuCommandBar Sebagai objek bar perintah Office.CommandBarControl '
    Dim cbMenu Sebagai Object

    On Error Resume Selanjutnya

    'lihat apakah kita dapat menemukan menu Add-in
    Set cbMenu = VBInstance.CommandBars ("Add-in")
    Jika cbMenu tidak berarti apa-apa
        'tidak tersedia sehingga kami gagal
        Fungsi Keluar
    Berakhir jika

    On Error GoTo ErrorHandler

    'tambahkan ke bilah perintah
    Set cbMenuCommandBar = cbMenu.Controls.Add (1)
    'atur keterangan
    cbMenuCommandBar.Caption = sCaption

    Setel AddToAddInCommandBar = cbMenuCommandBar

    Fungsi Keluar
ErrorHandler:
    'Keluar dengan anggun
Fungsi Akhir

Kode ini memungkinkan aplikasi untuk membaca warna yang saya inginkan dari file yang berada di direktori yang sama dengan .dll (disebut VB6CodeColours.dat). File ini berisi yang berikut (dan itu akan bervariasi berdasarkan warna yang Anda ganti di VB6.EXE sehingga copy & paste langsung mungkin tidak akan berfungsi.

0,14,12,0
1,0,0,0
2,16,13,0
3,0,15,15
4,16,5,5
5,7,12,0
6,11,12,0
7,8,12,0
8,16,10,10
9,16,3,3

Tampak omong kosong, tapi saya akan jelaskan. Ini memiliki format "Kode Warna", "Latar Depan", "Latar Belakang", Indikator "sehingga baris atas akan mengatur" Teks Normal "ke item ke-14 dalam kombo untuk Latar Depan, ke-12 untuk Latar Belakang dan ke-1 untuk Indikator .

Mengapa saya mengatakan ini adalah solusi yang cukup kasar: * Menggunakan SendKeys. Tidak ada penjelasan lebih lanjut yang diperlukan di sana saya yakin :) * Pengguna harus mengklik opsi menu / toolbar agar dapat berlaku. * Kode tidak terstruktur terbaik (menurut saya) tetapi didasarkan pada jumlah waktu yang saya dapat persembahkan untuk itu pada saat itu. Saya bertujuan untuk memperbaikinya di masa depan, tetapi berfungsi dengan baik untuk saya dalam kondisi saat ini (jadi saya mungkin akan meninggalkannya!)

Mungkin dengan dasar, seseorang dapat mengembangkannya lebih jauh.

Jonifen
sumber
2

Inilah trik bagaimana menjaga pemilihan warna Anda tetap. Pengeditan hex sedikit lebih. Jika Anda melakukan penggantian yang disarankan oleh Bond, Anda harus memiliki yang berikut ini di tangan Anda: Nilai RGBA untuk warna dasar (klasik) yang diindeks dari 0 hingga 15, dan nilai RGBA untuk warna kustom Anda diindeks dengan cara yang sama. Sekarang cari VBEx.DLL untuk urutan byte yang dibangun dari nilai-nilai RGBA "klasik" yang diurutkan dalam urutan indeks berikut: 15, 7, 8, 0, 12, 4, 14, 6, 10, 10, 2, 11, 3, 9, 1 , 13, 5 (yaitu putih, abu-abu, abu-abu gelap, hitam, merah, merah tua, dll.). Pola tidak acak, itu berasal dari nilai-nilai, disimpan dalam registri, lihat posting Tex Hex. String hex untuk pencarian akan terlihat seperti 'FFFFFF00C0C0C0008080800000000000FF000000 ...', dll. Total 64 byte. Ganti urutan byte yang ditemukan dengan nilai RGBA dari warna "custom" yang dipesan dengan cara yang sama, misalnya 15, 7, 8, dll. Sekarang semua warna yang Anda pilih dalam VS UI akan disimpan dalam registri dan diterapkan setelah aplikasi dimulai ulang. Yah, semua, tapi warna "indikator". Ini selalu diatur ulang ke default. Catatan:

  1. Dalam VBE7.DLL (MSO2010) saya hanya menemukan satu urutan byte yang dipesan sedemikian rupa pada offset 0x15A98C.
  2. Seperti yang disebutkan dalam posting Bond ada beberapa urutan byte untuk penggantian pertama (nilai RGBA dasar dipesan langsung dari 0 hingga 15). Saya hanya mengubah satu, yang terdekat dengan offset dari catatan sebelumnya (ditemukan di 0x15A5AC).
  3. Semua di atas Anda lakukan dengan risiko Anda sendiri :) Dan jangan lupa untuk membuat cadangan.

Terima kasih kepada Tex Hex dan Bond untuk penelitian awal.

UPD: Diuji dengan MSO2007 (VBE6.DLL) dan MSO2013 (VBE7.DLL). Bekerja seperti pesona.

dias
sumber
2

Solusi Bond (mengedit tabel warna dalam VB6.exe) berfungsi sempurna untuk memodifikasi tabel warna dalam VB6 IDE. Namun, saya menemukan bahwa ketika warna yang dimodifikasi dipilih dan VB6 dimatikan, VB6 tidak dapat menyimpan warna yang dimodifikasi dengan benar ke registri.

Biasanya, VB6 akan menulis indeks ke dalam tabel warna 16-nilai untuk setiap item teks yang dapat dimodifikasi warnanya.

Indeks warna ditulis ke registri di sini:

HKEY_CURRENT_USER\Software\Microsoft\VBA\Microsoft Visual Basic\CodeForeColors
HKEY_CURRENT_USER\Software\Microsoft\VBA\Microsoft Visual Basic\CodeBackColors

Misalnya, nilai CodeForeColors akan terlihat seperti ini:

6 14 5 0 1 3 13 4 15 0 0 0 0 0 0 0

Nilai dari 1 hingga 16 mewakili warna dalam tabel warna dan 0 berarti 'Otomatis'.

Namun, ketika warna yang dimodifikasi dipilih, VB6 akan menulis angka di luar rentang indeks ke registri dan nilai CodeForeColors akan terlihat seperti ini:

5245006 14 5 0 1 3 13 4 15 0 0 0 0 0 0 0

Kali berikutnya VB6 dimulai tidak akan dapat mengatur warna yang benar untuk item yang telah diatur ke warna yang dimodifikasi.

Saya masih mencoba mencari solusi tetapi ingin memposting apa yang saya temukan sejauh ini.

ravanbak
sumber