delphi

192
Win32API - Tutorial untuk Delphi von Michael Puff Copyright © 2002 – 2004 Michael Puff PDF Version 2.0 [2004-09-28] isi Pertama Windows dan Kontrol 1.1.Fenster 1.2. Teks output dalam Label 1.3. kancing-kancing 1.4. Kotak centang dan tombol radio 1.5. Bekerja dengan kotak teks 2.1. Bekerja dengan ListBoxes 2.2. Bekerja dengan combobox 2.3. Tambahkan Menu a 2.4. Dialog sumber daya menyebutnya 2,5. Masalah dengan Alt + Tab dan <Shortcut> Ketiga Standard dialog 3.1. Membuka dan Menyimpan File 3.2. Mengubah font 3.3. Cari / Ganti dialog 3.4. Tombol Bantuan 4th umum Kontrol 4.1. Kemajuan Indikator 4.2. Status bar. 4.3. Tooltips / Petunjuk 4.4. toolbar 4,5. Bidang Alamat IP 4.6. trackbar tersebut 4.7. Kontrol tampilan daftar 4.8. Tampilan struktur pohon 4.9. Rebar The 4.10. The Syslink Kontrol 4.11. Tabsheets 5th sistem Fungsi 5.1. Timer tanpa VCL 5.2. Koneksi ke Area Pemberitahuan Taskbar 5.3. Hotkeys dan shortcut

description

ainapi

Transcript of delphi

Page 1: delphi

Win32API - Tutorial untuk Delphivon Michael Puff

Copyright © 2002 – 2004 Michael PuffPDF Version 2.0 [2004-09-28]

isiPertama Windows dan Kontrol1.1.Fenster1.2. Teks output dalam Label1.3. kancing-kancing1.4. Kotak centang dan tombol radio1.5. Bekerja dengan kotak teks2.1. Bekerja dengan ListBoxes2.2. Bekerja dengan combobox2.3. Tambahkan Menu a2.4. Dialog sumber daya menyebutnya2,5. Masalah dengan Alt + Tab dan <Shortcut>Ketiga Standard dialog3.1. Membuka dan Menyimpan File3.2. Mengubah font3.3. Cari / Ganti dialog3.4. Tombol Bantuan4th umum Kontrol4.1. Kemajuan Indikator4.2. Status bar.4.3. Tooltips / Petunjuk4.4. toolbar4,5. Bidang Alamat IP4.6. trackbar tersebut4.7. Kontrol tampilan daftar4.8. Tampilan struktur pohon4.9. Rebar The4.10. The Syslink Kontrol4.11. Tabsheets5th sistem Fungsi5.1. Timer tanpa VCL5.2. Koneksi ke Area Pemberitahuan Taskbar5.3. Hotkeys dan shortcut5.4. Tanggal dan Waktu5.5. Penggunaan file INI5.6. registri6 Dasar-dasar dari GDI

Page 2: delphi

6.1. Dasar-dasar dari GDI7 topik lainnya7.1. subclassing7.2. Menciptakan sumber daya script7.3. Aplikasi untuk Control Panel7.4. Buat wizard7,5. terpecah8 Membantu menciptakan dan berbagi file8.1. HLP file help HilfedateienCHM

nonVCL, apa artinya? Dalam pemrograman nonVCL mengacu pada pemrograman tanpa menggunakan VCL. Tidak ada Komponen, tidak ada bentuk-bentuk dalam arti ... dll Sebaliknya, secara langsung mengakses API (Application Programmer Antarmuka kembali). Jika Anda sudah memiliki pengalaman dengan pemrograman VCL, maka Anda pertama akan menjadi jelas (Perlu) bahwa Anda harus berhati-hati dengan program API murni untuk banyak hal sendiri. Downside adalah bahwa sumber dari proyek-proyek tersebut u.U. agak rumit dan kadang-kadang membingungkan. Di sisi lain

memiliki file EXE dikompilasi hanya sebagian kecil dari ukuran versi VCL. Dan itu adalah untuk banyak programmer Alasan yang cukup, alat kecil untuk sepenuhnya berkembang tanpa VCL. Namun, Anda tidak boleh melupakan manfaat dari VCL. Menurut pendapat kami, itu tidak dapat diterima, proyek besar dengan bentuk empat, lima atau lebih untuk mengembangkan hanya pada API-based. Tentu akan menyadari bisa, tapi di sini Anda dengan VCL jelas lebih cepat, dan Anda dapat bekerja lebih nyaman. Idealnya, pemrograman API dalam pengembangan proyek-proyek kecil dan alat-alat yang mungkin hanya satu atau dua Jendela atau dialog dan yang memiliki fungsi ini tidak begitu besar. Berbeda dengan cara tradisional Anda harus menyediakan umumnya untuk program nonVCL untuk satu hal: Program Anda harus tetap aktif. Oleh karena itu, ada tulang punggung nonVCL khas dari tiga bagian - • fungsi utama (dalam PASCAL oleh mulai dan berakhir.) • loop pesan • fungsi pesan

Contoh: / / Pesan

function WndProc(wnd: HWND; uMsg: UINT; wp: WPARAM; lp: LPARAM):

LRESULT; stdcall;

Page 3: delphi

begin

Result := 0;

case uMsg of

WM_CREATE:

/ / Jalankan fungsi

WM_DESTROY:

PostQuitMessage(0);

else

Result := DefWindowProc(wnd,uMsg,wp,lp);

end;

end;

/ Fungsi / Main

var

msg : TMsg;

begin

/ / Daftar jendela kelas, menciptakan & jendela

/ / Pesan lingkaran

while(GetMessage(msg,0,0,0)) do

begin

TranslateMessage(msg);

DispatchMessage(msg);

end;

end.

Sebelum Anda mulai menulis & program nonVCL, Anda harus mengkonfirmasikan dengan dasar-dasar pemrograman PASCAL masing Object Pascal (Delphi) familiar. Ini tidak masuk akal, tanpa pengetahuan sebelumnya tentang hal ini ingin masuk. Frustrasi mungkin akan hasilnya.

Page 4: delphi

Selain itu, dokumentasi API lebih luas sangat dianjurkan. Pertama, ada yang APIHilfedateien Win32 untuk panggilan dari Borland. Ini kebohongan di Delphi, bagaimanapun, juga keluar dari tanggal dan (dalam kaitannya dengan yang baru Controls) tidak lengkap. Bila memungkinkan sehingga menggunakan sumber-sumber yang sama dari Microsoft, karena ada: • Microsoft Developer Network (MSDN) (www.msdn.microsoft.com) • Platform SDK (PSDK) (http://www.microsoft.com/msdownload/platformsdk/sdkupdate) Tutorial membangun sebagian besar pada satu sama lain. Jadi jika Anda tidak secara khusus mencari topik tertentu, maka sangat berguna untuk bekerja melalui mereka dalam rangka. 6 Informasi Tersedia Versi / bahan terkait • chm versi dengan setup • sumber demo dengan setup • Versi PDF • sumber demo dalam arsip zip Dimana untuk membeli / mendownload pilihan www.luckie-online.de www.simmack.de Para penulis Michael Puff Mathias Simmack Thomas Liebetraut Jendela Cari / Ganti script sumber daya dialog menciptakan Teks output dalam tooltips label / petunjuk Tombol Bidang Alamat IP Kotak centang dan tombol radio, treeview tersebut Bekerja dengan field input Rebar The Bekerja dengan ListBoxes Control Syslink Bekerja dengan koneksi combo box untuk TNA Tambahkan hotkeys menu dan shortcut Dialog sumber daya menyebut tanggal dan waktu Membuka dan menyimpan file menggunakan file INI Mengubah font, registri Progress bar aplikasi untuk sistem kontrol Status bar Buat Wizard File HLP bantuan toolbar The trackbar CHM help file The ListView Tabsheets Timer tanpa VCL Subclassing Dasar-dasar dari GDI, Bagian 1 Hubungi pilihan Michael Puff: Homepage: www.luckie-online.de

Page 5: delphi

Email: [email protected] Mathias Simmack: Homepage: www.simmack.de Thomas Liebetraut: Homepage: www.tommie-lie.net Email: [email protected] 7 Windows dan Kontrol Pertama Windows dan Kontrol

Jendela 1.1. Jendela 1.1.1. Jendela create Pada Windows jendela persegi panjang biasanya diciptakan dengan mana pengguna berinteraksi. Oleh karena itu, kita Setelah beberapa karakteristik dasar dari jendela bersama-sama, kita ingin mendefinisikannya dalam sebuah program: Nilai Arti x, y, w, h sudut kiri atas (x, y), dan tinggi dan lebar (w, h) dari jendela Icon Icon jendela SysMenu menu sistem yang terbuka bila Anda klik pada ikon atau dengan menekan ALT-Spasi Membingkai tidak ada frame atau bingkai tetap, kerangka variabel tikus Caption label teks di bar judul MinimizeBox, MaximizeBox Tombol untuk meminimalkan dan memaksimalkan jendela Kursor bentuk kursor dalam jendela Latar Belakang Warna latar belakang, pola jendela Menu menu, bagian dari jendela Kita melihat bahwa sebagai programmer Anda harus hanya berkat dukungan grafis untuk Windows Program berurusan dengan detail grafis banyak, lebih berkaitan dengan desain dibandingkan dengan tujuan pemrograman miliki. Karakteristik window didefinisikan di dua tempat. Setengah mantan catatan jendela kelas, yang kedua Setengah didefinisikan dengan menggunakan "CreateWindow (Ex)". Dalam source code demo, Anda akan menemukan misalnya baris perintah:

CreateWindowEx(0,

ClassName,

AppName,

WS_CAPTION or WS_VISIBLE or WS_SYSMENU or WS_MINIMIZEBOX or

WS_MAXIMIZEBOX or WS_SIZEBOX,

Page 6: delphi

CW_USEDEFAULT, / / posisi dari kiri CW_USEDEFAULT, / / posisi dari atas

WindowWidth, // lebar (di sini konstan)

WindowHeight,// tinggi(di sini konstan)

0,

0,

hInstance,

nil);

Cukup bereksperimen dengan nilai-nilai dijelaskan dan amati hasilnya. Anda juga dapat Masukkan nilai negatif. Apakah Anda ingin bukanlah posisi atau khawatir tentang ukuran jendela, kemudian menggunakan CW_USEDEFAULT nilai konstan, bukan data pixel. Tanpa mengantisipasi inginkan - Mari pertanyaan: "Bagaimana" CreateWindowEx "apa kelas itu sebagai jendela Dasar untuk mengambil? '. Kasus ini cukup sederhana. Catatan kita miliki dengan "wc.lpszClassName: = Nama kelas, "adalah kemampuan untuk menentukan nama kelas dalam kasus konstan di Den kepala Program .. nama yang sama kami melewati sebagai parameter kedua ke fungsi "CreateWindowEx". 9 Jendela

TWndClassEx-Definition

typedef struct _WNDCLASSEX {

UINT cbSize; / / ukuran catatan

UINT style; //gaya

WNDPROC lpfnWndProc; //pointer ke fungsi pesan

int cbClsExtra;

int cbWndExtra;

HANDLE hInstance; //contoh aplikasi

HICON hIcon; //ikon menangani

HBRUSH hbrBackground; //latar belakang wilayah klien

Page 7: delphi

LPCTSTR lpszMenuName; //MainMenu Menangani

LPCTSTR lpszClassName; //nama kelas

HICON hIconSm; //ikon menangani ikon (kecil)

} WNDCLASSEX;

Icon dan set tikus Seperti sekarang benar-benar ikon di bar judul jendela? Dalam contoh, ikon dari file sumber daya dikenakan, dan memang pada saat ini: wc.hIcon: = LoadIcon (hInstance, MAKEINTRESOURCE (100)); Hal ini tentu saja mensyaratkan bahwa file sumber daya dibuat sebelumnya dan kemudian juga dalam kode sumber adalah terlibat. Simbol itu sendiri kemudian dimuat dengan "LoadIcon", sebagai parameter pegangan contoh aplikasi dan nama ikon atau ID sumber daya ikon diharapkan. Jika Anda memiliki sumber daya Gunakan ID, Anda harus menggunakan "MAKEINTRESOURCE" makro ke integer untuk jenis sumber daya mengkonversi. Jika Anda ingin menyerah file sumber daya, Anda dapat menggunakan beberapa ikon standar Windows. Untuk mengubah baris di atas sebagai berikut: wc.hIcon: = LoadIcon (hInstance, IDI_WINLOGO); Dan Anda melihat logo Windows sebagai ikon di bar judul. Bantuan untuk "LoadIcon" melihat nilai-nilai lain, Anda dapat menggunakan. Dengan pointer mouse dapat dipindahkan sesuai. Contoh program memuat pointer mouse standar: wc.hCursor: LoadCursor = (0, IDC_ARROW); Meskipun komputer cepat saat ini tidak jarang: IDC_WAIT. Anda mungkin sudah tahu mana kursor itu? Benar - jam pasir akrab. Jenis lain dari kursor, lihat fungsi Help "LoadCursor". 1.1.3. Judul Dalam program contoh kita, kita lihat di bar judul (kiri ke kanan): menu sistem, judul jendela dan tiga

Tombol (meminimalkan, memaksimalkan, tutup): 10 Jendela Dalam kode program, informasi ini: CreateWindowEx (0, ClassName, AppName, WS_CAPTION atau / / jendela memiliki bar judul WS_VISIBLE atau / / jendela terlihat WS_SYSMENU atau / / menu sistem tersedia WS_MINIMIZEBOX atau / / meminimalkan tombol hadir WS_MAXIMIZEBOX atau / / memaksimalkan tombol hadir

Page 8: delphi

WS_SIZEBOX, / / ukuran jendela dapat diubah CW_USEDEFAULT, CW_USEDEFAULT, WindowWidth, WindowHeight,

0, 0, hInstance, nil);

Sekali lagi, Anda harus sedikit bereksperimen dengan detail. Abaikan konstanta, tambahkan lainnya dan melihat apa yang terjadi. Lebih lanjut tentang gaya jendela untuk belajar di Bantuan "CreateWindow" dan "CreateWindowEx". Kedua fungsi membuat jendela dengan cara, tetapi yang terakhir memiliki struktur diperpanjang dan dengan demikian memungkinkan untuk lebih gaya. 1.1.4. Ruang lingkup Ruang lingkup (VCL = "Client Area") adalah bagian dari jendela yang digunakan untuk tombol, daftar ... singkatnya, untuk Anda dapat menggunakan item yang Anda inginkan. Warna latar belakang nya diatur dalam kelas jendela dalam catatan Baris ini menyatakan: wc: TWndClassEx = (

... hbrBackground: COLOR_APPWORKSPACE; ... );

Dalam kasus dengan COLOR_APPWORKSPACE warna default sistem anda untuk objek 3D didirikan. Lebih Konstanta dapat ditemukan di WNDCLASS bantuan atau WNDCLASSEX. Akan mengirimkan warna default tidak, maka Anda dapat membuat sendiri. Menambah program contoh di bagian utama ke baris berikut: mulai wc.hInstance: = hInstance; ... / / Tambahkan baris ini -> wc.hbrBackground: = CreateSolidBrush (RGB (0.150.255)); ... end. Dengan cara yang sama, kini Anda dapat mencampur dengan spesifikasi RGB warna apapun. Atau Anda dapat menetapkan kali "wc.hbrBackground" adalah nol untuk ... »... dan melihat apa yang terjadi ... ": o) Catatan untuk Windows XP Bagaimana Anda merasa gambar di sebelah kiri menunjukkan, pada Windows XP latar belakang jendela disajikan mungkin terlalu gelap. Yang pada Menggunakan COLOR_APPWORKSPACE (seperti yang ditunjukkan di atas) dalam tema aktif. Sebagai solusi, Anda harus dengan Fungsi "GetSysColorBrush" mengundang warna untuk elemen 3D dan atribut: wc.hbrBackground: = GetSysColorBrush (COLOR_3DFACE);

Page 9: delphi

Seperti yang dapat Anda lihat dalam gambar ke kanan, maka latar belakang ditampilkan dengan benar: 11 Jendela

Anda juga dapat menggunakan perintah ini jika Anda belum mengaktifkan tema atau sistem operasi yang berbeda dari Windows XP menggunakan (9x, ME, NT dan 2000). Sebuah gambaran dari nilai warna mungkin, lihat perintah "GetSysColor" di PSDK. Perbedaan antara kedua perintah adalah bahwa "GetSysColorBrush" warna yang diinginkan sebagai seperti begitu pengembalian atas Brush yang digunakan segera dengan hbrBackground anggota variabel (lihat TWndClassEx-Rekam) bisa. Namun Anda akan memiliki hasil "GetSysColor" nilai dword (dengan informasi RGB Warna), misalnya, mengkonversi dengan hanya "CreateSolidBrush" untuk menggunakannya untuk latar belakang jendela bisa. 1.1.5. Fungsi pesan Bertanggung jawab untuk pesan dalam program kami adalah fungsi yang terpisah. Kebanyakan program menggunakan nama "WndProc" untuk fitur ini, yang juga sehingga dalam bantuan Microsoft. Kami contoh program

telah di baris wc: TWndClassEx = ( ... lpfnWndProc: @ WndProc; ... ); Fungsi ini menyatakan. Jendela pesan ("Windows Messages") biasanya dimulai dengan awalan "WM_?". Cara terbaik untuk menyaring pesan-pesan dan memproses mereka adalah mungkin kasus-loop. Pesan yang kami telah disediakan ada tindakan khusus, kami lolos ke fitur berita umum dari Windows. Itu Sistem mengurus kemudian. Kutipan berikut dari program contoh menunjukkan penyaringan pesan "WM_CREATE", yang disebut saat membuat jendela kita: 12 Jendela fungsi WndProc (hWnd: HWND, uMsg: UINT, wParam: wParam, lParam: lParam): LRESULT; stdcall; var x, y: integer; / / variabel untuk posisi jendela begin

Result := 0;

case uMsg of

Page 10: delphi

WM_CREATE:

begin

{Fenster zentrieren}

x := GetSystemMetrics(SM_CXSCREEN); //Screenhöhe & -breite

y := GetSystemMetrics(SM_CYSCREEN);

{Fenster auf neue Position verschieben}

MoveWindow(hWnd, (x div 2) - (WindowWidth div 2),

(y div 2) - (WindowHeight div 2),

WindowWidth, WindowHeight, true);

end;

else

Result := DefWindowProc(hWnd,uMsg,wParam,lParam);

end;

end;

Sebuah kata tentang "WM_DESTROY" - Pesan ini dikirim ketika jendela hancur dalam arti sebenarnya dari kata itu. Dalam hal ini, kita harus dengan "PostQuitMessage (0);" balasan dan menghasilkan pesan "WM_QUIT", loop pesan dari dihentikan. Dalam bantuan itu mengatakan untuk (diterjemahkan secara bebas): Platform SDK: The WM_QUIT Pesan menunjuk permintaan untuk mengakhiri aplikasi, dan diproduksi ketika Gunakan "PostQuitMessage" panggilan. Akibatnya, fungsi "GetMessage" ke nol kembali. Apa yang akan terjadi jika kita menghapus panggilan untuk "PostQuitMessage (0)"? Meskipun jendela akan hilang, tetapi jika Anda memulai program dari luar Delphi, debugger masih akan berjalan. Dengan kata lain, program ini akan berlanjut dan tidak akan keluar dari loop pesan. Akhir Hal ini dapat maka hanya task manager, atau (dalam IDE Delphi) dengan mengkompilasi ulang. 1.1.6. Loop pesan Dalam loop pesan, semua pesan dikumpulkan. Jendela tertutup, memberikan "GetMessage" yang Nilai "WM_DESTROY". Pesan ini diteruskan ke fungsi jendela "WndProc" dan kemudian dengan "PostQuitMessage (0);" jawab. Ini adalah "GetMessage" nilai pengembalian adalah nol (false) diproduksi, sementara loop berakhir dan program ini telah benar-benar berakhir.:

while GetMessage(msg,0,0,0) do

Page 11: delphi

begin

TranslateMessage(msg);

DispatchMessage(msg);

end;

Pada titik ini, Anda ingin kutipan dari bantuan menggambarkan bagaimana menangani "GetMessage":

Jendela Bool GetMessage ( LPMSG lpMsg, / / alamat struktur dengan pesan HWND hWnd, / / handle dari window UINT wMsgFilterMin, pesan / / pertama UINT wMsgFilterMax / / pesan terakhir ); HWND diatur ke nol, fungsi menerima pesan dari semua jendela yang termasuk dalam thread menelepon. Dengan Bantuan dari wMsgFilterMin dan wMsgFilterMax dapat menyaring pesan masuk. Untuk tujuan pengujian, kami mengomentari dua baris dalam tubuh loop dari program contoh mencoba dan amati hasilnya. Kami mencatat bahwa program kami tidak responsif. Bagaimana bisa? "GetMessage" dimulai saat pesan, tetapi mereka tidak bisa lewat (karena kurangnya fitur). Tidak ada

Pengolahan pesan sebagai gantinya, dan program ini terjebak dalam lingkaran tak berujung. Jadi kita perlu setidaknya "DispatchMessage" karena ini adalah pesan yang tercantum dalam Jendela fungsi lanjut. "TranslateMessage" diterjemahkan Kode virtual keyboard - seperti dalam contoh kita, tapi kita tidak Menangani input keyboard, kita juga melakukannya tanpa fungsi ini. Struktur Msg adalah antarmuka untuk pesan Windows. Dalam struktur ini adalah semua diperlukan informasi yang menggambarkan pesan. Anda lihat dengan sangat baik dalam "WndProc" di mana menanggapi berbagai pesan. Pastikan untuk menyenangkan bahkan ekstrak ini dari kata Berfungsi untuk: WM_LBUTTONDOWN:

begin

ahdc := GetDC(hWnd);

xPos := LoWord(lParam);

ypos := HiWord(lParam);

wvsprintf(buffer, 'Fensterhandle: %d', PChar(@hWnd));

wvsprintf(buffer1, ', Message: %d', PChar(@uMsg));

Page 12: delphi

lstrcat(buffer, buffer1);

wvsprintf(buffer1, ', wParam: %d', PChar(@wParam));

lstrcat(buffer, buffer1);

wvsprintf(buffer1, ', LoWord(lParam) x-Pos: %d', PChar(@xpos));

lstrcat(buffer, buffer1);

wvsprintf(buffer1, ', HiWord(lParam) y-Pos: %d', PChar(@ypos));

lstrcat(buffer, buffer1);

TextOut(ahdc, 20, 20, buffer, Length(buffer));

ReleaseDC(hWnd, ahdc);

End

Berikut adalah tanggapan terhadap pesan ketika mengklik tombol kiri mouse dalam lingkup jendela dibuat. Sebagai hasilnya, Anda melihat nilai-nilai numerik beberapa yang tampaknya hanya "pesan" selalu nilai yang sama memiliki. 513th dalam hal ini, yang tampaknya pesan "WM_LBUTTONDOWN" identik Uji dan menggantinya Dalam p.g. Sumber identifier pesan dengan nilai numerik dari "513". Program ini bekerja kemudian melanjutkan, karena pada kenyataannya sesuai dengan nilai numerik dari "WM_LBUTTONDOWN" pesan. Windows tampaknya hanya terdiri dari angka, tetapi - terima kasih Tuhan! - Untuk mempermudah pemrograman dalam unit "Windows.pas" didefinisikan sebagai konstanta. Namun, Anda harus menahan godaan untuk menggunakan nilai numerik. Memang, tidak pernah mengecualikan kemungkinan bahwa dalam versi masa depan Windows nilai yang sama sekali berbeda yang digunakan. Meskipun Anda dapat berasumsi bahwa (untuk tinggal dengan Delphi) Borland dalam kasus ini, versi disesuaikan unit yang terkena dampak akan mempublikasikan, tapi itu benar-benar hanya mengacu pada nilai-nilai dari konstanta. Ketika Anda Program tetapi nilai numerik, unit Anda hanya bisa lancar mungkin - program ini masih tidak biasa bekerja. Kembali ke contoh dengan tombol kiri mouse - Silakan jalankan program sampel, dan tekan tombol kiri mouse beberapa kali. Silakan juga menjaga menekan tombol kanan mouse atau CTRL atau Shift dan menonton nilai wParam. Anda akan menemukan bahwa itu berubah - tergantung pada kunci tambahan, tahan masih ditekan. 14 Jendela

Page 13: delphi

Hal ini memungkinkan Anda untuk eksekusi sangat spesifik dalam berbagai kondisi. Nilai wParam karena itu harus tidak selalu menjadi satu. Jika Anda misalnya Tekan Shift dan tombol kiri mouse, hasilnya akan menjadi lima. Bantuan Anda informasi lebih lanjut dan bagi kita untuk memiliki ekstensi menjadi menarik. Jika kita mengubah p.g. Jadi sekali kode bawah sehingga memberikan informasi hanya ketika pengguna menekan salah tombol kiri mouse dan Shift:

WM_LBUTTONDOWN:

if(MK_LBUTTON or MK_SHIFT = wParam) then

begin

/ / Etc end;

1.1.7. Dua panel menghasilkan Dengan pengetahuan yang kita miliki sekarang, itu menyajikan kita dengan masalah menampilkan dua jendela. Kita perlu lakukan adalah Hanya dua berita fungsi - satu per jendela. Segala sesuatu yang lain kita bisa 01:01 dari bab-bab sebelumnya . Menerima Jadi kita buat sekali dua jendela: {Struktur dengan informasi untuk jendela 1 mengisi}

wc.hInstance := hInstance;

wc.hIcon := LoadIcon(hInstance,MAKEINTRESOURCE(100));

wc.hCursor := LoadCursor(0, IDC_ARROW);

{Jendela 1 mendaftar}

RegisterClassEx(wc);

{jendela 1 menghasilkan dan menetapkan hWnd1}

CreateWindowEx(0, ClassName1, Window1Name, WS_VISIBLE or

WS_OVERLAPPEDWINDOW,

CW_USEDEFAULT, CW_USEDEFAULT, WindowWidth1, WindowHeight1, 0, 0, hInstance,

nil); {Struktur dengan jendela info 2 mengisi}

wc.hInstance := hInstance;

wc.lpfnWndProc := @Wnd2Proc; / / jendela untuk jendela 2

Page 14: delphi

wc.hIcon := LoadIcon(0, IDI_INFORMATION);

wc.hCursor := LoadCursor(0, IDC_ARROW);

wc.lpszClassName := ClassName2; / / nama kelas untuk jendela 2 {Jendela 2 mendaftar}

RegisterClassEx(wc);

Apa yang hilang dalam kode ini? Tepat. Jendela kedua telah terdaftar, tetapi belum dibuat dengan "CreateWindowEx". Itu Kami hanya membuat sebuah tombol, setelah pengguna telah mengklik tombol. WM_COMMAND:

begin

if hiword(wParam) = BN_CLICKED then

case loword(wParam) of

IDC_BUTTON1:

{Membuat dan menampilkan jendela 2}

hwnd2 := CreateWindowEx(0, ClassName2, Window2Name,

WS_OVERLAPPEDWINDOW or WS_VISIBLE, 40, 10,

300, 200, hWnd1, 0, hInstance, nil);

end;

end;

Teks output dalam Label1.2. Teks output dalam Label1.2.1. Label menghasilkanDalam tutorial ini kita fokus pada label dan mengubah font pada mereka. Di konvensionalJauh dengan VCL itu cukup mudah untuk menempatkan teks statis seperti pada bentuk dan label. TanpaVCL kita perlu antara lain melihat lebih jauh ke fungsi” Send Message”

kesepakatan. Label kami buat padaterbaik jika jendela kita pesan "WM_CREATE" menerima. Untuk terjemahan (gratis) dari MSDN:MSDN:WM_CREATE dikirim, jika aplikasi atau generasi jendela dengan "CreateWindowEx""CreateWindow" permintaan. Fungsi jendela jendela baru menerima pesan ini, setelah jendeladibuat tapi sebelum ia ditampilkan.Ada dapat menjadi tempat yang lebih baik begitu sedikit.Sekarang Windows akan tidak "Windows" panas ketika komponen utama yang tidak akan jendela.

Page 15: delphi

Dan begitu aneh untukmendengarkan kadang-kadang seperti - kita harus menyadari bahwa itu adalah tentang, hampir setiap elemen aDow. Bahkan label kami adalah jendela. Untuk alasan kita akan melihat titik ini, definisi

"CreateWindowEx" di:HWND CreateWindowEx (DWORD dwExStyle, / / gaya jendela diperpanjangLPCTSTR hwnd, / / pointer ke nama yang terdaftarLPCTSTR lpWindowName, / / pointer ke nama windowDWORD dwStyle, / / gaya jendelaint x, posisi / / horizontal windowint y, / / vertical posisi jendelaint nWidth, / lebar / windowint nHeight, / / jendela tinggiHWND hWndParent, / / menangani ke jendela orangtua atau pemilikHMenu HMENU, / / menangani untuk menu, atau anak-window identifierHINSTANCE hInstance, / / menangani untuk contoh aplikasiLPVOID lpParam / / pointer ke jendela-penciptaan data);Jadi kita perlu:

• pointer ke jendela kelas terdaftar• pointer ke nama window• pegangan ke jendela orangtua• Sebuah pengenal untuk jendela anak (Child window)• pegangan ke instance aplikasiTapi begitu kita membuat jendela kita dengan label, dan kemudian mari kita lihat apa yang ditemukan dalam kode.Seperti dengan jendela utama kami adalah parameter pertama untuk gaya jendela diperpanjang. Proyek ini terbuka lagibereksperimen dengan nilai yang berbeda ke dan untuk mengamati hasil.hwndLabel1: = CreateWindowEx (0,Parameter kedua adalah pointer ke jendela kelas terdaftar yang akhirnya bertanggung jawab atas apa yang kita(Ingin) untuk menghasilkan panggilan - apakah tombol, mengedit kotak, atau hanya label ... Rincian dapat ditemukan di MSDN bawahKata Kunci "CreateWindow".'Statis',Parameter ketiga adalah jelas teks kita, kita ingin menampilkan.17Teks output dalam Label"Label dari Font Sistem 'Parameter keempat ditentukan, dalam hal ini penampilan label kami, dicatat adalah bahwa setiap terdaftarJendela kelas masih memiliki gaya tambahannya. Teks label kami dapat tentang SS_CENTER properti

Page 16: delphi

terpusat. Untuk mempelajari lebih lanjut, tentu saja, untuk MSDN.Penting adalah WS_CHILD properti, dengan Windows tahu bahwa label kami adalah jendela anak.Dan untuk membuatnya bahkan segera terlihat, kita tidak boleh lupa WS_VISIBLE.WS_VISIBLE atau WS_CHILD,Empat berikutnya parameter menentukan kursus lagi asal koordinat, panjang dan lebar label kami.Data ini mengacu pada sudut kiri atas jendela utama kami.15, 25, 160, 20,Pegangan jendela ini, kami juga memberikan hal yang sama sebagai parameter berikutnya. Fungsi pesan "WndProc"dalam parameter mereka berisi handle valid jendela kita, sehingga kita bisa menggunakannya di sini.hWnd,Parameter kesepuluh mendefinisikan biasanya menu jendela kita. Karena kita dapat di sini denganuntuk melakukan minor (anak) jendela, kita malah memberikan pengenal yang unik, label kamidiidentifikasi. Dengan cara ini, pesan dapat dengan jelas diberikan kemudian, dan kami memiliki kesempatan,misalnya Untuk mengubah teks label kami. Anda harus mendefinisikan konstanta untuk tujuan ini (seperti pada contoh"IDC_LABEL1") yang dapat Anda gunakan di seluruh program. Sebuah kemungkinan perubahan dalam nilai tidak makaKesal seluruh program mereka.IDC_LABEl1,Parameter kesebelas menerima pegangan pada contoh aplikasi kita. Secara umum, nilai dari jendela kelasProperti "wc.hInstance" Singkatnya, dalam hal ini hInstance.hInstance,Parameter terakhir kita bisa mengabaikannya dan set ke nil begitu.nil);

1.2.2. Menghasilkan dan menetapkan hurufLabel kami biasanya diberi label dengan font default sistem, yang tidak selalu diinginkan danharus terlihat baik. Untuk menggunakan font kustom, kita menggunakan fungsi "Create Font":

MyFont: = CreateFont (FontSize, 0, 0, 0, 0, 0, 0, 0, ANSI_CHARSET,

OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,

DEFAULT_PITCH, FontName);

Sebuah penjelasan rinci dapat ditemukan dalam Bantuan atau MSDN. Cukuplah untuk mengatakan: sebagai nilai kembali, fungsipegangan untuk font logis. Harus parameter pertama menetapkan tinggi font dan selalu nilai negatifmiliki, dan parameter terakhir mendefinisikan nama majalah kami (salah satu dari banyak font diinstal di sini bisaakan digunakan). Untuk mempermudah, saya memiliki keduanya juga lagi dinyatakan sebagai konstanta.Tapi sekarang tidak hanya Windows mampu mengirim pesan. Juga kita dapat mengirim pesan. Dalam hal ini

Page 17: delphi

Kasus yang harus kita lakukan bahwa bahkan jika kita ingin label kami menetapkan font baru didefinisikan. Kami menggunakan inipesan "WM_SETFONT". Tujuan kami mencapai fungsi yang sangat penting bahwa kita nonVCLProjekten di banyak"Kirim Pesan" - masih perlu. Fungsi ini memiliki empat parameter. Karena kita percaya pesanJendela Anda ingin mengirim, kita perlu pertama tentu saja pegangannya. Di tempat kedua datang maka diinginkanPesan. Hanya yang terakhir dua parameter membutuhkan penjelasan lebih lanjut: Setiap pesan memiliki dua tambahanParameter, bisa melewatinya. Kadang-kadang nilai integer untuk perubahan status, kadang-kadang sebagai integerdikonversi pointer ke teks, dll (Pada titik yang cocok kita masih ditambah.) Dalam beberapa kasus, satu atau18Teks output dalam Labelkedua parameter tidak digunakan, dan bukannya ditentukan dengan nol.Tempat terbaik untuk Anda di sini lagi harus menjadi sarana atau MSDN, karena di sini Anda akan menemukan termasuk beritaparameter yang diperlukan.Untuk tetap dengan contoh font yang kita - panggilan kita akan terlihat seperti ini:jika MyFont kemudian <> 0SendMessage (hwndLabel2, WM_SETFONT, Integer (MyFont), integer (true));SendMessage definisiLRESULT SendMessage (HWND hWnd, / / handle dari jendela tujuanUINT Msg, / / pesan untuk mengirimWPARAM wParam, / / parameter pesan pertamaLParam lParam / / parameter pesan kedua);WM_SETFONT definisiWM_SETFONTwParam = (WPARAM) hfont / / handle fontlParam = MAKELPARAM (fRedraw, 0) / / redraw bendera1.2.3. Bitmap dalam Tampilan Label

Label juga dapat digunakan sebagai dasar untuk menampilkan bitmap - sebagai salah satu komponen TImageVCL tahu. Sebagai contoh, kita menghasilkan kontrol kedua, berdasarkan pada label, memiliki dua diperpanjangGaya elemen:

hwndImage: = CreateWindowEx (0, 'STATIC','',

WS_VISIBLE or WS_CHILD or {new style attributes ->} or SS_BITMAP

SS_REALSIZEIMAGE,

Page 18: delphi

9, 6, {w & h are ignored ->} 0, 0, hWnd, IDC_IMAGE, hInstance, nil);

Atribut dan SS_BITMAP SS_REALSIZEIMAGE menentukan bahwa bitmap dari sumber daya di Controlmuncul, dan bahwa ukuran bitmap tidak berubah setelah telah dimuat atau ditarik.Jika grafis lebih besar dari area yang tersedia, maka akan dipotong sesuai.Langkah berikutnya adalah untuk mendapatkan bitmap dari sumber daya dan menampilkan Control:hBmp: = LoadBitmap (hInstance, MAKEINTRESOURCE (300));SendMessage (hwndImage, STM_SETIMAGE, IMAGE_BITMAP, hBmp);Kami menggunakan pesan "STM_SETIMAGE" dengan mana kita juga dapat menampilkan ikon dan kursor.STM_SETIMAGE definisiSTM_SETIMAGEwParam = (WPARAM) fImageType / / image-jenis bendera =/ / IMAGE_BITMAP/ / IMAGE_CURSOR/ / IMAGE_ENHMETAFILE/ / IMAGE_ICONlParam = (lParam) (MENANGANI) Himage, / / menangani untuk gambarKerugiannya adalah bahwa (dalam kasus ini), bitmap harus menjadi bagian dari program tersebut. Meningkatkan tergantung pada ukuran grafik sehinggadan sejauh mana program dikompilasi untuk. The "Gambar Load" Oleh karena itu lebih baik, karena hal ini dapatKami menyediakan nama file. Bitmap tidak harus dikompilasi, dan program tetap kecil:19Teks output dalam LabelhBmp: = LoadImage (NULL, / / contoh aplikasi'Image.bmp', / / File NameIMAGE_BITMAP, / / Type165,314, / / lebar & tinggiLR_LOADFROMFILE) / / diperlukan BenderaDalam bantuan dan MSDN untuk parameter dijelaskan secara lebih rinci. Berikut ini adalah hanya menjadi penting untuk BenderaHarus mengatur LR_LOADFROMFILE dan bahwa Anda menentukan nama file kemudian sebagai parameter kedua. Anda harus keKeamanan, tetapi dengan nama path lengkap.Dan jangan lupa, bitmap ketika keluar program untuk melepaskan lagi:DeleteObject (hBmp);

1.3.1. Tombol menghasilkanSekarang, mari kita olahraga nasional: Klik Tombol ... : O)Di sini, juga, kita harus terlebih dahulu membuat jendela. Di sini kita fokus pada contoh sederhana dari label,tetapi menggunakan window class BUTTON

an sudah kami telah menciptakan tombol pertama kami:hwndButton: = CreateWindowEx (WS_EX_CLIENTEDGE, 'TOMBOL', 'Exit'

Page 19: delphi

WS_VISIBLE atau WS_CHILD, 45, 40, 100, 25, hWnd, IDC_BUTTON, hInstance,nil);Gaya Jendela tambahan untuk tombol dapat ditemukan - seperti biasa - dalam Bantuan dan MSDN di bawah kata kunci"CreateWindow".1.3.2. Menanggapi klik tombolOh betapa indah itu dapat menjadi VCL - Anda ambil tombol Anda untuk membentuk Anda, klik dua kali danmenulis kode dalam editor kode, yang akan dijalankan ketika mengklik. Tanpa VCL itu tidak cukup sebagaisederhana, tapi setelah Anda memahami prinsip, kemudian menarik Anda hadapi tidak lebih. : O)Dalam hal ini, kita perlu pesan "WM_COMMAND" yang dikirimkan ketika perintah menu penggunapanggilan, pilih jalan pintas ... atau jika item bisa menjadi pemberitahuan ("pesan pemberitahuan") untukmengirimkan jendela induk:WM_COMMANDwNotifyCode = HIWORD (wParam) / kode / pemberitahuanwid = LOWORD (wParam) / / item, kontrol, atau identifier acceleratorhwndCtl = (HWND) lParam, / / menangani kontrolwNotifyCodeNilai dari kata high-order dari wParam. Berisi kode pemberitahuan jika pesan tersebut dari kontroldatang. Apakah pesan dari jalan pintas, maka parameter 1 Apakah pesan dari menu,Parameter 0widNilai dari kata rendah urutan wParam. Menentukan ID dari item menu, kontrol, atau cara pintas.hWndCtlNilai lParam. Menangani dengan kontrol yang dikirim pesan (jika pesan tersebut dari kontrol).Jika tidak, parameter ini adalah nol.Jadi jika pesan "WM_COMMAND" terjadi, cek sistem pertama yang acara memicu mereka. Apakahadalah klik tombol acara ("BN_?" pesan), kemudian akan menjelaskan bahwa tombol telah ditekan. Sisapertanyaan: apa itu? Untuk kata rendah wParam diuji, yang berisi ID.Karena pengguna dalam contoh kita menganggap bahwa tombol ini keluar program, kita ingin diaSeperti melakukan waktu. Jadi kita mengirim pesan "WM_DESTROY" (alternatif pergi "WM_CLOSE"), dan programkeluar. Dalam kode yang terlihat seperti ini:

Buttons

WM_COMMAND:

begin

hiword if (wParam) = BN_CLICKED then

case loword (wParam) of

Page 20: delphi

IDC_BUTTON: SendMessage (hwnd, WM_DESTROY, 0, 0);

end;

end;

1.3.3. Bitmaps and icons to show buttons

Bitmap dan ikon untuk menampilkan tombolSebagai langkah terakhir, kita akan menyediakan tombol kedua dengan bitmap. Seperti tombol adalah dengan cara yang samaseperti tombol normal menciptakan. Hanya atribut BS_BITMAP gaya baru (untuk bitmap) atau BS_ICON adalah (untuk simbol):

hwndBmpButton: = CreateWindowEx (0, 'BUTTON', 'Button', WS_VISIBLE or

WS_CHILD or {new style ->} BS_BITMAP, 45, 60, 100, 25, hWnd, IDC_BMPBUTTON,

hInstance,

nil);

Untuk memuat bitmap dari sumber daya program, kita menggunakan "LoadBitmap".hwndBMP: = LoadBitmap (hInstance, MAKEINTRESOURCE (101));Mengembalikan nilai dari fungsi ini adalah pegangan untuk bitmap:LoadBitmap definisiHBITMAP LoadBitmap (HINSTANCE hInstance, / / contoh aplikasiLPCTSTR lpBitmapName / / nama sumber daya bitmap);Suatu ikon dimuat dengan cara yang sama, dimana di sini juga memiliki keuntungan untuk menggunakan grafis transparanbisa. Contoh berikut ini menunjukkan bagaimana untuk memuat ikon besar 16x16:hwndICO: = LoadImage (NULL, MAKEINTRESOURCE (101), IMAGE_ICON,16.16, LR_DEFAULTCOLOR);LoadImage definisiMENANGANI LoadImage (HINSTANCE hInst, / / contoh aplikasiLPCTSTR lpszName, / / sumber daya ID dari bitmap, atau nama fileUINT uType, / Type / GambarcxDesired int, / / lebarcyDesired int, / / tinggiUINT fuLoad / / Flags);Bitmap atau Ikon kemudian ditempatkan dengan pesan "BM_SETIMAGE" pada tombol:SendMessage (hwndBmpButton, BM_SETIMAGE, IMAGE_BITMAP, hwndBMP);Parameter wParam untuk menentukan apakah gambar adalah bitmap (IMAGE_BITMAP) atau simbol (IMAGE_ICON). Itu

Page 21: delphi

Menangani bitmap, dan ikon ditentukan sebagai parameter terakhir.BM_SETIMAGE definisi

BM_SETIMAGEwParam = (WPARAM) fImageType / / image-jenis benderalParam = (lParam) (MENANGANI) Himage, / / menangani untuk gambarDalam contoh program dapat diputuskan dengan menggunakan saklar kompilator, jika bitmap tombol gambar atauAdalah dengan menggunakan ikon.

Checkboxes and radio buttons

Kotak centang dan tombol radio menghasilkanJuga, periksa kotak dan tombol radio pada dasarnya hanya tombol, hanya saja mereka sifat gaya tambahanpameran, yang membedakan mereka dari tombol biasa.Sebuah kotak centang dibuat. BS_CHECKBOX dengan Perbedaan gaya atau BS_AUTOCHECKBOX adalah bahwaprogrammer dalam BS_CHECKBOX gaya sendiri harus khawatir tentang apakah atau tidak pilih kotak centangakan disorot. Contoh program menggunakan gaya ini untuk menunjukkan bagaimana untuk query status danPerubahan:

hwndChkBox: = CreateWindowEx (0, 'BUTTON', 'checkbox', WS_VISIBLE or

WS_CHILD or {new style ->} BS_CHECKBOX, 10, 20, 90, 25, hWnd, IDC_CHKBOX,

hInstance nil);

Kode untuk tombol radio sama, tentu saja, adalah nama kelas yang berbeda dan gaya atribut lainnyadigunakan. Dengan cara ini, saya telah memilih BM_AUTORADIOBUTTON gaya. Jadi akan mengurus sistemuntuk melihat status. Namun, kebutuhan untuk menggunakan tombol radio akan berada dalam kelompok yang sama:

hwndOpt1: = CreateWindowEx (0, 'BUTTON', 'RadioButton1', WS_VISIBLE or

WS_CHILD or {new style ->} BS_AUTORADIOBUTTON, 25, 75, 125, 25, hWnd,

IDC_OPT1,

hInstance nil);

The click event of check boxes and radio buttons

Penandaan atau menghapus tag sesuai dengan acara klik tombol kembali normal danmaka memiliki "WM_COMMAND" diedit. Status dipertanyakan dengan "BM_GETCHECK" Tombol pesan.

Page 22: delphi

Baik BST_CHECKED (set hook) atau BST_UNCHECKED (kait dihapus) Pengembalian. Dalam contohadalah hasil dari suatu variabel bool ditugaskanbCBFlag: = (SendMessage (hwndChkBox, BM_GETCHECK, 0.0) = BST_CHECKED);dan kembali dalam bentuk menegasikan dari kotak untuk mengubah status dengan "BM_SETCHECK" pesan:SendMessage (hwndChkBox, BM_SETCHECK, periksa bendera [tidak (bCBFlag)], 0);Dengan tombol radio adalah untuk mengikuti yang sama, karena mereka mengirim dan menerima pesan yang sama dengan kotak centang.

Bekerja dengan kotak teks

Fields menghasilkanFokus dari tutorial ini berfokus pada fitur kunci dari bidang masukan. Mereka terlalu kompleks untuk setiap detailuntuk mengobati. Paling sering Anda mungkin akan menulis sesuatu di dalamnya dan ingin membaca sesuatu dari mereka. Dan persisyang ditunjukkan di sini.Bahkan ketika entri dibuat dengan "CreateWindowEx". Dan bahkan di sini, ada atribut gaya khususAnda dapat menggunakan, dan seperti biasa Anda dapat menemukan di Bantuan atau MSDN. Contoh program kami menciptakan kotak editmisalnya dengan menelepon:

hwndEdit1: = CreateWindowEx (WS_EX_CLIENTEDGE, 'EDIT', 'Edit1', WS_VISIBLE or

WS_CHILD or ES_NOHIDESEL, 10, 20, 400, 20, hWnd, IDC_EDIT1, hInstance, nil);

Sebuah fitur khusus dari properti ES_NOHIDESEL disebutkan. Biasanya, sistem menyembunyikan saatteks yang dipilih ketika Anda memindahkan fokus dari lapangan dan pergi ke kontrol lain. Hanya ketikaKotak edit akan fokus kembali, Anda akan melihat tanda lagi juga. Dengan p.g. Properti iniPerilaku off, sehingga teks yang dipilih tetap disorot bahkan jika Anda menggunakan kontrol lain.Sifat-sifat lainnya dapat ditemukan juga dalam bantuan dan di MSDN.1.5.2. Input teks bidang copy"Copy Text" tombol di program contoh kita, bagian atas kolom input teks di bawahdisalin. Untuk teks yang ada dengan pesan "WM_GETTEXT" membaca ke dalam buffer:SendMessage (hwndEdit1, WM_GETTEXT, 1024, Integer (@ buffer));dan kemudian hanya ditulis hanya dengan mitranya "WM_SETTEXT" di bidang di bawah ini:SendMessage (hwndEdit2, WM_SETTEXT, 0, Integer (@ buffer));WM_GETTEXT definisiWM_GETTEXTwParam = (WPARAM) cchTextMax / / jumlah karakter untuk menyalinlParam = (lParam) lpszText / / alamat buffer untuk teksWM_SETTEXT definisiWM_SETTEXTwParam = 0, / / tidak digunakan, harus nollParam = (lParam) (LPCTSTR) lpsz / / alamat jendela-text stringSebagai alternatif untuk kedua pesan bisa juga "GetWindowText" dan "SetWindowText"

Page 23: delphi

gunakan:GetWindowText (hwndEdit1, @ penyangga, 1024);SetWindowText (hwndEdit2, @ buffer);GetWindowText definisiint GetWindowText (HWND hWnd, / / menangani untuk lpString LPTSTR jendela atau kontrol,/ / Alamat string int nMaxCount / / alamat string);25Bekerja dengan kotak teksSetWindowText definisiBool SetWindowText (HWND hWnd, / / menangani untuk jendela atau kontrolLPCTSTR lpString / / alamat dari string);

Saya ingin menyebutkan di sini lagi bahwa medan masukan sebagai jendela sebagai jendela utamaadalah. Itu hanya diproduksi dengan gaya lain. Mengapa saya bahkan mengatakan? Mereka hanya menaruhnya di tempatEditfield menangani salah satu pegangan label dan melihat apa yang terjadi kemudian ... Bahkan lebih menarik adalah ketikamereka memperpanjang prosedur untuk parameter "hWnd" dan kemudian menggunakan ini. Apa yang terjadi? Kita bisa diMasukan atas lapangan untuk menulis apa yang kita inginkan - dalam bidang di bawah ini, baik teks dari labelKami teks atau keterangan.Dengan "EM_LINELENGTH" pesan kotak edit hanya dihitung berapa banyak karakter berada di garis yang ditentukan.Dalam parameter pertama, garis ditunjukkan, dari yang akan ditentukan. Untuk single-line input field seperti dalamContoh, nilai ini adalah nol. Kemudian nilai kembali adalah jumlah karakter yang tersedia:TextLen: = SendMessage (hwndEdit1, EM_LINELENGTH, 0, 0);EM_LINELENGTH definisiEM_LINELENGTHwParam = (WPARAM) i, / / karakter indexlParam = 0, / / tidak digunakan, harus nolBy the way, dengan gaya "ES_MULTILINE" Anda dapat membuat field input multi-line. Untuk sederhanaEditor teks, misalnya. Ini kemudian akan memungkinkan, menggunakan I-parameter (dalam wParam) dari jumlah karakterbaris tertentu yang akan ditentukan.1.5.3. Pilih teks di bidang masukanUntuk memilih teks, masukkan mereka dalam mengedit kotak kecil dari contoh program, menulis posisi awal dan akhirsatu. Kemudian gunakan tombol "Select", dan teks dalam kotak teks pertama adalah - menurut data -disorot. Jika tidak ada yang terjadi, maka Anda sudah mungkin tidak tersedia. Bagaimana cara

Page 24: delphi

kerjanya?Sudah akrab dengan pesan "WM_GETTEXT" awalnya akan menyimpan informasi Anda keluar dari dua kecilMasukan ladang dan membaca dengan bantuan "val" dikonversi ke nilai numerik:SendMessage (hwndEdit3, WM_GETTEXT, 1024, Integer (@ buffer));val (buffer, SelStart, kode);Dengan cara ini, titik awal dan akhir yang jelas, kedua nilai hanya harus dengan pesan kotak input"EM_SETSEL" dikirim ke kotak, yang membuat pilihan, dan kemudian akan terlihat:SendMessage (hwndEdit1, EM_SETSEL, SelStart, Selend);EM_SETSEL definisiEM_SETSELwParam = (WPARAM) (INT) nStart / / posisi awallParam = (lParam) (INT) pembukaan, / / berakhir posisiMenyalin teks yang dipilih ke clipboardMenyalin dan menyisipkan teks dapat dengan mudah dilakukan dengan pesan "WM_COPY" dan "WM_PASTE". Yang pertamaKirim salinan teks yang dipilih dari kontrol tertentu (window, input field, ...) dengan format"CF_TEXT" ke clipboard:26Bekerja dengan kotak teksSendMessage (hwndEdit1, WM_COPY, 0, 0);Pesan kedua membawa kembali teks dari clipboard dan masuk ke Control ditentukan:SendMessage (hwndEdit2, WM_PASTE, 0, 0);Nilai-nilai wParam dan lParam tidak dibutuhkan di sini dan dapat diatur ke nol.1.5.4. The "onchange" acara tanpa VCLDalam banyak program, Anda dapat melihat bahwa misalnya status tombol pada keberadaan kolom input tekstergantung. Hanya jika teks hadir, sehingga tombol diaktifkan. Cara konvensional adalah untuk VCLterbaik "onchange" acara:TForm1.Edit1Change Prosedur (Sender: TObject);mulaiMachWeiterKnopf.Enabled: = (Edit1.Text <>'');end;Ketika API pemrograman adalah baris lagi, tapi hasilnya akhirnya sama. Pertama, buatkami adalah tombol dinonaktifkan, mengapa kita menggunakan atribut WS_DISABLED:Mach Lebar Erbtn: = CreateWindowEx (0, 'Next>' 'TOMBOL',, WS_VISIBLEatau WS_CHILD gaya baru {->} atau WS_DISABLED, 220, 65, 150, 25, hWnd,IDC_BUTTONADDSTR, hInstance,nil);Maka kita perlu pesan "EN_CHANGE", proporsi nilai yang lebih tinggi dibandingkan parameter wParam"WM_COMMAND" ditularkan. Pesan ini menunjukkan bahwa field input telah berubah agak:WM_COMMAND:Kasus hiword (wParam) dariEN_CHANGE:

Page 25: delphi

loword if (wParam) maka = IDC_EDIT1mulai{... }end;end;

Dalam persentase rendah Anda dapat menemukan ID dari kontrol, sehingga Anda dapat memeriksa secara spesifik. Pada langkah ketiga dan terakhirbaca dari teks yang ada dari kontrol dan memeriksa hasil kembali. Anda dapat menggunakan Message"WM_GETTEXT" digunakan (dalam hubungannya dengan "SendMessage") atau "GetWindowText". Keduanya menyediakan jumlahkarakter disalin kembali, sehingga Anda dapat berasumsi bahwa teks hanya tersedia, jika hasilnya lebih besardari nol. Tergantung pada ini Anda mengaktifkan tombol, atau Anda terus ke bawah:

EnableWindow (Mach Wide Erbtn, GetWindowText (hEdit1, buffer, 256)> 0);

Auto-penyelesaian sistemDalam bab ini, itu hanya harus pergi ke auto-lengkap, yang akan disediakan oleh sistem.Namun, minimum yang diperlukan untuk Internet Explorer 5 Ini berarti NT4 Windows 95 dan 98, danitu bisa berpotensi menyebabkan masalah jika pengguna tidak menggunakan usang atau IE.Auto-completion hanya dapat digunakan untuk bidang masukan. Ini juga termasuk sebuah ComboBoxExtertanam kontrol edit. Dan itu bertindak seperti sistem-dikenal fungsi. Artinya, padaComboBoxEx menunjukkan autocompletion tidak dengan nilai-nilai yang tersedia di ComboBox Anda, tetapi Andamelihat nama-nama program yang berjalan, URL dari halaman web disebut, dll27Bekerja dengan kotak teksDalam prakteknya, fungsi shell, sehingga benar-benar hanya bermanfaat jika Anda suka program anda denganIngin melengkapi baris masukan: Start / Run dan selain ingin memiliki dukungan dari sistem.Auto-completion terdiri dari dua bagian: Auto append berarti bahwa teks yang Anda ketikdiselesaikan secara otomatis saat Anda mengetik (asalkan string apapun dalam daftar MRU dari shell dengan mengetikSurat identik). Dan sebagai autosuggest mengacu pada jendela kecil yang muncul saat mengetik danMenampilkan Anda daftar MRU.PetunjukMungkin versi Delphi terlalu tua dan tahu perintah "SHAutoComplete"mengapa tidak. Dalam hal Anda menemukan unit dalam program sampel"ShlObj_Fragment.pas" yang berisi perintah, termasuk bendera dan juga dariProgram Contoh ("Edit_R2.dpr") digunakan.Untuk menggunakan auto-lengkap, dapat program Anda membutuhkan ketika memulai perintah "CoInitialize", dansaat keluar "CoUninitialize" (Unit "ActiveX") panggilan.

Page 26: delphi

Ini juga berarti bahwa perintah terakhir tidak secara khusus di suatu tempat sebelum kedua kalinya dapat disebut.Idealnya, karena itu Anda harus melanjutkan sebagai berikut:

if (CoInitialize (nil) = S_OK) then try

/ / Buat jendela, dan/ / Mulai editing pesan

finally

CoUninitialize;

end;

dan masukkan antara mencoba dan akhirnya kode yang diperlukan untuk membuat aplikasi, dll.Jika Anda ingin melengkapi kontrol mengedit dengan auto-lengkap, maka cukup gunakan pegangandan memanggil perintah yang disebutkan sebelumnya "SHAutoComplete" pada:SHAutoComplete (hwndEdit1, SHACF_DEFAULT);Parameter kedua dapat menjadi salah satu bendera berikutNilai ArtiSHACF_DEFAULT SHACF_FILESYSTEM Sama + SHACF_URLALL. Tidak bisa dengan lainnyaFlags digabungkan!SHACF_FILESYSTEM Apakah sistem file (baca: daftar MRU dari program yang sedang berjalan,dll)SHACF_URLALL Mengingat kemajuan dan URL baru diketik Setara IESHACF_URLHISTORY + SHACF_URLMRUSHACF_URLHISTORY Mengingat kursusSHACF_URLMRU Mengingat URL diketik terakhir di IESHACF_USETAB Dengan Tab sekarang dapat memilih salah satu item dari daftar MRU (autosuggest)menjadi. Jika bendera tidak diatur, Anda mendapatkan Tab seperti biasa untukselanjutnya kontrol. Hanya dalam kombinasi dengan SHACF_FILESYS * atau * SHACF_URLbermakna.

Bekerja dengan kotak teksPara bendera berikut digunakan untuk menimpa pengaturan IE dalam registri. Dan mereka hanya bisa bekerja diKonjungsi dengan SHACF_FILESYS * - * atau SHACF_URL benderaSHACF_AUTOAPPEND_FORCE_OFF terlepas dari pengaturan registri akan otomatis menambahkan baris inputlepasSHACF_AUTOAPPEND_FORCE_ON terlepas dari pengaturan registri akan otomatis menambahkan baris inputberalihSHACF_AUTOSUGGEST_FORCE_OFF terlepas dari autosuggest pengaturan registri adalah garis masukanlepas

Page 27: delphi

SHACF_AUTOSUGGEST_FORCE_ON terlepas dari autosuggest pengaturan registri adalah garis masukanberalihAkhirnya, lihat kecil di bagaimana menggunakan auto-completion untuk ComboBoxEx a. ItuTugas terbatas, namun, hanya menunggu untuk mendapatkan pegangan kontrol mengedit tertanam. The ComboBoxExmengajukan pesan khusus yang tersedia "CBEM_GETEDITCONTROL", yang juga jelas mengapa mobil-Penyelesaian hanya dapat menggunakannya pada - ComboBox normal memiliki apa-apa seperti itu.Lagi pula, jika Anda telah menentukan pegangan field input, maka panggilan untuk perintahcontoh di atas menunjukkan:hEdit: = SendMessage (hCBEx, CBEM_GETEDITCONTROL, 0.0);

if (hEdit <> 0) then

SHAutoComplete (hEdit, SHACF_DEFAULT);

Khusus untuk Windows XPPada Windows XP menawarkan bidang edit di beberapa piring kecil. Anda akan perlu, bagaimanapun, umumKontrol 6.0, Anda dapat menggunakan melalui penggunaan sebuah manifesto yang disebut. Manifest ini adalah file XMLmembuat dengan konten tetap dan antara lain bahwa program Anda menggunakan gaya XP baru (tema), disediakanitu diaktifkan.Selain itu, manifesto ini juga menawarkan akses ke kemungkinan ditingkatkan untuk kontrol. Produk yang dijelaskan di siniFitur membuktikan hal ini, dan itu adalah sesuatu yang akan kita bahas pada posting selanjutnya. Mari kita lihat mengapasekarang sekali fitur-fitur baru untuk kotak edit. Tidak masalah dalam kasus ini, apakah Anda menggunakan Temaatau tidak. Hal ini juga bekerja pada tampilan klasik. Yang penting adalah file manifest.Teks standarBila Anda membuat kotak teks, maka Anda memiliki kemungkinan untuk menentukan teks tertentu, misalnya

hwndEdit1: = CreateWindowEx (WS_EX_CLIENTEDGE, 'EDIT', 'Edit1', WS_VISIBLE or

WS_CHILD or ES_NOHIDESEL, 10,20,400,20, hWnd, IDC_EDIT1, hInstance, nil);

Anda mungkin tahu serta fitur pencarian Windows Explorer. Jika Anda mencari file, Anda dapatkotak teks pertama untuk menentukan jenis file. Kotak di bawah ini memungkinkan Anda untuk mencari istilah,yang harus disertakan dalam file. Bidang ini menampilkan teks yang biasanya ditampilkan dalam warna abu-abu. KlikKemudian di lapangan, teks menghilang. Lapangan kehilangan fokus, ia muncul kembali. Hal yang sama dapat Anda gunakanFungsi "Edit_SetCueBannerText" membuat, dimana parameter pertama adalah pegangan field input,

Page 28: delphi

dan yang kedua adalah teks yang ingin Anda tampilkan.Sampel diperpanjang program "Edit_R2.dpr" menunjukkan bahwa Anda menggunakan baris ini:Edit_SetCueBannerText (hwndEdit1, 'Masukkan sesuatu yang');yang memiliki hasil sebagai berikut:Jadi teks hanya masuk akal jika lapangan kosong. Dia hanya muncul saat itu. Ambil sebagaiContoh sebagai manajer alamat. Untuk memperoleh data bagi pengguna dan menyerahkan-Nya alasankecil antarmuka dengan bidang beberapa masukan. Dengan bantuan "Edit_SetCueBannerText" Anda dengan mudah dapatTampilkan deskripsi cara kecil, dapat membantu pengguna untuk memahami makna dari bidang masukan.29Bekerja dengan kotak teksDan terlepas dari teks yang ditampilkan dan menerapkan field input tetap kosong.Jalan lain adalah untuk pergi dengan baik: dengan "Edit_GetCueBannerText" dan pesan"EM_GETCUEBANNER" seseorang harus dapat membaca teks yang ada. "Wajib", penekanannya adalah pada karena PSDK iniSebaliknya dalam kasus ini. Sun adalah dalam deskripsi parameter "Edit_GetCueBannerText" berikut ini:PSDK (Edit_GetCueBannerText)Parameterhwnd

Menangani ke kontrol edit.lpcwTextPointer ke string Unicode yang Menerima Teks yang ditetapkan sebagai isyaratbanner.cchTextJumlah WCHARs dalam string direferensikan oleh lpcwTextSaya pikir ini adalah masuk akal. Buffer teks memiliki ukuran tertentu, dan juga dalam kasus lain("GetWindowText", misalnya) dilewatkan berdekatan dengan buffer dan ukuran daripadanya. Dengan demikian, hal itu jugapelaksanaan fungsi:# Tentukan Edit_GetCueBannerText (hwnd, lpwText, cchText) \(Bool) SNDMSG ((hwnd), EM_GETCUEBANNER, (WPARAM) (lpwText), (lParam) (cchText))Namun, ia mengatakan dalam pesan "EM_GETCUEBANNER", atas belakang musuh Fungsi:PSDK (EM_GETCUEBANNER)ParameterwParamTidak digunakan, harus nol.lParamPointer ke string Unicode yang Menerima Set teks sebagai isyarat tekstual.Harap dicatat bahwa yang dikatakan di sini, nilai wParam tidak digunakan dan harus nol. Jika AndaNamun, p.g. Lihat fungsi, maka Anda akan menemukan bahwa nilai yang digunakan sangat baik. Rupanya

Page 29: delphi

Jadi Microsoft tidak tahu kapan tangan kiri membuat kanan.Pokoknya, tegasnya benar-benar tidak perlu untuk membaca ini isyarat teks. Dia melayaniPengguna tetapi hanya sebagai pengingat, sehingga dia tahu apa tujuan memiliki field input. Dan tugas ini(Tujuannya) tidak akan berubah dalam banyak kasus, mungkin tidak. Dan saya pribadi tidak akan tahu apa yang Andaharus membaca teks menggunakan isyarat. Tapi setidaknya aku ingin kau di kontradiksi yang sangat jelasPSDK titik.Kedua Balloon TipsTips balon tooltip seperti popup, tetapi memiliki lebih penampilan balon komik strip. DalamAlat tips dan artikel di Area Notifikasi Taskbar kita akan dihadapkan lagi dengan mereka. JadiMisalnya, ada juga kemungkinan untuk menciptakan sebuah tooltip yang muncul dalam bentuk ini kemudian pada Bidang Suntingadalah. Itu juga akan bekerja sama dengan sistem lain. Dan jika "shell32.dll" adalah cukup baru,juga bisa digunakan, gimmicks optik, seperti gaya kartun atau judul di tooltip.Dirancang khusus untuk Windows XP, ada dua fungsi "Edit_ShowBalloonTip" dan "Edit_HideBalloonTip" dengan,yang ini tooltips tanpa basa-basi dan menyembunyikan lagi pergi. Tapi itu benar-benar hanya bekerjapada Windows XP.Untuk melihat tool tip, kita perlu rekor TEditBalloonTip, yang pertama ukuran diinisialisasi:30Bekerja dengan kotak teksebt.cbStruct: = sizeof (EBT);Kemudian kita tentukan judul yang akan ditampilkan dalam tooltip tebalebt.pszTitle: = 'Edit demo revisi 2.1';Teks Alat yang sebenarnya ujung kemudian diteruskan ke pszText anggota variabel:ebt.pszText: = 'Beberapa karakter telah ditandai dalam kontrol edit top';Kemudian Anda memiliki pilihan untuk memilih salah satu dari empat simbol. Simbol-simbol adalah konstantadiidentifikasi yang dimulai dengan awalan TTI_.Nilai ArtiTTI_ERROR error ikon merah perisai dengan salib putihInformasi TTI_INFO simbol pidato gelembung dengan "i" di dalamnyaTTI_NONE icon tidak adaTTI_WARNING simbol peringatan, segitiga kuning dengan tanda seru(Simbol-simbol juga dapat digunakan dalam tool tips.)ebt.ttiIcon = TTI_INFO;Setelah itu, catatan dapat menggunakan fungsi "Edit_ShowBalloonTip" ke kontrol edit (yang menangani pertamaParameter dilewatkan)Edit_ShowBalloonTip (hwndEdit1, @ EBT);Tidak seperti program TNA menghilang Balloon Tips bidang otomatis. Anda butuhkan di sinidisebut individual "Edit_HideBalloonTip" dan lulus pegangan kontrol edit:Edit_HideBalloonTip (hwndEdit1);

Page 30: delphi

Bekerja dengan ListBoxes2.1. Bekerja dengan ListBoxes2.1.1. Listbox menghasilkanTutorial ini berkaitan dengan kotak daftar, dan menambah dan menghapus entri. Di sini, juga, salah satuVCL dari banyak pekerjaan, tetapi tidak begitu sulit dengan API.Pada titik ini sangat singkat sesuatu tentang bagaimana program sampel, karena hal ini tutorial pada bagian masihakan diam. Setelah awal, sudah ada lima entri dalam daftar. Jika Anda memilih salah satu dari ditampilkanRekam label di kanan atas. Hal ini memungkinkan entri baru untuk menambahkan field input, dan dapat ditandaiMenghapus entri dari daftar.Selain itu, semua entri dapat dipilih melalui tombol, dan entri terpilih dalam field inputdisalin.Jadi pertama, kami berkomitmen untuk menghasilkan kotak daftar. Seperti biasa, ia juga seperti setiap elemen jendela laindihasilkan. Ada beberapa gaya atribut khusus, beberapa di antaranya digunakan dalam kutipan berikut:

hwndListBox: = CreateWindowEx (WS_EX_CLIENTEDGE, 'LISTBOX', nil, WS_CHILD

or WS_VISIBLE or LBS_STANDARD LBS_EXTENDEDSEL or, 10, 10, 200, 230,

hWnd, IDC_LB, hInstance, nil);

Nilai ArtiLBS_EXTENDEDSEL memungkinkan Anda untuk memilih beberapa entri (Ctrl dan Shift yang didukung)LBS_MULTICOLUMN dibuat listbox dengan beberapa kolom yang dapat menggulir horizontalLBS_NOTIFY parent window menerima pemberitahuan bila item diklikLBS_SORT entri diurutkan berdasarkan abjadUntuk informasi lebih lanjut tentang atribut gaya, lihat MSDN atau membantu.2.1.2. Menambahkan sebuah entri ke kotak daftarBagaimana menambahkan entri menyediakan listbox pesan "LB_ADDSTRING". Parameter pertama tidak digunakan(Ie adalah nol), dan yang kedua berisi sebuah pointer ke buffer.buffer: = 'Peter';SendMessage (hwndListbox, LB_ADDSTRING, 0, Integer (@ buffer));Dalam program sampel adalah fungsi yang - menambahkan entri baru - melalui klik tombol. Prinsipnya adalahseperti contoh yang ditampilkan.

2.1.3. Menghapus item dari listboxSebelum kita menghapus entri, pertama-tama kita harus mencari tahu apakah mereka ada entri, dan apakah min.satu dipilih. Kami ingin membuat program bahkan logis mungkin dan tidak membingungkan

Page 31: delphi

pengguna. KitaJadi pertama mengidentifikasi dengan "LB_GETCOUNT" pesan jumlah entri:i: = SendMessage (hwndListbox, LB_GETCOUNT, 0, 0);Nilai kembali adalah baik jumlah entri atau LB_ERR nilai, menyatakan bahwa terjadi kesalahanadalah. Jika kode kesalahan atau nilai yang akan dikembalikan ke nol, kita harus mengakhiri fungsi pada titik tersebut.Dalam kasus terbaik kita dapat tapi sekarang indeks dari item yang dipilih dengan pesan "LB_GETCURSEL". mendapatkan sini juga, dalam kasus LB_ERR kesalahan dikembalikan. Jika tidak, hasilnya adalah dicari-indeks kami, dan kamidapat menghapus entri dengan "LB_DELETSTRING":32Bekerja dengan ListBoxesi: = SendMessage (hwndListbox, LB_GETCURSEL, 0, 0);SendMessage (hwndListbox, LB_DELETESTRING, i, 0);2.1.4. Baca selengkapnya entri yang dipilihKotak daftar dalam program sampel kami memungkinkan Anda untuk memilih beberapa item. Di sini, juga akan menjadi koreksi kesalahandisarankan: pertama-tama Anda harus mencari tahu berapa banyak entri yang disorot. Kami mencari indeks dari masingEntry dan teks itu sendiri keluar. Contoh program berisi prosedur yang sama denganTombol ini disebut.Pertama, kita menemukan menggunakan pesan "LB_GETSELCOUNT" keluar jumlah entri dipilih:Hitung Produk: = SendMessage (hwndListbox, LB_GETSELCOUNT, 0, 0);Dalam perjalanan, kita tidak perlu susah payah memeriksa semua entri pada status mereka. Kami bukannya menggunakan pesan"LB_GETSELITEMS" dan lulus nilai yang baru ditentukan sebagai parameter pertama. Yang kedua adalah sebuah array bilangan bulat,

catatan bahwa nilai indeks dari item yang dipilih untuk. Array ini harus cukup besar. Program Contohhanya dibatasi untuk 100 entri.SendMessage (hwndListbox, LB_GETSELITEMS, item Count, Integer (@ SelItems));Sisanya adalah loop untuk di mana kita pergi melalui indeks, menentukan teks yang menyertai dan dalam kotak teksuntuk mendaftar. Untuk membaca entri, kita menggunakan pesan "LB_GETTEXT". Pesan ini membutuhkan duaParameter. Yang pertama adalah indeks kita ingin mencari teks, dan yang kedua adalah pointer ke buffer yangUntuk mengakomodasi teks. Prinsipnya sama dengan yang membaca medan edit.

for i: = 0 to Count-1 do Items

begin

SendMessage (hwndListbox, LB_GETTEXT, SelItems [i], Integer (@ buffer));

lstrcat (buffer1, buffer);

Page 32: delphi

lstrcat (buffer1, ';');

SetWindowText (hwndEditSelItems, buffer1);

end;

Sebuah metode yang lebih elegan akan menjadi array dinamis, yang tergantung pada jumlah item yang dipilih dankarena itu tidak ada ukuran yang tetap (seperti 100, dalam kasus) terbatas. Implementasi sangat sederhana juga. Array adalahdinyatakan sebagai berikut:varSelItems: array integer;Jika kita telah menentukan jumlah item yang ditandai, maka kita mengatur panjang array ini sesuai:SetLength (SelItems, Count item);Satu-satunya perbedaan antara dinamis dan array tetap sekarang bahwa array dinamis masihdereferenced sehingga harus diakses pada elemen pertama (dengan indeks nol). Ada duaPilihan:Pertama Masukkan indeks dengan:SendMessage (hwndListbox, LB_GETSELITEMS, item Count, lParam (@ SelItems[0]));

Kedua Anda dapat menggunakan pernyataan ini untuk dereference:SendMessage (hwndListbox, LB_GETSELITEMS, item Count, lParam (pointer(@ SelItems) ^));Jika kita tidak melakukan pelanggaran akses akan menghasilkan. Dan pada akhirnya kita membutuhkan memori yang digunakanArray melepaskan lagi:SetLength (SelItems, 0);33Bekerja dengan ListBoxes2.1.5. Seleksi pemrograman memenuhiJika entri ditandai pemrograman - dan membatalkan tandanya - kemudian akan digunakan untukPesan "LB_SETSEL". Parameter kedua sedangkan indeks dari entri yang diinginkan diberikan, sedangkanParameter pertama berisi keadaan yang diinginkan (true, false). Perlu dicatat di sini lagi bahwa nilai Booleanharus dikonversi ke integer. Sebagai contoh, kita akan menunjukkan bagaimana masuknya ketiga dari listboxdapat memilih:SendMessage (hwndListbox, LB_SETSEL, WPARAM (benar), 2);Prosedur "SelAll" menunjukkan contoh program bagaimana untuk memilih semua entri dalam kotak daftar. Perlu dicatattapi itu "LB_SETSEL" hanya berlaku untuk kotak daftar di mana Anda dapat memilih beberapa item secara bersamaan.Untuk kotak daftar khas yang hanya memungkinkan pemilihan satu item, pesan "LB_SETCURSEL"

Page 33: delphi

akan digunakan. Di sini, Anda menentukan indeks yang diinginkan dalam wParam, lParam tidak digunakan selama danRemains nol:SendMessage (hwndSimpleLB, LB_SETCURSEL, 2, 0);Dengan nilai wParam -1 Anda dapat membatalkan.2.1.6. Menanggapi perubahan dalam pemilihan listboxDi sini kita menggunakan lagi pesan "WM_COMMAND". Kata high-order dari wParam adalah ListboxPesan "LBN_SELCHANGE" yang dipicu ketika pemilihan perubahan daftar kotak. (LainnyaKode pemberitahuan, lihat Bantuan dan MSDN) Dalam kata rendah wParam. AdalahIdentifier dari kotak daftar.

WM_COMMAND:

case hiword (wParam) of

LBN_SELCHANGE:

case LoWord (wParam) of

IDC_LB:

begin

end;

end;

end;

Untuk tujuan demonstrasi, saya gunakan di sini sekali "LB_GETSEL" untuk query status entri. ItuAlternatif akan kembali "."

Items: = SendMessage (hwndListbox, LB_GETCOUNT, 0, 0);

for i: = 0 to Items Thurs

if SendMessage (hwndListbox, LB_GETSEL, i, 0)> 0 then

begin

Inc (SelItems);

wvsprintf (buffer1, 'which marked:% d', PChar (@ SelItems));

lstrcpy (buffer, buffer1);

end;

Bekerja dengan ListBoxes

Sebagai "DragListbox" mengacu pada listbox, yang entri dapat dipindahkan dengan mouse. (Untuk menarik) Karena

Page 34: delphi

sehingga fungsi kontrol yang disebut umum digunakan, itu diperlukan, unit "CommCtrl.pas"dan mengintegrasikan perintah "InitCommonControls" (atau "InitCommonControlsEx") dalam tampilan program.Saya mendefinisikan demo sebagai aplikasi konsol, {$ APPTYPE CONSOLE} penambahan sehingga dihasilkanGunakan jendela konsol untuk teks output dengan "writeln" untuk. Lebih khusus lagi: saya berikan dalam hal iniKonsol jendela ketika Anda memindahkan entri dibuat menggunakan berita mouse ke prosesUntuk menggambarkan pergeseran. Garis-garis ini saya telah ditandai dengan "DEBUG" komentar.2.1.7.2. Bermutasi menjadi listbox ...DragListbox adalah hanya listbox yang normal sedikit dimodifikasi.

Akhirnya kami membawa Anda hanya, daftar melaluiDrag dan drop untuk memindahkan. Modifikasi ini hanyalah sebuah panggilan ke fungsi API"Membuat Daftar Drag" tercapai. Lulus pegangan mudah untuk memodifikasi kotak daftar:Tarik Membuat Daftar (GetDlgItem (hDlg, IDC_LISTBOX));Nilai kembali bool dapat digunakan untuk memeriksa. Sebaiknya tidak listbox dapat dimodifikasi, Anda harusMenghentikan program, atau setidaknya semua fitur yang entah bagaimana tergantung pada modifikasi, menonaktifkan.Membuat Tarik daftar definisiBool Buat daftar Drag (HWND HLB);

Selain itu, Anda harus mendaftar pesan lain dari Windows yang dihasilkan oleh Windows, jika adaDrag-and-drop operasi di listbox adalah:DL_MESSAGE: = RegisterWindowMessage Pesan (DRAGLISTMSGSTRING);"DL_MESSAGE" adalah pesan kami, dan di belakang DRAGLISTMSGSTRING menyembunyikan preset oleh sistemString konstan.The "Pesan Jendela Register" menciptakan pesan seluruh sistem yang unik. Itu berarti, panggilanlain fungsi jendela dengan string yang sama konstan pada, maka tidak ada nilai baru yang diciptakan, tetapiFungsi mengembalikan nilai numerik yang sebelumnya terdaftar.Dengan cara itu Anda bisa berhubungan dengan program lain, pesan tersebut dalam sistemmendaftar. Tapi itu bukan masalah di sini ... : O)RegisterWindowMessage message definisiUINT RegisterWindowMessage Pesan (LPCTSTR lpString

);

Berita DragListboxDragListbox menghasilkan empat pesan yang dapat kita gunakan dalam menanggapi "seret":Nilai Arti

Page 35: delphi

DL_BEGINDRAG dihasilkan ketika "tarik" Operasi dimulaiDL_DRAGGING dihasilkan selama "menarik"35Bekerja dengan ListBoxesDL_CANCELDRAG dihasilkan ketika membatalkan operasi (dipicu oleh ESC)DL_DROPPED dipicu ketika menutup "tarik" prosesTapi karena dalam pesan tarik sebelumnya terdaftar kami (DL_MESSAGE) adalah variabel, kita bisap.g. Pemberitahuan tidak seperti biasanya dievaluasi. Karena itu kita harus memanfaatkan kasus klausa lain. IniPrinsip akan menemui kami di Cari dan Ganti kotak dialog dari tutorial dialog standar lagielse

begin

Result: = FALSE;

/ / Message handling of the drag listbox comes here

DL_MESSAGE if <> 0 then / / can not be DL_MESSAGE WM_NULL (= 0)!

if uMsg = DL_MESSAGE then

Pesan apa yang sekarang dihasilkan, memberitahu kita catatan PDRAGLISTINFO yang dikirimkan kepada kami lParam tersebut.Bagi kami, yang uNotification variabel anggota yang menarik, Pemberitahuan atas DragListboxmengandungKasus PDRAGLISTINFO (lParam) ^. uNotification dari

DL_BEGINDRAG:

{... }

DL_DRAGGING:

{... }

DL_CANCELDRAG:

{... }

DL_DROPPED:

{... }

end / /kasus (PDRAGLISTINFO (lParam) ^ uNotification dari.)end / / yang lain (kasus uMsg of)DRAG DAFTAR INFO-Definitiontypedef struct {UINT uNotification;

Page 36: delphi

HWND hWnd;POINT ptCursor;

DRAG} LIST INFO

The "DrawInsert"The "DrawInsert" digunakan untuk menggambarkan proses dan menyediakan pengguna dengan orientasi manaitu saat ini berada. Dia menarik panah ke kiri DragListbox pada jendela induknya. BerikutContoh kecil pertama menentukan item dalam kotak daftar di mana kita menemukan diri kita:ItemIdxDragging: = LBItemFromPt (GetDlgItem (hDlg, IDC_LISTBOX)PDRAGLISTINFO (lParam) ^ ptCursor, TRUE).;Sehingga kita bisa menampilkan panahDrawInsert (hDlg, PDRAGLISTINFO (lParam) ^ hWnd, ItemIdxDragging.);Dua parameter pertama dalam setiap kasus menunjukkan pegangan ke jendela induk dan kotak daftar. Parameter terakhir adalahDari item yang kita kebetulan berada pada saat "menarik".Dalam rangka ulang tanda atau menghilang, sebagai parameter terakhir hanya akan melewati -1:DrawInsert (hDlg, PDRAGLISTINFO (lParam) ^ hWnd, -1.)

36Bekerja dengan ListBoxesDrawInsert definisibatal DrawInsert (HWND orangtua menangani,HWND HLB,int nItem);2.1.7.5. Apa yang akan menjadi lebih penting ...Saya ingin (untuk menarik perhatian Anda ke titik ini, terutama pada titik sisa dari program ini didasarkan pada logikademo ekstensif dijelaskan ditelusuri)/ / Kembali pesan hasil eksplisit, kalau tidak kita tidak akan/ / Menerima DL_DRAGGINGSetWindowLong (hDlg, DWL_MSGRESULT, integer (TRUE));/ / Pesan ditanganiHasil: = True;Sebagai komentar menunjukkan, adalah penting bahwa kami memberitahu sistem bahwa kita memiliki "DL_BEGINDRAG" pesantelah diobati. Jika kita tidak, kita tidak akan mengirim Windows "DL_DRAGGING" pesan karena tidaktahu apakah "tarik" proses telah dimulai atau tidak. Dan ketika ragu-ragu tetap Windows hanya bodoh - lebih baik aman daripada menyesal.Karena saya juga telah dikembalikan dari kenyamanan ke sumber daya dialog, efek dari pemberitahuanpanggilan dari "SetWindowLong" dengan parameter indeks DWL_MSGRESULT. The PSDK komentar bebas (

Page 37: delphi

diterjemahkan):PSDKApakah "SetWindowLong" dengan indeks DWL_MSGRESULT dengan nilai pengembalian prosedur dialog, Maka set masih harus dikembalikan selain benar, jika nilai kembali dilewatkan kembalibisa diganti.37Bekerja dengan combobox2.2. Bekerja dengan combobox2.2.1. Menghasilkan comboboxKotak combo adalah tanpa VCL mengambil membiasakan diri - tapi bisa dilakukan. Tutorial ini menunjukkan bagaimana untuk merekammenambahkan, menghapus, dan membaca dan menampilkan catatan yang dipilih.Unsur ini dibuat dengan "CreateWindowEx". Penting di sini hanyalah dua hal:Ketinggian yang ditentukan adalah tinggi bidang mengedit termasuk daftar diperluas! Dalam daftar, bar gulirmuncul di samping WS_VSCROLL gaya harus digunakan!Combo gaya utama (lebih dapat ditemukan dalam bantuan dan MSDN):Nilai ArtiCBS_AUTOHSCROLL teks secara otomatis gulungan ke kanan ketika karakter pengguna pada akhirBaris input. Tanpa gaya ini, panjang teks, hanya lebar garis masukancocok.CBS_DISABLENOSCROLL Jika daftar item tidak cukup untuk bergulir, scroll bar dinonaktifkanditampilkan. Tanpa gaya ini, bar gulir tersembunyi dalam kasus ini.CBS_LOWERCASE,CBS_UPPERCASEDengan gaya atribut teks dapat dengan huruf kecil atau modal mengkonversi.Kedua atribut ini mencakup namun saling eksklusif, jadi harap hanya menggunakan.CBS_SORT Menyortir string dalam daftar abjad.Atau ekstrak dari contoh program:HCB: = CreateWindowEx (0, 'ComboBox','', WS_CHILD atau WS_VISIBLE atauCBS_AUTOHSCROLL atau CBS_DROPDOWN atau CBS_SORT WS_VSCROLL atau, 10, 10, 150,150, hWnd, IDC_CB, hInstance, nihil);2.2.2. Combo box untuk menambahkan entriAda dua cara untuk menambahkan entri: "CB_ADDSTRING" menambahkan string ke dalam daftar abjad(Jika atribut style yang sesuai diatur) tergantung atau string ke dalam daftar:buffer: = 'Peter';SendMessage (HCB, CB_ADDSTRING, 0, Integer (@ buffer));"CB_INSERTSTRING" Namun, mengabaikan perintah, pergi ke sana string ditargetkan pada posisi tertentu: Sisipkanbuffer: = 'Luckie';SendMessage (HCB, CB_INSERTSTRING, {index ->} 3, Integer (@ buffer));Kedua pesan memiliki kesamaan yang mereka harapkan sebagai parameter kedua pointer ke buffer.

Page 38: delphi

Tetapisementara "CB_INSERTSTRING" Parameter pertama adalah indeks di mana teks yang akan dimasukkan,nilai ini dari nol "CB_ADDSTRING".2.2.3. Menghapus item dari comboboxProsedur untuk menghapus entri sesuai pada prinsipnya untuk listbox. Pertama Anda harus denganPesan "CB_GETCURSEL" menentukan indeks adalah entri yang dipilih depannya denganBisa "CB_DELETESTRING" Hapus. Kutipan dari program contoh menggambarkan hal itu:38Bekerja dengan comboboxIDC_DEL:mulaiIndeks {} mendapatkani: = SendMessage (HCB, CB_GETCURSEL, i, 0);if (i = CB_ERR) kemudian keluar;Item {} deleteSendMessage (HCB, CB_DELETESTRING, i, 0);end;Untuk menghapus seluruh isi dari kotak kombo, menggunakan pesan "CB_RESETCONTENT". KeduanyaParameter harus nol:IDC_DELALL:SendMessage (HCB, CB_RESETCONTENT, 0, 0);2.2.4. Entri dari kotak kombo untuk membacaJika Anda melihat contoh program, Anda akan menyadari bahwa Anda berhasil dalam label di bagian kanan atassetiap item yang dipilih dari kotak kombo ditampilkan. Ini adalah pesan "CBN_SELCHANGE"diedit. Ini adalah tanda bahwa pemilihan combo box telah berubah. Dengan pesan "CB_GETLBTEXT"Anda kemudian dapat membaca teks. Sebelumnya, tentu saja lagi, indeks dari entri yang dipilih untuk bertanya. Kutipanmenunjukkan Anda bagaimana untuk melakukannya:WM_COMMAND:Kasus hiword (wParam) dari{Pemilihan combobox Berubah}CBN_SELCHANGE:Kasus loword (wParam) dariIDC_CB:mulaiIndeks {} mendapatkani: = SendMessage (HCB, CB_GETCURSEL, i, 0);if (i <> CB_ERR) makamulai{} Pembaruan labelSendMessage (HCB, CB_GETLBTEXT, i, Integer (@ buffer));SendMessage (hSelItem, WM_SETTEXT, 0, Integer (@ buffer));

Page 39: delphi

{Tombol Delete Aktifkan}EnableWindow (HDEL, true);end;end;end;end;2.2.5. Jumlah entri dalam kotak kombo menentukanUntuk menentukan jumlah entri dalam kotak kombo, kita menggunakan pesan "CB_GETCOUNT".Hasil Kembali adalah nilai yang sesuai, atau CB_ERR pada kegagalan.39Bekerja dengan comboboxi: = SendMessage (HCB, CB_GETCOUNT, 0, 0);wvsprintf (buffer, "% d", PChar (@ i));lstrcat (buffer, "entri dalam kotak kombo ');2.2.6. Sebuah produk ComboBoxExComboBoxEx adalah bentuk lanjutan dari ComboBox yang memiliki dukungan built-in untuk grafis.Namun, gaya CBS_OWNERDRAWVARIABLE tidak mungkin karena dukungan diimplementasikan dalam bentuk daftar gambaritu. Ini berarti Anda dapat memuat beberapa gambar dalam daftar ini dan tidak perlu bahkan menggambargambar terlihat. Namun, grafis selalu ukuran yang sama. Jika tidak berperilakuComboBoxEx seperti ComboBox biasa.Namun, ini adalah apa yang disebut "Sepengendali". Oleh karena itu sangat penting bahwa ComboBoxExselalu diinisialisasi ke "InitCommonControlsEx" harus, jika tidak, anda bahkan tidak melihatnyavariccex: TInitCommonControlsEx =(DwSize: sizeof (iccex);dwICC: ICC_USEREX_CLASSES ;);mulaiInitCommonControlsEx (iccex);{... }end.Mereka melihat bahkan jika Anda hanya menyebutnya "InitCommonControls" seperti yang mungkin Anda dalam beberapa yang lain"Kontrol umum" masih terlihat.2.2.6.1. Control menghasilkanJika Anda diinisialisasi "Kontrol umum" dan dengan demikian ComboBoxEx, maka Anda dapat menambahkannya seperti yang lainKontrol produk, yang akan digunakan sebagai WC_COMBOBOXEX nama kelas:hCBEx: = CreateWindowEx (0, WC_COMBOBOXEX, nihil, WS_BORDER atau WS_CHILD atauCBS_DROPDOWN atau WS_VISIBLE, 10,10,300,150, wnd, IDC_CBEX, hInstance, nihil);Lanjutan gaya atributNilai ArtiCBES_EX_CASESENSITIVE The mencari teks dalam ComboBoxEx tergantung pada ejaan

Page 40: delphi

String.CBES_EX_NOEDITIMAGE Bidang masukan dan daftar ComboBoxEx tidak menampilkan grafisCBES_EX_NOEDITIMAGEINDENT Bidang masukan dan daftar ComboBoxEx tidak menampilkan grafis(Gaya Lebih Anda akan menemukan di PSDK)Jika Anda ingin mengatur gaya diperpanjang, maka Anda perlu pesan "CBEM_SETEXTENDEDSTYLE"di mana Anda harus mengatur wParam ke nol. Hal ini menyebabkan semua flag yang Anda tentukan dalam lParam dianggapmenjadi. misalnyaSendMessage (hCBEx, CBEM_SETEXTENDEDSTYLE, 0, CBES_EX_NOEDITIMAGEINDENT);Sebaliknya, dalam panggilan berikut ke CBES_EX_CASESENSITIVE bendera akan menjadi tidak efektif karena wParam tersebutCBES_EX_NOEDITIMAGE hanya berisi dan dengan demikian mengabaikan bendera kedua di lParam tersebut40Bekerja dengan comboboxSendMessage (hCBEx, CBEM_SETEXTENDEDSTYLE, CBES_EX_NOEDITIMAGE,CBES_EX_NOEDITIMAGE CBES_EX_CASESENSITIVE atau);2.2.6.2. Daftar gambar untuk menetapkanSeperti disebutkan ComboBoxEx mengandung built-in mendukung untuk grafis dalam bentuk daftar gambar. Ituadalah, jika grafis yang tidak tepat pada saat runtime menciptakan, tetapi sebagai gambar dari sumber daya dalamComboBoxEx ingin ditampilkan, maka Anda hanya perlu membuat daftar gambar dan grafis yang diperlukan. memuatSayangnya, saya miliki di situs sedikit di depan diri kita sendiri. Pertama daftar gambar kita dalam posting selanjutnyabertemu (dalam tampilan daftar tentang), dan di sisi lain kita menggunakan video singkat dari kontribusi toolbar.Jadi mari kita asumsikan bahwa karya seni dikatakan merupakan bagian dari sumber daya program dan ID memiliki 100 Kemudian kami mengundangMereka pertamahBMP: = LoadBitmap (hInstance, MAKEINTRESOURCE (100));Jika yang bekerja, maka nilai kembali adalah non-nol, dan kita dapat melihat daftar gambarDimensi 16x16 piksel menghasilkanif (hBMP <> 0) maka mulaihImgList: ImageList_Create = (16,16, ILC_COLOR, 0,1);Sekarang kita memuat plot dengan hanya panggilan perintah "ImageList_Add". Fitur khusus di sini adalah bahwagrafik kami sebenarnya mengandung beberapa frame. Dengan menetapkan daftar gambar untuk 16 piksel lebar,Grafis Oleh karena itu secara otomatis dalam frame "dipisahkan". Oleh karena itu, Anda hanya harus memastikan bahwa semua framememiliki lebar yang samaImageList_Add (hImgList, hBMP, 0);

Page 41: delphi

Karena kita tidak lagi perlu menggunakan grafis, kami akan berbagiDeleteObject (hBMP);dan kemudian mentransfer daftar gambar dengan "CBEM_SETIMAGELIST" pesan ComboBoxExSendMessage (hCBEx, CBEM_SETIMAGELIST, 0, lParam (hImgList));end;Share Gambar DaftarSebelum Anda keluar dari program, Anda harus menggunakan daftar gambar dengan "ImageList_Destroy" perintah membukanya,di mana Anda menggunakan pegangan sebagai parameter ke dalam daftar:ImageList_Destroy (hImgList);2.2.6.3. Produk meliputiUntuk menambahkan item, kita perlu TComboBoxExItem record. Pertama kita menentukan variabel anggotacatatan yang akan berlaku. Tujuan dari variabel masker yang kami melewati bendera diperlukan. Kami inginTeks ComboBoxEx melihat teks harus u.U. terlibat, dan harus menampilkan grafik. DefinisiAtribut Oleh karena itu sangatcbei.mask: = CBEIF_TEXT atau CBEIF_INDENT atau CBEIF_IMAGE atauCBEIF_SELECTEDIMAGE;Kemudian kita tentukan indeks dari item. Contoh di sini adalah sebuah loop program dijalankan, dan masing-masingNilai pengulangan dilewatkan sebagai indeks. Jika sebaliknya setiap item baru umumnya akan melampirkan sampai akhir,kemudian menggunakan nilai -141Bekerja dengan comboboxcbei.iItem: = -1;Kemudian kita masukkan teks yang diinginkan dan panjangnya. Dalam contoh program informasi ini berasal dariArray yang unsur-unsurnya diproses oleh urutan loop. Ini menetapkan nilai dari array,Prinsip menggambarkan:cbei.pszText: = 'Peter';cbei.cchTextMax: = lstrlen ("Petrus");Jika Anda ingin indent teks, kemudian menggunakan variabel anggota iIndent dan menetapkan nilai.Perlu dicatat bahwa nilai tertentu dikalikan dengan 10, yaitu One sesuai dengan lekukan dari 10Pixels, dua dari 20 piksel, dllcbei.iIndent: = 1;Tetap grafis. Dalam daftar pilihan sebelum setiap item adalah gambar dari daftar gambar yang akan dilihat. Karena itukita harus menentukan indeks saja:cbei.iImage: = ItemInfo [i] iImage;.Tapi juga dalam pemilihan item dalam kolom input ke ComboBoxEx grafis terlihat. Pada awalKami telah menggunakan CBEIF_SELECTEDIMAGE bendera, yang berarti bahwa kita indeks dari gambar yang diinginkanvariabel iSelectedImage harus lulus:

Page 42: delphi

cbei.iSelectedImage: = ItemInfo [i] iImage;.Menggunakan pesan "CBEM_INSERTITEM" menambahkan kita item kemudian satuSendMessage (hCBEx, CBEM_INSERTITEM, 0, lParam (@ cin));dan, misalnya, memberikan hasil sebagai berikut:Dan sehingga Anda melihat bahwa Anda benar-benar perlu khawatir tentang apa pun. Jumlahnya tergantung pada ComboBoxExKebetulan, menurut jumlah grafis. Program sampel mengandung saklar kompilator (THE_BIG_PICTURE) dengan,yang Anda dapat memuat bitmap 32x32. ComboBoxEx ini kemudian yang lebih tinggi.TcomboBoxExItem definisi42Bekerja dengan comboboxtypedef struct {UINT mask, / / set variabel anggota yang sahINT_PTR iItem / / item index, atau -1LPTSTR pszText / / Item textint cchTextMax / / panjang teksiImage int / / index dari grafik untuk daftar pilihaniSelectedImage int / / indeks grafik untuk bidang masukanint iOverlay;iIndent int / / indentasiLParam;COMBOBOXEXITEM}43Tambahkan Menu a2.3. Tambahkan Menu a2.3.1. Menu menghasilkanTutorial ini menjelaskan cara membuat dan menggunakan menu melalui panggilan API.Untuk menghasilkan menu utama, pertama-tama kita menggunakan fungsi "CreateMenu". Nilai kembali dari fungsi inimaka yang akan menangani menu kami, yang kami dengan "AppendMenu" dapat menetapkan entri. Ini mengacutetapi hanya pada menu bar di bawah judul bar - dengan barang-barang seperti "File", "Edit", dllhMenu = CreateMenu;Untuk memenuhi pos-pos dengan kehidupan, kita membutuhkan sebuah menu yang kami berfungsi dengan"CreatePopupMenu" menghasilkan. Sekali lagi, kita kembali pegangan, sehingga kita lagi "AppendMenu" yangdapat melampirkan entri yang sebenarnya:hSubMenu: = CreatePopupMenu;{Isi menu dengan entri}AppendMenu (hSubMenu MF_STRING,, IDM_ITEM1, 'Item & 1');AppendMenu (hSubMenu MF_STRING,, IDM_ITEM2, 'Item & 2');AppendMenu (hSubMenu, MF_SEPARATOR, 0, nihil);AppendMenu (hSubMenu MF_STRING,, IDM_ITEM3, 'Item & 3');

Page 43: delphi

Submenu sehingga tercipta kemudian ditugaskan ke menu utama, sehingga akhirnya, struktur yang diinginkan:AppendMenu (hMenu, MF_STRING atau MF_POPUP, hSubMenu, 'Menu & 1');Dan tentu saja kita harus mengatur menu ke jendela sehingga kita bisa melihat:SetMenu (hWnd, hMenu);Untuk informasi spesifik tentang fitur, lihat MSDN atau membantu. Saya ingin hanya mengatakan beberapaGaya atribut pergi, tapi yang juga dijelaskan dalam bantuan:Nilai ArtiMF_CHECKED,MF_UNCHECKEDSet atau menghilangkan tanda centang di depan item menu.MF_SEPARATOR Catatan ini menentukan tanda hubung. ID berikutnya adalah nol, dan nihil sebagai teks menuditentukan, karena entri ini tidak dipertanyakan dalam fungsi jendela.MF_DISABLED,MF_GRAYEDKedua atribut menonaktifkan item menu, tetapi hanya yang kedua juga merupakan abu-abuMF_ENABLED Mengaktifkan item menu lagi.MF_POPUP Alih-alih ID item dispesifikasikan disini, pegangan submenu.2.3.2. Menanggapi pemilihan item menuKlik menu diperlakukan sebagai klik tombol. Ini harus berada dalam pesan "WM_COMMAND" "BN_CLICKED"diobati, dengan, tentu saja, ID dari item menu jangan lupa:44Tambahkan Menu aWM_COMMAND:hiword if (wParam) = BN_CLICKED kemudianKasus loword (wParam) dariIDM_ITEM1:mulaibuffer: = 'Item1';ShowMsgBox (hWnd, buffer);end;end;2.3.3. Pilihan menu untuk mengaktifkan atau menonaktifkan dan Untuk mengaktifkan dan menonaktifkan item menu, fungsi API "EnableMenuItem". Fungsi ini Pertama lulus pegangan menu. Parameter kedua adalah ID item item yang mengaktifkan harus dinonaktifkan atau. Dan parameter terakhir ini kemudian justru status ini. Dua yang paling umum bendera Anda mungkin akan MF_ENABLED dan MF_GRAYED, pada bantuan lainnya terus informasi biasa. Dalam Kode terlihat seperti ini: WM_COMMAND: hiword if (wParam) = BN_CLICKED kemudian

Page 44: delphi

Kasus loword (wParam) dari IDC_ENABLE: EnableMenuItem (hMenu, IDM_ITEM1, MF_ENABLED); IDC_DISABLE: EnableMenuItem (hMenu, IDM_ITEM1, MF_GRAYED); end; EnableMenuItem definisi Bool EnableMenuItem ( HMenu HMENU, / / menangani untuk menu UINT uIDEnableItem, / item / menu untuk mengaktifkan, menonaktifkan, atau abu-abu UINT uEnable / bendera item / menu ); 2.3.4. Informasi tentang item menu Jika Anda ingin mengetahui status dari item menu, API menawarkan fungsi "GetMenuItemInfo". Ini Fungsi membutuhkan antara lain Sebuah catatan dari TMenuItemInfo jenis. Terlebih dahulu harus diinisialisasi. Kita juga perlu dalam variabel fmask menentukan informasi apa yang kami tertarik. Dalam kasus ini, itu adalah status Entri. (Hal ini dapat mencakup informasi lain yang kemudian akan Sejalan ORed.) MenuItemInfo.cbSize: = sizeof (TMenuItemInfo); MenuItemInfo.fMask = MIIM_STATE; TMenuItemInfo definisi 45 Tambahkan Menu a typedef struct {tagMENUITEMINFO UINT cbSize / / ukuran catatan UINT fmask / / mask untuk memilih jenis UINT ftype; UINT fState; UINT wid; HMENU hSubMenu; HbmpChecked HBITMAP; HbmpUnchecked HBITMAP; DWORD dwItemData; LPTSTR dwTypeData; UINT CCH; MENUITEMINFO}, FAR * LPMENUITEMINFO; Sekarang kita dapat memanggil fungsi "GetMenuItemInfo" di mana kita hasilnya adalah sama dengan variabel Boolean : Teruskan isEnabled: = (GetMenuItemInfo (hMenu, IDM_ITEM1, palsu, MENUITEMINFO)) dan (MenuItemInfo.fState MFS_GRAYED dan = 0); GetMenuItemInfo definisi Bool GetMenuItemInfo ( HMenu HMENU, / / menu menangani

Page 45: delphi

UINT uItem, / / id MENUITEM Bool fByPosition, LPMENUITEMINFO lpmii / / "TMenuItemInfo" kami record ); 2.3.5. GetMenuState Jika Anda hanya tertarik pada informasi status dari entri dan tidak informasi lebih lanjut, maka bekerja dengan fungsi "GetMenuState". Misalnya kami hanya satu ini direduksi menjadi Line: isEnabled = GetMenuState (hMenu, IDM_ITEM1, MF_BYCOMMAND) <> MF_GRAYED; GetMenuState definisi UINT GetMenuState ( HMenu HMENU, / / menu menangani UINT uid, / / MENUITEM ID, atau indeks MENUITEM UINT uFlags / / MF_BYCOMMAND (uid = menu id) / / MY_BYPOSITION (UID index = item) ); 2.3.6. Menu dari beban sumber daya Sekarang Anda memiliki menu, tentu saja, tidak hanya pada awal program "merakit". Anda dapat mengakses menu untuk memuat sumber daya dari program. Untuk ini kita membutuhkan resource editor, desain dari Menu diperbolehkan. Ketika datang ke dialog kita lebih luas pada editor Visual Studio dari Microsoft, sehingga hanya mengatakan bahwa saya baru saja menggunakan editor ini untuk menu: 46 Tambahkan Menu a Kode sumber naskah sumber daya kami menu terlihat seperti ini: / / Menu 200 DISCARDABLE MENU BEGIN POPUP "Menu 1" BEGIN MENUITEM "Item 1", 1 MENUITEM "Item 2", 2 MENUITEM "Item 3", 3 AKHIR POPUP "Menu & 2" BEGIN MENUITEM "Item 4", 4 MENUITEM "Item 5", 5 AKHIR AKHIR Script ini kita berjalan dengan kompiler sumber daya, seperti "BRCC32" Borland, ke dalam sebuah file sumber daya dan memasukkan ke dalam program kami. Untuk menggunakan menu, kita perlu perintah API "LoadMenu", sebagai

Page 46: delphi

Parameter selain contoh program, ID dari sumber daya menu diharapkan: hMenu = LoadMenu (hInstance, MAKEINTRESOURCE (200)); Ada dua versi untuk memuat. Pertama, kita dapat menggunakan menu di bagian-beban "WM_CREATE" dari fungsi berita pergi, maka masih harus "lulus" pada jendela. Hal ini terjadi seperti sebelumnya, dengan "SetMenu".

Sebagai kemungkinan kedua kita dapat memasukkan perintah "LoadMenu" sebagai parameter "CreateWindowEx": CreateWindowEx (0, ClassName, AppName, WS_CAPTION atau WS_VISIBLE atau WS_SYSMENU atau WS_MINIMIZEBOX atau WS_MAXIMIZEBOX atau WS_SIZEBOX, CW_USEDEFAULT, CW_USEDEFAULT, WindowWidth WindowHeight,, 0, LoadMenu (hInstance, MAKEINTRESOURCE (200)), / / <- menu Beban hInstance nil); LoadMenu-definition menunjukkan HMENU LoadMenu ( HINSTANCE hInstance, / / menangani untuk modul LPCTSTR lpMenuName / / menu nama atau identifier sumber daya ); 2.3.7. Bantuan item menu di status bar Dalam banyak program, Anda akan melihat penjelasan singkat di status bar ketika Anda mengarahkan mouse lebih dari satu Menu adalah: Sistem ini menyediakan fungsi "MenuHelp" tersedia untuk Anda yang terbaik dalam pengolahan 47 Tambahkan Menu a Pesan "WM_MENUSELECT" panggilan. Seperti namanya, pesan dipicu ketika memilih item menu. LParam mengandung ini pegangan menu. Kata yang lebih rendah dari wParam menentukan MENUITEM atau indeks submenu. Itu Menu Firman tinggi menetapkan bendera yang dapat dievaluasi, untuk MF_BITMAP misalnya, MF_GRAYED, dan lain-lain Dalam contoh program jadi memeriksa apakah item menu yang dipilih adalah pemisah atau menu pop-up. Dalam hal ini Kasus, baris status mengirimkan pesan "SB_SIMPLE" apa yang harus dikatakan, sebuah "redraw" status bar Konsekuensi. if (bool (HIWORD (wParam) dan MF_POPUP)) atau (Bool (HIWORD (wParam) dan MF_SEPARATOR)) atau (HIWORD (wParam) = $ FFFF) kemudian SendMessage (hStatus, SB_SIMPLE, 0.0) Jika tidak, kami menyerukan kepada fitur yang telah disebutkan "MenuHelp", yang kita yang pesannya, wParam dan lParam nilai, serta menu dan status bar menangani dan contoh aplikasi harus lulus: MenuHelp (uMsg, wParam, lParam, HMENU (lParam), hInstance, hStatus, @ dummy);

Page 47: delphi

Urutan nilai terbukti dari baris ini contoh ya. Juga layak disebutkan adalah parameter terakhir. Keras Microsoft harus parameter ini menjadi sebuah array yang memasangkan ID dari sumber daya string dan Menu menangani termasuk. Array ini kemudian mencari pegangan, yang (jika berhasil, tentu saja), fungsi beban string yang tepat dari sumber daya dari program dan menampilkan di status bar. Jadi setidaknya dalam PSDK. Sekarang "dummy" variabel dideklarasikan, namun, sebagai berikut: var dummy: uint = 0; Hal ini dimungkinkan karena, menurut definisi, parameter terakhir adalah pointer ke variabel UINT. Dan tampak seolah-olah akan nilai dari variabel ini karena firman rendah wParam akan ditambahkan ke sumber daya yang diinginkan Membentuk ID. Hal ini dapat ditentukan bahkan jika nilai "dummy" sebagai Salah satu contoh perubahan dan . Mencoba Dalam kasus item menu pertama sekarang akan menampilkan informasi untuk entri kedua, dan terakhir (No. 5) akan tidak memiliki sumber daya yang lebih tepat. Karena sumber daya string kita sekarang menggunakan ID yang sama sebagai item menu STRING DISCARDABLE BEGIN 1 "Menu pertama" 2 "Item menu kedua" 3 "Item menu ketiga" 4 "menu item # 4" 5 "Dan, tentu saja - entri kelima" AKHIR kita meninggalkan nilai "dummy" ke nol, dan semuanya adalah mentega ... : O) Petunjuk 48 Tambahkan Menu a Jika misalnya menu Anda Buat editor sumber daya dari Visual Studio, Anda telah ada dengan cara yang sama, masukkan teks yang sesuai. Hal ini secara otomatis membuat sumber daya string yang sesuai dibuat dan disimpan. MenuHelp definisi batal MenuHelp ( UINT uMsg, / / WM_MENUSELECT atau WM_COMMAND WPARAM wParam, / / wParam pesan LParam, / / lParam pesan HMainMenu HMENU, / / Menangani menu HINSTANCE hInstance, / instance / modul (untuk sumber daya string) HwndStatus HWND, / / handle dari status bar LPUINT lpwIDs / / pointer ke variabel UINT

Page 48: delphi

); 49 Dialog sumber daya menyebutnya 2.4. Dialog sumber daya menyebutnya 2.4.1. Dasar-dasar Tutorial ini adalah tentang dialog dari sumber daya program. Sebelum selalu menciptakan jendela baru dan panggilan, mungkin akan berguna untuk menggunakan pra-dibuat "bentuk." Terserah Anda, dengan editor yang Anda buat dialog. Perlombaan klasik mungkin Borland Lokakarya sumber daya, - sayangnya tidak sangat topikal - dalam Delphi 5 masih dalam proses. Saya pribadi lebih suka Visual Studio editor dari Microsoft. Tergantung pada versi Visual Studio itu cukup up to date dan menyediakan Oleh karena itu, akses ke kontrol baru (sekitar TreeView atau ListView) yang tidak diketahui Editor Borland. Ketika Mereka juga menggunakan editor VS, saya ingin menarik perhatian Anda untuk beberapa hal: Pertama Sebuah fenomena yang telah saya di awal adalah berjam-jam biaya adalah kenyataan bahwa dihasilkan Dialog tidak ditampilkan secara default. Pelakunya adalah kurangnya kait sebelum "Terlihat" di sifat dari kotak dialog. Jika program Anda berjalan, maka, Anda melihat apa-apa, maka ini kemungkinan kurangnya visibilitas adalah alasan utama. Kedua The VS editor Anda memiliki pilihan untuk sumber daya sebagai script (*. Rc) atau langsung seperti yang dikumpulkan Untuk menyimpan file sumber daya (*. Res). Untuk menggunakan script, Anda dapat menyebarkan dengan Sumber daya Compiler - misalnya yang "BCC32.EXE" Borland - kompilasi. Langkah ini dihilangkan dari akhir RES file, tapi Anda dapat mengedit secara manual tidak - apa script mungkin, karena pada prinsipnya hanya sebuah file teks dengan sintaks khusus. Ketiga Editor VS yang dihasilkan dari script juga "resource.h". Hal ini dapat menyebabkan pesan kesalahan datang ketika Anda mencoba untuk mengkompilasi script RC dengan compiler sumber daya dari Borland. Bohong tetapi tidak ketidakcocokan tetapi hanya fakta bahwa kompiler tidak definisi tertentu dapat mengakses. Dalam hal ini, Anda harus "Autoexec.bat" dalam Visual Studio Anda, masukkan nama file batch yang Variabel lingkungan, menyesuaikan diri. Secara default, file ini disebut "VCVARS32.BAT" dan terletak di BINOrdner oleh Visual C + +. Setelah restart berikutnya Borland sumber daya compiler menghasilkan tidak lebih RES file untuk masalah Anda. 4th Dimensi dari semua elemen editor VS tidak cocok dengan Pixelmaß dari Delphi. Maka Anda harus membayar perhatian khusus. Jika Anda - seperti biasa Delphi - elemen sebagai lebar dari nilai 300 Menetapkan, maka itu adalah lebih dari 300 piksel.

Page 49: delphi

Dalam contoh berikut, kita ingin dialog ini: dalam program acara kami, yang terletak dalam naskah sumber daya ("dialog.rc"). Saya mengatakan kepada Anda bahwa ini hanyalah sebuah file teks dengan sintaks tertentu, dan karena itu, dialog kami di script terlihat seperti ini: 50 Dialog sumber daya menyebutnya / / Dialog 100 DIALOGEX 0, 0, 162, 95 GAYA DS_3DLOOK | DS_NOFAILCREATE | DS_CENTER | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_CAPTION WS_VISIBLE | WS_SYSMENU CAPTION "Bekerja dengan sumber daya dialog" FONT 8, "MS Sans Serif" BEGIN CTEXT "Hello", 101,38,5,85,20, SS_CENTERIMAGE | SS_SUNKEN CTEXT "Dunia", 102,38,35,85,20, SS_CENTERIMAGE | SS_SUNKEN PUSHBUTTON "& Pelabelan" 103,5,70,70,20,0, WS_EX_CLIENTEDGE PUSHBUTTON "& Tutup", 104,85,70,70,20,0, WS_EX_CLIENTEDGE AKHIR 2.4.2. Non-modal dialog Dengan fungsi "menciptakan dialog" Anda membuat dialog non-modal. Lulus bersama contoh aplikasi ID sumber daya dialog, jendela pemilik (dalam hal ini nol) dan pointer ke fungsi pesan. Ketika kita tinggal dengan script contoh kita, maka panggilan akan terlihat seperti: hDialog: = dialog Create (NULL, MAKEINTRESOURCE (100), 0, @ dlgfunc); Menurut MSDN, fungsi ini juga hanya menggunakan "CreateDialogParam" bahwa Anda tidak bisa memanggil gantinya. Baru hanya nilai awal bahwa Anda tidak perlu menggunakan. Anda bisa, bagaimanapun, nilai untuk lParam negara, yang kemudian diteruskan ke fitur pesan dialog Anda: hDialog: = CreateDialogParam (hInstance, MAKEINTRESOURCE (100), 0, @ dlgfunc, 0); CreateDialog definisi HWND CreateDialog ( HINSTANCE hInstance, / / contoh aplikasi LPCTSTR lpTemplate, / / ID dari sumber daya dialog HWND hWndParent, / / handle dari jendela pemilik DlgProc lpDialogFunc / / Pointer ke fitur pesan dialog ); CreateDialogParam definisi HWND CreateDialogParam ( HINSTANCE hInstance, / / contoh aplikasi LPCTSTR lpTemplateName, / / ID dari sumber daya dialog HWND hWndParent, / / handle dari jendela pemilik DlgProc lpDialogFunc, / / Pointer ke fitur pesan dialog LParam dwInitParam / / inisialisasi );

Page 50: delphi

Jika Anda menggunakan salah satu fungsi, Anda juga perlu pesan loop di mana Anda tidak menjawab

Intercept pesan. Namun, loop pesan dialog berbeda dengan memanggil fungsi "IsDialogMessage". Karena fungsi ini untuk menerjemahkan dan mendistribusikan berita itu sendiri menunjukkan, mereka mungkin tidak diproses oleh "TranslateMessage" atau "DispatchMessage". sementara GetMessage (msg, 0,0,0) lakukan mulai IsDialogMessage (hDialog, msg); end; IsDialogMessage definisi 51 Dialog sumber daya menyebutnya Bool IsDialogMessage ( HWND hDlg, / / dialog menangani LPMSG lpMsg / / "TMSG" Struktur ); Petunjuk Jika Anda menggunakan dalam program Anda, pesan "WM_USER" dan "WM_USER + 1", mungkin bisa Masalah terjadi karena "IsDialogMessage" dalam beberapa kasus, pesan "DM_GETDEFID" dan "DM_SETDEFID" kirim mungkin. Ini memiliki nilai numerik yang sama seperti di atas Pesan, sehingga tumpang tindih dan masalah yang terkait dengan itu datang, misalnya, jika program Anda merupakan adaptasi dari "WM_USER + 1" menyediakan. Jika Anda memilih untuk ini bentuk panggilan dialog, Anda harus menyadari bahwa Anda bertanggung jawab untuk harus memproses semua pesan. Hal ini berlaku untuk semua kontrol yang Anda telah ditempatkan pada dialog, dll Atau misalnya jika Anda Shortcuts akan memuat dan memproses sumber daya dan, sayangnya, maka Anda tidak punya pilihan untuk dipilih sebagai jalan ini. Setelah meninggalkan pesan loop, Anda juga harus menangani dialog dengan "DestroyWindow" : Share DestroyWindow (hDialog); 2.4.3. Modal dialog Dengan "DialogBox" Anda membuat dialog modal: DialogBox (hInstance, MAKEINTRESOURCE (100), 0, @ dlgfunc) Sekali lagi, fungsi ini benar-benar menggunakan keterampilan lain - "DialogBoxParam" - seperti yang Anda sebut bisa. Parameter sesuai dengan "dialog menciptakan" fungsi atau "CreateDialogParam". Besar Perbedaan adalah bahwa di sini Anda tidak perlu pesan loop. Sebuah fitur berita sudah, tapi Mendistribusikan pesan masuk tidak manajer dialog dari sistem. DialogBox definisi int DialogBox (

Page 51: delphi

HINSTANCE hInstance, / / contoh aplikasi LPCTSTR lpTemplate, / / ID dari sumber daya dialog HWND hWndParent, / / handle dari jendela pemilik DlgProc lpDialogFunc / / Pointer ke fitur pesan dialog ); DialogBoxParam definisi int DialogBoxParam ( HINSTANCE hInstance, / / contoh aplikasi LPCTSTR lpTemplateName, / / ID dari sumber daya dialog HWND hWndParent, / / handle dari jendela pemilik DlgProc lpDialogFunc, / / Pointer ke fitur pesan dialog LParam dwInitParam / / inisialisasi ); Dan karena itu dalam program kami ada pesan loop untuk dialog cukup untuk menyelesaikan dalam Pesan fungsi perintah "EndDialog". 52 Dialog sumber daya menyebutnya Kasus uMsg dari WM_CLOSE: EndDialog (hDlg, 0); end; Perintah ini menghancurkan jendela tapi tidak segera. Sebaliknya, ia menetapkan bendera, yang memungkinkan prosedur dialog Kembali kontrol ke sistem. Sistem memeriksa bendera sebelum mencoba pesan berikutnya terima. Sudah diatur, maka sistem berhenti (dalam hal ini: internal) pesan loop hancur, jendela dan menggunakan nilai "nResult" sebagai nilai kembali untuk fungsi yang menciptakan dialog. EndDialog definisi Bool EndDialog ( HWND hDlg, / / handle dialog int nResult / / kembali ); Ini juga berarti bahwa Anda tidak perlu pegangan untuk dialog Anda. Karena nilai kembali "nResult" setara (atau dalam Error: -1) Anda benar-benar perlu untuk memeriksa apakah atau tidak kesalahan telah terjadi, misalnya: if (DialogBox (hInstance, MAKEINTRESOURCE (100), 0, @ dlgfunc) = -1) maka MessageBox (0, 'kesalahan saat melihat dialog' 'Demo Dialog',, MB_OK atau MB_ICONERROR); 2.4.4. Fungsi pesan untuk dialog Dialog kami membutuhkan fungsi, di mana kita dapat menanggapi pesan yang masuk. Prinsip sesuai dengan fungsi konvensional "WndProc" di jendela, tetapi berbeda dalam nilai kembali bool. Jika fungsi mengembalikan palsu sebagai hasil yang hampir merupakan tanda bahwa alih-alih penangan default untuk menjadi aktif. Ketika Anda mengedit pesan sendiri, maka Anda harus kembali benar ke Untuk menghindari eksekusi oleh penangan default.

Page 52: delphi

Fungsi dlgfunc (hDlg: hWnd, uMsg: dword, wParam: wParam, lParam: lParam): bool; stdcall; Namun ada perbedaan: Pada "WM_CREATE" berita Anda akan menunggu sia-sia. Counterpart disebut "WM_INITDIALOG". DialogProc definisi Bool Callback DialogProc ( HwndDlg HWND, / pegangan / dialog UINT uMsg, / / message WPARAM wParam, / / parameter pesan pertama LParam lParam / / parameter pesan kedua ); Ketika Anda keluar dari dialog, sekarang penting untuk fungsi yang telah Anda pilih. Menggunakan "Buat dialog", maka Anda perlu dialog - seperti dalam fungsi jendela konvensional - dengan "PostQuitMessage (0) quit "untuk keluar dari loop pesan: WM_CLOSE: PostQuitMessage (0); Sebaliknya, gunakan "DialogBox", sudah cukup untuk memanggil perintah tersebut "EndDialog": 53 Dialog sumber daya menyebutnya WM_CLOSE: EndDialog (hDlg, 0); Dalam program contoh dapat ditemukan di kedua versi. 2.4.5. Tutup dialog dengan ESC Anda akan menyadari bahwa kotak dialog yang paling sederhana dapat terhubung dengan tombol ESC. Ini Fungsi masih kurang, tapi cukup mudah untuk retrofit. Jika Anda menekan ESC, sistem akan mengirimkan pesan "WM_COMMAND". WParam ini berisi IDCANCEL nilai bereaksi sehingga Anda seperti ini harus: WM_COMMAND: if (wParam = IDCANCEL) kemudian SendMessage (hDlg, WM_CLOSE, 0,0) else {... } Lebih diperlukan. 2.4.6. Akses elemen dialog Untuk bekerja dengan unsur-unsur dialog, API beberapa fitur khusus. Anda tidak boleh lupa bahwa misalnya Sebuah kotak centang tidak sendirian, tetapi bagian dari sumber daya jendela dialog yang dihasilkan sekarang. Jadi, Anda perlu pertama mengetahui pegangan setiap elemen dan hanya maka Anda dapat mengatasinya. Sebuah fitur utama dari ini adalah "GetDlgItem" Menggunakan contoh yang sama dari kotak centang: Katakanlah kita memiliki ID nya diberikan IDC_CHECKBOX1, maka akan kita menanganinya dengan baris berikut: hDlgCheckBox: = GetDlgItem (hDlg, IDC_CHECKBOX1); Dan dari sini, akses ke properti dari kontrol berbeda dalam apa-apa dari apa yang kita telah dibahas dalam tutorial.

Page 53: delphi

GetDlgItem definisi HWND GetDlgItem ( HWND hDlg, / / dialog menangani nIDDlgItem int / / ID dari elemen ); Fitur lainnya adalah "SendDlgItemMessage". Ia bekerja seperti "Kirim Pesan", hanya itu di sini langsung dapat mengatasi elemen dialog. Jika kita ingin mengatur kait di kotak centang kita, maka terlihat seperti dari: SendDlgItemMessage (hDlg, IDC_CHECKBOX1, BM_SETCHECK, BST_CHECKED, 0); Kami ketik di samping ID dari kontrol. SendDlgItemMessage definisi PANJANG SendDlgItemMessage ( HWND hDlg, / / dialog menangani nIDDlgItem int, / / ID dari elemen UINT Msg, / / pesan yang ingin Anda kirimkan WPARAM wParam, / / parameter pesan pertama LParam lParam / / parameter pesan kedua ); Akhirnya, kita akan melihat bagaimana teks dalam elemen dialog menulis dan membaca lagi. Ini memberikan API fungsi "SetDlgItemText" dan "GetDlgItemText". 54 Dialog sumber daya menyebutnya Jika kita ingin menulis teks, maka kita hanya perlu menggunakan pegangan dialog dan ID dari Kontrol - dan teks, tentu saja! SetDlgItemText (hDlg, IDC_HELLO, 'Hello World!'); Untuk membaca, kita perlu variabel pchar yang menerima teks. Dialog menangani dan kontrol ID di sini lagi dibutuhkan: Nol Memory (@ szBuffer, sizeof (szBuffer)); GetDlgItemText (hDlg, IDC_HELLO, szBuffer, sizeof (szBuffer)); MessageBox (0, szBuffer, 'hasil', MB_OK atau MB_ICONINFORMATION); SetDlgItemText definisi Bool SetDlgItemText ( HWND hDlg, / / dialog menangani nIDDlgItem int, / / ID dari elemen LPCTSTR lpString / / text ); GetDlgItemText definisi UINT GetDlgItemText ( HWND hDlg, / / dialog menangani nIDDlgItem int, / / ID dari elemen LPTSTR lpString, / / pointer ke buffer teks

Page 54: delphi

nMaxCount int / / ukuran buffer ); 55 Masalah dengan Alt + Tab dan <Shortcut> 2,5. Masalah dengan Alt + Tab dan <Shortcut> Jika Anda bekerja dengan VCL digunakan, maka Anda akan tahu pasti bahwa Anda salah satu kunci TAB Kontrol dapat pindah ke yang berikutnya. Dan bahwa dengan huruf digarisbawahi dalam koneksi kontrol tombol ALT untuk digunakan sebagai jalan pintas untuk mengaktifkan fungsi yang sesuai. Tanpa VCL, ceritanya berbeda. Jika Anda telah mengikuti contoh dan ini telah diuji, maka Anda akan Perhatikan bahwa fungsi ini hilang. Untuk retrofit mereka, kita perlu "IsDialogMessage" dari tutorial dialog mengalihkan sedikit. Sekarang, fitur ini seperti yang dimaksudkan untuk kotak dialog, tetapi dalam kasus kami itu sangat membantu. Karena salah satu pegangan nya Diharapkan jendela, kita perlu menentukan rekayasa kami dengan jendela "CreateWindowEx" utama: {} Jendela menghasilkan hwndMain: = CreateWindowEx (0, ClassName, AppName, WS_CAPTION atau WS_VISIBLE atau WS_SYSMENU, integer (CW_USEDEFAULT), integer (CW_USEDEFAULT), lebar jendela, WindowHeight, 0, 0, NULL, NULL); sementara GetMessage (msg, 0,0,0) lakukan mulai jika tidak (IsDialogMessage (handle window {->} hwndMain, msg)) kemudian mulai TranslateMessage (msg); DispatchMessage (msg); end; end; Jika itu adalah pesan yang masuk kami sehingga ada pesan dialog, maka pada cara biasa tangan dan diproses, jika melompat ke manajer dialog dan memastikan bahwa kami Program untuk menjadi responsif pada tab. Ini masih merupakan langkah penting: Anda membutuhkan semua kontrol Anda ingin beroperasi dengan cara ini, Gaya WS_TABSTOP atribut menetapkan. Sebagai contoh: hClose: = CreateWindowEx (WS_EX_CLIENTEDGE, 'TOMBOL', '& Tutup' WS_VISIBLE atau WS_CHILD {atribut gaya baru ->} atau WS_TABSTOP, Jendela Lebar-115, WindowHeight-60, 100, 25, hWnd, IDC_CLOSE, hInstance, nihil); CreateWindowEx (WS_EX_CLIENTEDGE, 'TOMBOL', 'Tombol 1', WS_VISIBLE atau WS_CHILD {atribut gaya baru ->} atau WS_TABSTOP, 10, 10, 100, 25, hWnd, 0, NULL, NULL); Jika Anda mencoba program ini sekarang, Anda dapat memilih tombol individu dalam suksesi

Page 55: delphi

dengan tombol TAB. Dan oleh manajer dialog juga bekerja untuk menutup pintas tombol ALT + S. Petunjuk Saya berdoa untuk diingat bahwa ini bukan solusi resmi. Hal ini lebih patch jika fungsi TAB benar-benar perlu di self-made jendela Anda. Dan saya harus mengatakan bahwa itu dalam menu Dapat menyebabkan masalah ketika Anda mencoba untuk membuka dengan ALT dan huruf digarisbawahi dari menu. Kadang-kadang tekanan ESC memicu acak (?) Dari tindakan yang dipilih. Jika memungkinkan, gunakan sumber dialog bukan jendela. Kemudian Anda dapat membuka manajer dialog Sistem harus digunakan dan tidak perlu khawatir tentang pelaksanaan fungsi TAB / ALT. 56 Standard dialog Ketiga Standard dialog Bab ini berkaitan dengan dialog standar sistem. Ini termasuk misalnya Terbuka dan Simpan- Dialog, dialog font, dll Sistem ini menyediakan fungsionalitas, dan Anda tidak perlu sumber daya dialog untuk fokus sepenuhnya pada pengolahan pesan. Jadi mari kita gunakan kesempatan ini untuk mengembangkan dalam bab ini editor kecil yang paling penting bagi kami Dialog akan hadir. Saya tidak akan lagi menanggapi generasi jendela menu utama. Mengedit teks dimungkinkan melalui field input, dengan hanya beberapa atribut gaya baru untuk beberapa baris teks dan scrollbar mungkin diperlukan diamati. 57 Membuka dan Menyimpan File 3.1. Membuka dan Menyimpan File Apa yang akan menjadi editor tapi tanpa cara untuk membuka file yang sudah ada dan data diedit atau baru untuk menyimpan lagi? Selain dua dialog dalam tutorial ini akan menjadi fokus utama pada fungsi "Baca File" dan "WriteFile" kebohongan, yang akan kita gunakan untuk memuat dan menyimpan file teks dalam mini editor kami. 3.1.1. Catatan TOpenFileName The TOpenFileName Rekam digunakan oleh kedua Terbuka dan dialog Save As. Ini memberi kami tentang ( Flags, dll) akses ke desain dialog masing-masing, dan tentu saja kita membutuhkan mereka di sekitar nama file di Membawa pengalaman. Hal ini sebanding dengan sifat-sifat komponen VCL dan TOpenDialog TSaveDialog, dan jika Anda sudah Memiliki pengalaman dengan komponen ini akan menjadi familiar bagi Anda dari TOpenFileName banyak variabel dikenal. Seperti dengan beberapa fungsi sistem lainnya, Anda harus menginisialisasi catatan hanya oleh dia sendiri ukurannya Menetapkan:

Page 56: delphi

ofn.lStructSize: = sizeof (TOpenFileName); Jika Anda telah menggunakan dialog dengan VCL, Anda terbiasa melihat unsur-unsur individu filter file melalui pipa (pipa) yang dipisahkan. Saat memanggil fungsi API Sebaliknya, menggunakan karakter nol sebagai pemisah, dan kemudian tutup indikasi dari dua karakter null: const . Filter = file teks "(* Txt.) '# 0' Txt '# 0'Alle file (* *.)' # 0 '*' # 0 # 0.; {... } ofn.lpstrFilter: = filter; Digunakan tipe memiliki ekstensi file ganda, mereka harus dipisahkan oleh titik koma, sebagai contoh: const "(... * Pas, dpr *, * inc) Pascal file 'filter = # 0' * txt .. * Dpr; * Inc. '# 0 # 0; Dan jika kita tidak terlalu berniat untuk sepenuhnya mematuhi bendera berikut: ofn.Flags: = OFN_FILEMUSTEXIST atau OFN_PATHMUSTEXIST atau OFN_LONGNAMES; Silakan berkonsultasi dengan Bantuan atau MSDN untuk cara tambahan untuk menilai. Dan jika Anda misalnya satu VCLProgramm ingin menulis ulang API-based, maka sangat membantu untuk parameter komponen dialog untuk melihat dan membandingkan dengan pengamatan bantuan. TOpenFileName definisi 58 Membuka dan Menyimpan File typedef struct {tagOFN DWORD lStructSize / / ukuran catatan HWND hwndOwner / / pegangan jendela induknya HINSTANCE hInstance, / instance / program LPCTSTR lpstrFilter / / VCL = "Filter" LPTSTR lpstrCustomFilter; DWORD nMaxCustFilter; DWORD nFilterIndex / / VCL = "Filter Indeks" LPTSTR lpstrFile / / VCL = "Nama file" DWORD nMaxFile / / ukuran buffer untuk nama file LPTSTR lpstrFileTitle; DWORD nMaxFileTitle; LPCTSTR lpstrInitialDir / / VCL = "InitialDir" LPCTSTR lpstrTitle / / VCL = "Judul" Flags DWORD / / VCL = "Options" KATA nFileOffset / / awal nama file di jalan KATA nFileExtension / / awal ekstensi file di jalan LPCTSTR lpstrDefExt / / VCL = "DefaultExt" LParam lCustData; LPOFNHOOKPROC lpfnHook; LPCTSTR lpTemplateName; # Jika (_WIN32_WINNT> = 0x0500) void * pvReserved;

Page 57: delphi

DWORD dwReserved; DWORD FlagsEx; # Endif / / (_WIN32_WINNT> = 0x0500) } OPENFILENAME Catatan untuk Windows 2000 dan XP: Definisi sintaks sudah menunjukkan catatan diperluas, yang dapat digunakan untuk Windows 2000 dan XP. Jika Anda Versi Delphi terbaru cukup, ini rekor baru sudah tersedia. Jika tidak, harap sertakan Catatan pada akhir dari tiga variabel anggota baru Anda: kelas tagOFNA record = dikemas {Variabel catatan Old} pvReserved: pointer; dwReserved: dword; FlagsEx: dword; end; Dalam versi Unicode (tagOFNW) adalah untuk melanjutkan tepat. - Dua anggota variabel dan pvReserved dwReserved belum tapi milik dan harus diisi nil atau nol. Hanya FlagsEx- Variabel yang tersedia untuk Anda. Gunakan flag ini untuk menyembunyikan OFN_EX_NOPLACESBAR sehingga disebut "Tempat bar" dalam dialog: ofn.FlagsEx = OFN_EX_NOPLACESBAR; Jika Anda bekerja dengan rekor baru, maka Anda perlu Windows 95, 98, ME, dan NT, ukuran catatan lama menginisialisasi, karena sistem ini tidak bisa berbuat apa-apa dengan variabel baru. Untuk konstanta berikut: 59 Membuka dan Menyimpan File const {$ EXTERNALSYM OPENFILENAME_SIZE_VERSION_400A} OPENFILENAME_SIZE_VERSION_400A = sizeof (TOpenFileNameA) - sizeof (pointer) - (2 * sizeof (dword)); {$ EXTERNALSYM OPENFILENAME_SIZE_VERSION_400W} OPENFILENAME_SIZE_VERSION_400W = sizeof (TOpenFileNameW) - sizeof (pointer) - (2 * sizeof (dword)); {$ EXTERNALSYM OPENFILENAME_SIZE_VERSION_400} OPENFILENAME_SIZE_VERSION_400 = OPENFILENAME_SIZE_VERSION_400A; Panggilan bisa, tergantung sistem operasi, maka sebagai berikut: if (Win2k) atau (WinXP) kemudian ofn.lStructSize: = sizeof (TOpenFileName) lain ofn.lStructSize: = OPENFILENAME_SIZE_VERSION_400; Petunjuk Tutorial ini merupakan unit khusus di ("CommDlg_Fragment.pas"), catatan baru dan diperpanjang Berisi konstanta. Gunakan unit ini jika versi Delphi tidak mengetahui variabel baru. 3.1.2. Panggilan Terbuka dan Simpan dialog

Page 58: delphi

Setelah catatan sekarang diisi, kita sekarang dapat mengakses dialog yang diinginkan. Sajikan fungsi "GetOpenFilename" jika GetOpenFileName (ofn) maka MessageBox (0, buffer, 'file yang dipilih', MB_OK atau MB_ICONINFORMATION); dan "GetSaveFileName": jika GetSaveFileName (ofn) maka MessageBox (0, buffer, 'nama file yang ditentukan:', MB_OK atau MB_ICONINFORMATION); Masing-masing fungsi mengembalikan baik benar (jika pengguna dikonfirmasi dengan OK) atau salah. 3.1.3. Buka file dan membaca Tinggal dengan contoh bahwa kita telah memilih file dialog terbuka, dan sekarang di bidang masukan

Untuk melihat Editor mini kami. Untuk tujuan ini kita mendapatkan pegangan pada file pertama dan memori permintaan: hFile = CreateFile (buffer, GENERIC_READ atau GENERIC_WRITE, FILE_SHARE_READ atau FILE_SHARE_WRITE, nihil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); {} Ruang Permintaan hMemory: = GlobalAlloc (GMEM_MOVEABLE atau GMEM_ZEROINIT, memsize); Setelah selesai, kita mendapatkan alamat dari byte pertama dari objek memori baru dibuat pMemory: = GlobalLock (hMemory); Membaca file dan transfer ke "WM_SETTEXT" dalam bidang kita: 60 Membuka dan Menyimpan File ReadFile (hFile, pMemory ^, MemSize-1, ReadWrite Ukuran, nihil); SendMessage (Edit, WM_SETTEXT, 0, Integer (pMemory)); SendMessage (Edit, EM_SETSEL, 0, 0); Dan pada akhirnya - dibersihkan - seperti dalam setiap anggaran yang baik: CloseHandle (hFile); GlobalUnlock (CARDINAL (pMemory)); Gratis Global (hMemory); Untuk membaca data (dalam kasus max. 64k), kita menggunakan "ReadFile". Adalah sangat penting lpNumberOfBytesRead (dalam kode: "Ukuran ReadWrite"). Dia memberi kita jumlah byte benar-benar membaca kembali. Meskipun nilai ini tidak dibahas lebih lanjut dalam contoh ini, tapi dia dapat mengontrol kesalahan dalam program Anda . Melayani ReadFile definisi Bool ReadFile ( MENANGANI hFile, / menangani / file LPVOID lpBuffer, / / pointer ke buffer data NNumberOfBytesToRead DWORD, / / jumlah byte untuk membaca LPDWORD lpNumberOfBytesRead, / / jumlah byte yang dibaca LpOverlapped lpOverlapped );

Page 59: delphi

3.1.4. Isi field input sebagai file Jika kita ingin menyimpan teks editor, maka pada prinsipnya kita melakukan segala sesuatu mundur. Pertama, kita buka file lagi, tentu saja, meminta ruang alamat dan membawa kita ke toko kami. Sejauh ini, begitu baik. Sekarang kita bisa membunuh dua burung dengan satu batu: pesan "WM_GETTEXT" memberi kita sebagai nilai kembali jumlah byte yang dibaca (= karakter), dan mereka juga masih sama menulis data ke buffer: {} Tentukan byte yang akan ditulis ReadWrite size: = SendMessage (Edit, WM_GETTEXT, memsize-1, integer (pMemory)); {File} Menulis WriteFile (hFile, pMemory ^, Ukuran ReadWrite, ReadWrite Ukuran, nihil); Tentu saja, kita juga harus membersihkan lagi, yaitu Tutup file dan memori yang digunakan lepaskan. WriteFile definisi Bool WriteFile ( MENANGANI hFile, / menangani / file LPCVOID lpBuffer, / / pointer ke buffer data NNumberOfBytesToWrite DWORD, / / jumlah byte yang akan ditulis LPDWORD lpNumberOfBytesWritten, / / jumlah byte yang ditulis LpOverlapped lpOverlapped ); 3.1.5. Memilih lebih dari satu file Karena ada juga aplikasi di mana Anda dapat meng-upload lebih dari satu file, sekarang akan ditunjukkan segera. Berikut ini harus diperhatikan: kita perlu memperluas variabel anggota Flags adalah bendera, tapi ini memiliki konsekuensi bahwa dialog akan ditampilkan dalam tampilan "lama" dari Windows 3.x: 61 Membuka dan Menyimpan File ofn.Flags: = {... Atau OFN_ALLOWMULTISELECT}; Anda dapat menghindari ini dengan menggunakan bendera selain OFN_EXPLORER dan sebagainya Windows 9x/NT/ME/2000/XP menerima gaya biasa: ofn.Flags: = {... } Atau OFN_ALLOWMULTISELECT atau OFN_EXPLORER; Tapi karena ada perbedaan di kedua variasi dalam hasil kembali, kita harus melihat kedua. 3.1.5.1. Gaya lama dialog Dalam kasus ini, buffer teks menunjuk ke string dari kedua nama folder dan nama file yang dipilih, mengatakan semuanya dipisahkan oleh spasi. Jadi ini mungkin misalnya jadi terlihat seperti: C: \ My ~ 1 file1.txt file2.txt file3.txt Anda perlu mengurai string sehingga tepat ketika dalam nama file dan nama folder dari Anda Ingin menggunakan aplikasi. 3.1.5.2. Gaya baru dialog Sebuah cerita yang berbeda sedikit dialog Win9x-gaya. Di sini, juga, teks berisi hanya buffer string. Tetapi

Page 60: delphi

Kali ini baris dengan karakter # 0 dipisahkan. Penyebabnya memiliki panjang dengan Apakah nama file. Dibandingkan dengan p.g. Merangkai kotak dialog tua, nama folder akan waktu ini sebagai C: \ My Documents dikembalikan. Nama file yang terakhir berakhir dengan dua karakter # 0. Dengan memisahkan # 0-karakter penyangga sehingga Anda tidak dapat diproses lebih lanjut secara langsung, Anda hanya akan melihat nama folder: MessageBox (0, buffer, NULL, 0); Untuk nama file yang akan tampilannya tetapi dengan bantuan sebuah variabel pchar yang Anda tetapkan untuk awal buffer: p: = penyangga; Sekarang pergi melalui teks asalkan buffer sampai tanda pertama ini # variabel 0, masing-masing. Ini adalah yang paling terbaik dalam loop sementara: sementara (p [0] <> # 0) lakukan mulai MessageBox (Handle, p, NULL, 0); Juga, panggilan ini pertama akan melihat nama folder. Menggunakan inc kita meningkatkan posisi pchar variabel dalam buffer dengan panjang string saat ini (+1, karena berakhir dengan ya # 0-karakter): inc (p lstrlen, (p) +1); end; Dengan cara ini, kita memperoleh berturut nama file individu dan mengeditnya dengan nama folder gunakan. 62 Mengubah font 3.2. Mengubah font Editor kami digunakan sebelumnya ketika memulai font sistem untuk menampilkan: hWndFont: = GetStockObject (SYSTEM_FONT); if (hWndFont <> 0) maka SendMessage (hEdit, WM_SETFONT, hWndFont, 1); Karena font ini sekarang mungkin tidak menyenangkan semua orang, dan sekarang praktek umum di editor adalah bahwa Anda, Font bahkan dapat memilih untuk editor kami diperluas untuk menyediakan fungsi ini. 3.2.1. Catatan TChooseFont Untuk dialog font, kita perlu catatan yang disebut TChooseFont yang memberikan kami akses ke dialog. Pertama kita harus menginisialisasi dan menetapkan ukuran sendiri dan parent window: cf.lStructSize: = sizeof (TCHOOSEFONT); cf.hWndOwner: = wnd; Selanjutnya, kita perlu variabel TLogFont jenis (dalam contoh "Jika"), yang kita sesuai dengan Anggota variabel dari catatan lulus: cf.lpLogFont: = @ lf; Kecuali "ts" variabel sekarang berisi font yang sah, hal ini diatur dalam dialog sudah. Dan ketika Anda keluar dengan OK, variabel disesuaikan sesuai dengan pilihan kita, jadi kami mengubah font di Editor kami cukup

Page 61: delphi

mudah dapat berubah. Dalam hal ini, kita perlu mengatur bendera "CF_INITTOLOGFONTSTRUCT" karena jika

variabel anggota lpLogFont tidak diperhitungkan: cf.Flags: = CF_SCREENFONTS atau CF_INITTOLOGFONTSTRUCT atau CF_NOSCRIPTSEL; Bendera lain dapat ditemukan di MSDN dan / atau PSDK tersebut. Dalam kasus kami, dialog hanya menampilkan font, gaya dan Ukuran. TChooseFont definisi typedef struct { DWORD lStructSize / / ukuran catatan HWND hwndOwner / / Menangani dari jendela induk HDC hdc; LPLOGFONT lpLogFont / / pointer ke variabel "TLogFont" INT iPointSize; Flags DWORD, / / Flags COLORREF rgbColors; LParam lCustData; LPCFHOOKPROC lpfnHook; LPCTSTR lpTemplateName; HINSTANCE hInstance; LPTSTR lpszStyle; WORD nFontType; INT nSizeMin; INT nSizeMax; ChooseFont} 3.2.2. Panggilan Font dialog Sekarang kita telah mengisi catatan TChooseFont, kita bisa memanggil dialog, yang kita sebut Record

Parameter yang lulus: 63 Mengubah font if (ChooseFont (cf)) kemudian Hasil: = CreateFontIndirect (Jika); Hasilnya benar jika pengguna telah mengkonfirmasi dialog dengan OK. Dalam hal ini sebelumnya oleh kami disesuaikan ditugaskan variabel TLogFont sesuai dengan pilihan, jadi kita menggunakan fungsi "CreateFontIndirect" dapat membuat font logis. Fungsi ini mengembalikan menangani ke Font. Dalam contoh program, font ini logis akan digunakan untuk mengubah font dalam kotak edit: myfont: = Pilih Font (wnd); if (myfont <> 0) maka mulai SendMessage (hEdit, WM_SETFONT, WPARAM (myfont), lParam (false));

Page 62: delphi

UpdateWindow (hEdit); end; 64 Cari / Ganti dialog 3.3. Cari / Ganti dialog 3.3.1. Dasar Sebelum kita dapat menggunakan Cari dan Ganti dialog, kita perlu (sayangnya) beberapa perubahan untuk program . Make Teks pencarian yaitu hanya didukung oleh kontrol RichEdit, jadi kita punya program kami sehingga . Melengkapi Namun upaya batasnya: program editor; menggunakan {... } RichEdit; mulai LoadLibrary ('riched20.dll') / / RichEdit 2.0 LoadLibrary ('riched32.dll') / / RichEdit {... } end. Hasil kembali dari "LoadLibrary" tidak peduli, karena kita masih dalam terjadi kesalahan Edit biasa Kontrol akan menghasilkan. Berikut ini akan mengatakan: The 2.0 RichEdit petunjuk untuk menemukan pilihan dari Cari arah. Jadi kita bisa mencari awal teks menjelang akhir teks, atau sebaliknya. Oleh karena itu, pertama-tama kita coba juga untuk membuat 2,0 RichEdit. Tidak bekerja, kita menciptakan normal Kontrol RichEdit. Apakah itu tidak, kita tetap berpegang pada multi-line kontrol edit kami: Kasus uMsg dari WM_CREATE: mulai {... } {Buat RichEdit 2,0} hEdit: = CreateWindowEx (WS_EX_CLIENTEDGE, 'RichEdit20A', nihil, atau WS_CHILD WS_VISIBLE atau ES_MULTILINE atau ES_NOHIDESEL atau WS_VSCROLL atau ES_AUTOVSCROLL 0,0,0,0, wnd, IDC_EDIT, hInstance, nihil); RichEdit20: = (hEdit <> 0); {RichEdit 1.0 menghasilkan jika R2.0 tidak mungkin} if (tidak RichEdit20) maka hEdit: = CreateWindowEx (WS_EX_CLIENTEDGE, 'RichEdit', nihil, atau WS_CHILD WS_VISIBLE atau ES_MULTILINE atau ES_NOHIDESEL atau WS_VSCROLL atau ES_AUTOVSCROLL 0,0,0,0, wnd, IDC_EDIT, hInstance, nihil); RichEdit10: = (hEdit <> 0); {Ada juga ada 1,0 RichEdit yang mungkin: o (} if (tidak RichEdit10) dan (tidak RichEdit20) maka hEdit: = CreateWindowEx (WS_EX_CLIENTEDGE, 'Sunting','', WS_VISIBLE atau

Page 63: delphi

WS_CHILD atau ES_MULTILINE atau WS_VSCROLL ES_AUTOVSCROLL atau, 0, 0, 0, 0, wnd, IDC_EDIT, hInstance, nihil); SetFocus (hEdit); {... } end; end; Dan hanya jika min. salah satu dari dua kontrol RichEdit (v2.0 atau v1.0) bisa dibuat, kami memperpanjang Main menu editor untuk "Cari" poin dan "Ganti": 65 Cari / Ganti dialog if (RichEdit10) atau (RichEdit20) kemudian mulai AppendMenu (hSubmenu, MF_STRING, IDM_SEARCH, 'Cari'); AppendMenu (hSubmenu, MF_STRING, IDM_REPLACE, 'Ganti'); end; "RichEdit10" dan "RichEdit20" bool adalah dua variabel global yang digunakan terutama untuk mengontrol. 3.3.2. Para Cari atau Ganti panggilan dialog Untuk memanggil dua dialog, pertama kita perlu catatan TFindReplace jenis. Kita juga perlu lebih buffer teks, yang menerima string ini: var fnd: TFindReplace; Findstr: array [0 0,4096] dari char; Findlen: DWORD = sizeof (findstr) - 1; Ukuran catatan harus, tentu saja, akan didirikan kembali fnd.lStructSize: = sizeof (TFindReplace); Ketika kita berikan kepada jendela menangani pemilik jendela editor kami. Pada saat yang sama kita menetapkan bendera, tapi dari RichEdit digunakan tergantung. Bisa menghasilkan 2,0 RichEdit, kami mengatur arah pencarian untuk "turun". Hanya 1,0 RichEdit tersedia, maka kita menetapkan Abwärtsflag kursus menyembunyikan (untuk menghindari kesalahan) Namun pemilihan arah: fnd.hWndOwner: = wnd; if (RichEdit20) kemudian fnd.Flags = FR_DOWN lain fnd.Flags: = FR_HIDEUPDOWN atau FR_DOWN; Program ini menggunakan metode yang sedikit berbeda meskipun, tetapi prinsipnya tetap sama. Akhirnya, kami memiliki sekitar buffer teks fnd.lpstrFindWhat: = findstr; fnd.wFindWhatLen: = Findlen; Sebelum kita dapat memanggil dialog sekarang benar-benar, kita membutuhkan nilai FINDMSGSTRINGNachricht disebut mencari tahu. Ini adalah sistem yang sudah ditetapkan dan menggunakan fungsi "RegisterWindowMessage pesan" kita dapat menentukan nilai numerik: var

Page 64: delphi

FindTextMsgId: UINT; {... } FindTextMsgId: = RegisterWindowMessage Pesan (FINDMSGSTRING); Pesan ini dikirim nanti jendela kita. Untuk kemudian mengambil tindakan, kita perlu nilai numerik. Sekarang kita dapat memanggil dialog pencarian tapi untuk saat ini: CommDlg.FindText (fnd); Sebaliknya, kita ingin memanggil dialog Ganti, pertama-tama kita butuh buffer teks: 66 Cari / Ganti dialog var ReplStr: array [0 0,4096] dari char; Fakta bahwa panggilan ini tidak berbeda dari dialog pencarian besar, Anda sudah mengenali fakta bahwa editor kami di kedua Kasus prosedur "Cari" digunakan. Kita hanya perlu untuk menetapkan buffer teks baru: if (fReplaceMode) kemudian mulai fnd.lpstrReplaceWith: = ReplStr; fnd.wReplaceWithLen: = Findlen; end; dan mengubah bendera karena kami ingin mencari teks pada dasarnya menjelang akhir dan mengganti teks: if (RichEdit20) dan (tidak fReplaceMode) maka fnd.Flags: = FR_DOWN lain fnd.Flags: = FR_DOWN atau FR_HIDEUPDOWN; Dan sampai panggilan dialog tetap tidak berubah segalanya yang lain: CommDlg.ReplaceText (fnd); TFindReplace definisi typedef struct { DWORD lStructSize / / Ukuran Rekam HWND hwndOwner / / pemilik window HINSTANCE hInstance; Flags DWORD, / / Flags LPTSTR lpstrFindWhat text / / pencarian LPTSTR lpstrReplaceWith text / / baru (untuk penggantian) KATA wFindWhatLen / / panjang dari string pencarian KATA wReplaceWithLen / / panjang teks baru LParam lCustData; LPFRHOOKPROC lpfnHook; LPCTSTR lpTemplateName; } 3.3.3. Teks Pencarian Dalam bab terakhir itu disebutkan bahwa jika kita menjalankan dialog pencarian (dalam arti bahwa kita memasukkan teks dan pada "Find Next" tombol), kemudian pada jendela kita FINDMSGSTRING pesan dikirim. Ini tidak konstan, tapi kami harus menentukan nilai dari pesan ini terlebih dahulu. Kita harus meninjau sebelum pengolahan pesan jika pernah diberi nilai. Nilai lParam

Page 65: delphi

kemudian pointer ke record TFindReplace: Kasus uMsg dari {... } / / Cari fungsi, oleh NicoDE else if (FindTextMsgId <> 0) dan (uMsg = FindTextMsgId) kemudian mulai FindParam: PFindReplace = (lp); Para anggota bendera variabel catatan ini sekarang berisi FR_FINDNEXT nilai jika kita di tombol pencarian dialog "Find Next" tombol. Dalam hal ini kita sebut pencarian yang sebenarnya, "Cari Teks", berikutnya kami Pemilik jendela dan pencarian teks juga melewati bendera yang kita dapat diatur dalam dialog pencarian yang Arah kita ingin melihat apakah semua kata-kata yang akan dicari, dan apakah peran case-sensitive a memainkan: 67 Cari / Ganti dialog jika (dan FindParam.Flags FR_FINDNEXT = FR_FINDNEXT) maka Cari teks (FindParam.hWndOwner, FindParam.lpstrFindWhat, FindParam.Flags dan FR_DOWN = FR_DOWN, FindParam.Flags dan FR_MATCHCASE = FR_MATCHCASE, FindParam.Flags dan FR_WHOLEWORD = FR_WHOLEWORD); akhir Karena kita selalu bekerja dengan jendela pemilik, jendela editor kami sehingga kami harus dalam pencarian pertama Menangani dari kontrol RichEdit menentukan. Untuk tujuan ini kita menggunakan fungsi terkenal dari dialog "GetDlgItem": KREDIT: = GetDlgItem (wnd, IDC_EDIT); Kemudian kita menemukan bahwa dalam teks kontrol sudah disorot. Ini membantu kita memahami pesan "EM_EXGETSEL", sebagai lParam mengharapkan pointer ke rekor CHARRANGE. Karena kita ingin mencari teks belum, kita menggunakan yang sama variabel yang sesuai anggota dari catatan TFindText: SendMessage (redit, EM_EXGETSEL, 0, lParam (@ FindRec.chrg)); Para anggota cpMax variabel kita diatur sebelum panggilan setiap saat -1 cpMin variabel, itu tergantung pada kami Cari di arah. Kami sedang mencari menjelang akhir teks (bawah), maka cukup untuk menetapkan nilai lama cpMax. Kami mencari ke arah konten (atas), maka kita harus menjaga nilai lama cpMin. if (bawah) maka FindRec.chrg.cpMin: = FindRec.chrg.cpMax; FindRec.chrg.cpMax: = -1; Kenapa? Bayangkan Hanya teks sampel kecil sebelum kita mencari kata apapun, kita katakan: Tutorial. Kita akan lihat segera bagaimana teks yang ditemukan akan disorot. Dan itulah titik! The p.g. Pesan sekarang kembali label, di mana cpMin kursus awal dan akhir kata cpMax

Page 66: delphi

mewakili - dalam kasus tutorial sehingga posisi "T" dan "l". Apakah kita ingin mundur (menjelang akhir teks) pencarian, kita perlu untuk menyewa posisi awal yang baru hanya endpoint tua. Dalam perjalanan, pencarian berjalan waktu berikutnya jauh di belakang kata yang sudah salah eja. Berbeda, namun dengan pencarian terhadap konten. Akankah kita bahkan di sini FS lama seperti baru Set benih, pencarian tidak akan terlihat bekerja. Bahkan, dia selalu menemukan kata yang sama karena kita selalu dapat melihat akhir dari kata baru. Kami menjaga nilai di cpMin Namun, menyediakan Cari juga dalam arah ke atas lebih dari satu hasil (jika istilah sesuai dengan beberapa pencarian, tentu saja). Untuk menemukan teks, kita perlu menentukan kursus ini, dalam hal ini kita menetapkan ke catatan TFindText. FindRec.lpstrText: = teks; Yang menarik, tentu saja, bendera yang memiliki dampak paling pada hasil. Di mana Arah kita cari? Apakah seluruh kata saja diperlukan? Berperan dalam ejaan? Semua masalah ini dapat kita memperjelas menggunakan variabel yang dilewatkan ke prosedur: Flags: = 0; if (bawah) maka Flags: = FR_DOWN; if (akal) maka Flags: = Flags atau FR_MATCHCASE; if (Grosir) maka Flags: = Flags atau FR_WHOLEWORD; Nah, maka kita cari kali. Richedit menyediakan untuk tujuan pesan "EM_FINDTEXT" yang sama seperti yang wParam menetapkan bendera dan lParam sebagai mengharapkan pointer ke record TFindText pertama kali digunakan. Nilai kembali adalah posisi di mana teks itu ditemukan: FindPos: = SendMessage (redit, EM_FINDTEXT, bendera, lParam (@ FindRec)); Jika nilai lebih besar dari nol, maka kita dapat memilih teks yang ditemukan dengan pesan "EM_EXSETSEL": 68 Cari / Ganti dialog if (findPos> 0) maka mulai FindRec.chrg.cpMin: = findPos; FindRec.chrg.cpMax: = findPos lstrlen + (teks); SendMessage (redit, EM_EXSETSEL, 0, lParam (@ FindRec.chrg)); akhir lain mulai lstrcpy (errmsg, pchar ('"' + text + '"')); lstrcat (errmsg, 'tidak dapat ditemukan.'); MessageBox (wnd, errmsg, 'Editor', MB_ICONINFORMATION); end; Tidak dapat ditemukan dalam kata yang dicari (lebih), pesan akan muncul. CHARRANGE definisi typedef struct {_charrange PANJANG cpMin / / posisi awal

Page 67: delphi

PANJANG cpMax / / posisi akhir } TFindText definisi typedef struct {_findtext CHARRANGE chrg / / CHARRANGE record LPCTSTR lpstrText text / / pencarian } 3.3.4. Ganti Teks Untuk mengganti teks, kita perlu mencari ini juga hanya sekali. Pada prinsip bahwa kita dalam bab terakhir telah dibahas, sehingga tidak banyak berubah. Menariknya, hanya ketika kami menemukan teks lama miliki. Seperti biasa, ia akan ditandai: FindRec.chrg.cpMin: = findPos; FindRec.chrg.cpMax: = + findPos lstrlen (oldtext); SendMessage (redit, EM_EXSETSEL, 0, lParam (@ FindRec.chrg)); Tapi kemudian kita menggantinya dengan pesan "EM_REPLACESEL" oleh teks baru: SendMessage (redit, EM_REPLACESEL, WPARAM (benar), lParam (NewText)); Nilai wParam BENAR memberitahu kita dalam hal ini, bahwa penggantian ini mungkin dapat dibalik. Untuk melakukan Program Anda memiliki fungsi Undo yang sesuai tersedia. Nilai lParam adalah, seperti yang Anda lihat, pointer buffer teks dengan string baru. Juga menarik adalah desain prosedur "ReplText" adalah. Karena pengguna dapat melihat tombol dalam dialog Replace "Ganti Semua" bisa diklik, kita harus mengulang pencarian dalam hal ini berulang-ulang. Aku memilih

memutuskan loop berulang, yang hanya akan pergi jika kata itu tidak ada (lagi), atau jika pengguna hanya menggunakan tombol "Ganti": 69 Cari / Ganti dialog ulangi {} Teks pencarian if (findPos> 0) maka mulai {Ganti teks} akhir lain mulai {} Pesan end; sampai (findPos <= 0) atau (tidak replaceAll); Semua yang saya hanya disebutkan (mencari, memilih dan mengganti), terjadi di dalam lingkaran ini.

Karena itu saya ingin mengambil kesempatan ini untuk secara singkat disebutkan, dalam pesan FINDMSGSTRING bab terakhir . Menerima Tentu saja mereka juga akan dikirim ke sini, jika kita menggunakan dialog Replace. Sistem dialog Ganti juga menyediakan cara untuk "Find Next" tombol. Karena kita sudah memiliki

Page 68: delphi

fungsi ini telah dilaksanakan, kita tidak perlu khawatir tentang hal itu. Namun, tidak ada arah-pemilu, itu Oleh karena itu umumnya dicari menjelang akhir teks. Untuk dapat pergi ke fungsi sebenarnya dari editor dapat menggantikan, jadi kami hanya memiliki bendera lagi . Mempertimbangkan Kami memeriksa apakah FR_REPLACE bendera (tombol "Ganti") atau FR_REPLACEALL (Semua tombol " ganti ") yang hadir dalam kasus ini dan memanggil prosedur baru" ReplText on ": jika (dan FindParam.Flags FR_REPLACE FR_REPLACE =) atau (FindParam.Flags dan FR_REPLACEALL FR_REPLACEALL =) kemudian ReplText (FindParam.hWndOwner, FindParam.lpstrFindWhat, FindParam.lpstrReplaceWith, FindParam.Flags dan FR_DOWN = FR_DOWN, FindParam.Flags dan FR_MATCHCASE = FR_MATCHCASE, FindParam.Flags dan FR_WHOLEWORD = FR_WHOLEWORD, FindParam.Flags dan FR_REPLACEALL = FR_REPLACEALL); Berbeda dengan fungsi pencarian dari bab terakhir benar-benar hanya fakta bahwa di sini string baru

dimasukkan ke dalam tempat yang lama, harus ditentukan, dan bahwa parameter terakhir menentukan apakah hanya satu atau semua kejadian dari string tua untuk diganti. 3.3.5. Mengolah lagi Dalam PSDK Microsoft masih harus digunakan "IsDialogMessage" ketika dua dialog panggilan. Rekomendasi ini, kita akan mengikuti langkah terakhir dari bab ini. Untuk itu kita membutuhkan global pertama Variabel yang akan menerima gagang dialog pencarian: var hDlg: HWND = 0; Jika kita dalam program sampel, prosedur "Cari" fungsi, di mana kita telah menggunakan gagang dialog Variabel ke: if (fReplaceMode) maka hDlg = CommDlg.ReplaceText (fnd) lain hDlg = CommDlg.FindText (fnd); Langkah terakhir adalah untuk memperpanjang loop pesan di bagian utama dari program ini: 70 Cari / Ganti dialog sementara (GetMessage (msg, 0,0,0)) lakukan if (tidak IsDialogMessage (hDlg, msg)) kemudian mulai TranslateMessage (msg); DispatchMessage (msg); end; Sekarang dialog bereaksi cara kita digunakan untuk di aplikasi lain. Kita dapat menggunakan tombol TAB untuk beralih antara Mengubah kontrol individu, tekan ENTER untuk memicu pencarian, mengakhirinya dengan ESC, dll 71

Page 69: delphi

Tombol Bantuan 3.4. Tombol Bantuan Jika Anda ingin menggunakan tombol bantuan dalam dialog standar, pertama anda harus bendera * _SHOWHELP . Suplemen Tanda bintang berarti bahwa awalan dialog masing-masing tergantung (pencarian / ganti = FR, Open / Save = ofn, font = CF). Anda juga harus mengatur variabel hwndOwner di setiap dialog pada jendela utama aplikasi Anda. Ini adalah diperlukan karena mengklik tombol Bantuan menyebabkan pesan yang akan diproses oleh program Anda kebutuhan. Sebagai contoh, kutipan dari catatan TOpenFileName: OFN.hwndOwner: = wnd; Jika Anda melihat contoh program, Anda akan melihat bahwa dialog dalam prosedur yang terpisah disebut, dan menangani jendela "wnd" dilewatkan sebagai parameter dari prosedur ini. Anda juga perlu menentukan nilai dari pesan HELPMSGSTRING disebut. Anda tahu prinsip Sudah pada menemukan dan mengganti teks. Di sana Anda telah menentukan nilai dari pesan sehingga Anda memprogram Anda bisa memperluas pencarian dan / atau mengganti fungsi. Dengan cara ini, proses ini di sini. Pesan HELPMSGSTRING adalah sistem sudah digunakan, dan dengan bantuan "Daftar Pesan Jendela" kita mendapatkan nilai numerik: HelpMsgId: = RegisterWindowMessage Pesan (HELPMSGSTRING); Sekarang ketika Anda mengklik tombol bantuan dalam dialog, maka pesan ini dikirim ke jendela yang

Anda tentukan di hwndOwner. Karena dalam kasus contoh adalah jendela utama, kita bisa Edit pesan sesuai dalam "WndProc" dari jendela editor. Namun, karena ini lagi adalah variabel, kita harus menggunakan bagian lain dari laporan kasus. Kasus uMsg dari {... } else if (HelpMsgId <> 0) dan (uMsg = HelpMsgId) maka MessageBox (wnd, pchar (Format ('memposting pesan di sini membantu% s', [SzHelpMsgArray [iHelpContext]])), NULL, 0) lain Hasil: = DefWindowProc (wnd, uMsg, wp, lp); end; Apakah ada sesuatu yang perlu dipertimbangkan? Ya: wParam pesan adalah pegangan untuk dialog. Namun, Anda yang terbaik pegangan Cari dan Ganti dialog dikenal, dan bahkan ini adalah dua dialog yang berbeda. Sebuah query seperti if (HWND (wp) = hDlg) maka {... } membawa begitu banyak. Untuk satu, Anda harus menggunakan dua variabel dialog yang berbeda untuk setidaknya Suchenund tersebut berbeda satu sama lain ke dialog Replace. Dan di sisi lain Anda memiliki pegangan yang terbuka-dan Toko-dan bukan pada dialog font.

Page 70: delphi

Kemudian harus diingat bahwa lParam adalah pointer ke dialog tergantung catatan terkait. Apakah Jadi misalnya, kotak dialog font di mana Anda klik tombol bantuan, maka poin lParam ke TChooseFont record. Dengan kata lain, lupa dua parameter dan menggunakan ide sederhana. Kutipan di atas dari Contoh program ini menunjukkan Anda. Sebuah kotak pesan akan muncul dengan teks, nama masing-masing dialog yang ditampilkan mengandung. Ia bekerja dengan array sederhana string 72 Tombol Bantuan const szHelpMsgArray: array [0 4] string = ('Dialog Font, 'Cari dialog, "Cari dan Ganti dialog, 'Buka Dialog', 'Simpan dialog'); yang unsur-unsurnya diakses menggunakan variabel integer, masing-masing sebelum panggilan untuk dialog diatur dengan benar. Untuk tetap dengan contoh dialog Open, di sini tugas akan benar-benar hanya begitu terlihat seperti: iHelpContext: = 3; Sisanya adalah sederhana: Jika Anda klik pada tombol bantuan, maka atas Pesan diedit. Dan karena bekerja seperti "IHelpContext" adalah variabel global (seperti array string), MessageBox juga bisa Lihat nama lengkap dan benar dari dialog. Jika Anda ingin menampilkan informasi yang berguna, dengan ini saya merujuk Anda ke file bantuan pasca membuat dan menggunakan di mana penanganan file bantuan ditampilkan. 73 Umum Kontrol 4th Umum Kontrol Kata pengantar Apa kontrol umum? Semua tutorial berikut yang berhubungan dengan apa yang disebut "Kontrol umum", yang "comctl32.dll" di perpustakaan diimplementasikan. Anda dapat menggunakan "kontrol secara keseluruhan" seperti yang dijelaskan di bawah ini dalam program Anda gunakan. Berbeda dengan kontrol standar, selalu ada bahaya bahwa sistem operasi Anda kata perpustakaan tidak mengandung atau versi yang lebih lama. Mungkin, karena itu, "Kontrol umum" (Seperti yang dibahas di sini) tidak akan tersedia, atau mereka memiliki sebagian kecil untuk. Selain itu, diperlukan dua langkah sebelum Anda dapat menggunakan kontrol ini: • Unit "CommCtrl.pas" harus dalam klausul "PENGGUNAAN". • Program harus memanggil perintah "InitCommonControlsEx" untuk menginisialisasi kontrol.

Page 71: delphi

The "InitCommonControlsEx" bug Apa yang dimaksud dengan "InitCommonControlsEx" bug? Jika Anda perhatikan ketika Anda menguji program tertutup yang adalah beberapa "Controls umum" tidak ditampilkan, maka ini bukan program. Sebagai contoh, saya akan mengutip kotak untuk alamat IP. Untuk tujuan ini kita perlu tahu bahwa perintah "InitCommonControls" di Platform SDK dari Microsoft usang (usang) disebut. Sebagian besar contoh tutorial ini menggunakannya belum. Dalam beberapa kasus, seperti ketika sudah Kontrol IP berkisar disebutkan, perintah ini tapi tidak lagi. Di sini harus memiliki perintah "InitCommonControlsEx" digunakan. Karena bug adalah kontrol tetapi tidak benar diinisialisasi, dan bidang IP tidak terlihat. Versi apa yang terpengaruh? Delphi versi Status Delphi 2 - Delphi 3 - Delphi 4 - Delphi 5, kesalahan terjadi tanpa dan dengan SP1 diinstal Delphi 6, kesalahan terjadi tanpa dan dengan update diinstal / service pack Delphi 7, kesalahan terjadi (kA untuk update dan service pack) (Tidak berarti ditentukan kepada saya saat ini tidak menyadari apakah atau tidak kesalahan terjadi) Karya-sekitar Jika Anda memiliki versi standar atau pribadi Delphi, Anda tidak memiliki akses ke kode sumber dari unit. Saran saya dalam kasus ini: menggunakan versi standar yang cukup saat ini (dengan harapan bahwa kesalahan ada terpecahkan). Tidak terjadi, kemudian memanggil dalam program anda, selain perintah InitCommonControls; pada. Hal ini tidak relevan, di mana titik Anda menyebutnya, tetapi untuk kejelasan merekomendasikan Saya tahu bahwa perintah sebelum "InitCommonControlsEx" masuk ke dalam kode sumber. Harus menyelesaikan masalah sekali telah, Anda tidak terlihat panjang dan kemudian dapat menghapus pernyataan berlebihan cepat. 74 Umum Kontrol Patch Anda akan membutuhkan Borland kode sumber dari unit "commctrl". Jika kita melihat contoh 5, deklarasi Delphi menonton sekali, maka kita berada dalam unit, fungsi yang terpisah yang disebut "InitCommonControlsEx". Ini Tidak ada kesalahan tetapi mungkin harus dilakukan dengan fakta bahwa fungsi di bawah Windows 95 dan NT4 menggunakan Internet Explorer 3 membutuhkan minimal. Siapa saja yang bekerja dengan versi asli dari sistem ini (tanpa pra-instal IE), fungsi ada bersamanya

Page 72: delphi

belum tidak sama sekali. Mencoba untuk tetap memuat (statis) akan memicu pesan kesalahan jelek. Oleh karena itu, dalam unit Borland sekarang mencoba untuk memuat fungsi dinamis. Untuk tujuan kedua, Fungsi internal yang disebut (dalam kasus D5) terlihat seperti ini: Prosedur InitComCtl; mulai jika ComCtl32DLL = 0 maka mulai ComCtl32DLL: = GetModuleHandle (cctrl); jika kemudian ComCtl32DLL <> 0 @ _InitCommonControlsEx: = GetProcAddress (ComCtl32DLL, 'InitCommonControlsEx'); end; end; Dan di sini saya pikir adalah setelah kesalahan. Dalam baris ComCtl32DLL: = GetModuleHandle (cctrl); adalah pegangan untuk dimuat DLL "comctl32.dll" mencari dan diteruskan ke variabel. Jika DLL tidak dimuat, variabel adalah null dan memimpin dalam kasus ini dan tidak lagi mengikuti petunjuk di bawah ini. Jadi menambahkan satu ke baris hanya ditampilkan sebagai berikut: jika ComCtl32DLL = 0 maka ComCtl32DLL: = LoadLibrary (cctrl); Jadi harus "GetModuleHandle" benar-benar memberikan nilai nol sebagai hasilnya, kondisi aktif dan DLL dimuat. 75 Kemajuan Indikator 4.1. Kemajuan Indikator 4.1.1. Indikator kemajuan menghasilkan Indikator kemajuan umumnya digunakan untuk menjembatani waktu tunggu tertentu. Hal ini dapat memuat file akan menyalin download, sama ... dll, dll kontrol adalah dengan fungsi "CreateWindowEx" dihasilkan. Dalam atribut gaya saya merujuk Anda kembali ke MSDN dan bantuan, dengan hanya pada atribut ini akan Saya perlu menjelaskan: Nilai Arti PBS_SMOOTH Dengan Windows 95 adalah bentuk baru dari progress bar yang menunjukkan status dari blok disk. Default, kontrol menggunakan bentuk tampilan alami. Tampil ke kiri Gaya atribut, tetapi Anda dapat menggunakan formulir lama progress bar. Dalam contoh program baris perintah adalah sebagai berikut: hwndProgress: = CreateWindowEx (0, 'msctls_progress32', nihil, atau WS_CHILD PBS_SMOOTH atau WS_VISIBLE, 10, 30, 270, 15, hWnd, 0, NULL, NULL); InitCommonControlsEx Jika perintah "InitCommonControlsEx", Anda perlu dwICC variabel anggota kelas

Page 73: delphi

ICC_PROGRESS_CLASS digunakan. 4.1.2. Pelacakan dan menetapkan langkah-langkah Default adalah 100, nilai minimum dari nol dan nilai maksimum Itu harus cukup dalam banyak kasus menjadi (terutama dengan "MulDiv" elegan sekitar Persentase kemungkinan mengganggu datang sekitar ...: o)), tapi tentu saja memiliki Anda dapat bekerja daerah progress bar itu sendiri ditetapkan. Untuk menggunakan pesan "PBM_SETRANGE" lulus yang nilai minimum dan maksimum dalam parameter kedua. Itu suara mungkin dari rumit daripada yang sebenarnya. Untuk mis membatasi berjalan kaki ke nilai 1 dan 20, ini sudah cukup Command: SendMessage (hwndProgress, PBM_SETRANGE, 0, MAKELPARAM () 1,20); Untuk mengubah jumlah langkah yang kita gunakan "PBM_SETSTEP". Secara default, nomor 10, yang mengatakan masing-masing Memanggil "PBM_STEPIT" progress bar akan meningkat sebesar jumlah ini. Nomor baru langkah kami berikan di sini Dalam parameter pertama: SendMessage (hwndProgress, PBM_SETSTEP, 5.0); 4.1.3. Perubahan Status Kemajuan Untuk mengubah keadaan progress bar Anda memiliki dua pesan. Program sampel menggunakan "PBM_STEPIT" untuk secara bertahap meningkatkan tampilan. Berikut ada parameter yang diperlukan karena jumlah langkah ya telah ditentukan. Pernyataan demikian cukup sederhana: SendMessage (hwndProgress, PBM_STEPIT, 0, 0); Alternatif kedua akan "PBM_SETPOS", menentukan lokasi baru di sini. Sejumlah yang ditentukan sebelumnya Langkah tidak masalah. Kabar diharapkan dalam parameter pertama posisi baru. Dalam program sampel dengan cara ini - ketika mencapai posisi tertinggi - ulang progress bar ke nol: 76 Kemajuan Indikator SendMessage (hwndProgress, PBM_SETPOS, {lokasi baru ->} 0, 0); 4.1.4. Warna perubahan kontrol Sebuah pertanyaan yang populer di berbagai forum adalah: Bagaimana saya bisa mengubah warna progress bar? Inspektur obyek Delphi belum ada cara untuk memenuhi keinginan tersebut. Oleh karena itu, API menawarkan tapi dua pesan "PBM_SETBARCOLOR" dan "PBM_SETBKCOLOR". Berita ini diharapkan lParam nilai warna baru yang dapat paling mudah lulus sebagai nilai RGB. Apakah sinar merah gelap sehingga misalnya Pernyataan ini diperlukan: SendMessage (hwndProgress, PBM_SETBARCOLOR, 0, RGB ($ 90,0,0)); Dan latar belakang hitam diperoleh dengan baris: SendMessage (hwndProgress, PBM_SETBKCOLOR, 0, RGB (0,0,0)); Hal ini ditunjukkan dalam contoh program menggunakan compiler beralih Ganti WARNA. Catatan

Page 74: delphi

Dalam VCL dapat, pada pandangan pertama, hanya warna foreground dapat diubah. Pengujian pada berbeda Warna latar belakang berlari tanpa keberhasilan. The p.g. Codeausriss disebabkan dalam program API, bagaimanapun, tidak ada masalah. Selain itu, seperti "permainan warna" tidak dianjurkan dalam hal apapun. Pengguna aman sendiri Kinerja sistem dalam hal warna perusahaan memiliki, dan Anda tidak harus mengabaikan hal ini. Hal ini tidak membuat terutama baik ide jika program Anda mencemooh pengaturan pengguna dan sendiri Warna, menggunakan u.U. berbeda dengan mereka yang tersedia bagi pengguna lebih disukai. 4.1.5. The "marquee" gaya pada Windows XP Pada Windows XP mengetahui progress bar gaya, baru tambahan, yang dapat Anda gunakan jika Anda Durasi dari suatu tindakan tidak dapat dinilai. Di sini, progress bar tidak bertambah, tetapi jumlah tetap "blok" akan bergerak dari kiri ke kanan. Untuk mencapai efek ini, bagaimanapun, Kontrol umum 6,0 diperlukan. Ini berarti bahwa Anda Anda

Aplikasi harus melampirkan file manifest. Ini juga menjelaskan mengapa ini min gaya. Windows XP membutuhkan. Anda membuat progress bar seperti yang ditunjukkan pada awal tutorial ini, tetapi menggunakan atribut gaya baru PBS_MARQUEE: hwndXP: = CreateWindowEx (0, PROGRESS_CLASS, nihil, WS_CHILD atau WS_VISIBLE atau PBS_MARQUEE, 10.60, 270,15, wnd, IDC_XPPROGRESS, hInstance, nihil); Pada penggunaan atribut PBS_SMOOTH, tetapi Anda harus menahan diri. Progress bar juga akan animasi dalam bentuk baru, tapi itu terlalu kecil: Jika Windows XP Tema yang aktif, kemudian memutar desain (apakah atau tidak PBS_SMOOTH) tidak masalah karena dalam kasus tetap grafis tema masing-masing digunakan. Karena Anda tidak bisa berasumsi, bagaimanapun, bahwa setiap pengguna Windows XP telah diaktifkan tema, Anda sebaiknya tetap dengan tampilan blok yang normal: 77 Kemajuan Indikator Animasi mulai dan berhenti Untuk memulai animasi Anda memiliki pesan baru progressbar "PBM_SETMARQUEE" tersedia, seperti Status wParam (true, false) dan lParam seperti yang diharapkan jumlah milidetik untuk animasi. Sekitar Pindah contoh progress bar pada kecepatan 40 milidetik, menulis: SendMessage (hwndXP, PBM_SETMARQUEE, WPARAM (benar), 40); Jika Anda ingin menghentikan animasi, informasi waktu tidak relevan. Ini hanya penting bahwa Anda palsu di wParam : Gunakan

Page 75: delphi

SendMessage (hwndXP, PBM_SETMARQUEE, WPARAM (palsu), 0); Contoh program menciptakan kemajuan tambahan dalam gaya ini. Kondisi ini min itu. Jendela XP aktif, jika tidak, anda hanya melihat pesan peringatan ... : O) 78 Baris status 4.2. Baris status 4.2.1. Baris status produksi Sebuah status bar digunakan umumnya untuk menyediakan pengguna dengan informasi tertentu. Tentu ini Elemen ini selalu di bagian bawah jendela. Ada fungsi intrinsik "Buat Jendela Status", dengan yang kita dapat menghasilkan: hwndStatus: = Buat Status Window (WS_CHILD atau WS_VISIBLE atau SBT_TOOLTIPS, nihil, hWnd, IDC_STATUS); Fitur ini, namun, menurut PSDK usang, sehingga kita dapat mengakses bahkan "CreateWindowEx": hwndStatus: = CreateWindowEx (0, NAMA STATUS KELAS, nihil, atau WS_CHILD WS_VISIBLE atau SBT_TOOLTIPS, 0,0,0,0, hwnd, IDC_STATUS, hInstance, nihil); Informasi tentang posisi dan lebar dan tinggi yang diabaikan dalam kasus ini. InitCommonControlsEx Jika perintah "InitCommonControlsEx", Anda perlu dwICC variabel anggota kelas ICC_BAR_CLASSES gunakan. 4.2.2. Panel menghasilkan Karena kita ingin membuat beberapa panel, kita perlu membagi status bar. Kami memiliki pesan "SB_SetParts". Mengharapkan pesan ini sebagai parameter pertama, jumlah panel (maks. 256 yang mungkin). Dalam parameter kedua adalah pointer akan diteruskan ke sebuah array integer yang berisi lebar panel. Suatu nilai -1 menyediakan sini bahwa baris status memanfaatkan seluruh lebar jendela induknya. Sebagai contoh dari ekstrak yang relevan dari sumber: GetClientRect (hWnd, rec); Panel Lebar [0]: = 40; Panel lebar [1]: = rec.Right - rec.Left - 55; Panel lebar [2]: = -1; ... SendMessage (hwndStatus, SB_SetParts, 3, Integer (@ lebar panel)); 4.2.3. Teks dalam status bar Teks yang akan ditampilkan adalah pesan "SB_SETTEXT" diteruskan ke panel yang diinginkan, Panel indeks dan gaya opsional dalam pertama dan buffer teks ditentukan dalam parameter kedua. Informasi tentang Gaya, lihat MSDN dan bantuan. Berikut adalah kutipan singkat dari program contoh: buffer: = '10 '; SendMessage (hwndStatus, SB_SETTEXT, 0, Integer (@ buffer)); 4.2.4. Tooltips Anda juga dapat menetapkan sebuah panel tooltip. Untuk baris status harus sesuai dengan atribut

Page 76: delphi

style "SBT_TOOLTIPS" dihasilkan. Ujung itu sendiri, bagaimanapun, ditampilkan hanya jika label panel tidak sepenuhnya terlihat. Idealnya, Anda memutuskan untuk mengatur konten yang sama untuk ujung panel dan alat, yang tampak pada contoh program sebagai berikut: 79 Baris status buffer: = 'Panel3 dengan tips alat'; SendMessage (hwndStatus, SB_SETTEXT, 2 atau SBT_NOBORDERS, Integer (@ buffer)); SendMessage (hwndStatus, SB_SETTIPTEXT, 2, integer (@ buffer)); Kami menggunakan pesan "SB_SETTIPTEXT", parameter pertama adalah indeks panel, di mana Tooltip untuk muncul kemudian. Teks ini dilewatkan sebagai pointer pada parameter kedua, seperti yang Anda lakukan di Untuk melihat kutipan. SB_SETTIPTEXT definisi SB_SETTIPTEXT wParam = (WPARAM) (int) iPart / / Panel Indeks lParam = (lParam) (LPCTSTR) lpszTooltip / / Pointer ke tooltip 4.2.5. Ikon di status bar Sebagai usaha terakhir kami ingin menunjukkan sebuah ikon di status bar. Kami mengundang terlebih dahulu dari Sumber dan kemudian menggunakan pesan "SB_SETICON" yang kita lagi indeks dari panel yang diinginkan dan Menangani simbol berlalu: hIcon = LoadIcon (hInstance, MAKEINTRESOURCE (200)); SendMessage (hwndStatus, SB_SETICON, 1, hIcon); 80 Tooltips / Petunjuk 4.3. Tooltips / Petunjuk 4.3.1. Jendela tool tip menghasilkan Di balik tooltips tersembunyi benar-benar hanya sebuah jendela dengan nama kelas tersendiri, sistem telah ditetapkan. Jendela ini memiliki tugas untuk menampilkan tool tips yang Anda tetapkan ke elemen yang lain miliki. Ujung alat jendela kita hasilkan menggunakan "CreateWindowEx": hToolTip: = CreateWindowEx (WS_EX_TOPMOST, TOOLTIPS_CLASS, nihil, TTS_ALWAYSTIP atau TTS_NOPREFIX atau WS_POPUP, integer (CW_USEDEFAULT), integer (CW_USEDEFAULT), integer (CW_USEDEFAULT), integer (CW_USEDEFAULT), wnd, 0, NULL, NULL); Penting di sini adalah TOOLTIPS_CLASS nama kelas (konstan untuk nama sebenarnya Tooltips_Class32) bahwa sinyal ke sistem yang kita ingin membuat jendela tool tip. Pilih atribut style kami: Atribut penting TTS_ALWAYSTIP tooltip ini juga akan muncul ketika jendela utama tidak aktif. Tanpa informasi ini harus Program aktif di latar depan, sehingga Anda dapat melihat ujung.

Page 77: delphi

TTS_NOPREFIX Karakter "&" biasanya tersembunyi, sehingga item menu seperti Dapat menggunakan tool tip. Dengan ini atribut style dapat ditangani, sehingga Ampersand terlihat. Atribut lainnya dapat ditemukan di MSDN dan PSDK. Meskipun kami dalam menciptakan jendela tooltip sudah digunakan atribut "WS_EX_TOPMOST", kita menempatkan dengan mengikuti panggilan lagi sebagai "jendela utama" waktu: SetWindowPos (hToolTip, HWND_TOPMOST, 0, 0, 0, 0, atau SWP_NOMOVE SWP_NOSIZE atau SWP_NOACTIVATE); InitCommonControlsEx Jika perintah "InitCommonControlsEx", Anda perlu dwICC variabel anggota kelas ICC_BAR_CLASSES gunakan. 4.3.2. Tooltips mendaftar Alat jendela kami tip dapat berisi lebih dari satu untungnya tooltip. Oleh karena itu tidak diperlukan untuk setiap Tips untuk membuat jendela terpisah. Jika kita ingin mendaftarkan tool tip, kita perlu pesan "TTM_ADDTOOL" yang kami melewati sebagai pointer ke record TToolInfo lParam. TToolInfo-definition menunjukkan 81 Tooltips / Petunjuk typedef struct {tagTOOLINFO UINT cbSize / / ukuran catatan UINT uFlags / / Flags HWND hwnd, / / handle ke jendela / / Ini harus menunjukkan ujung UINT_PTR UID / / ID RECT rect / / area jendela HINSTANCE hInst / / contoh aplikasi LPTSTR lpszText / / Tip-text # Jika (_WIN32_IE> = 0x0300) LParam; # Endif } Seperti biasa dalam kasus seperti itu, kita harus pertama-tama sebelum panggilan untuk mengatur ukuran dari catatan: ti.cbSize: = sizeof (TToolInfo); Selain itu, kita membutuhkan pegangan dari elemen yang kita ingin menggunakan tool tip. Dan karena kami tip juga akan muncul di tempat yang tepat, kita juga akan membutuhkan dimensi setiap elemen: / / Jendela handle (= Control) ti.hwnd: = wnd; ti.uId: = wnd; / / Ukuran dari jendela GetClientRect (wnd, ti.Rect); Sebuah kata mungkin bendera:

Page 78: delphi

ti.uFlags: = TTF_SUBCLASS atau TTF_IDISHWND; Bendera Arti TTF_SUBCLASS tikus-pesan yang terkait secara otomatis diteruskan ke jendela tool tip TTF_IDISHWND Nilai "uid" sesuai dengan handle window Petunjuk Karena kita sedang mencari kontrol yang khas (tombol, kotak teks dll), kita dapat mengedit-tikus terkait Pesan tanpa. Ini secara otomatis dihasilkan oleh "TTF_SUBCLASS" bendera dari Control ke Jendela tooltip berlalu. Ini bekerja (menurut PSDK) bukan ketika program seperti menggunakan jendela sistem-didefinisikan. Dalam sebuah Kasus, pesan ke jendela sistem dan tidak akan dikirim ke program. Satu karena itu tidak akan hanya pesan intercept, juga akan diperlukan, posisi dan tampilan tooltips sendiri . Menerima Tapi karena itu adalah mungkin untuk pergi dalam banyak kasus, oleh karena itu, menampilkan tooltips untuk kontrol dari program yang sama, menyimpan p.g. Bendera banyak pekerjaan. Kami kemudian melewati seluruh dengan pesan yang disebutkan sebelumnya ke jendela tool tip: SendMessage (hToolTip, TTM_ADDTOOL, 0, lParam (@ t)); TTM_ADDTOOL-definition menunjukkan TTM_ADDTOOL (WPARAM) wParam / / tidak digunakan, harus nol (LParam) lParam / / pointer ke record "TToolInfo" 82 Tooltips / Petunjuk Kita tidak perlu menulis kode ini untuk setiap item, untuk menawarkan fungsi built-in atau prosedur yang kita bisa menelepon. Anda dapat menemukannya dalam program sampel sebagai "AddToolTip". Prosedur untuk lulus pegangan diinginkan kendali, contoh aplikasi (dalam kasus selalu hInstance) dan tentu saja teks Anda sebagai Ingin melihat tooltip, dan dinyatakan sebagai konstan dalam contoh: AddToolTip (hEdit, hInstance, TIPP_EDIT); Petunjuk Ketika kita bekerja dengan sumber daya dialog, kita perlu sedikit pendekatan yang berbeda. Karena kita hanya menangani melakukan dialog dan hanya dapat diakses melalui ID pada item, kita akan menggunakan Fungsi "GetDlgItem", untuk mendapatkan pegangan dari elemen. Sebagai contoh, kita asumsikan bahwa dialog menangani "hDlgWnd" variabel diberikan, dan bahwa bidang kita ID "120" memiliki. Panggilan

terlihat seperti ini: AddToolTip (GetDlgItem (hDlgWnd, 120), hInstance, TIPP_EDIT); 4.3.3. Naskah perubahan tooltip Dalam contoh kita, fitur ini lebih atau kurang hanya bermain-main. Tapi ada aplikasi nyata, mana mengubah teks tip adalah bermakna. Bisa jadi mis deskripsi dari tombol, input field

Page 79: delphi

dll berubah tergantung pada kondisi dan dengan demikian menjaga pengguna up to date. dll Untuk Mengubah teks saja, halaman baru diperlukan (tentu saja). Demikian juga, tetapi juga harus menangani jendela yang sesuai (elemen) dapat ditentukan, sehingga tooltip benar berubah dan teks baru juga muncul pada kontrol yang tepat. Diperbarui tooltip maka pesan "TTM_UPDATETIPTEXT": SendMessage (hToolTip, TTM_UPDATETIPTEXT, 0, integer (@ t)); TTM_UPDATETIPTEXT-definition menunjukkan TTM_UPDATETIPTEXT (WPARAM) wParam / / tidak digunakan, harus nol (LParam) lParam / / pointer ke record "TToolInfo" Anda dapat mencoba fitur ini dengan menulis program sampel dengan teks baru dalam kotak input dan kemudian tombol "Ubah Tip" digunakan. Kemudian menampilkan "Connect" tombol untuk Anda oleh teks tertulis. Program ini dilakukan dengan membaca teks dari field input dan lolos ke atas Prosedur. - Seperti yang saya katakan, dalam hal ini itu gimmick. : O) 4.3.4. Tooltips untuk mengaktifkan dan menonaktifkan Tooltips juga bisa sementara selama program berjalan dan lagi. Tapi ini berlaku umumnya berlaku untuk semua tooltips. Contoh ini menunjukkan ini dengan menggunakan kotak centang. Secara default, tips diaktifkan. Jika Anda hapus centang pada kotak centang untuk menonaktifkan mereka. Untuk tujuan ini kita menggunakan Pesan "TTM_ACTIVATE". WPARAM saat kita memasuki benar jika tips akan diaktifkan, dan false jika harus dinonaktifkan. Itu Periksa checkbox kami karena itu juga: bFlag: = SendMessage (hCheckBox, BM_GETCHECK, 0.0) = BST_CHECKED; Jadi membaca status akan dikirim menggunakan di atas Pesan untuk jendela kami tip tool: SendMessage (hToolTip, TTM_ACTIVATE, integer (bFlag), 0); 83 Tooltips / Petunjuk TTM_ACTIVATE definisi TTM_ACTIVATE (WPARAM) wParam / / fActivate (LParam) lParam / / tidak digunakan, harus nol 4.3.5. Tooltips hapus Jika Anda ingin menghapus secara permanen tool tip, maka Anda harus menggunakan pesan "TTM_DELTOOL". Itu Catatan TToolInfo diharapkan dari indikasi yang valid dari kontrol atau jendela menangani, menghapus ujung inginkan. Contoh program menggunakan fungsi ini, tetapi call option akan terlihat seperti: / / Mengatur ukuran struktur ti.cbSize: = sizeof (TToolInfo); / / Pegangan untuk field input, / / Dan contoh aplikasi ti.hwnd: = hEdit;

Page 80: delphi

ti.hInst: = hInstance; / / Hapus tooltip SendMessage (hToolTip, TTM_DELTOOL, 0, integer (@ t)); Semua tooltips lainnya tetap tidak terpengaruh. Ini benar-benar akan menghapus hanya ujung lapangan masukan kami menjadi. TTM_DELTOOL-definition menunjukkan TTM_DELTOOL (WPARAM) wParam / / tidak digunakan, harus nol (LParam) lParam / / pointer ke record "TToolInfo" 4.3.6. Lebih kemungkinan tooltips Terlepas dari fungsi yang diusulkan, ada hal-hal lain yang dapat Anda lakukan dengan tool tips. Dengan demikian, untuk misalnya Mengubah warna tips terlepas dari pengaturan sistem. Selain itu, dapat disesuaikan sesuai,

berapa banyak milidetik tip akan muncul, berapa lama harus tetap terlihat, dan berapa banyak waktu antara Berlalu harus menampilkan berbagai tips saat pointer bergerak dari satu kontrol yang lain. - Dll dan lain-lain Beberapa fitur baru, bagaimanapun, bagi pengguna versi Delphi tidak tersedia. Unit dari Borland dalam kasus-kasus telah cukup usang. Cara termudah masih, jika Anda ingin mencoba sebuah atribut baru. Misalnya, biarkan tool tips Tampilkan dalam gaya kartun (Balon) biarkan. Untuk ini kita hanya perlu versi terbaru dari file header "Commctrl.h" (PSDK, MSDN), dari mana kita menulis diri konstan yang sesuai: const TTS_BALLOON = $ 40; Kita bisa menggunakannya sekarang, dan jika DLL kami cukup baru, Anda akan melihat ujung dalam desain baru: 84 Tooltips / Petunjuk Ini adalah sedikit bermasalah jika Anda ingin menarik pada semua berita. Dalam hal ini Anda harus menggunakan unit "CommCtrl.pas" beradaptasi. Sekali lagi, Anda harus merujuk ke versi saat ini di atas File header. Dan

Kemudian hasilnya berbicara untuk dirinya sendiri: Petunjuk Contoh program menggunakan unit khusus, "CommCtrl_Fragment.pas" yang diperlukan ekstensi bab ini berisi. Oleh saklar kompilator khusus unit hanya digunakan dengan Delphi 5. Silakan periksa terlebih dahulu apakah suplemen dalam versi Delphi Anda diperlukan sama sekali. Coba Lalu, jika program dapat mengkompilasi versi Delphi dan unit disebut. 4.3.7. The "CommCtrl.pas" suplemen Penambahan baru sebagian besar nilai konstan kita file header dari versi saat ini dari "Commctrl.h" dapat mengambil:

Page 81: delphi

85 Tooltips / Petunjuk const {$ EXTERNALSYM TTS_NOANIMATE} TTS_NOANIMATE = $ 10; {$ EXTERNALSYM TTS_NOFADE} TTS_NOFADE = $ 20; {$ EXTERNALSYM TTS_BALLOON} TTS_BALLOON = $ 40; {$ EXTERNALSYM TTS_CLOSE} TTS_CLOSE = $ 80; / / Tooltip ikon (diatur dengan TTM_SETTITLE) {$ EXTERNALSYM TTI_NONE} TTI_NONE = 0; {$ EXTERNALSYM TTI_INFO} TTI_INFO = 1; {$ EXTERNALSYM TTI_WARNING} TTI_WARNING = 2; {$ EXTERNALSYM TTI_ERROR} TTI_ERROR = 3; {$ EXTERNALSYM TTF_PARSELINKS} TTF_PARSELINKS = $ 1000; {$ EXTERNALSYM TTM_GETBUBBLESIZE} TTM_GETBUBBLESIZE = WM_USER + 30; {$ EXTERNALSYM TTM_ADJUSTRECT} TTM_ADJUSTRECT = WM_USER + 31; {$ EXTERNALSYM TTM_SETTITLEA} TTM_SETTITLEA = WM_USER + 32; {$ EXTERNALSYM TTM_SETTITLEW} TTM_SETTITLEW = WM_USER + 33; {$ EXTERNALSYM TTM_POPUP} TTM_POPUP = WM_USER + 34; {$ EXTERNALSYM TTM_GETTITLE} TTM_GETTITLE = WM_USER + 35; kelas _TGETTITLE Record = Dikemas dwSize: DWORD; uTitleBitmap: UINT; CCH: UINT; pszTitle: PWideChar; end; TGetTitle = _TGETTITLE; PGetTitle TGetTitle = ^; const {$ EXTERNALSYM TTM_SETWINDOWTHEME}

Page 82: delphi

TTM_SETWINDOWTHEME = CCM_SETWINDOWTHEME; Untuk menghindari masalah dengan konstanta terakhir dilanjutkan pada awal unit masih CCM_SETWINDOWTHEME Mendeklarasikan (mencari untuk memasukkan merujuk ke INFOTIPSIZE). Anda harus ingat, bagaimanapun, bahwa konstanta ini hanya dapat digunakan pada Windows XP: 86 Tooltips / Petunjuk const {$ EXTERNALSYM CCM_SETVERSION} CCM_SETVERSION CCM_FIRST = + $ 07; {$ EXTERNALSYM CCM_GETVERSION} CCM_GETVERSION CCM_FIRST = + $ 08; {$ EXTERNALSYM CCM_SETNOTIFYWINDOW} CCM_SETNOTIFYWINDOW CCM_FIRST + = $ 09 / / wParam == hwndParent. {$ EXTERNALSYM CCM_SETWINDOWTHEME} CCM_SETWINDOWTHEME CCM_FIRST = + $ 0b; {$ EXTERNALSYM CCM_DPISCALE} CCM_DPISCALE CCM_FIRST = + $ 0c / / wParam == Kesadaran 87 Toolbar 4.4. Toolbar 4.4.1. Dasar-dasar dari bitmap toolbar Mari kita mulai dengan bitmap untuk toolbar kami. Tampaknya seolah-olah mereka file yang berbeda Tombol toolbar ditugaskan. Pada kenyataannya, itu sebenarnya hanya bitmap tunggal. Ketika Graphics tidak menciptakan editor Visual Studio dari Microsoft, maka pastikan bahwa semua frame memiliki ukuran yang sama, dan bahwa bitmap ini dianggap sesuai. Misalkan, sebagai contoh, Anda perlu tiga grafis dengan dimensi 16x15. Kemudian Anda bitmap ukuran memiliki piksel 48x15. Kemudian salin tiga grafis individu mulus bersama-sama dan menyimpan bitmap. Untuk pemahaman yang lebih baik, aku telah meningkatkan bitmap dari program sampel dan berbagai tombol pertama dibingkai: Mudah melakukannya dengan editor VS tersebut. Di sini Anda bisa - seperti program gambar yang digunakan untuk - kerja, dan bekerja editor di latar belakang untuk memastikan bahwa alat grafis setiap tombol disimpan dalam bitmap tunggal menjadi. 4.4.2. Tombol toolbar menghasilkan Untuk tombol TBBUTTON kami rekor diperlukan. Ini berisi beberapa properti, dan tugas Anda Ada benar-benar hanya untuk menetapkan jumlah tombol, sifat itu dalam kursus jangka sudah bisa mengisi. Dalam contoh kita, empat tombol telah dinyatakan: var

Page 83: delphi

tbButtons: array [0 3] dari TTBButton; TBBUTTON definisi typedef struct {_TBBUTTON int iBitmap; int idCommand; BYTE fsState; BYTE fsStyle; # Ifdef _WIN64 BYTE BReserved [6] / / padding untuk penyelarasan # Jika didefinisikan (_WIN32) BReserved BYTE [2] / / padding untuk penyelarasan # Endif DWORD_PTR dwData; INT_PTR IString; } 88 Toolbar Sebuah tombol toolbar yang khas ini kemudian dihasilkan sebagai berikut: dengan tbButtons [0] lakukan mulai iBitmap: = indeks 0 / / bitmap (zero-based) idCommand: = IDC_BUTTON1 / / Tombol ID fsState: Status = / / Tombol TBSTATE_ENABLED fsStyle: = BTNS_BUTTON / / jenis tombol dwData: = 0; IString: = 0; end; Untuk pemisah menggunakan atribut style lain sementara Anda duduk sebagian besar parameter lain ke nol bisa (karena mereka tidak benar-benar diperlukan dalam pemisah): dengan tbButtons [1] lakukan mulai iBitmap: = 0; idCommand: = 0; fsState: = TBSTATE_ENABLED; fsStyle: = BTNS_SEP / / pemisah gaya atribut dwData: = 0; IString: = -1; end; Sebuah atribut style ketiga, lihat tombol ketiga (sebenarnya, itu adalah keempat, karena kita harus menghitung separator) kemudian harus menampilkan menu drop-down: dengan tbButtons [3] lakukan mulai ... fsStyle: BTNS_DROPDOWN = / / drop-gaya ... end;

Page 84: delphi

Petunjuk Contoh program menggunakan unit khusus, "CommCtrl_Fragment.pas". Unit ini berisi baru Tombol Gaya versi 5.80, direkomendasikan oleh Microsoft sebagai standar baru. Ini gaya atribut mulai dengan awalan "BTNS_", tapi selain memenuhi atribut gaya hidup saat ini. Ide di belakang adalah, Untuk menghindari kebingungan dengan atribut toolbar jendela, yang dimulai dengan "TBSTYLE_" awalan. Itu Contoh program akan menunjukkan penerapan gaya baru. Unit ini hanya digunakan ketika kompilasi contoh program dengan Delphi 5. Pertama-tama Anda harus memeriksa apakah versi Delphi perubahan ini diperlukan lagi. Kemudian coba jika demikian apakah Bisa compile dengan versi itu. 4.4.3. Toolbar menghasilkan Sekarang kita dapat membuat toolbar. Meskipun - sehingga semuanya bekerja, pertama-tama kita harus memiliki bitmap pilih dan beban. Kami menggunakan fungsi "CreateMappedBitmap", bitmap menggunakan sumber daya kita menciptakan bitmap untuk toolbar kami: hBitmap: = CreateMappedBitmap (NULL, 100, 0, NULL, 0); 89 Toolbar CreateMappedBitmap definisi HBITMAP CreateMappedBitmap ( HINSTANCE hInstance, / / contoh aplikasi idBitmap int, / / sumber daya ID dari bitmap UINT wFlags, / / Bitmapflag (nol, atau CMB_MASKED) LPCOLORMAP lpColorMap, / peta / warna dengan informasi warna untuk memetakan bitmap iNumMaps int / / jumlah penggunaan warna peta (atau nihil) ); Ketika itu selesai, kita dapat membuat dengan "CreateToolbarEx" toolbar: hToolbar: = CreateToolbarex (hWnd, WS_CHILD atau WS_VISIBLE atau TBSTYLE_TOOLTIPS atau CCS_NODIVIDER atau TBSTYLE_FLAT, IDC_TOOLBAR 3, 0, hBitmap, @ tbButtons, panjang (tbButtons), 0, 0, 16, 15, sizeof (TTBBUTTON)); CreateToolbarEx definisi HWND CreateToolbarEx ( HWND hwnd, / / pegangan jendela induknya DWORD ws, / / gaya toolbar UINT Wid, / id / toolbar nBitmaps int, / / jumlah bitmap (zero-based) HINSTANCE hBMInst, / instance / modul file yang / / Berisi bitmap, dengan hanya diperlukan / Bitmap System / - dinyatakan nol UINT wBMID, / / sumber daya ID dari bitmap, atau / / Menangani ke sumber daya bitmap LPCTBBUTTON lpButtons, / / pointer ke record TBBUTTON

Page 85: delphi

iNumButtons int, / / Jumlah tombol / / (Pemisah Jumlah PERINGATAN!!) int dxButton, dyButton int, / / lebar dan tinggi tombol int dxBitmap, dyBitmap int, / / lebar dan tinggi bitmap UINT uStructSize / / ukuran TBBUTTON catatan ); Petunjuk PSDK di "CreateToolbarEx" disebut sebagai usang. Sebaliknya, Microsoft merekomendasikan bahwa Menggunakan "CreateWindowEx". Tapi ini membutuhkan beberapa baris kode lebih. Pertama, menciptakan Toolbar, yang Anda dapat mengabaikan rincian posisi dan ketinggian dan lebar: hToolBar: = CreateWindowEx (0, NAMA TOOLBAR KELAS, nihil, atau WS_CHILD WS_VISIBLE atau CCS_NODIVIDER atau TBSTYLE_TOOLTIPS atau TBSTYLE_FLAT {$ Ifdef TEXT KANAN} atau {$ ENDIF} TBSTYLE_LIST, 0,0,0,0, hwnd, IDC_TOOLBAR, hInstance, nihil); Karena "CreateWindow" Fungsi digunakan untuk berbagai tujuan, Anda memiliki jendela baru sekarang menyampaikan besarnya catatan TTBBUTTON dan kemudian tentu saja tombol sendiri: SendMessage (hToolBar, TB_BUTTONSTRUCTSIZE, sizeof (TTBBUTTON), 0); SendMessage (hToolBar, TB_ADDBUTTONS, panjang (tbButtons), lParam (@ tbButtons)); Dan sekarang untuk bit Anda memerlukan variabel TTBAddBitmap tipe dengan program sebelumnya, Perlu untuk memuat bitmap: 90 Toolbar hBitmap: = CreateMappedBitmap (NULL, 100, 0, NULL, 0); aBmp.hInst: = 0; aBmp.nID: = hBitmap; SendMessage (hToolBar, TB_ADDBITMAP, 3, lParam (@ ABMP)); Jika Anda ingin menjadi warna transparan grafis, maka Anda membutuhkan catatan TColorMap jenis. Jika Anda ingin mengubah lebih dari satu warna, maka anda harus menggunakan catatan lebih TColorMap ke array terhubung. Program sampel mengandung sumber daya bitmap kedua, di mana setiap tombol memiliki latar belakang berwarna berbeda. Ketiga warna kini digantikan oleh warna latar belakang khas untuk objek 3D. Warna dari Label adalah untuk disesuaikan dengan sistem. Untuk itu kita perlu, seperti yang saya katakan, array TColorMap- Catatan: var cm: array [0 3] dari TColorMap; Setiap record harus diberi warna yang harus diganti. Dan tentu saja, yang diinginkan

Page 86: delphi

warna baru dapat ditentukan. Menggunakan contoh dari merah akan terlihat seperti: cm [0] cFrom: = $ 000000FF;. cm [0] CTO: = GetSysColor (COLOR_3DFACE). Lakukan hal yang sama dengan biru dan dengan semua warna Anda ingin mengganti. Kemudian mengubah p.g. Panggilan "CreateMappedBitmap" bawah sehingga Anda memiliki pointer ke array dan jumlah warna untuk menggantikan : Tentukan hBitmap: = CreateMappedBitmap (hInstance, 200,0, @ cm [0], panjang (cm)); Dengan demikian, warna latar belakang (merah, biru, ungu) akan diganti, dan grafis atau tombol toolbar sebenarnya harus terlihat normal. Jika Anda ingin mengikuti contoh, kemudian hapus centang di demo Titik ini saklar kompilator $ {.} DEFINE USEMASKBITMAP Sehingga panah pada tombol ketiga (drop-gaya) menampilkan dengan benar, kami akan mengirimkan pesan "TB_SETEXTENDEDSTYLE" pernyataan tersebut, menarik panah pada toolbar: SendMessage (hToolBar, TB_SETEXTENDEDSTYLE, 0, TBSTYLE_EX_DRAWDDARROWS); Jika Anda ingin menampilkan teks pada tombol, Anda perlu string yang berisi semua label tombol, masing-masing dipisahkan oleh # 0 satu sama lain. Prasasti terakhir berakhir dengan dua # tanda-0: var TB_Text: string = 'Tombol 1' 0'Button # 2 '# 0'Button 3' # 0 # 0; Teks ini kemudian dapat lulus. Menggunakan pesan "TB_ADDSTRING" pada toolbar Karena merupakan String adalah, menunjukkan karakter pertama: SendMessage (hToolBar, TB_ADDSTRING, 0, lParam (@ TB_Text [1])); Atau, juga akan "pchar (TB_Text)" atau "pointer (TB_Text)". Tombol mana yang label fitur yang Anda memutuskan bila Anda membuat tombol dengan bantuan dari "IString" anggota variabel. Dan sehingga program kami sekarang memiliki toolbar. InitCommonControlsEx Jika perintah "InitCommonControlsEx", Anda perlu dwICC variabel anggota kelas ICC_BAR_CLASSES gunakan. 91 Toolbar 4.4.4. Bitmap dari sistem Kami sudah dibahas bagaimana membuat bitmap untuk toolbar. Di sini kita akan menunjukkan bagaimana dapat menggunakan sistem yang ada grafis. Mari kita perhatikan lagi tujuan toolbar khas: Kebanyakan program menawarkan akses sehingga lebih cepat untuk perintah menu akrab, seperti Open, Save, , Cut Copy, dll Bagi perintah Windows cukup umum sudah selesai grafis Tersedia. Ini menghemat sumber daya dan mengurangi salah satu di sisi lain dari pekerjaan. Namun terbatas pada pemilihan saja.

Page 87: delphi

4.4.4.1. Persiapan Seperti yang sudah dijelaskan, kami sedang mempersiapkan rekaman TTBButton kami. Hanya saja kali ini, kita menggunakan iBitmap-the Variabel anggota bukan ID dari bitmap eksternal! Sebaliknya, kita menggunakan konstanta yang kita di Unit Bisa "CommCtrl.pas" menemukan, dan mulai dengan "STD_" awalan. Berikut adalah beberapa yang paling terkenal tercantum adalah: Konstan Deskripsi Bitmap STD_COPY sesuai dengan "copy" Bitmap STD_CUT sesuai dengan 'cut' Bitmap STD_DELETE sesuai dengan "menghapus" STD_FILENEW setara "File / New" STD_FILEOPEN setara "File / Buka" Setara STD_FILESAVE "File / Save" Ada juga konstanta bitmap lain yang dimulai dengan "VIEW_" awalan dan dari Windows Explorer harus diketahui. Tentang: Konstan Deskripsi View_details setara "View / Details" VIEW_LARGEICONS setara "View / Large Icons" VIEW_SMALLICONS setara "View / ikon kecil" (Karena bitmap dapat berbeda karena sistem, saya dapat menyimpan grafik) 4.4.4.2. Aplikasi Sebuah tombol dengan seperti bitmap sistem sehingga dapat dinyatakan sebagai berikut: dengan tbButtons [0] lakukan mulai iBitmap = STD_FILEOPEN; {... } end; Sekarang kita dapat membuat toolbar kami, yang kami lakukan hampir semua parameter (yaitu, ukuran tombol, jumlah Bitmaps dapat diabaikan, dll). Karena kita sehingga meskipun toolbar tetapi tidak memiliki bitmap, kita perlu sebagai Selanjutnya, variabel TBAddBitmap jenis. Ini variabel yang sudah terlihat di sini, sebagai baru, Microsoft merekomendasikan cara untuk membuat toolbar telah dibuktikan. Dalam kasus ini, kita memberikan nilai hInst variabel anggota "HINST_COMMCTRL". Ini sudah mapan

bahwa kita ingin menggunakan bitmap sistem. Namun, kita harus menyatakan bahwa harus persis seperti itu. Dalam kasus Tombol contoh bunga hanya ditampilkan kami bitmap standar ("STD_" prefix), jadi kami memilih antara "IDB_STD_LARGE_COLOR" (grafis standar, besar) dan "IDB_STD_SMALL_COLOR" (standar grafis, kecil) miliki. 92 Toolbar

Page 88: delphi

aBmp.hInst = HINST_COMMCTRL; aBmp.nID = IDB_STD_SMALL_COLOR; Untuk pandangan Bitmaps konstanta yang Sejalan "IDB_VIEW_LARGE_COLOR" dan "IDB_VIEW_SMALL_COLOR". TBADDBITMAP definisi typedef struct { HINSTANCE hInstance; UINT_PTR NID; TBADDBITMAP} Sisanya cukup sederhana - injaknya dan mengirimkannya ke seluruh toolbar: o) SendMessage (hToolbar, TB_ADDBITMAP, 0, lParam (@ ABMP)); Untuk demonstrasi adalah program contoh kecil terisolasi menggunakan langkah-langkah yang diperlukan untuk Contoh Toolbar menampilkan. 4.4.4.3. VCL-toolbar dan bitmap sistem Bahkan dengan komponen toolbar VCL Anda dapat menggunakan bitmap sistem. Untuk melakukan ini, pertama kali membuat tombol yang sesuai. Untuk menetapkan bitmap, ada dua kemungkinan: Pertama Jika Anda ingin menggunakan properti "Index Gambar" di Object Inspector, maka Anda perlu numerik Nilai p.g. Konstanta sekitar STD_FILENEW karena ini tidak bisa menentukan secara langsung. Lihat nilai-nilai dalam unit "CommCtrl.pas" atau dalam file header "commctrl.h" (PSDK). Kedua Agak lebih kompleks, tapi (sehubungan dengan perubahan) aman, cara nilai-nilai dalam bitmap Assign "OnCreate" peristiwa formulir. Dalam hal ini, Anda juga dapat p.g. Konstan menggunakan: Toolbar1.Buttons [0] Index Gambar: = STD_FILENEW;. Bitmaps sendiri dimuat seperti dijelaskan di atas. Masuk akal, kode yang diperlukan dalam "OnCreate" acara dari bentuk untuk mengakomodasi. 4.4.5. Acara klik Tombol Toolbar Seperti dengan tombol normal, kami juga menggunakan tombol toolbar dalam pesan "WM_COMMAND" dan periksa apakah Benachrichtungscode "BN_CLICKED" adalah: WM_COMMAND: mulai hiword if (wParam) = BN_CLICKED kemudian Kasus loword (wParam) dari IDC_BUTTON1: SendMessage (hwnd, WM_CLOSE, 0, 0); IDC_BUTTON2, IDC_BUTTON3: MessageBox (hWnd, "diklik Tombol ',' Cuckoo ', MB_ICONINFORMATION); end; end; Anda dapat melihat bahwa prinsip intersepsi klik tombol normal identik.

Page 89: delphi

93 Toolbar 4.4.6. Tooltips dan drop-down menu Toolbar telah dikenal saat ini kami hanya dua hal depan: satu di kita hilang tooltips bahwa ketika Anda menempatkan kursor mouse pada tombol muncul, dan di sisi lain kita harus menu kami , Memproduksi untuk ditampilkan pada tombol ketiga (gaya drop-down). Kami menggunakan pesan "WM_NOTIFY". Pesan ini berasal dari kontrol pada jendela induk dikirim ketika beberapa peristiwa telah terjadi. Sebagai bunga Kode pemberitahuan kami "TTN_NEEDTEXT" untuk tooltips: Kasus PNMToolBar (lParam) ^ hdr.code dari. TTN_NEEDTEXT: Kasus PToolTipText (lParam) hdr.idFrom dari. IDC_BUTTON1: PToolTipText (lParam) lpszText:. = 'Toolbar Button 1'; IDC_BUTTON2: PToolTipText (lParam) lpszText:. = 'Toolbar Button 2'; IDC_BUTTON3: PToolTipText (lParam) lpszText:. = 'Toolbar Button 1'; end; end; dan "TBN_DROPDOWN" untuk menu, di mana kita menentukan posisi tombol langsung menggunakan lParam tersebut. Menawarkan keuntungan yang kita dapat mengatur ulang tombol yang diinginkan - menu muncul kemudian tetap kanan: Kasus PNMToolBar (lParam) ^ hdr.code dari. TBN_DROPDOWN: mulai {Dimana 3 Tombol} SendMessage (hToolbar, TB_GETRECT, PNMToolBar (lParam) ^ iItem, lParam (@ Rect).) PT.X: = rect.left; pt.y: = rect.bottom + 2; ClientToScreen (hWnd, pt); {Menghasilkan pop-up menu - menu lihat tutorial} end; 4.4.7. The Customize Toolbar Dalam bab terakhir kita akan melihat adalah bagaimana untuk mengatur ulang tombol toolbar dan apapun seperti perubahan akan disimpan dan dimuat sesuai. VCL Delphi mendukung fungsi ini, sayangnya, setidaknya versi 7, meskipun mereka (secara teknis) dari Sistem operasi disediakan. Oleh karena itu kita bisa untuk sampel kecil nonVCL kami dengan lebih tua Delphi Versi mudah digunakan. 4.4.7.1. Perubahan dalam program Pertama, kita harus membuat toolbar dengan CCS_ADJUSTABLE gaya menambahkan atribut: hToolBar: = CreateWindowEx (0, TOOLBAR KELAS NAMA, nihil, WS_CHILD atau WS_VISIBLE atau

Page 90: delphi

CCS_ADJUSTABLE atau CCS_NODIVIDER atau TBSTYLE_TOOLTIPS atau TBSTYLE_FLAT atau TBSTYLE_LIST, 0,0,0,0, hwnd, IDC_TOOLBAR, hInstance, nihil); Atribut ini sudah cukup untuk memindahkan tombol sambil menekan tombol Shift. Hanya menggunakan kursus untuk Sejauh ini tidak ada. Dan jika Anda menguji sebagai DoubleClick di daerah terbuka dari toolbar, kemudian Anda mungkin melihat flash singkat. Berkedip-kedip ini adalah kotak dialog, yang akan kita bahas nanti. Bahwa itu tidak muncul atau sisa-sisa yang terlihat tentu saja memiliki alasan-nya. Berbicara drag dan drop. Jika Anda memilih untuk mengatur ulang tombol sambil menekan tombol ALT, kemudian gunakan tambahan atribut TBSTYLE_ALTDRAG saat membuat toolbar. 94 Toolbar Akhirnya, Anda masih harus memastikan bahwa (variabel yang digunakan dalam tombol toolbar Anda di Kasus "tbButtons"), adalah variabel global. Sebuah variabel lokal dalam Anda "WndProc" hanya akan menimbulkan masalah. 4.4.7.2. Apa tombol dapat dimanipulasi? Mari kita lihat PSDK pada apa yang terjadi ketika Anda mencoba untuk mengubah toolbar: Pertama Toolbar mengirimkan pemberitahuan TBN_BEGINADJUST yang tidak menarik bagi kami tetapi terus. Kedua Hal ini diikuti dengan pemberitahuan TBN_INITCUSTOMIZE, kita bisa gunakan untuk membantu Tombol di hide kotak dialog (yang kita masih menunggu). Namun, ini memerlukan lebih baru Delphi versi depan karena p.g. Pemberitahuan dan respon yang akan digunakan sebagai di Delphi 5 belum diketahui. Itu tidak masalah, karena kami mendapatkan data dari PSDK saat dapat: const TBN_INITCUSTOMIZE TBN_FIRST = - 23; TBNRF_HIDEHELP = $ 00000001; Dilihat dari definisi di PSDK harus itu tapi setidaknya IE5 terpasang. Jadi untuk membantu Sembunyikan tombol, menjawab TBNRF_HIDEHELP update: WM_NOTIFY: PNMToolBar kasus (lp) ^ hdr.code dari. TBN_INITCUSTOMIZE: Hasil: = TBNRF_HIDEHELP; end; Ketiga Berikut ini adalah pemberitahuan TBN_QUERYINSERT untuk setiap tombol pada toolbar. Jika Anda menggunakan ini palsu Jawaban (nol), Anda mencegah tombol dapat ditambahkan kembali ke toolbar, memiliki dihapus. Hal yang sama berlaku dengan tanda berlawanan untuk TBN_QUERYDELETE pemberitahuan: di sini mencegah Anda dengan palsu, bahwa tombol dapat dihapus dari toolbar.

Page 91: delphi

Untuk mis untuk membuat tombol pertama sehingga tidak dapat dihapus atau dimasukkan lagi akan memiliki Dengan kedua peringatan khusus untuk tombol ini if (PNMToolbar (lp) ^ iItem = 0.) lalu Hasil: = LRESULT (palsu) Hasil lain: = LRESULT (true); . Jawaban Masalahnya akan jika Anda hanya menjawab TBN_QUERYINSERT cara ini. Kemudian memang bisa dihapus tombol dari toolbar, tetapi tidak dapat dimasukkan. Dialog tidak akan ditampilkan dengan cara, jika Anda menggunakan semua TBN_QUERYINSERT peringatan palsu . Jawaban Oleh karena itu awal "berkedip". 4th Selanjutnya adalah pemberitahuan TBN_GETBUTTONINFO, lagi untuk setiap tombol. Anda butuhkan di sini melakukan tidak lebih dari tombol yang sesuai dari variabel global Anda ke catatan untuk NMTOOLBAR ditransmisikan, yang di lParam: WM_NOTIFY: PNMToolBar kasus (lp) ^ hdr.code dari. TBN_GETBUTTONINFO: mulai nItem: PNMToolBar = (lp) ^ iItem;. if (nItem <panjang (tbButtons)) kemudian mulai PNMToolBar (lp) ^ tbButton: = tbButtons [nItem];. Jika tombol Anda tidak dapat menggunakan teks Anda sendiri (hanya ikon), maka Anda harus jelas Menetapkan teks, karena jika Anda hanya melihat ikon dalam dialog: 95 Toolbar lstrcpy (PNMToolBar (lp) ^. pszText, pchar (+ alat tombol 'IntToStr (nItem +1))); end; Selama tombol yang tersedia selama Anda harus membalas pemberitahuan dengan benar. Apakah ada Tombol lagi, kirim palsu: Hasil: = LRESULT (tidak (nItem = panjang (tbButtons))); end; end; Dengan demikian, Anda sekarang harus melihat kotak dialog. 4.4.7.3. Aktivisme Jika kotak tersebut terlihat dan digunakan oleh pengguna, Anda bisa menanggapi pemberitahuan beberapa yang semua akan dikirim sebagai bagian dari "WM_NOTIFY". 4.4.7.4. Membantu Misalnya, pengguna mengklik pada tombol bantuan (jika Anda belum tersembunyi), Anda dapat membuat pencocokan Bantuan Bawa saya ke: TBN_CUSTHELP:

Page 92: delphi

MessageBox (wnd, 'memposting pesan di sini Bantuan!', 'Toolbar Demo', MB_OK atau MB_ICONINFORMATION); Dalam contoh program ini hanya kotak dialog akan ditampilkan. Nah ... : O) Jika Anda ingin menggunakan beberapa toolbar dan akibatnya juga melihat berbagai halaman bisa membantu, Anda harus Periksa "PNMToolBar (lp) ^ hdr.hwndFrom." Yang toolbar bertanggung jawab untuk notifikasi ini. 4.4.7.5. Kembalikan Pengaturan Jika pengguna mengklik pada "Reset" tombol, maka Anda harus mengembalikan pengaturan asli dari toolbar . Memulihkan Untuk melakukan ini, pertama menghapus semua tombol yang ada dan kemudian memiliki tombol asli lagi ke: TBN_RESET: mulai nItem: (. PNMToolbar (lp) ^ hdr.hwndFrom, TB_BUTTONCOUNT, 0.0) = SendMessage / / Hapus tombol yang ada untuk i: = nItem - 1 downto 0 lakukan SendMessage (PNMToolbar (lp) ^ hdr.hwndFrom, TB_DELETEBUTTON, i, 0.); / / Tombol Asli ditugaskan SendMessage (PNMToolbar (lp) ^ Hdr.hwndFrom,. TB_ADDBUTTONS, panjang (tbButtons), lParam (@ tbButtons)); end; 4.4.7.6. Terapkan Perubahan Jika pengguna telah menambahkan tombol toolbar atau dihapus atau telah berubah adalah Dikirim TBN_TOOLBARCHANGE pemberitahuan. Ini harus digunakan untuk menyetel kembali toolbar; mengatakan, jika perlu mengubah ukuran 96 Toolbar TBN_TOOLBARCHANGE: SendMessage (PNMToolbar (lp) ^ hdr.hwndFrom, TB_AUTOSIZE, 0.0.) 4.4.7.7. Memuat dan menyimpan pengaturan Tapi semua ini tidak akan masuk akal jika tidak ada cara untuk menyimpan perubahan dan memuat setiap kali. Pilihan ini disebut "TB_SAVERESTORE" dan dikirim ke toolbar. Yang menyenangkan adalah bahwa kita harus khawatir tentang apa pun. Toolbar membawa kita dari semua pekerjaan. Dengan demikian, wParam dari p.g. Pesan menentukan apakah pengaturan disimpan (benar) atau dimuat (palsu) seharusnya. LParam adalah pointer ke catatan TTBSaveParams jenis yang berisi data yang diperlukan. Karena informasi yang disimpan dalam registri, catatan hanya kunci master, nama kunci Tentukan (perangkat lunak Anda, misalnya) dan nama nilai. Yang terakhir berisi data aktual Toolbar, yaitu: jika Anda menggunakan beberapa toolbar, Anda harus mengirim pesan yang berkali-kali dan selalu menemukan hak

Page 93: delphi

Nilai menunjukkan nama. Karena kita hanya memiliki toolbar, kita hanya perlu satu nama: sp.hkr: = HKEY_CURRENT_USER; sp.pszSubKey: = 'Software \ Win32 API tutorial \ Toolbar demo'; sp.pszValueName: = "Toolbar Pengaturan '; Berkenaan dengan sistem operasi NT dan hak-hak pengguna mungkin terbatas, saya sarankan selalu kunci HKEY_CURRENT_USER untuk menyimpan. Jika program Anda menyimpan pengaturan dalam registri tetap, maka Anda harus meletakkan pengaturan Toolbar dalam kunci yang sama. Untuk menyelamatkan kita gunakan sekarang, seperti yang saya katakan, pesan sejati "TB_SAVERESTORE" dengan wParam ini!: SendMessage (hToolbar, TB_SAVERESTORE, WPARAM (benar), lParam (@ sp)); Untuk memuat pengaturan, menggunakan yang bukan palsu.

Bidang Alamat IP 4,5. Bidang Alamat IP 4.5.1. Control IP menghasilkan Bidang IP ditentukan dari beberapa dialog Anda tahu sistem operasi. Sebaik mungkin bahkan lebih seperti field input biasa. Hal ini dibagi menjadi empat bidang saja, alamat IP dari pengolahan khusus : Memungkinkan Seperti "sepengendali" bidang ini juga harus diinisialisasi. Namun, kami menggunakan fungsi "InitCommonControlsEx" karena kita harus menentukan kelas tertentu: var icc: TInitCommonControlsEx = ( dwSize: sizeof (TInitCommonControlsEx); dwICC: ICC_INTERNET_CLASSES; ); mulai InitCommonControlsEx (icc); {... } end. Setelah itu, bidang IP dihasilkan seperti jendela biasa. Catatan, konstanta WC_IPADDRESS, yang dapat digunakan sebagai pengganti nama kelas yang sebenarnya SysIPAddress32: hIpAddr: = CreateWindowEx (WS_EX_CLIENTEDGE, WC_IPADDRESS, nihil, WS_VISIBLE atau WS_CHILD, 10,20,120,21, wnd, IDC_IPCTRL, hInstance nil); 4.5.2. Masukkan alamat IP dan membaca Untuk memasukkan alamat IP, kita memiliki pesan "IPM_SETADDRESS" dan "MAKEIPADDRESS", untuk Tersedia. Biasanya dalam sebuah alamat IP, yaitu nilai 32-bit, yang (tapi untuk yang lebih baik Keterbacaan) dibagi menjadi empat bidang 8 bit masing-masing, yang dipisahkan oleh periode ("notasi quad memanjakan"). Setara mis nilai 2130706433 (0x7f000001) alamat IP "127.0.0.1". Dan jika Anda tidak rumit DWORD value akan menghitung alamat, Anda dapat membantu dengan "MAKEIPADDRESS" langsung

Page 94: delphi

byte individu : Tentukan jika kemudian (hIpAddr <> 0) SendMessage (hIpAddr, IPM_SETADDRESS, 0, MAKEIPADDRESS (127,0,0,1)); IPM_SETADDRESS definisi IPM_SETADDRESS wParam = (WPARAM) 0 / / tidak digunakan lParam = (lParam) (DWORD) dwAddr / alamat / IP sebagai sebuah DWORD 98 Bidang Alamat IP MAKEIPADDRESS definisi LParam MAKEIPADDRESS ( BYTE b0 BYTE b1, BYTE b2 BYTE b3 ); Membaca alamat IP saat ini dari kendali kita miliki dengan bantuan dari "IPM_GETADDRESS" pesan oleh, nilai lParam sebagai pointer ke variabel DWORD diharapkan, yang dalam contoh kita terlihat seperti ini: var curIp: dword; {... } IPM_GETADDRESS definisi IPM_GETADDRESS wParam = (WPARAM) 0 / / tidak digunakan lParam = (lParam) (LPDWORD) dwAddr / / Pointer ke variabel DWORD Kami dalam program kita juga dapat menggunakan notasi yang biasa, mengandung Unit "CommCtrl.pas" empat fitur yang kita dapat mengekstrak byte individu variabel kami: FIRST_IPADDRESS (lParam) SECOND_IPADDRESS (lParam) THIRD_IPADDRESS (lParam) FOURTH_IPADDRESS (lParam) Semua empat fungsi memiliki kesamaan bahwa mereka harapkan sebagai parameter nilai DWORD dari alamat IP. Masing-masing menyediakan Tapi kemudian lagi byte dari alamat. Contoh akan menjadi alamat "127.0.0.1" misalnya dari "FIRST_IPADDRESS" dapat mengedit hasil "127" akan. Dalam "SECOND_IPADDRESS" Namun akan menjadi Hasilnya adalah nol, dll Contoh program menggunakan semua empat fungsi untuk format alamat IP untuk lolos ke label: IpStr: = Format ('% d% d% d% d', [FIRST_IPADDRESS (curIp) SECOND_IPADDRESS (curIp) THIRD_IPADDRESS (curIp) FOURTH_IPADDRESS (curIp)]); SendMessage (hLabel, WM_SETTEXT, 0, lParam (@ IpStr [1]));

Page 95: delphi

4.5.3. Bidang kosong entri Untuk melengkapi bidang IP kosong, kita menggunakan pesan "IPM_CLEARADDRESS" bahwa tidak ada khusus Diharapkan parameter: SendMessage (hIpAddr, IPM_CLEARADDRESS, 0.0); 4.5.4. Individu bidang fokus Sebuah field input IP, Anda memiliki pilihan untuk selektif memilih lapangan, dan sebagainya, misalnya, perubahan permintaan oleh pengguna. Contoh program fokus ini sebelum menggunakan tombol yang actuates berturut-turut masing-masing bidang: 99 Bidang Alamat IP WM_COMMAND: Kasus HIWORD (wp) dari BN_CLICKED: Kasus LOWORD (wp) dari IDC_FOCUS: mulai iFocus: = (iFocus + 1) mod 4; SendMessage (hIpAddr, IPM_SETFOCUS, iFocus, 0); end; end; end; Berikut adalah variabel integer yang telah diterima di inisialisasi dengan -1. Hal ini berkaitan dengan fakta bahwa penghitungan array byte IP dimulai dengan nol. Dengan mengklik tombol, variabel bertambah satu dan sesuai sehingga counter lapangan yang sebenarnya yang diteruskan dengan pesan "IPM_SETFOCUS" ke bidang masukan IP. IPM_SETFOCUS-definition menunjukkan IPM_SETFOCUS wParam = (WPARAM) (int) nField / / lapangan untuk menerima fokus lParam = (lParam) 0 / / tidak digunakan Meskipun itu adalah prasangka sedikit ke topik berikutnya - Pada setiap perubahan dari array byte lain, atau mengubah nilai dalam array byte, para iFocus variabel disesuaikan, sehingga mereka selalu bidang byte dipilih saat mengandung. 4.5.5. Menanggapi perubahan Field input IP mengirimkan pesan "IPN_FIELDCHANGED" sebagai bagian dari "WM_NOTIFY" secepat apapun perubahan. Hal ini tidak hanya menyangkut perubahan nilai dari masing-masing bidang byte. Pesan ini juga dikirim bila Anda selanjutnya berada dalam kendali dengan mouse atau tombol panah dari array byte untuk pindah. Contoh program menggambarkan prinsip ini, di mana dalam setiap kemunculan nilai pesan direvisi

Page 96: delphi

Di lapangan dan mencari label yang menunjukkan: WM_NOTIFY: if (PNMIpAddress (lp) ^ hdr.Code IPN_FIELDCHANGED. =) kemudian mulai IpStr: = Format ('Field "% d" mengandung nilai "% d", [POINTER (PNMIpAddress (lp) ^ Ifield +. 1), POINTER (PNMIpAddress (lp) ^ iValue.)]); SendMessage (hLabel, WM_SETTEXT, 0, lParam (@ IpStr [1])); end; Juga memiliki bidang IP, merupakan ciri khas dari bidang yang dikenal: ada sesuatu yang berubah, "EN_CHANGE" dipicu. Ini berarti bahwa Anda sudah bisa bereaksi saat Anda mengetik. Yang bisa mis akan membantu jika Anda klik pada unsur-unsur tertentu dalam menanggapi masukan yang benar atau indikasi atau menonaktifkan inginkan. WM_COMMAND: if (HIWORD (wp) = EN_CHANGE) dan (LOWORD (wp) = IDC_IPCTRL) maka mulai {... } end; 100 Trackbar tersebut 4.6. Trackbar tersebut 4.6.1. Kontrol trackbar menghasilkan Menghasilkan dilacak seperti jendela lain dengan fungsi "CreateWindowEx" di mana jendela kelas msctls_trackbar32 berarti (atau alternatif TRACKBAR_CLASS): hredTB: = CreateWindowEx (0, 'msctls_trackbar32','', WS_VISIBLE atau WS_CHILD atau WS_TABSTOP atau TBS_TOP atau TBS_AUTOTICKS atau TBS_TOOLTIPS, 10, 15, 275, 35, hWnd, 0, NULL, NULL); InitCommonControlsEx Jika perintah "InitCommonControlsEx", Anda perlu dwICC variabel anggota kelas ICC_BAR_CLASSES gunakan. 4.6.2. Jendela gaya trackbar tersebut Saya menempatkan sama sebelum gaya jendela, yang saya telah digunakan dalam program saya. Lebih dapat di MSDN atau PSDK terlihat: Nilai Deskripsi TBS_TOP Tanda centang muncul di atas. TBS_BOTH Garis muncul di atas dan di bawah. TBS_AUTOPTICKS The spasi dari baris akan diatur secara otomatis. Jarak dapat pesan "TBM_SETTICFREQ" yang akan ditentukan. TBS_TOOLTIPS Pindah slider ke nilai saat ini ditampilkan sebagai tooltip. 4.6.3. Dilacak pesan Dengan pesan berikut dalam program sampel yang digunakan adalah perilaku trackbar baik didefinisikan

Page 97: delphi

atau dipengaruhi: Nilai Deskripsi TBM_SETRANGE Dengan pesan ini, kisaran nilai trackbar ditentukan, katakanlah, minimum, dan nilai maksimum yang dapat diatur. TBM_SETTICFREQ Anda gunakan saat membuat gaya jendela trackbar itu "TBS_AUTOTICKS", Anda dapat diatur dengan pesan jarak garis. TBM_SETLINESIZE The slider trackbar juga dapat dipindahkan dengan menggunakan tombol panah. Dengan pesan ini itu didefinisikan oleh berapa banyak unit yang anda ingin memindahkan slider. TBM_SETPAGESIZE pesan yang tepat untuk "Up" - dan "Page Down" tombol. Sekali lagi, saya telah terdaftar hanya yang paling penting. Artikel lebih lanjut dapat ditemukan di MSDN atau PSDK. Pesan "TBM_SETRANGE" Mungkin masih perlu penjelasan untuk parameter kedua. Mari kita lihat kali dalam kode: SendMessage (hredTB, TBM_SETRANGE, Integer (Benar) MAKELONG () 0.255); Dalam C adalah "MAKELONG" makro yang menghasilkan dua bilangan bulat nilai 32-bit. Ketika lParam adalah yaitu nilai 32-bit, sementara wParam sebelumnya adalah nilai 16-bit ke 16-bit sistem. Saat itu Tetapi bahkan dengan nilai wParam 32-bit. Kenyataan ini juga menjelaskan "w" di depan wParam dan "l" sebelum lParam: "w" adalah mungkin untuk WORD dan "L" untuk LONGWORD. 101 Trackbar tersebut Apakah ini berarti bagi kita: kata rendah menentukan batas bawah dari kisaran dan orde tinggi Firman, batas atas. 4.6.4. Bagaimana program ini bekerja Berikut adalah beberapa komentar tentang bagaimana program itu bekerja: Dengan mengubah posisi slider trackbar yang didukung oleh Windows, pesan Windows "WM_HSCROLL" dikirim ke jendela. Petunjuk Jika Anda membuat slider vertikal (untuk menggunakan TBS_VERT gaya atribut), maka Anda harus Sebaliknya, mengedit pesan "WM_VSCROLL". "WM_HSCROLL" hanya di horisontal yang normal Regulator dikirim. Tapi terlepas dari semua informasi berikut adalah sama. Untuk ilustrasi, lihat Dalam folder dengan program sampel, varian kedua yang disebut "Vertical.dpr". Dalam kata rendah wParam menempatkan kode pemberitahuan yang menyediakan informasi seperti posisi pengguna slider telah berubah (jika mouse, tombol panah, atau apakah itu selain menggunakan mouse kiri atau kanan untuk Diklik slider ... apa pun ...). Pada setiap kesempatan saya telah menanggapi dalam program. WM_HSCROLL: mulai Kasus LoWord (wParam) dari TB_THUMBTRACK, / / menggambar "Sliders"

Page 98: delphi

TB_TOP, / / Pos1 TB_BOTTOM, / / end TB_LINEUP, / / Kiri / Kanan TB_LINEDOWN, / / Atas / bawah TB_PAGEDOWN, / / halaman ke bawah dan klik di bar TB_PAGEUP: / / gambar diklik di bar & mulai / / Lakukan tindakan yang sesuai end; end; end; Tetap kata tinggi wParam: Berikut ini adalah posisi saat slider. Anda memerlukan ID, yang slider yang mengirim pesan, sehingga Anda hanya perlu lParam tersebut baca, di mana pegangan yang sesuai trackbar dilewatkan. Saya tidak melakukannya dan saya Mudah: Sebuah jendela harus digambar ulang (karena isi jendela tidak valid, karena dikaburkan atau dipindahkan adalah ...), itu mendapat "WM_PAINT" pesan. Di sini Anda dapat melakukan pengoperasian gambar yang sesuai. Saya baca misalnya pada titik ini dalam program, posisi slider menghasilkan, dengan "CreateSolidBrush" satu Sikat dengan bantuan nilai-nilai, dan mengisi di dalamnya, tetap dengan persegi panjang Rekam TRect: 102 Trackbar tersebut WM_PAINT: mulai dc: = BeginPaint (hWnd, ps); red: = SendMessage (hredTB, TBM_GETPOS, 0, 0); hijau: = SendMessage (hgreenTB, TBM_GETPOS, 0, 0); Biru: = SendMessage (hblueTB, TBM_GETPOS, 0, 0); rect.top: = 160; rect.left: = 0; rect.bottom: = WindowHeight; rect.right: = Lebar Jendela; sikat: = CreateSolidBrush (RGB (merah, hijau, biru)); FillRect (dc rect, sikat); end; Selain itu, saya memberikan nilai warna saat ini dari teks terbalik. Oleh karena itu terbalik, sehingga mereka juga dapat membaca. Untuk tujuan ini, saya mengatur mode warna latar belakang dengan "SetBkMode" pada transparan, aku bekerja setiap string bersama-sama dan menghabiskan dengan "TextOut" langsung pada jendela. Untuk tindakan ini adalah "Device Konteks", (pegangan ke area gambar) perlu dengan "BeginPaint" mendapat. Parameter, sebuah rekor TPaintStruct tertarik, tapi tidak seperti kita - kita hanya perlu

Page 99: delphi

Pengembalian: kami "Perangkat Konteks". Adalah penting bahwa kita menandai akhir tindakan kita dengan "EndPaint" lagi dan memberitahu Windows yang kita memperbarui jendela kita sudah selesai. Jika kita tidak, akan mendapatkan program kami berjalan "WM_PAINT" pesan. Paling buruk, program kami tidak merespon lagi. Dan karena saya tidak ingin menunggu sampai jendela harus digambar ulang, saya memaksa Neuzeichen menggunakan "InvalidateRect". Tapi itu terjadi di p.g. Mengedit "WM_HSCROLL" pesan: InvalidateRect (hWnd, NULL, TRUE); Petunjuk Dengan karakter dan operasi teks output, saya akan membahas dalam tutorial lain lagi secara lebih rinci. 103 Kontrol tampilan daftar 4.7. Kontrol tampilan daftar 4.7.1. Pandangan daftar kontrol produk Dari program VCL dan bahkan dari rutinitas sehari-hari normal, seharusnya tampilan daftar Windows yang dikenal menjadi. Siapa yang menggunakan Explorer, dia tahu, berbagai program lainnya yang mereka gunakan. Dan itu mempersiapkan kita tidak mengalami kesulitan untuk menggunakan seperti kontrol dalam program nonVCL kami. Ada beberapa mode tampilan, salah satunya adalah Anda dalam generasi jendela (jika Kontrol kami ya harus ditentukan): Nilai Arti LVS_REPORT rincian termasuk header kolom, yang dapat digunakan untuk menyortir. LVS_LIST Tampilan daftar LVS_ICON Semua entri yang ditampilkan dengan ikon besar. LVS_SMALLICON Semua entri yang ditampilkan menggunakan ikon kecil. Jendela kelas kami Kontrol SysListView32 (atau WC_LISTVIEW konstan), dan panggilan kemudian seperti ini: HLV: = CreateWindowEx (WS_EX_CLIENTEDGE, WC_LISTVIEW, nihil, WS_VISIBLE atau WS_CHILD atau LVS_REPORT atau LVS_EDITLABELS atau LVS_SHOWSELALWAYS atau LVS_SHAREIMAGELISTS, 0,0,100,100, wnd, IDC_LV, hInstance, nihil); InitCommonControlsEx Jika perintah "InitCommonControlsEx", Anda perlu dwICC variabel anggota kelas ICC_LISTVIEW_CLASSES gunakan. 4.7.2. Khusus window gaya Sebuah tampilan daftar dapat dilengkapi dengan efek khusus, karena ada: • Pilih seluruh baris • Melayang • Garis grid • simbol untuk subentries dll PSDK, lihat kata kunci "LVM_SETEXTENDEDLISTVIEWSTYLE" dan "Styles Daftar Diperpanjang View"

Page 100: delphi

lanjut opsi, sambil menghormati, bagaimanapun, bahwa beberapa dari mereka hanya dalam versi tertentu dari "umum kontrol "yang tersedia. Mengatur gaya ini diperpanjang dalam setiap kasus sebagai berikut: SendMessage (HLV, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LVS_EX_HEADERDRAGDROP atau LVS_EX_FULLROWSELECT); 4.7.3. Membuat Kolom Sampai sekarang, Anda tidak akan memiliki banyak menyenangkan di tampilan daftar, karena kolom masih perlu dihasilkan. Selain itu, ini berlaku bahkan jika Anda menciptakan kontrol pada sumber daya dialog. Kami juga membutuhkan catatan jenis TLVColumn dari mana kita tidak perlu harus seperti semua parameter. Pertama kita buat masker variabel anggota yang sah untuk menentukan: 104 Kontrol tampilan daftar lvc.mask: = LVCF_TEXT atau LVCF_WIDTH; Kami tertarik di sini adalah teks dan lebar. Teks kolom, kita tentukan sebagai berikut lvc.pszText: = 'file'; Masih hilang lebar kolom lvc.cx: = 200; Kemudian kita dapat membuat kolom sekarang: SendMessage (HLV, LVM_INSERTCOLUMN, 0, lParam (@ LVC)); Untuk kolom kedua kita ingin mengubah perataan teks (rata kanan), yang memiliki efek berikut pada topeng: lvc.mask: = lvc.mask atau LVCF_FMT; Jadi kami juga memberikan sama dengan keinginan untuk hak-dibenarkan teks lvc.fmt: = LVCFMT_RIGHT; Teks dan lebar kolom yang berlalu seperti diketahui: lvc.pszText: = 'size'; lvc.cx: = 150; Dan jadi kita bisa membuat kolom kedua: SendMessage (HLV, LVM_INSERTCOLUMN, 1, lParam (@ LVC)); Kolom ketiga ini kemudian menunjukkan jenis file. Sejak saat membuat kolom akan ada kabar lagi besar Di sana, aku mengarahkan Anda ke titik ini dalam program sampel> bahwa kode lengkap dalam prosedur "Membuat Kolom" mengandung. TLVColumn definisi typedef struct {_LVCOLUMN UINT mask, / / properti (di kolom ini, dan label) int fmt / / Alignment kolom int cx, / / lebar kolom LPTSTR pszText / / kolom text int cchTextMax; int iSubItem;

Page 101: delphi

# Jika (_WIN32_IE> = 0x0300) int iImage; int iOrder; # Endif } LVM_INSERTCOLUMN definisi LVM_INSERTCOLUMN wParam = (WPARAM) (int) iCol / / Kolom index lParam = (lParam) (const LPLVCOLUMN) pcol / / pointer ke "TVColumn" record Alternatif Alih-alih pesan "LVM_INSERTCOLUMN" Anda juga dapat menggunakan "ListView_InsertColumn" : Gunakan 105 Kontrol tampilan daftar ListView_InsertColumn (HLV, 1, @ LVC); Catatan untuk Windows XP Tentunya Anda tahu efek optik di Explorer Windows XP, yang hanya ditambahkan ke abu-abu kolom saat ini. Ini adalah fungsi yang menyediakan sistem operasi yang tersedia, tidak perlu untuk pemrograman yang rumit: Hal ini tentu saja mengasumsikan bahwa menjalankan Windows XP, dan bahwa Anda versi Delphi cukup baru dan dibutuhkan Fungsi, "ListView_SetSelectedColumn" tahu. Selain itu, program ini membutuhkan file manifest sehingga Kontrol umum dapat 6,0 dimuat. File ini mungkin sudah tahu, jika Anda saat ini ditetapkan XPThema berencana untuk menggunakan untuk program Anda. Apakah mereka hanya datang dengan program ("Dateiname.exe.manifest") atau termasuk dalam sumber daya, tidak memainkan peranan. Adalah penting bahwa Program dapat mengaksesnya, jika tidak, anda tidak melihat efek di atas? Jika Anda memiliki versi lama dari Delphi, Anda dapat menggunakan unit "CommCtrl_Fragment.pas" bahwa ini Tutorial disertakan. Unit telah berhasil diuji dengan Delphi 5 dan termasuk beberapa update XP, dll juga yang p.g. Fungsi. Program sampel sekarang sebagai berikut: Pada awal kolom pertama dipilih, fungsi di mana Anda hanya indeks dari kolom lulus (zero-based): ListView_SetSelectedColumn (HLV, 0); Fungsi yang sama juga digunakan ketika menyortir. Klik pada header kolom, entri tidak hanya jenis - pada Windows XP maka kolom yang sesuai dipilih. Dengan pesan "LVM_GESELECTEDCOLUMN" atau makro "ListView_GetSelectedColumn" bisa Anda cara untuk menentukan kolom yang dipilih saat ini: iCol: = ListView_GetSelectedColumn (HIV);

Page 102: delphi

4.7.4. Tampilan daftar fleshing Untuk mengisi, kita perlu rekor, TLVItem. Sebagai contoh, kutipan dari yang sesuai Prosedur program kami> melayani. Anda membuat topeng yang mengidentifikasi jenis (teks) ditentukan lvi.mask: = LVIF_TEXT; Kemudian Anda dapat menentukan item dan indeks subitem lvi.iItem: = loop; lvi.iSubItem: = 0; termasuk teks (dalam hal ini: nama dari file yang ditemukan) 106 Kontrol tampilan daftar lvi.pszText = finddata.cFileName; Jadi kita bisa menambahkan entri dengan pesan "LVM_INSERTITEM" Tambahkan ke dalam daftar, nilai lParam Pointer untuk merekam hanya diisi: SendMessage (HLV, LVM_INSERTITEM, 0, Integer (@ lvi)); Alternatif Atau, Anda juga dapat menggunakan "ListView_InsertItem", ini hanya sebuah enkapsulasi pesan: ListView_InsertItem (HLV, lvi); Sebagai catatan kedua kami membaca ukuran file dalam buffer teks. Karena sekarang dalam entri kolom kedua adalah, kita perlu mengubah variabel anggota iSubItem dari catatan sesuai: lvi.iSubItem: = 1; Kami memiliki buffer teks ke ukuran file lvi.pszText: = buf; dan kali ini menggunakan pesan "LVM_SETITEM" atau makro "ListView_SetItem" ListView_SetItem (HLV, lvi); Perbedaannya adalah bahwa "LVM_INSERTITEM" menyisipkan item baru, sementara kita dengan "LVM_SETITEM" kemungkinan memiliki informasi lebih lanjut tentang item saat ini (hanya sebagai entri dalam kolom lain) yang harus diambil. TLVItem definisi typedef struct {_LVITEM UINT mask, / / properti berlaku iItem int / / Item Index int iSubItem; UINT negara; UINT stateMask; LPTSTR pszText / / item text int cchTextMax; iImage int / / Index Gambar LParam; # Jika (_WIN32_IE> = 0x0300) int iIndent; # Endif # Jika (_WIN32_IE> = 0x560)

Page 103: delphi

int iGroupId; UINT CColumns; Puint puColumns; # Endif } LVM_INSERTITEM definisi LVM_INSERTITEM wParam = 0; lParam = (lParam) (const LPLVITEM) pItem; 107 Kontrol tampilan daftar 4.7.5. Tentukan jenis file Keanehan adalah tampilan dari jenis file. Nama-nama ini disediakan oleh sistem, dan kita datang dengan fungsi "SHGetFileInfo" terserah mereka. Fungsi mengambil nama file satu Variabel jenis "TSHFileInfo". Karena kita tertarik dalam deskripsi jenis, kita menggunakan bendera SHGFI_TYPENAME sehingga panggilan terlihat seperti ini: SHGetFileInfo (finddata.cFilename, 0, fi, sizeof (TSHFileInfo) SHGFI_TYPENAME); Setelah panggilan berisi variabel anggota szTypeName nama. Sisanya sesuai dengan p.g. Prosedur: Pilih indeks sub-item ke kolom kanan diisi, kemudian menetapkan Ketik nama untuk membaca dan menyisipkan item baru dalam tampilan daftar. lvi.mask: = LVIF_TEXT; lvi.iSubItem: = 2; lvi.pszText = fi.szTypeName; ListView_SetItem (HLV, lvi); 4.7.6. Gambar Anda juga akan ingin ...? Oh well. Apa yang akan daftar seperti itu melihat tanpa simbol-simbol yang khas? Dalam bab ini, pertama-tama kita melihat bagaimana kita dapat menggunakan grafis Anda sendiri. Oleh karena itu kita membutuhkan Imagelist disebut. Ini adalah dengan Diisi simbol dan tampilan daftar ditugaskan. Jika diperlukan, kita harus membuat masing-masing Imagelist untuk besar dan satu untuk ikon kecil. Kami melihat dasar ikon kecil sekaligus: Dengan "ImageList_Create" kita membuat daftar gambar. Sebagai nilai kembali, kita mendapatkan pegangan yang kita butuhkan setelah itu untuk tugas ke kontrol tampilan daftar: hImgSm: ImageList_Create = (16,16, ILC_COLOR, 0,1); ImageList_Create-definition> HIMAGELIST ImageList_Create ( int cx, / / lebar tidak harus sesuai dengan yang sebenarnya cy int, / / tinggi tidak harus sesuai dengan yang sebenarnya UINT bendera, / / Flags, terutama untuk warna int cInitial, / / jumlah gambar dalam menciptakan mungkin menjadi nol cGrow int / / jumlah gambar yang digunakan untuk daftar ditingkatkan / /, Ketika sistem perlu menambahkan gambar baru ); Selanjutnya kita mengisi daftar dengan ikon dalam file sumber daya:

Page 104: delphi

ImageList_AddIcon (hImgSm, LoadIcon (hInstance, MAKEINTRESOURCE (1))); ImageList_AddIcon Definisi: int ImageList_AddIcon ( HIMAGELIST himl, HICON hicon ); Dengan cara yang sama bisa tentu saja masih banyak simbol untuk melampirkan Imagelist tersebut. Agar tampilan daftar, yang Simbol juga dapat menggunakannya, kita memiliki daftar dengan "LVM_SETIMAGELIST" pesan: SendMessage (HLV, LVM_SETIMAGELIST, LVSIL_SMALL, hImgSm); 108 Kontrol tampilan daftar Parameter kedua adalah pegangan Imagelist kami, dan parameter pertama menggambarkan jenis daftar: Nilai Arti LVSIL_NORMAL Imagelist dengan ikon besar LVSIL_SMALL Imagelist dengan ikon kecil LVSIL_STATE Imagelist dengan simbol status LVM_SETIMAGELIST definisi LVM_SETIMAGELIST wParam = (WPARAM) (int) IImageList; lParam = (lParam) (HIMAGELIST) himl; Alternatif: Pesan ini dirumuskan oleh "ListView_SetImageList" yang dapat Anda gunakan juga. Namun, tentukan pegangan daftar gambar dan jenis dalam urutan terbalik, misalnya: ListView_SetImageList (HLV, hImgSm, LVSIL_SMALL); Ketika menetapkan daftar simbol besar melanjutkan juga. Masih ada pertanyaan: Bagaimana item dalam tampilan daftar menggunakan semacam simbol? Saya ingin mengingatkan Anda tentang bab terakhir, yang berkaitan dengan Isi tampilan daftar itu. Jika entry pertama (berdasarkan kolom dengan indeks nol) dalam tampilan daftar ingin masuk, silahkan mengisi formulir sebagai berikut: lvi.mask: = LVIF_TEXT atau LVIF_IMAGE; Ini memberikan Anda dengan iImage variabel anggota yang tersedia bahwa Anda lulus indeks simbol. Jika kita menganggap bahwa kita hanya memiliki sebuah ikon dalam daftar gambar, panggilan demikian cukup sederhana: lvi.iImage: = 0; Entri akan seperti yang dijelaskan dalam bab terakhir dengan "LVM_INSERTITEM" (atau "ListView_InsertItem") terdaftar dan ikon kemudian harus menunjukkan juga. Kebetulan, saya telah menemukan bahwa dengan otomatis menempatkan Imagelist sebuah ikon pertama untuk semua item digunakan ketika Anda membuat tidak ada informasi yang spesifik. Jika Anda catatan sehingga semua sama (pertama) simbol pada daftar

Page 105: delphi

untuk menunjukkan, Anda dapat memilih untuk tidak mengabaikan bendera dan LVIF_IMAGE variabel iImage anggota. Gambar untuk sub-item Pada tampilan rinci (LVS_REPORT gaya) Anda dapat menambahkan entri dalam kolom lain dengan grafis. Untuk digunakan, seperti hanya ditampilkan, masker yang sesuai dan lulus nilai indeks gambar yang diinginkan, misalnya lvi.mask: = LVIF_TEXT atau LVIF_IMAGE; lvi.iImage: = 1; dll Selain itu, Anda perlu mengatur gaya atribut diperpanjang, jika grafis yang tidak ditampilkan: SendMessage (HLV, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, {... Atau LVS_EX_SUBITEMIMAGES}); Jika tampilan daftar pada musim gugur sebelum entri pertama menunjukkan icon tidak, maka ingatlah apa yang saya hanya menulis secara otomatis Dengan menetapkan sebuah Imagelist simbol pertama digunakan, bahkan jika eksplisit menentukan. Anda dapat menimpa perilaku ini dengan hanya "trik" oleh LVIF_IMAGE yaitu bendera untuk pertama Penggunaan variabel iImage berlalu tapi nilai -1 (I_IMAGENONE): lvi.mask: = LVIF_TEXT atau LVIF_IMAGE; lvi.iImage = I_IMAGENONE; Namun, ini memiliki kelemahan dari bertindak sangat jelek, yang masih tersisa dari ruang entri untuk grafis gratis. Hal ini tergantung, bagaimanapun, bersama-sama dengan alokasi daftar gambar. Hanya jika Anda menggunakan daftar, yang Entri langsung di tepi kiri. 109 Kontrol tampilan daftar Terlepas dari hal ini, laporan ini memberikan modus terbaik baik. Setelah Anda menggunakan pandangan yang berbeda, yang secara default kembali ke entri pertama dengan nya (kemudian mungkin tidak ada) menggunakan simbol, yang mungkin untuk hasil yang aneh mengarah. 4.7.6.1. Daftar Gambar Pers The Dengan "ImageList_Destroy" memori dibebaskan untuk daftar lagi. Silakan melakukannya di "WM_DESTROY" dilupakan: Kasus uMsg dari WM_DESTROY: ImageList_Destroy (hImgSm); end; ImageList_Destroy Definisi: Bool ImageList_Destroy ( HIMAGELIST himl

Page 106: delphi

); 4.7.6.2. Simbol, yang kedua! Sebuah metode yang lebih elegan adalah dengan mengacu pada sistem simbol. Sejak program contoh kita tetap membaca file dalam folder saat ini, kita juga dapat melihat serta ikon file yang sesuai . Cuti Tapi karena kita ingin menggunakan dua daftar gambar secara bersamaan (untuk simbol kecil dan besar), sangat penting bahwa tampilan daftar telah dibuat dengan LVS_SHAREIMAGELISTS atribut style. Hal ini berkaitan dengan fakta bahwa biasanya dalam alokasi daftar gambar disarankan sudah digunakan lagi dirilis. Jadi Anda dapat hanya dengan atribut style disebutkan lebih dari satu daftar gambar untuk digunakan. Hal ini juga berlaku untuk kasus yang Anda ingin menggunakan ikon sendiri. Tapi setidaknya di sini konsekuensinya segera terlihat jika Anda lupa atribut: menghilang, dll ikon pada desktop Anda, di Windows Explorer dan dapat dilihat hanya setelah restart. Jadi jika Anda telah memverifikasi bahwa p.g. Atribut yang digunakan, maka Anda dapat men-download dua daftar gambar. Kita menggunakan fungsi "SHGetFileInfo" yang memberikan kita dengan pegangan setiap daftar sebagai hasilnya, jika kita bendera SHGFI_SYSICONINDEX penggunaan. Untuk ikon kecil baris perintah adalah sebagai berikut: hImgSm: = HIMAGELIST (SHGetFileInfo ('', 0, fi, sizeof (fi), SHGFI_SYSICONINDEX atau SHGFI_SMALLICON)); if (hImgSm <> 0) maka ListView_SetImageList (HLV, hImgSm, LVSIL_SMALL); Yang besar simbol kita hanya menukar SHGFI_SMALLICON bendera melawan SHGFI_ICON: hImgBig: = HIMAGELIST (SHGetFileInfo ('', 0, fi, sizeof (fi), SHGFI_SYSICONINDEX atau SHGFI_ICON)); Dan tentu saja kita harus menggunakan bendera lain tampilan daftar, karena saat ini kita bahkan besar simbol (= normal) ingin menerapkan: if (hImgBig <> 0) maka ListView_SetImageList (HLV, hImgBig, LVSIL_NORMAL); Jadi banyak untuk dasar-dasar. 110 Kontrol tampilan daftar Ketika menentukan simbol kita ingat bahwa kita menggunakan "SHGetFileInfo" sudah merupakan Nama jenis yang diambil dari sistem. Karena kita perlu fungsi untuk mengubah indeks simbol masing-masing untuk menentukan, itu sekitar untuk benar-benar menggabungkan kedua pandangan dan kedua jenis file dan icon segera . Menentukan Jadi kita mengambil dua bersama-sama: Nol Memory (@ fi, sizeof (TSHFileInfo)); SHGetFileInfo (finddata.cFilename, 0, fi, sizeof (TSHFileInfo)

Page 107: delphi

SHGFI_ICON atau SHGFI_SYSICONINDEX atau SHGFI_TYPENAME); Dengan cara ini, kita mendapatkan indeks dari simbol dalam variabel iIcon anggota dan dapat menggunakan ini untuk daftar kami Lihat lulus masuk: lvi.iImage = fi.iIcon; Tidak ada masih banyak yang harus dilakukan, dan hasilnya menakjubkan. : O) Perhatian! Seperti telah disebutkan, Anda tidak dapat berbagi daftar sistem gambar dalam keadaan apapun! Jika Anda melakukan ini untuk diri sendiri Cara untuk memutuskan di sini, mengabaikan bahwa Anda telah diberitahu dalam bab ini bagaimana citra daftar rilis. Konsekuensi mungkin hanya bersifat sementara (reboot, dan semuanya kembali normal), namun tidak menyenangkan. Harap diingat! 4.7.6.3. Mengubah tampilan Switching pandang relatif sederhana. Satu "pergi" hanya gaya saat jendela untuk melihat dan menetapkan baru. Ini melayani dua fungsi, "GetWindowLong" dan "SetWindowLong". Dalam kasus kami tertarik kita dalam GWL_STYLE "normal" atribut gaya. Dengan prosedur khusus yang sebagai contoh dalam PSDK ditemukan, kita dapat membuat pekerjaan kami di sini. Kami pertama kali membaca tentang gaya saat ini dan mengubah tampilan saja, ketika gaya yang diinginkan tidak diatur: Prosedur setview (hWndListView: HWND; dwView: dword); var dwStyle: dword; mulai dwStyle: = GetWindowLong (hWndListView, GWL_STYLE); if (dwStyle dan LVS_TYPEMASK <> dwView) maka SetWindowLong (hWndListView, GWL_STYLE, dwStyle dan tidak LVS_TYPEMASK atau dwView); end; Catatan dan bukan sebagai adalah mitra atau dan "menghapus / menghilangkan" atribut. 111 Kontrol tampilan daftar GetWindowLong definisi LONG GetWindowLong ( HWND hWnd, / handle / window int nIndex / / atribut untuk dibaca ); SetWindowLong-definition> LONG SetWindowLong ( HWND hWnd, / handle / window int nIndex, / / atribut yang akan ditetapkan

Page 108: delphi

PANJANG dwNewLong / / nilai baru ); Dalam kasus contoh kita, kita sekarang hanya mempertimbangkan mana item menu yang dipilih, dan menyebutnya Prosedur dengan gaya yang diinginkan untuk tampilan ke: Kasus LOWORD (wParam) dari IDM_ICONS: Setview (HLV, LVS_ICON); IDM_SMICONS: Setview (HLV, LVS_SMALLICON); IDM_LIST: Setview (HLV, LVS_LIST); IDM_REPORT: Setview (HLV, LVS_REPORT); end; Catatan untuk Windows XP Dari Windows XP, tampilan daftar memiliki built dalam fungsi, "ListView_SetView", dengan pandangan dapat diaktifkan. Hal ini, bagaimanapun, adalah lagi file manifest telah disebutkan diperlukan. Sekarang, orang bisa percaya bahwa efek praktis cenderung nol, karena dengan fitur baru ini, Windows yang lebih tua Versi memulai sesuatu. Tapi sayangnya bisa menjadi satu-satunya cara baru "Tile" view (ubin) pada Windows Aktifkan XP. Oleh karena itu kita perlu (setidaknya di XP) digunakan. Saya telah membuat mudah dan p.g. Fungsi "setview" diperluas. Jika program pada Windows XP dimulai, "lama" nilai-nilai yang digunakan untuk memanggil fungsi baru sesuai. Pengecualian adalah hanya telah disebutkan "tile mode", yang ada tentu saja tidak ada "lama" korespondensi. Oleh karena itu, saya memiliki nilai "666" digunakan. LVS_ICON: ListView_SetView (HLV, LV_VIEW_ICON); LVS_SMALLICON: ListView_SetView (HLV, LV_VIEW_SMALLICON); LVS_LIST: ListView_SetView (HLV, LV_VIEW_LIST); LVS_REPORT: ListView_SetView (HLV, LV_VIEW_DETAILS); 666: ListView_SetView (HLV, LV_VIEW_TILE); Di balik fungsi menempatkan pesan baru, "LVM_SETVIEW", dengan konstanta baru beberapa. Untuk pesan ini ada juga berlawanan, "LVM_GETVIEW" (atau "ListView_GetView"), dengan mana Anda dapat mengetahui, mode yang sedang aktif. 112

Page 109: delphi

Kontrol tampilan daftar lvMode: = ListView_GetView (HIV); 4.7.7. Urutkan dengan mengklik header kolom Jadi sekarang bagian yang sulit: menyortir entri ketika Anda klik pada header kolom. Apa yang kita inginkan capai? Jika kita memilih kolom, maka harus entri dalam kolom tersebut dalam rangka ascending (A - Z) atau turun (Z - A) order. Oleh karena itu, kita perlu pertama-tama sebuah variabel yang kita dapat mengubah urutan. Karena hanya dua dari kita Arah sudah cukup (ascending, descending), variabel byte atau bool. Faktanya Anda pergi. Saya telah dipilih untuk contoh kita dari variabel byte yang diinisialisasi ke nol: var SortOrder: byte = 0; Sekarang, apa yang terjadi ketika kita klik pada header kolom? Tampilan daftar mengirimkan pemberitahuan "LVN_COLUMNCLICK" (dalam bentuk pesan "WM_NOTIFY") ke jendela utama kami. Termasuk pegangan tampilan daftar, dan (dalam catatan TNMListView) kolom diklik. Nilai ini dapat diakses melalui lParam tersebut menunjuk ke mengatakan catatan. Dengan asumsi kontrol terlihat dalam program kami sekali seperti ini: WM_NOTIFY: dengan pNMHDR (lp) ^ Kam if (hwndFrom = HLV) maka kasus kode LVN_COLUMNCLICK: mulai {... } end; end; WM_NOTIFY definisi WM_NOTIFY idCtrl = (int) wParam, / / Control yang memicu pesan pnmh = (LPNMHDR) lParam / / Pointer ke Rencana NMDHR du- NMHDR definisi typedef struct {tagNMHDR HWND hwndFrom / / Menangani "pemancar" UINT idFrom / / ID dari "pemancar" UINT kode / / code alert NMHDR}; 4.7.7.1. Sort Untuk mengurutkan entri, ada pesan "LVM_SORTITEMS" atau makro "ListView_SortItems". Dua umum bahwa satu aplikasi yang berhubungan dengan parameter dan alamat fungsi semacam kita sendiri

Page 110: delphi

berharap. Mari kita mulai dengan yang kedua. Nama fungsi yang tersisa untuk Anda hanya harus untuk deklarasi Mereka tetap: 113 Kontrol tampilan daftar kelas PFNLVCOMPARE = function (lParam1, lParam2, lParamSort: Integer): Integer stdcall; lParam1, lParam2 Nilai-nilai yang akan dibandingkan lParamSort Parameter ini kami melewati saat p.g. Pesan atau fungsi. Dalam banyak kasus, nilai yang dipilih, laporan tentang arah menyortir dll bertemu. Saya pribadi berpendapat bahwa pernyataan diklik Kepala kolom adalah solusi yang lebih baik. Jadi saya telah dikhianati, jika kita memicu semacam itu, maka kita memberikan indeks kolom diklik sebagai aplikasi-parameter terkait. Saya juga mengatakan alasan yang sama, tapi pertama-tama mari kita lihat panggilan. Sekali dengan pesan: SendMessage (hwndFrom, LVM_SORTITEMS, WPARAM (PNMListView (lp) ^. ISubItem), lParam (@ CompareFunc)); dan sekali dengan makro: ListView_SortItems (hwndFrom, @ compareFunc, PNMListView (lp) ^ iSubItem.); Sekarang berikut ini terjadi: nilai indeks dari entri pertama dan kedua dari tampilan daftar dengan nilai indeks diklik kolom ke fungsi penyortiran kami. Menggunakan indeks kolom, kita memutuskan bagaimana kita memilah inginkan. Untuk tujuan ini kita ingat program contoh. Ini memiliki tiga kolom. Yang pertama menunjukkan nama file, mean menunjukkan ukuran file, dan terakhir menunjukkan jenis file. Itu berarti kita memiliki dua nilai string, dan integer Nilai. Dengan demikian, urutan berbeda, karena kami memiliki integer tidak menggunakan perbandingan string dapat mengurutkan. Tapi pertama-tama, mari kita mendapatkan teks dari dua item yang akan dibandingkan. Dalam contoh Saya menggunakan variabel string dua yang diinisialisasi pertama, tentu saja. Ketika itu dilakukan, kita menggunakan nilai "LP1" untuk membaca teks. Indeks kolom mungkin tentu saja tidak dilupakan: ListView_GetItemText (HLV, LP1, subitem, @ buf1 [1], MAX_PATH); Misalkan kita memiliki kolom pertama diklik, itu akan "subitem" nol, dan karena "LP1" dalam hal indeks entri pertama mengandung, kita memiliki pernyataan di atas dengan nama file dari entri pertama dalam tampilan daftar ditentukan.

Page 111: delphi

Hal yang sama kita lakukan dengan entri kedua yang indeks dilewatkan "LP2": ListView_GetItemText (HLV, LP2, subitem, @ buf2 [1], MAX_PATH); Jika sekarang kita berasumsi bahwa ada dua string (yaitu isi kolom # 1 dan # 3), maka kita dapat dengan "lstrcmpi" melakukan perbandingan cukup sederhana. Fungsi ini mengembalikan nol Kembali ketika dua string yang identik. String pertama kurang dari yang kedua, maka hasilnya adalah negatif. Apakah string pertama lebih besar dari yang kedua, fungsi mengembalikan hasil yang positif. Lebih kecil dan lebih besar tidak hanya mengacu pada panjang string yang diberikan. Jadi adalah Berarti karakter dalam perbandingan langsung. The string berikut adalah sama, dan hasilnya akan memiliki nol hasil: Abcd abcd = Karena kita adalah independen dari notasi "lstrcmpi", Anda dapat menerima Sun pernyataan saya : O) Perbandingan berikut akan menghasilkan hasil yang positif, karena meskipun string pertama lebih pendek, ia memiliki "lebih tinggi" Karakter pada titik awal dari string kedua: 114 Kontrol tampilan daftar ABCZ> abcdefg Apakah Anda swap dua string, Anda akan mendapatkan hasil negatif, karena akan menjadi string kedua kali ini, yang pertama memiliki karakter yang paling signifikan: abcdefg <ABCZ Prinsip yang sama kita membandingkan string dua. Namun, saya ingin Anda pada kondisi kita Mulai diingat: kita ingin mengurutkan secara ascending atau descending. Ini berarti kita perlu utama kami menyatakan variabel lembar. Bagaimana kita lanjutkan? Sangat sederhana: kami ingin mengurutkan dalam urutan (A - Z), maka kita membandingkan pertama Item dengan kedua. Apakah kita ingin mengurutkan turun (Z - A), kami membalik dua string ke fungsi

dan membandingkannya adalah kedua item pertama: if (SortOrder = 1) lalu Hasil: = lstrcmpi (@ buf2 [1], @ buf1 [1]) Hasil lain: = lstrcmpi (@ buf1 [1], @ buf2 [1]); Penyortiran aktual sekarang mengambil kembali tampilan daftar bagi kita. Dari sisi kami, hanya nilai-nilai itu (<negatif Nol <positif) penting karena mereka menentukan bagaimana tampilan daftar bekerja. Mari kita kembali nilai negatif, maka ini berarti bahwa item pertama harus dimasukkan sebelum kedua. Mari kita memberikan kembali nilai positif, maka ini berarti bahwa item pertama harus dimasukkan setelah kedua. Dan nilai nol menunjukkan bahwa kedua item adalah identik dan tidak diurutkan. Setelah tampilan daftar telah melakukan ini, fungsi ini dipanggil lagi. Kali ini Anda akan menggunakan

Page 112: delphi

Indeks nilai-nilai parameter kedua dan ketiga berlalu ... Dengan cara ini, semua entri dari tampilan daftar dipertimbangkan, dan fungsi semacam akan berjalan sampai ada lagi yang menyortir. LVM_SORTITEMS-definition menunjukkan LVM_SORTITEMS wParam = (WPARAM) (lParam) lParamSort / / nilai yang ditetapkan pengguna lParam = (lParam) (PFNLVCOMPARE) pfnCompare / / alamat fungsi pemilahan 4.7.7.2. Tunggu, masih ada sesuatu ... Benar! Integer nilai kolom tengah (ukuran file). Sekarang jelas mengapa kita "lstrcmpi" tidak mendapatkan sangat jauh. Sebuah perbandingan antara nilai-nilai 13, dan 2 misalnya akan memiliki hasil bahwa kedua (dibandingkan dengan Salah satunya adalah diklasifikasikan sebagai karakter pertama dari tiga belas) dibandingkan yang lebih besar. Untuk alasan ini, kami menganggap dalam fungsi penyortiran kami yang kolom diklik. Jika indeks disampaikan memiliki nilai satu, maka ini sesuai dengan kolom tengah dengan ukuran file, dan kami cabang menjadi terpisah Pemeriksaan. Dalam hal ini kita mengubah string menjadi integer. Untuk mempermudah, saya miliki untuk fungsi "StrToIntDef" simulasi sama dengan nilai default dilewatkan. Catatan, bagaimanapun, bahwa ukuran tertentu dalam tampilan daftar misalnya mungkin terlihat seperti ini: 26 B. Jadi kita memiliki segalanya untuk kemungkinan yang ada Hapus ruang, sehingga kita benar-benar perlu untuk mengubah string ke nilai numerik hanya nomor . Mempertimbangkan Ketika itu selesai, kita berpikir kembali ke arah semacam kami dan memiliki nilai integer sesuai

if (SortOrder = 1) kemudian mulai b: = StrToIntDef (buf1, 0); a: = StrToIntDef (buf2, 0); akhir lain mulai a: = StrToIntDef (buf1, 0); b: = StrToIntDef (buf2, 0); end; Perbandingan dari dua bilangan bulat sekarang harus menjadi masalah paling. Mulai dari dasar (negatif <nol < positif) kita bandingkan sebagai berikut: 115 Kontrol tampilan daftar if (a> b) lalu Hasil: = 1 else if (a <b) lalu Hasil: = -1 Hasil lain: = 0; 4.7.7.3. Itu masih belum cukup meskipun! Jika Anda mencoba untuk mengurutkan sehingga Anda akan melihat bahwa tidak ada yang terjadi. Kenapa? - Jawabannya ditemukan dalam deklarasi TLVItem catatan di PSDK, yang mengatakan (kira-kira diterjemahkan):

Page 113: delphi

PSDK: lParam Barang-nilai yang terkait. Jika Anda menggunakan LVM_SORTITEMS pesan, mengirim tampilan daftar bahwa nilai ke Sorting fungsi aplikasi. Karena barang-barang kami tapi ketika mengisi diberi nilai variabel anggota lParam TLVItem catatan punya, tidak akan terjadi. Jadi yang harus kita lakukan, di mana kita dapat hanya indeks item tertentu lParam nilai yang ditetapkan: lvi.mask = LVIF_PARAM; lvi.iSubItem: = 0; untuk i: = 0 sampai ListView_GetItemCount (HLV) - 1 lakukan mulai lvi.iItem: = i; lvi.lParam: = i; SendMessage (HLV, LVM_SETITEM, 0, lParam (@ lvi)); end; Dalam program contoh, lihat petunjuk dalam "UpdateLParam" prosedur masing-masing sebelum fungsi pemilahan disebut. 4.7.7.4. Membalik urutan semacam Hanya satu hal yang harus dilakukan: ketika kita telah diurutkan dalam urutan, kita harus memastikan bahwa langkah berikutnya dalam Urutan reverse diurutkan ... dan terbalik, setelah klik yang lain, dll Kami pergi Kembali ke evaluasi kami "LVN_COLUMNCLICK" dan meniadakan nilai saat ini dari "SortOrder" variabel sederhana: SortOrder: = 1 - SortOrder; Sekarang program kami namun memiliki satu kelemahan: klik header kolom apa pun yang kita akan selalu menjadi saat ini nilai "SortOrder" digunakan untuk menyortir arah. Lihatlah kali, namun di Windows Explorer on: ketika Anda klik pada header kolom di sana, selalu pertama dalam urutan menaik (A - Z) yang diurutkan. Hanya mengklik berulang pada header kolom yang sama berbalik arah. Oleh karena itu tepat untuk mempertahankan indeks kolom saat ini dan, jika diubah, "SortOrder" lagi ke nol (untuk urutan menaik), yang lebih pendek terlihat seperti: if (lastCol <> PNMListView (lp) ^. iSubItem) maka SortOrder: = 0; {... Urutkan} / / LastCol: PNMListView = (lp) ^ iSubItem;. Penting! Selama proses pemilahan, isi daftar melihat "tidak stabil" (menurut PSDK). Jika memungkinkan sehingga harus bekerja dihindari dengan tampilan daftar sementara menyortir. 116

Page 114: delphi

Kontrol tampilan daftar 4.7.8. The "di tempat"-Editor Kau tahu apa yang disebut "di tempat" editor sudah dari program lain. Windows Explorer adalah Contoh yang baik. Klik sekali pada nama file atau menggunakan tombol F2, dan tampaknya jenis Masukan lapangan, yang terletak langsung di kontrol: Untuk kemampuan ini pertama atribut style diperlukan, yang dapat ditentukan saat membuat tampilan daftar harus: LVS_EDITLABELS: HLV: = CreateWindowEx (WS_EX_CLIENTEDGE, WC_LISTVIEW, nihil, WS_VISIBLE atau WS_CHILD atau LVS_REPORT atau baru {->} atau LVS_EDITLABELS LVS_SHOWSELALWAYS 0,0,100,100, wnd, IDC_LV, hInstance, nihil); Sebenarnya, orang bisa mengatakan: itu saja. Benar-benar! Tampilan daftar memberikan kita dengan editor "di tempat" yang hanya tidak memperlakukan kita banyak - seperti yang kita lakukan dengan dia lagi. Dengan demikian masih hilang selangkah, dan, seperti biasa, adalah: kita harus menanggapi pesan. Sebenarnya, bahkan ada dua: "LVN_BEGINLABELEDIT" dan "LVN_ENDLABELEDIT". Nama-nama mengatakan itu sebenarnya sudah: "LVN_BEGINLABELEDIT" memberitahu jendela induk dari tampilan daftar yang akan mulai mengedit nama (= label). Dengan demikian informasi "LVN_ENDLABELEDIT" fakta bahwa proses selesai atau dihentikan. Kedua pesan diterima melalui "WM_NOTIFY" dikirim. WM_NOTIFY: Kasus pNMHDR (lParam) ^ kode. LVN_BEGINLABELEDIT: {... } LVN_ENDLABELEDIT: {... } end; The lParam dalam kedua kasus adalah pointer ke TLVDispInfo rekor dengan kami variabel item-anggota bunga karena mengandung teks lama dan baru dari label kami. Tentu saja memiliki informasi lebih lanjut, namun sebagian besar itu hanya kita di sekitar teks. NMLVDISPINFO definisi typedef struct {tagNMLVDISPINFO NMHDR hdr; LVITEM item / / TLVItem record } Setelah mengatakan: Hal ini tidak perlu untuk mencegat kedua pesan untuk "sebelum dan setelah acara" nama label. Itu teks baru untuk menggantikan dirinya. Contoh kode berikut akan Anda (menggunakan contoh dari "LVN_ENDLABELEDIT") yang Melihat nama lama dan baru, tetapi ada yang berubah dalam tampilan daftar:

Page 115: delphi

117 Kontrol tampilan daftar LVN_ENDLABELEDIT: if (PLVDispInfo (lp) ^ item.pszText <.>'') kemudian mulai i: = ListView_GetNextItem (hwndFrom, -1, LVNI_FOCUSED); if (i> -1) kemudian mulai Nol Memory (@ buf, sizeof (buf)); ListView_GetItemText (hwndFrom, i, 0, buf, sizeof (buf)); MessageBox (0, pchar (Format ('"% s" vs "% S"', [Buf PLVDispInfo (lp) ^ item.pszText.])), NULL, 0); end; end; Apakah Anda ingin mengubah nama sekarang benar-benar masuk sebagai nilai pengembalian yang benar (atau dalam kasus "WndProc" pesan fitur) nilai lain dari nol. Jika tidak, hasilnya adalah palsu (nol) Hasil: = 1; 4.7.8.1. Bagaimana dengan F2? Saya sudah sebutkan itu: itu terdiri dari mengklik tentu kemungkinan label pada Menu, tombol, jalan pintas untuk mengubah dll. Tampilan daftar menunjukkan pesan untuk "LVM_EDITLABEL", atau Anda menggunakan "ListView_EditLabel" makro yang merangkum pesan. Hasilnya adalah sama, Anda harus hanya memilih satu cara. Contoh program menggunakan kedua menu dan F2 pintas untuk berubah. Mari kita lihat bagian menu, karena mengandung kode produksi aktual. Pertama, kita harus menentukan apakah item apapun yang dipilih: i: = ListView_GetNextItem (HLV, -1, LVNI_FOCUSED); if (i> -1) kemudian mulai {... } end; Jika itu yang terjadi ("x" dalam kasus yang lebih besar dari -1), maka kita memberikan fokus tampilan daftar: SetFocus (HIV); dan panggilan baik p.g. Pesan atau makro. Aku memilih untuk makro, tapi (seperti yang saya katakan!) itu terserah Anda: ListView_EditLabel (HLV, i); Tentukan pegangan jendela tampilan daftar dan nilai dari item yang dipilih. Pada berita itu akan sangat melihat bahwa Anda harus menentukan nilai ("x") sebagai wParam: SendMessage (HLV, LVM_EDITLABEL, i, 0); Shortcut ketika kita menulis sekarang tidak semuanya lagi, kita malah menghasilkan pesan klik dan menyebutnya kode menu:

Page 116: delphi

SendMessage (wnd, WM_COMMAND, MAKEWPARAM (IDM_EDITLABEL, BN_CLICKED), 0); Alternatif untuk shortcut Jika Anda ingin menggunakan jalan pintas, Anda juga memiliki tampilan daftar sendiri tersedia. Ketika Edit pesan "LVN_KEYDOWN", Anda juga dapat merespon tombol F2. Hasilnya adalah sama, hanya Mereka menyimpan cara pintas. "LVN_KEYDOWN" dikirim sebagai bagian dari "WM_NOTIFY" dan perlu diedit sesuai: 118 Kontrol tampilan daftar WM_NOTIFY: pNMHDR kasus (lp) ^ kode. LVN_KEYDOWN: {... } end; Kode kunci kita datang dengan pointer ke TLVKeyDown variabel dengan wvKey dibutuhkan Variabel anggota adalah: if (PLVKeyDown (lp) ^ wvKey VK_F2. =) kemudian {... } Tapi karena itu (seperti yang saya katakan!) Apakah pointer, kita gunakan dalam kasus, PLVKeyDown. TLVKEYDOWN-definition menunjukkan typedef struct {tagLVKEYDOWN NMHDR hdr / / informasi lebih lanjut tentang pesan KATA wVKey / kode kunci / virtual Bendera UINT / / selalu nol } 4.7.9. Entri secara otomatis menyorot Mari kita lihat secara singkat bagaimana untuk menandai item pemrograman dan bagaimana untuk menandai mereka membalikkan. Apa gunanya itu? Sebuah contoh akan menjadi file manager. Anda dapat memilih file, beberapa file ... atau memang semua. Dan jika Anda misalnya ingin menghapus semua file ke nomor tertentu, maka jelas lebih cepat ketika mereka memilih file dan kemudian membalikkan seleksi untuk berbicara. Untuk menghindari masalah (seperti yang Anda pikirkan, "Hei, itu tidak entah bagaimana"), kita membeli List kami View-Control, atribut gaya baru: HLV: = CreateWindowEx (WS_EX_CLIENTEDGE, WC_LISTVIEW, nihil, WS_VISIBLE atau WS_CHILD atau LVS_SHOWSELALWAYS, {... }); Para LVS_SHOWSELALWAYS atribut hanya memastikan bahwa pilihan saat ini selalu terlihat, terlepas dari apakah daftar View memiliki fokus atau tidak. Sekarang untuk masalah sesungguhnya - Contoh kami memiliki dua item menu baru, "Pilih Semua" dan "Invert Selection". Keduanya

Page 117: delphi

memanggil prosedur yang sama pada, karena prinsipnya adalah sama, memutuskan hanya parameter bool, bagaimana prosedur berperilaku. Dalam prosedur ini Pertama, status setiap entri dipertanyakan. Saya memilih untuk menggunakan macro "ListView_GetItemState" memutuskan, tapi ini benar-benar hanya sebuah enkapsulasi pesan "LVM_GETITEMSTATE" adalah. Dalam kedua kasus, indeks dari entri yang bersangkutan diperlukan. Selain itu ada bendera (atau kombinasi dari beberapa flag) sehingga kita belajar apa yang kita tertarik! Panggilan terlihat seperti ini: Ures = ListView_GetItemState (HLV, saya LVIS_SELECTED); "Aku" adalah indeks dari entri, dan LVIS_SELECTED memberitahu kita bahwa kita berasal dari tanda Entri bunga. Juga mungkin akan: 119 Kontrol tampilan daftar LVIS_CUT LVIS_DROPHILITED LVIS_FOCUSED LVIS_OVERLAYMASK LVIS_STATEIMAGEMASK Ini bendera harus jika Anda ingin menggunakan lebih, atau dihubungkan, seperti Ures = ListView_GetItemState (HLV, i, atau LVIS_SELECTED LVIS_FOCUSED); Ini juga berarti bahwa Anda tidak bisa hanya memeriksa tes untuk kesetaraan. Oleh karena itu kita harus mengetahui apakah bendera yang menarik perhatian kita termasuk dalam hasil pengembalian makro. Tapi sebenarnya ya kita tertarik apakah bendera tidak termasuk dalam hasil pengembalian, yaitu: if (Ures dan LVIS_SELECTED = 0) maka; Di tepi Bagaimana sebenarnya akan memanggil p.g. Pesan terlihat seperti jika kita tidak ingin menggunakan makro? Nah, hanya seperti ini: Ures: = SendMessage (HLV, LVM_GETITEMSTATE, saya LVIS_SELECTED); Dalam rangka untuk mengubah status item, kita akan menggunakan setara dengan makro di atas: "ListView_SetItemState". Makro mengharapkan pertama (terlepas dari pegangan tampilan daftar) kembali ke indeks entri masing. Parameter ketiga menentukan apakah ditetapkan dalam kasus kami tanda atau dicabut

seharusnya. Parameter keempat adalah lagi bendera yang kita tertarik (mark tepatnya!). ListView_SetItemState (HLV, saya LVIS_SELECTED, LVIS_SELECTED); Pernyataan ini, entri akan ditandai. Untuk membatalkan pilihan, digunakan sebagai sepertiga Parameter nol bukan LVIS_SELECTED: ListView_SetItemState (HLV, i, 0, LVIS_SELECTED); Dalam kasus kami, karena itu penting jika item dipilih atau tidak. Jika ini dicentang, maka akan ditandai. Apakah ditandai, pemilihan ini dibatalkan. Menurut prinsip perintah "Balikkan Pilihan". Ketika

Page 118: delphi

"Pilih semua" fungsi negara ditentukan diabaikan dan umumnya menetapkan tanda. Berikut harus diperhatikan: Hal yang sama terjadi juga dalam program sampel. Namun tampaknya ada mungkin tampak aneh, karena saya memiliki disimpan jika pernyataan. Sebaliknya, saya menggunakan array bool: const fStateState: array [boolean] dari kardinal = (0, LVIS_SELECTED); Array ini hanya memiliki dua negara: true (= LVIS_SELECTED) atau salah (= 0). Alih-alih rumit Untuk menulis query seperti: if (Ures dan LVIS_SELECTED = 0) atau (tidak fTurnSelection) maka ListView_SetItemState (HLV, saya LVIS_SELECTED, LVIS_SELECTED) lain ListView_SetItemState (HLV, i, 0, LVIS_SELECTED); Saya menyerahkan array hanya status ditentukan masuk dan variabel bool dari header prosedur sebagai atau link: 120 Kontrol tampilan daftar ListView_SetItemState (HLV i,, fStateState [(Ures dan LVIS_SELECTED = 0) atau (tidak fTurnSelection)], LVIS_SELECTED); Hasilnya adalah tidak lagi sama, hanya jika pernyataan. Cobalah! Jalankan program sampel dan tandai sebagai Anda item pertama, ketiga, kelima, dll Kemudian gunakan yang "Invert Selection". Atau pilih apa, dan kemudian pilih "Pilih Semua". 4.7.10. The "Tile" melihat tampilan daftar pada Windows XP Ketika kita berbicara tentang berbagai tampilan tampilan daftar, maka kita baru bisa "Tile" pandangan Windows XP tidak dapat diabaikan. Hal ini mirip dengan tampilan ikon, simbol masuk ke terlihat. Di samping ikon ini, dan itu bedanya, Anda melihat nama item dan satu atau lebih tambahan baris dengan teks tambahan. Pandangan baru lagi file manifest diperlukan, yang dapat disertai oleh salah satu program, atau yang diintegrasikan ke dalam sumber daya. Jika versi Delphi catatan yang diperlukan dan fungsi yang akan dibahas, belum diketahui, maka Anda dapat membaca "CommCtrl_Fragment.pas" digunakan. Ini termasuk semua informasi yang diperlukan. Di mana kita mulai sekarang? Cara terbaik yang kita pikirkan sebelumnya, menunjukkan informasi yang kita inginkan. Bahwa baris teks dalam modus "Tile" dengan beberapa kolom yang dipilih (dari modus laporan) yang sama, saya ingin referensi screenshot : Mengklarifikasi Yang menarik di sini adalah benar-benar hanya kolom # 2 dan # 3 (pada Gambar 1 dan 2 wg nol berbasis penghitungan.). Isi kolom pertama, sama dengan nama item utama adalah, dalam setiap kasus, yaitu, dan dalam

Page 119: delphi

setiap Tampilan display mode, sehingga kita bisa mengabaikannya. 4.7.10.1. Langkah # 1 - pengaturan dasar untuk tampilan daftar Jika kita ingin menggunakan "Tile" mode, pertama-tama kita harus membuat beberapa pengaturan umum. Jika tidak, secara default, hanya dua baris (yaitu primer, dan baris tambahan). Rekor diperlukan untuk tujuan ini adalah dari TLVTileViewInfo jenis dan harus diinisialisasi dengan ukuran tileinfo.cbSize: = sizeof (TLVTileViewInfo); Karena kita ingin mengubah jumlah baris, kita perlu mengatur variabel anggota dwMask sesuai dengan: tileinfo.dwMask = LVTVIM_COLUMNS; Sebagai bendera untuk saya LVTVIF_AUTOSIZE nilai tampaknya ideal. Dalam rangka agar sesuai dengan dimensi dari ubin individu Jendela untuk memiliki, tapi lebar minimum tileinfo.dwFlags = LVTVIF_AUTOSIZE; Clines dalam variabel anggota kita sekarang menunjukkan jumlah baris tambahan untuk mode "Tile". Itu Nama utama item selalu terlihat, sehingga tidak masuk hitungan: 121 Kontrol tampilan daftar tileinfo.cLines: = 2; Catatan kita kaya sekarang begitu penuh dengan pesan "LVM_SETTILEVIEWINFO" atau fungsi "ListView_SetTileViewInfo" ke dalam daftar lihat lebih lanjut: ListView_SetTileViewInfo (HLV, tileinfo); Tetap ukuran Anda dapat menentukan ukuran seperti "ubin" sendiri. Untuk menambahkan masker untuk bendera LVTVIM_TILESIZE melepaskan variabel dwFlags anggota dan ketik tileSize ukuran yang diinginkan; misalnya: tileinfo.dwMask: = LVTVIM_COLUMNS atau LVTVIM_TILESIZE; tileinfo.cLines: = 2; tileinfo.sizeTile.cx: = 300; tileinfo.sizeTile.cy: = 70; 4.7.10.2. Langkah # 2 - The Pertimbangkan setiap item Jika kita menguji "Tile" pandangan saat ini, kita hanya akan melihat ikon dan nama item ke kanan. Itu

karena tampilan daftar belum tahu apa yang harus dilakukan dengan masing-masing item ketika baru Mode yang dipilih. Kami sekarang memiliki dua cara yang harus dilakukan untuk mengubah itu, katakanlah, katakan tampilan daftar, informasi apa yang kami yang "Tile" modus tertarik. Kedua rute memerlukan perpanjangan rutin yang kita mengisi tampilan daftar miliki. Catatan diperpanjang TLVItem

Page 120: delphi

Untuk cara ini masih suplemen untuk catatan sebelumnya TLVItem sebagaimana ditentukan dalam PSDK diperlukan. Anda hanya memiliki variabel anggota ketiga ditandai dengan warna merah dalam deklarasi tipe (dalam Unit "CommCtrl.pas") Tambahkan: kelas tagLVITEMA record = dikemas mask: UINT; iItem: Integer; iSubItem: Integer; Negara: UINT; stateMask: UINT; pszText: PAnsiChar; cchTextMax: Integer; iImage: Integer; lParam: lParam; iIndent: Integer; iGroupId: integer; CColumns: uint; puColumns: Puint; end; 122 Kontrol tampilan daftar (Dalam versi Unicode, "tagLVITEMW" adalah melakukan hal yang sama.) Jika Anda melakukan ini, maka kita lihat silahkan kembali bagaimana item pertama Anda dimasukkan dalam tampilan daftar. Demikian juga pengaturan untuk mode "Tile" diperhitungkan, kita memperpanjang topeng ke LVIF_COLUMNS bendera baru (dinyatakan dalam "CommCtrl_Fragment.pas"): lvi.mask: = LVIF_TEXT atau LVIF_IMAGE atau LVIF_COLUMNS; Kami kemudian gunakan salah satu anggota CColumns variabel baru dan menentukan jumlah baris tambahan Yang akan ditampilkan (selain nama utama item) dalam modus "Tile": lvi.cColumns: = 2; Di sini, dengan cara, pilihan intervensi pertama. Anda dapat meninggalkan entri tertentu mewakili berbeda dengan Anda memasukkan nilai yang berbeda. Ambil sebagai contoh, setiap file, nilai indeks adalah angka ganjil, untuk hanya menampilkan satu baris tambahan, maka akan menyadari bahwa ini: if (aneh (Loop)) maka lvi.cColumns: = 1 lvi.cColumns lain: = 2; Juga sangat penting untuk presentasi adalah puColumns variabel anggota. Ini adalah pointer ke Aray integer, mengandung nilai-nilai indeks dari kolom, kita ingin melihat dalam modus "Tile"! Jika Anda melihat gambar di awal, maka ini adalah kolom 1 dan 2 (zero-based Indexzählweise), di

Page 121: delphi

mana jenis file dari kolom terakhir untuk muncul sebelum ukuran file. Array kita karena itu sebagai berikut menyatakan: var colArray: array [0 .1] integer = (2,1); dan diteruskan ke variabel anggota: lvi.puColumns: = @ colArray [0]; Itu tentang seluruh rahasia. Jika kita memiliki lebih banyak kolom, array akan meningkat sesuai. Sejak itu item seperti biasa dengan pesan "LVM_INSERTITEM" atau "ListView_InsertItem" Tampilan daftar diambil, kita harus terus melakukan apa-apa. Kami sekarang beralih ke modus tampilan baru, maka kita lihat hasilnya seperti yang ditunjukkan pada gambar di awal. Kebetulan, array itu sendiri menawarkan kemungkinan untuk campur tangan dalam representasi kedua. Jika Anda bermain dengan nilai indeks aneh mengingat bahwa hal serupa bisa dilakukan di sini juga, sehingga semua file dengan

Indeks aneh keluar ukuran, dan kemudian melihat jenis file, dll dll Percobaan sedikit! Varian kedua Hanya menunjukkan jalan memiliki satu kelemahan: Anda memerlukan kode sumber dari Unit "CommCtrl.pas" untuk memperpanjang TLVItem catatan. Tentu saja, jenis baru ini juga bisa ditemukan di file eksternal menyatakan (sebagai TLVItem60 Ini di jalan "CommCtrl_Fragment.pas"), maka Anda mungkin tidak, bagaimanapun, pada makro- Fungsi seperti dll akses "ListView_InsertItem", karena ini masih merupakan struktur asli dari TLVItem gunakan. Itulah sebabnya aku di contoh program mengambil jalan lain: Setelah item telah ditambahkan, kita menggunakan rekor baru (tipe: TLVTileInfo). Catatan ini juga diinisialisasi: tile.cbSize: = sizeof (TLVTileInfo); Kemudian kita tentukan indeks dari item yang baru dimasukkan. Indeks ini sesuai dengan variabel dalam program sampel "Loop" dari "GetFiles" Prosedur: tile.iItem: = loop; 123 Kontrol tampilan daftar Dua berikutnya parameter dan maknanya sudah diketahui dari catatan TLVItem diperpanjang. Jadi kita menjawab juga berapa banyak baris tambahan kita ingin melihat dalam modus "Tile" tile.cColumns: = 2; dan kami menggunakan referensi untuk array kita dengan nilai-nilai indeks kolom yang akan ditampilkan: tile.puColumns: = @ colArray [0]; Sekarang kita harus lulus pengaturan ini bahkan pada tampilan daftar, sehingga mereka juga dapat mengamati: ListView_SetTileInfo (HLV, genteng);

Page 122: delphi

Dan itu saja. 4.7.11. Pengelompokan item di Windows XP Windows XP juga khusus disediakan untuk grup baru melihat tampilan daftar. Ini berarti Anda dapat Disarikan catatan ke dalam kelompok logis, yang juga terpisah satu sama lain secara spasial. Dibandingkan dengan urutan normal, saya pikir itu adalah tambahan yang cukup berguna: (Kiri: Whistler Beta 1 dengan jumlah kemudian ada entri) Tampilan grup dapat digunakan dalam mode Ikon, Ikon Kecil, Rincian dan "Tiles". Hanya dalam posisi normal Tampilan daftar (LVS_LIST) itu dibatalkan oleh sistem. File manifest juga diperlukan! Bahwa Anda harus khawatir tentang kelompok sendiri mungkin, di awal tampak seperti suatu kerugian. Di sisi lain Page, Anda sehingga memiliki keuntungan bahwa Anda dapat memotong nama-nama kelompok untuk aplikasi Anda. Contoh program meniru tentang Explorer Windows XP: Biasanya, Anda pertama akan melihat pemilahan abjad dari nama file. Screenshot pada acara yang benar tetapi juga cara lain: Jika Anda mengurutkan item sesuai dengan jenis mereka, maka kelompok menggunakan nama tipe terbentuk, dan file akan kembali ditugaskan. Akan berada di urutan alfabetischen Oleh karena itu, sebagian akan menemukan "make.bat" di bawah M dan "resbuild.bat" di bawah R. Dalam Urutkan Type memasukkan baik dalam kelompok yang sama. Dan akhirnya, ada juga masih menyortir berdasarkan ukuran file, yang juga mempengaruhi Nama kelompok memiliki. 4.7.11.1. Sebelum kami mendirikan kelompok ... ... kita harus memastikan bahwa kelompok-kelompok yang sudah ada akan dihapus. Hal ini berkaitan dengan fakta bahwa setiap kelompok memiliki ID unik dan disimpan oleh tampilan daftar. Agar tidak perlu membuang-buang sumber daya, kita hapus Oleh karena itu, semua kelompok setiap kali pemilihan perubahan menyortir! Pembentukan kelompok tidak diperlukan, jika Anda mengurutkan kolom yang sama lagi. Hanya ketika Anda misalnya Mengubah nama file dari jenis file Anda harus membuat kelompok. Untuk menghapus kelompok kita menggunakan pesan "LVM_REMOVEALLGROUPS" atau makro "ListView_RemoveAllGroups": ListView_RemoveAllGroups (HIV);

Kontrol tampilan daftar 4.7.11.2. Kami pertama kelompok Sebagai contoh kelompok pertama kami saya ingin menggambarkan mengurutkan abjad. Di sini, hanya Gunakan huruf pertama dari tampilan daftar item. Jadi pertama kita perlu untuk loop, yang kita dapat mengontrol item individu. Dan karena prosedur yang sesuai, "RebuildGroups", indeks kolom

Page 123: delphi

ditransmisikan ke pembacaan nama menjadi cukup sederhana: ListView_GetItemText (HLV, i iSubItem, @ buf [1], MAX_PATH); Sekarang kita memotong string untuk karakter dan mengubahnya menjadi huruf kapital yang sesuai: SetLength (buf, 1); buf [1]: = upcase (buf [1]); Tanpa mengantisipasi terlalu banyak ingin: Kami bekerja saat ini dengan karakter Unicode, yang berarti bahwa semua referensi string yang harus dikonversi ke string lebar atau jenis PWideChar. Saya miliki untuk tujuan buffer teks yang sesuai menyatakan var WBUF: array [0.MAX_PATH.] Dari WideChar; yang sekarang ingin mengajar nama grup yang direncanakan. Berikut pertanyaannya: Apakah karakter sisa makanan dari kami String mulai dari A sampai Z? Jika demikian, kita menggunakannya sebagai nama grup. Jika tidak, maka kita mendefinisikan kelompok "Lain": if (buf [1] di ['A' .. 'Z']) maka lstrcpyW (WBUF, PWideChar (string lebar (buf))) lain lstrcpyW (WBUF, 'Lainnya'); Sekarang pertanyaannya adalah: Apakah ada kelompok ini mungkin? Jika demikian, maka kita tidak perlu membuat lagi tetapi penting bahwa kita mengetahui ID mereka, sehingga kami dapat menetapkan item sesuai. Dan dengan demikian kita berkenalan dengan rekor baru TLVGroup, yang kita nama grup hanya sekali untuk membaca ingin menggunakan. Karena kita dapat menentukan kelompok jelas hanya dengan ID mereka, kita juga perlu indeks Variabel, "gi". Variabel ini ditetapkan sebelum pembacaan kelompok ke nol, dan, bersama-sama dengan minimum Group ID (MIN_GROUP_ID = 2000), ID masing-masing. Catatan kami diinisialisasi: Nol Memory (@ group, sizeof (TLVGroup)); group.cbSize: = sizeof (TLVGroup); Karena kita tertarik pada nama, kita menggunakan topeng sebagai berikut: group.mask = LVGF_HEADER; Menggunakan pesan "LVM_GETGROUPINFO" atau "ListView_GetGroupInfo" kita kemudian dapat mengambil informasi yang diinginkan. Berikut adalah hasil fungsi adalah kepentingan. Karena kita berada dalam Loop kontinyu (sedangkan tipe, lihat contoh program) yang tersedia, kita harus bisa membatalkan ini! Kondisi terminasi dalam hal ini akan memiliki nilai -1, yang dikembalikan oleh pesan, dan fungsi, jika diinginkan dalam Group tidak dapat diakses: if (ListView_GetGroupInfo (HLV, MIN_GROUP_ID + gi, group) = -1) kemudian istirahat; Angka itu berhasil, pszHeader variabel anggota sekarang berisi nama kelompok, yang kita dengan kami dapat membandingkan nama yang direncanakan. Jika mereka cocok, maka kita keluar dari loop, karena kita ID ya sekarang

Page 124: delphi

miliki. 125 Kontrol tampilan daftar if (lstrcmpiW (WBUF, group.pszHeader) = 0) kemudian mulai fFound: = true; break; end; Mari kita sekarang menganggap bahwa kelompok itu belum ada. Dalam hal ini kita diajukan kepada mereka apa yang kita katakan kembali Rekor TLVGroup gunakan: Nol Memory (@ group, sizeof (TLVGroup)); group.cbSize: = sizeof (TLVGroup); group.mask: = LVGF_HEADER atau LVGF_GROUPID; Anda bisa lihat di sini sebagai LVGF_GROUPID bendera tambahan. Dengan demikian, variabel anggota iGroupId Records dan penting harus diisi oleh kami dengan ID. ID tersebut diperoleh, sebagaimana telah disebutkan, dari nilai minimum dan ditentukan, atau (jika grup tersebut bukan) nilai asli dari variabel "gi" group.iGroupId: = MIN_GROUP_ID + gi; Kemudian kita memiliki nama kelompok kami dan panjangnya group.pszHeader: = WBUF; group.cchHeader: = lstrlenW (WBUF); dan menambahkan kelompok menggunakan pesan "LVM_INSERTGROUP" atau makro "ListView_InsertGroup" a: ListView_InsertGroup (HLV, -1, kelompok); Sebuah nilai -1 berarti di sini bahwa kelompok tersebut harus ditempatkan pada akhir daftar internal. Dengan cara ini, maka semua kelompok yang dibutuhkan diciptakan. Saat Anda melanjutkan program Anda, yang tergantung sepenuhnya pada sifat dari aplikasi Anda dari. Contoh program menggunakan (seperti yang saya katakan) nama tipe Pengelompokan. Mari kita mengurutkan file berdasarkan ukuran, menggunakan enam ambang yang berbeda untuk kelompok "Apakah Null" untuk "Sangat besar" bisa terwujud. Karya ini mengambil Anda dari sistem, sayangnya, tidak Pastikan Anda dapat mengatur fleksibilitas pengelompokan untuk program anda. Group Title menyelaraskan Anda dapat pusat judul kelompok, atau bahkan menghabiskan kanan. Untuk melakukan hal ini, tambahkan variabel mask bendera LVFG_ALIGN group.mask: = {... Atau LVGF_ALIGN}; dan kemudian Anda dapat menggunakan konstanta dan LVGA_HEADER_RIGHT LVGA_HEADER_CENTER menunjukkan uAlign- Anggota variabel. (LVGA_HEADER_LEFT tentu saja, tapi pilihan yang tersisa dibenarkan dalam hal apapun Preset.)

Page 125: delphi

group.uAlign = LVGA_HEADER_CENTER; 4.7.11.3. Item menetapkan Sekarang satu-satunya yang tersisa untuk dilakukan: item masing-masing harus ditugaskan ke grup. Kita akan membutuhkan, bagaimanapun, Lanjutan catatan TLVItem, yang saya telah dibahas dalam "Tile>" melihat sudah. Mari saya jelaskan: Saya awalnya berpikir bahwa pesan "LVM_MOVEITEMTOGROUP" (masing-masing "ListView_MoveItemToGroup") digunakan untuk menetapkan item ke grup. Tapi ini adalah baik Pesan untuk tujuan lain, atau hanya tidak bekerja. (@ Microsoft ada :) usaha saya Dimahkotai dengan kesuksesan. Sekarang, bagaimanapun, catatan TLVItem diperluas kemungkinan pada iGroupId variabel anggota. 126 Kontrol tampilan daftar Jika versi Delphi, variabel ini tidak, silakan gunakan tipe unit TLVItem60 . "CommCtrl_Fragment.pas Kosongkan variabel Anda dan menetapkan bendera baru sebagai masker hanya LVIF_GROUPID: Nol Memory (@ lvi, sizeof (lvi)); lvi.mask = LVIF_GROUPID; Anda kemudian lulus indeks dari item dan ID dari kelompok yang item harus dimasukkan: lvi.iItem: = i; lvi.iGroupId: = MIN_GROUP_ID + gi; Dan dengan bantuan "LVM_SETITEM" atau "ListView_SetItem" (jika Anda versi Delphi cukup baru dan Catat penggunaan yang berkepanjangan), Anda menetapkan item ke ID group: SendMessage (HLV, LVM_SETITEM, 0, lParam (@ lvi)); 4.7.11.4. Kelompok ini melihat atau menonaktifkan API memberikan kita dengan pesan ini "LVM_ENABLEGROUPVIEW" tersedia. Anda dapat mengharapkan sebagai wParam yang diinginkan Status: true (lihat enable) atau salah (menonaktifkan tampilan) SendMessage (HLV, LVM_ENABLEGROUPVIEW, WPARAM (benar), 0); Atau, ada fungsi "ListView_EnableGroupView": ListView_EnableGroupView (HLV, true); 4.7.12. Arah semacam di Tampilkan header kolom Sebagai tambahan kecil untuk fungsi semacam kami ingin menunjukkan arah arus di header kolom dari tampilan daftar. Harus dikatakan bahwa kita memiliki pergi sedikit pada kontrol header, yang tidak ada tutorial. Kita membatasi diri sampai ke inti. Selain itu, untuk mengatakan bahwa kita dapat menggunakan versi 6.0 dari Bitmaps Kontrol umum dari sistem. Tapi karena program pada akhirnya akan berjalan pada versi Windows, jadi kita mengambil pilihan pertama kami

Program gambar (Paint hanya cukup!) Dan membuat bitmap dengan dua panah dari lebar dan tinggi yang sama untuk Uplink dan downlink arah. Untuk mengetahui apakah kita membutuhkan bitmap ini sama sekali, kita mendapatkan pegangan

Page 126: delphi

untuk header dari tampilan daftar dan mengirim pesan "CCM_GETVERSION": hHeader: = ListView_GetHeader (HIV); iHeaderVer: = SendMessage (hHeader, CCM_GETVERSION, 0.0); Nilai kembali lebih besar dari atau sama dengan 6, kita bisa menyerah diri ditarik karya seni kami. Tapi kami ingin mengasumsikan bahwa nilai kurang dari 6. Dalam hal ini, kami memuat video sebagai gambar dari daftar sumber daya Program: hSortImg: = ImageList_LoadBitmap (hInstance, MAKEINTRESOURCE (BMP_SORTBMP) 7.1, $ 00c0c0c0); dan menyebarkannya ke kontrol header: Header_SetImageList (hHeader, hSortImg); Kepentingan tertentu, dalam pandangan saya adalah nilai ditandai merah diatas $ 00c0c0c0. Nilai ini diberikan oleh warna latar belakang gambar sampel saya: abu-abu Cahaya. Menentukan nilai ini adalah latar belakang gambar transparan. Apakah Anda lebih suka menggunakan nilai yang berbeda, Anda bisa menggunakan latar belakang abu-abu terang 127 Kontrol tampilan daftar terlihat. Jika Anda menggunakan warna latar belakang yang berbeda dalam gambar Anda, maka Anda jelas membutuhkan nilai tentukan! ImageList_LoadBitmap-definition menunjukkan HIMAGELIST ImageList_LoadBitmap ( HINSTANCE hi, / pegangan / instance LPCTSTR lpbmp, / / bitmap ID int cx, / / lebar gambar int cGrow, COLORREF crMask ); 4.7.12.1. Hapus dari header bitmap Bahkan jika kedengarannya aneh, pertama kita ingin menghapus gambar dari header. Faktanya adalah dengan kami Untuk melakukan penyortiran. Jika kita klik pada header kolom, menentukan apakah kolom berbeda dari pilihan terakhir. Jika demikian, maka tentu saja, bitmap harus dihapus. Hal ini cukup mudah dengan makro "Header_GetItem", dengan kolom pertama, kami menyajikan semua data . Menentukan Bunga kami di sini, hampir semua parameter, karena meskipun kami menghapus informasi gambar, yang lain Pengaturan tetapi tidak ingin. Oleh karena itu melihat topeng catatan THDItem seperti ini: hi.Mask: = HDI_BITMAP atau HDI_FORMAT atau HDI_IMAGE atau HDI_ORDER atau HDI_TEXT atau HDI_WIDTH;

Page 127: delphi

Dengan demikian, teks kolom dapat diselamatkan, kita masih akan menjadi buffer dan ukurannya hi.pszText: = buf; hi.cchTextMax: = sizeof (buf); dan kemudian memanggil "Header_GetItem" pada: Header_GetItem (hwndHeader, IIDX, hi); Karena kita tidak tertarik pada nilai-nilai tapi kami mendedikasikan diri hanya menghapus variabel anggota fmt dan apa yang harus dilakukan entah bagaimana dengan bitmap: hi.fmt: = hi.fmt dan tidak HDF_SORTUP / / panah-up (v6.0) dan tidak HDF_SORTDOWN / / Arrow Down (v6.0) dan posisi tidak HDF_BITMAP_ON_RIGHT / / bitmap dan tidak HDF_IMAGE; Dalam dua baris pertama Anda akan melihat rincian dan HDF_SORTDOWN HDF_SORTUP yang benar-benar baru hanya untuk Versi Windows yang menarik. Tapi mari kita menghemat cek versi. : O) Item dengan demikian dimodifikasi kita berikan sekarang dengan punggung "Header_SetItem" ke Control header Header_SetItem (hwndHeader, IIDX, hi); dan setiap grafis yang ada telah dihapus. 4.7.12.2. Bitmap dalam header Melihat grafik pada dasarnya adalah cara yang sama hanya disajikan. Pertama kita menghitung data aktual Header kolom "Header_GetItem". Jika kita memiliki informasi ini, kita tambahkan dalam variabel Format fmt pertama, bahwa kita ingin agar gambar kolom kanan menunjukkan teks: hi.fmt: = hi.fmt atau HDF_BITMAP_ON_RIGHT; Grafik itu sendiri ditampilkan tergantung pada versi. Jika, seperti yang disebutkan, kami versi Windows terbaru yang cukup dan Header versi 6.0 Control atau isi, maka kita dapat menggunakan bitmap yang sudah ada di sistem 128 Kontrol tampilan daftar adalah. Dalam hal ini, kita tidak perlu daftar citra kami, tapi kami menggunakan bendera atau HDF_SORTUP HDF_SORTDOWN - tergantung pada arah semacam: maka jika (iHeaderVer> = 6) hi.fmt: = hi.fmt atau fSortBmp [SortOrder = 0] "FSortBmp" adalah sebuah array boolean yang berisi dua bendera. Kondisi puas (SortOrder = 0), HDF_SORTUP kemudian digunakan, jika HDF_SORTDOWN. Dengan versi Windows, kita menggunakan Sebaliknya, citra daftar kami dan awalnya menetapkan HDF_IMAGE bendera. Ini berarti bahwa kontrol sundulan diinstruksikan untuk menggunakan gambar dari daftar gambar awalnya ditugaskan. lain mulai hi.fmt: = hi.fmt atau HDF_IMAGE; Dalam kasus contoh kita, kita mendapatkan manfaat dari kenyataan bahwa kita mengurutkan) hanya dalam dua arah (naik dan turun)

Page 128: delphi

dan b yang adalah daftar gambar header) hanya berisi dua bitmap. Dan karena variabel "SortOrder" hanya Nilai-nilai nol dan satu dapat berasumsi, kita hanya bisa menentukan indeks untuk gambar yang diinginkan: hi.iImage: = SortOrder; end; Dengan "Header_SetItem" Kami melewati kontrol header pengaturan berubah, dan voila, panah muncul di header kolom tampilan daftar: 129 Tampilan struktur pohon 4.8. Tampilan struktur pohon 4.8.1. Menghasilkan tampilan struktur pohon Pohon view're mungkin menyadari pemrograman VCL dan berbagai program. Khas Ia digunakan untuk memesan struktur pohon untuk berbagai macam informasi. Windows Explorer adalah salah satu contohnya. Generasi dari pandangan pohon, seperti diketahui, dengan "CreateWindowEx" vonstatten, di mana kita nama kelas WC_TREEVIEW penggunaan: hTreeview: = CreateWindowEx (WS_EX_CLIENTEDGE, WC_TREEVIEW, nihil, WS_VISIBLE atau WS_CHILD atau TVS_HASLINES atau TVS_LINESATROOT atau TVS_HASBUTTONS, 0,0,10,10, wnd, IDC_TREEVIEW, hInstance, nihil); Gaya atribut dari tampilan struktur pohon Keunikan dalam potongan kode di atas, atribut yang ditentukan dengan gaya jendela biasa bisa. Untuk contoh ini saya telah menggunakan bendera berikut dan sehingga tampilan struktur pohon khas yang dihasilkan: Nilai Arti TVS_HASLINES tampilan struktur pohon menunjukkan garis khas antara unsur-unsur TVS_LINESATROOT menunjukkan garis untuk node puncak hirarki, tetapi harus TVS_HASLINES ditetapkan, jika bendera diabaikan TVS_HASBUTTONS tampilan struktur pohon telah dikenal tombol plus / minus untuk menampilkan dan menyembunyikan node Selanjutnya, sebagian diketahui, gaya yang Nilai Arti TVS_CHECKBOXES setiap item memiliki kotak centang TVS_EDITLABELS yang "di tempat" editor dapat digunakan untuk mengubah Itembezeichnungen TVS_SINGLEEXPAND klik untuk membuka node, node adalah setiap terbuka lainnya ditutup (kecuali pengguna memegang tombol CTRL) TVS_TRACKSELECT mengaktifkan "pelacakan panas", item sudah di "kontak" dengan pointer mouse jelas Mari kita tinggal di sini untuk saat ini dan melihat fungsi tambahan kecil dari contoh program: itu adalah mungkin untuk mengubah beberapa gaya saat runtime. Hal ini memungkinkan garis dan tombol serta "pelacakan hot"-dan dari

Page 129: delphi

nyalakan. Program ini menggunakan fungsi kecil yang mengubah gaya tampilan struktur pohon dan hasilnya (dalam rangka Pelabelan dalam menu utama) kembali: Fungsi setStyle (HTV: HWND; dwNewStyle: dword): dword; var dwStyle: dword; mulai dwStyle: = GetWindowLong (HTV, GWL_STYLE); if (dwStyle dan dwNewStyle = 0) maka SetWindowLong (HTV, GWL_STYLE, dwStyle atau dwNewStyle) lain SetWindowLong (HTV, GWL_STYLE, dwStyle dwNewStyle dan tidak); Hasil: = GetWindowLong (HTV, GWL_STYLE); end; Sebuah fungsi yang sama, kita tahu dari tampilan daftar dan melihat saklar. Dalam kasus tampilan struktur pohon-, kami melewati fungsi yang sama dan menangani bendera diinginkan bahwa kita ingin mengaktifkan atau menonaktifkan. Ambil contoh "pelacakan panas", yang terdiri dalam program sampel yang sama terdiri dari dua bendera: 130 Tampilan struktur pohon SetStyle (hTreeview, TVS_TRACKSELECT atau TVS_SINGLEEXPAND); Apakah Anda memanggil fungsi lagi, bendera akan dihapus, dan "pelacakan panas" berangkat. 4.8.2. Tampilan struktur pohon lengkap Setelah membuat tampilan struktur pohon, kami ingin konten ini sekarang pengaya. Contoh program untuk tujuan mengundang Pertama semua hard disk atau partisi yang tersedia, dimulai dengan C, dan menampilkannya dalam menu utama, yang pertama Partisi ini kemudian dicari dan sama untuk folder dan folder tersebut akan ditampilkan dalam tampilan struktur pohon - jenis Mini Explorer jadi ... Pemindaian partisi yang akan dibahas hanya secara sepintas. Satu-satunya yang layak disebut, tetapi itu adalah sifat Yang pertama dapat memindai hard drive atau partisi mungkin: mungkin sudah tahu untuk waktu yang cukup untuk . Menerima Tapi sudah peluncuran kedua berlangsung lebih cepat. Ini bukan subjektif Sensation, dengan bantuan "GetTickCount", perbedaan waktu dapat dibuat terlihat. Kembali ke topik: Untuk membuat entri, kita perlu pesan "TVM_INSERTITEM" yang merupakan Pointer ke record TVInsertStruct diharapkan. Kami tertarik dengan catatan ini untuk waktu orangtua, semakin harus menunjuk ke entry level ditetapkan sebelumnya. Pertama kali prosedur ini disebut "Scan", yang untuk pemindaian

Page 130: delphi

Partisi bertanggung jawab, di sini nilai dilewatkan sebagai nil "hRoot": tvi.hParent = hRoot; Untuk mendapatkan pemilahan Explorer seperti, kita menggunakan TVI_SORT sebagai nilai untuk menyisipkan: tvi.hInsertAfter: = TVI_SORT; Karena saat ini kami hanya membuat pesan teks telanjang, mulai bendera berikut: tvi.item.mask: = TVIF_TEXT; Dan tentu saja kita harus menentukan nama folder saat ini, fungsi "FindFirstFile" dan "FindNextFile" diberikan: tvi.item.pszText = ds.cFileName; Itu saja. Masuknya jadi dibuat, kita akan menambah pohon-pandangan kita dengan memanggil "Kirim Pesan" dan lulus rekor sebagai lParam. Hasil dari panggilan ini maka pegangan entry: hr = HTREEITEM (SendMessage (HTV, TVM_INSERTITEM, 0, lParam (@ TVI))); Dan karena prosedur "scan" dalam program sampel pada setiap folder yang ditemukan berulang kali menyebut dirinya, Kita harus melewati pegangan ini sebagai akar baru. Jika tidak, pohon kita tidak terlihat seperti kita dari Explorer digunakan untuk. Petunjuk Selain pesan, ada juga makro, "TreeView_InsertItem" yang dapat kita gunakan sebagai gantinya. Ini merangkum p.g. Pesan saja, tetapi juga menyediakan HTREEITEM tipe yang sama kembali, sehingga di atas Typecasting dapat diabaikan: hr = TreeView_InsertItem (HTV, TVI); Saya akan lebih sering menanggapi fungsi tersebut, karena saya lakukan, dan dalam kebanyakan kasus untuk lebih elegan cara yang lebih mudah untuk berpikir. 131 Tampilan struktur pohon TVInsertStruct definisi typedef struct {tagTVINSERTSTRUCT HTREEITEM hParent / / Menangani dari item induk HTREEITEM hInsertAfter / / handle dari item setelah / / Saat ini adalah untuk dimasukkan; / / Atau salah satu dari empat standar / / Konstanta # Jika (_WIN32_IE> = 0x0400) serikat { TVITEMEX Itemex / / Itemex record untuk Item saat ini TVITEM item / / item record untuk item saat ini UNION DUMMY NAME}; # Lain TVITEM item / / item record untuk item saat ini

Page 131: delphi

# Endif } TVM_INSERT definisi TVM_INSERT wParam = 0; lParam = (lParam) (LPTVINSERTSTRUCT) LPIS; Predefined nilai untuk item menyisipkan Nilai Arti TVI_FIRST Item di bagian atas lapisan saat dimasukkan. TVI_LAST Item pada akhir lapisan saat ini ditambahkan. TVI_ROOT Item ini dimasukkan sebagai akar dari tingkat saat ini. TVI_SORT Item akan dimasukkan dalam urutan abjad pada tingkat saat ini. 4.8.3. Simbol untuk pohon Gambar melakukannya tanpa melihat pohon kita tidak. Atau? Jadi, di sini kita pergi ... Kami sekarang memiliki Kesempatan untuk mengulangi prinsip sederhana dari tampilan daftar, karena kita juga perlu sebuah Imagelist. The Basics (Baca: menghasilkan daftar, upload dan menetapkan ikon) sebenarnya identik. Tapi sekali lagi, kami ingin sistem untuk membantu dan memanfaatkan simbol-simbol yang digunakan untuk folder Windows. Dengan demikian sesuai dengan prinsip diperpanjang Daftar pandangan. Keuntungan: menggunakan program contoh, tergantung pada sistem operasi saat ini, dari simbol-simbol yang biasa Explorer. Mari kita mulai dengan Daftar Gambar. Sistem ini menimbulkan pegangan bahwa daftar yang tersedia jika kita berfungsi "SHGetFileInfo" panggilan dengan bendera SHGFI_SYSICONINDEX. Karena kita juga hanya ikon kecil tertarik, kami akan memberikan SHGFI_SMALLICON atribut sama dengan: hSmallImg: = HIMAGELIST (SHGetFileInfo ('', 0, fi, sizeof (fi), SHGFI_SYSICONINDEX atau SHGFI_SMALLICON)); Nilai kembali dari fungsi adalah pegangan daftar gambar, yang kita sampaikan kepada tampilan struktur pohon: if (hSmallImg <> 0) maka TreeView_SetImageList (hTreeview, hSmallImg, TVSIL_NORMAL); Sejauh ini, begitu baik. Ketika membaca setiap folder kita sekarang menggunakan fungsi lagi dan ambil indeks masing simbol. Hal ini berkaitan dengan fakta bahwa tidak semua folder menggunakan gambar yang sama. Berpikir pilih favorit Anda untuk kursus, My Documents, dll 132 Tampilan struktur pohon Oleh karena itu kita pertama menentukan icon folder normal. Panggilan ini mirip dengan di atas, kami tertarik hanya iIcon anggota variabel catatan TSHFileInfo. Ini variabel integer berisi indeks ikon: Nol Memory (@ fi, sizeof (TSHFileInfo));

Page 132: delphi

SHGetFileInfo (ds.cFileName, 0, f, sizeof (f), atau SHGFI_SMALLICON SHGFI_SYSICONINDEX); ICO1: = fi.iIcon; Untuk simbol dari folder terbuka (kita ingin melihat ketika kita berada dalam program contoh kita, entri pilih, kita menggunakan panggilan yang sama, tetapi juga untuk memberikan bendera masih SHGFI_OPENICON: Nol Memory (@ fi, sizeof (TSHFileInfo)); SHGetFileInfo (ds.cFileName, 0, f, sizeof (f), atau SHGFI_SMALLICON SHGFI_OPENICON SHGFI_SYSICONINDEX atau); ico2: = fi.iIcon; 4.8.3.1. Bendera baru membutuhkan tampilan struktur pohon ... Gambar kecil kami, tapi kami menyambut selama kita tidak kode untuk memindai partisi sesuai suplemen. Mari kita lihat masalah ini lagi. Jadi, terlihat sejauh ini: tvi.item.mask: = TVIF_TEXT; tvi.item.pszText = ds.cFileName; Pertama kita memperluas bendera, sehingga simbol diperhitungkan. Karena kita, biasa dan terbuka Icon folder, kita perlu bendera untuk gambar normal dan terpilih: tvi.item.mask: = TVIF_TEXT atau TVIF_IMAGE atau TVIF_SELECTEDIMAGE; Dan kemudian benar-benar hilang adalah mengacu pada dua simbol, atau indeks mereka, bendera TVIF_IMAGE untuk variabel anggota dan iImage TVIF_SELECTEDIMAGE iSelectedImage bertanggung jawab untuk: tvi.item.iImage = ICO1; tvi.item.iSelectedImage: = ico2; Voila, itu saja. Kami tree-view "bersinar" dengan ikon folder dalam sistem. SHGetFileInfo definisi DWORD_PTR SHGetFileInfo ( LPCTSTR pszPath, / / file atau nama folder, dll DwFileAttributes DWORD, / / Atribut SHFILEINFO PSFï *, / / variabel TSHFileInfo UINT cbFileInfo, / / ukuran variabel UINT uFlags / / Flags ); TVM_SETIMAGELIST-DefinitionTVM_SETIMAGELIST wParam = (int) iImage / / TVSIL_NORMAL Imagelist = normal / / Status = TVSIL_STATE Imagelist lParam = (HIMAGELIST) himl / / Imagelist 4.8.4. Item yang dipilihnya? Ada cara yang relatif sederhana untuk menemukan entri yang sedang disorot: Anda berada di Anda Program setidaknya pemberitahuan "TVN_SELCHANGED", yang dikirim sebagai bagian dari "WM_NOTIFY". 133 Tampilan struktur pohon "Setidaknya" berarti bahwa Anda alternatif dapat juga menanggapi "TVN_SELCHANGING". Pemberitahuan ini

Page 133: delphi

dipicu ketika perubahan pilihan saat ini. Sebaliknya, "TVN_SELCHANGED" dipicu hanya sekali telah mengubah pilihan. Seperti lulus dalam lParam dari pointer TNMTreeView untuk merekam, Anda akan memiliki akses ke yang lama (sebelumnya aktif) dan item (untuk dipilih) baru di pohon, sehingga Anda bisa meletakkan kedua relatif mudah dibandingkan. Pertama, memperluas variabel topeng anggota item lama ke TVIF_TEXT flag: itemOld.mask: = TVIF_TEXT; Selanjutnya, menetapkan penyangga teks dan ukurannya. Jika Anda tidak, maka Anda akan baik setiap masuk akal karakter, atau pada apa-apa yang terbaik: itemOld.pszText: = buf; itemOld.cchTextMax: = sizeof (buf); Apakah Anda menggunakan maka pszText anggota variabel atau buffer teks, yang terserah Anda. Hal ini hanya penting Anda pernah memasukkan Penyangga teks! Makro "TreeView_GetItem" Anda kemudian dapat membaca teks dan variabel string : Lulus if (TreeView_GetItem (hdr.hwndFrom, itemOld)) kemudian s: = String (itemOld.pszText); Makro ini digunakan terutama untuk tujuan tersebut, tentu saja, cari tahu segala macam informasi tentang item. Itu Teks ada hanya satu hal. Pada akhirnya, bendera Anda harus memutuskan dalam variabel anggota topeng, yang Informasi yang Anda pedulikan. Pokoknya, instruksi yang sama juga membantu kita mengetahui teks item baru (itemNew). Jika kita memperluas variabel string sesuai, kita dapat melihatnya di status bar dan melihat begitu dari mana kita berasal dan di mana kami akan: if (TreeView_GetItem (hdr.hwndFrom, itemNew)) kemudian s: = s + '->' + string (itemNew.pszText); SendMessage (hStatusBar, SB_SETTEXT, SB_SIMPLEID, lParam (pchar (s))); Mari kita melangkah lebih jauh: Kami ingin menunjukkan pada status bar tidak hanya nama dari item saat ini, tapi kami ingin melihat path lengkap ke atas dari item akar. Oleh karena itu kami melewati pegangan baru Produk awalnya untuk sebuah variabel HTREEVIEW jenis. Hal ini diperlukan karena kita gunakan kemudian di loop sementara jadi, yang dijalankan melalui sampai kita telah mencapai item atas. Sebagai programmer bertanggung jawab dan sumber daya hemat kami menggunakan variabel yang kita Drag dan drop akan bertemu lagi: HitHandle = itemNew.hItem; Jadi kita masukkan loop sementara dan mengisi variabel TTVItem, seperti yang kita katakan di awal sudah dilakukan memiliki: sementara (HitHandle <> nil) lakukan mulai

Page 134: delphi

tv.mask: = TVIF_TEXT; tv.hItem = HitHandle; tv.pszText: = buf; tv.cchTextMax: = sizeof (buf); Jika kita telah membaca teks dari item saat ini dan menyebarkannya ke variabel string 134 Tampilan struktur pohon if (TreeView_GetItem (hdr.hwndFrom, tv)) kemudian s: = String (buf) + '\' + s lain break; maka kita dapatkan dengan bantuan pegangan "TreeView_GetParent" ke orangtua setiap entri: HitHandle = TreeView_GetParent (hdr.hwndFrom, HitHandle); end; Selama ada seperti barang tua, selama kita tetap dalam lingkaran. Jika mereka pergi karena tidak ada

adalah barang tua lebih, atau karena kesalahan, program akan menampilkan path lengkap dalam Baris status. Dalam contoh program, Anda dapat menggunakan compiler direktif (ShowPath) antara pandangan dan Penjajaran perubahan item lama dan baru. 4.8.5. Drag dan Drop Dalam bab berikutnya kita akan berurusan dengan drag dan drop dalam tampilan pohon. Pindahkan dan Copy Entri, tentu saja, tidak berpengaruh pada struktur folder dari hard drive Anda. Anda tahu sekarang bahwa contoh program menunjukkan direktori dari hard drive Anda (s). Tapi, seperti yang saya katakan, Anda tidak perlu takut bahwa folder ini akan disalin atau dipindahkan. Jika Anda ingin mencegah drag dan cara drop, maka Anda perlu melihat pohon dengan atribut style ditambahkan TVS_DISABLEDRAGDROP buat. 4.8.5.1. Memulai operasi drag Kontrol mengirimkan "TVN_BEGINDRAG" pemberitahuan (dalam bentuk "WM_NOTIFY") ke induknya Jendela ketika pengguna memilih item dan mulai menarik dan tahan tombol kiri mouse. Karena Drag dan drop juga dimungkinkan dengan tombol mouse sebelah kanan, pemberitahuan itu mungkin "TVN_BEGINRDRAG". Dalam kedua kasus, parameter lParam ke alamat pada catatan TNMTreeView, semua informasi yang item yang dipilih mengandung. WM_NOTIFY: dengan PNMTreeView (lp) ^ Kam hdr.code kasus TVN_BEGINDRAG, TVN_BEGINRDRAG:

Page 135: delphi

mulai {... } end; end; Tugas pertama kami adalah untuk menambahkan kita untuk item saat ini. Kami mungkin menggunakan HTREEITEMVariable global: hOldItem = itemNew.hItem; Selanjutnya, kita perlu gambar yang akan ditampilkan sambil menyeret. Anda pasti tahu efek ini dari Windows Explorer: Bila Anda memindahkan folder di sana, maka Anda dapat melihat ikon transparan dan nama Folder, sementara di latar belakang adalah selalu folder yang disorot, di mana Anda berada saat ini. Akankah kita kita tidak melihat Anda tarik tidak baik, atau paling item, kita berada di sebelah kanan (Jika fungsi ini karena kita install). 135 Tampilan struktur pohon Kita sekarang bisa menggunakan grafis khusus, kita juga dapat Pohon-View-Control "mengatakan" gambar yang akan menghasilkan. Ini membantu kita memahami pesan "TVM_CREATEDRAGIMAGE" hDragImgList: = SendMessage (hTreeview, TVM_CREATEDRAGIMAGE, 0, lParam (ItemNew.hItem)); dan makro berikut: hDragImgList = TreeView_CreateDragImage (hTreeview, itemNew.hItem); Gagang item yang akan digunakan sebagai semacam gambar, kita mengambil dari catatan yang TNMTreeView Pesan dikirim dari "WM_NOTIFY". (Jangan bingung TNMTreeView adalah catatan,! Bahwa di balik semuanya - tetapi karena kita hanya memiliki alamat, PNMTreeView kita perlu tahu tentang pointer ke aktual Rekam akses ke.) Langkah berikutnya dalam dua pernyataan "ImageList_BeginDrag" dan "ImageList_DragEnter" adalah. Itu Fungsi "ImageList_BeginDrag" terletak di sebelah indeks dari gambar dan hotspot. Hal ini di sudut kiri atas foto. Di sini kita gunakan dalam kedua kasus nol. ImageList_BeginDrag (hDragImgList, 0,0,0); Apakah Anda, misalnya, ImageList_BeginDrag (hDragImgList, 0,6,6); Gunakan befände tikus sesuai lebih lanjut dalam gambar. Untuk indeks adalah untuk mengatakan bahwa daftar kami hanya mencakup satu gambar. Untuk alasan ini, tentu saja, harus dalam hal apapun, nilai Nol digunakan untuk indeks. Anda tidak mungkin "bingkai" tidak hanya mengacu pada icon folder. Sebenarnya dihasilkan kontrol TreeView gambar dari kedua simbol dan digunakan dalam teks Produk ada. Sebagai ujian, akan menentukan indeks yang berbeda, Anda akan melihat segala sesuatu yang mungkin - tapi tidak Gambar yang sangat penting bagi kami: ImageList_BeginDrag (hDragImgList, 1,0,0);

Page 136: delphi

Fungsi "ImageList_DragEnter" kedua mencegah jendela yang berubah selama gambar dan menampilkan gambar pada posisi yang ditentukan. Ini tentang tampilan struktur pohon, kami melewati menangani jendela. Dan posisi datang lagi dari catatan TNMTreeView, yang "WM_NOTFIY" dikirim dalam lParam ini: ImageList_DragEnter (hTreeview, ptDrag.x, ptDrag.y); Selanjutnya kita memakai "SetCapture" bahwa semua pesan mouse dikirim langsung ke jendela utama kami menjadi. Ini masuk akal, karena mouse sulit selama aksi drag dan drop sebaliknya dapat digunakan. Selain itu, kita masih menggunakan variabel bool untuk mengontrol apakah kita berada dalam "modus tarik": SetCapture (wnd); DragMode: = true; 4.8.5.2. Di sinilah mouse ... Saya telah menyebutkan: di Windows Explorer sementara menyeret folder selalu otomatis ditandai, di mana mouse berada. Dan tentu saja juga citra transparan ditarik Folder pindah sesuai. Untuk mencapai efek ini, kita dapat menemukan pesan "WM_MOUSEMOVE, dengan bool telah disebutkan Variabel digunakan. Hal ini terutama diperlukan jika Anda berada di program anda pula untuk gerakan mouse merespon, sehingga mereka tidak disalahartikan sebagai operasi tarik: 136 Tampilan struktur pohon WM_MOUSEMOVE: if (modus drag) kemudian mulai {... } end; Pertama kita memindahkan gambar tarik transparan menggunakan "ImageList_DragMove" pada posisi saat ini Pointer mouse. Karena "WM_MOUSEMOVE" membawa posisi ini di lParam, kita menggunakannya: ImageList_DragMove (LOWORD (lp), HIWORD (lp)); Efek # 2: Kami akan menandai item dalam tampilan struktur pohon, keputusan di mana kita menemukan diri kita. Oleh karena itu kita perlu pertama Variabel TTVHitTestInfo jenis yang kami melewati posisi mouse: tvhit.pt.x: = LOWORD (lp); tvhit.pt.y: = HIWORD (lp); Menggunakan apa yang disebut "tes hit" (dengan "tabrakan" cukup tepat diterjemahkan) maka kita dapat memeriksa, apakah item pada posisi yang ditentukan adalah. Penawaran ini baik pesan "TVM_HITTEST" atau lagi makro "TreeView_HitTest" on. Jika Anda ingin menggunakan pesan, Anda memiliki TTVHitTestInfo lulus sebagai lParam. Dengan makro ini, akan lebih mudah: HitHandle = TreeView_HitTest (hTreeview, tvhit); Apakah sekarang item "di bawah" posisi mouse saat ini, maka nilai kembali adalah pegangan item. Makro mengembalikan menangani kembali sebagaimana telah HTREEITEM, hasil pesan, Anda harus terlebih dahulu sesuai

Page 137: delphi

cor. Jadi jika kita memiliki item, kami menandainya dengan "TVM_SELECTDROPTARGET" pesan atau dengan Makro: if (HitHandle <> nil) kemudian TreeView_SelectDropTarget (hTreeview, HitHandle); Untuk keamanan, Anda harus menyembunyikan gambar tarik sebelum dan sesudah yang membuat mereka terlihat lagi. Dalam perjalanan Anda menghindari fragmen jahat dalam tampilan struktur pohon Untuk menyembunyikan dan menampilkan menggunakan "ImageList_DragShowNolock". Parameter bool menentukan proses apakah gambar tersembunyi (palsu) atau ditampilkan (benar). Pada contoh program, melihat aplikasi ini Fungsi. 4.8.5.3. Anda harus membiarkan pergi bisa ... Langkah terakhir dalam tarik, tentu saja! Melepaskan. Program kami karena itu memiliki pesan Edit "WM_LBUTTONUP" (tombol kiri mouse) dan / atau "WM_RBUTTONUP" (klik kanan). Jika dalam kedua kasus sama harus terjadi, Anda dapat menggabungkan kursus pengolahan sesuai. Kami pergi sekali kasus normal, yaitu: kami telah menggunakan tombol kiri mouse. Pertama kita berikan jendela Tree View bebas lagi sehingga dapat diperbarui. Porsi fungsi "ImageList_DragLeave" yang secara bersamaan dapat lenyap gambar drag. ImageList_DragLeave (hTreeview); Sebagai tanda bahwa operasi drag selesai, kami kemudian memanggil "ImageList_DragEnd" pada: 137 Tampilan struktur pohon ImageList_EndDrag; Dan karena kita tidak lagi membutuhkan daftar gambar, kita "menghancurkan" mereka ImageList_Destroy (hDragImgList); Kemudian kita pastikan bahwa pesan mouse dapat kembali diproses seperti biasa. Seperti yang kami katakan ya Barang telah dirilis, juga tidak lagi diperlukan untuk membatasi pesan mouse untuk jendela kita. Bool Variabel yang digunakan untuk mengendalikan kita, juga akan mengambil kesempatan kembali lagi: ReleaseCapture; DragMode: = false; Akhirnya, kami menyoroti item yang paling baru-baru ini dalam posisi pointer mouse. Kami menggunakan dua fungsi: "TreeView_SelectItem" dan "TreeView_GetDropHilite". Untuk yang terakhir adalah untuk mengatakan bahwa mereka dalam Microsoft PSDK sebenarnya nama "TreeView_GetDropHilight" beruang. Borland memiliki, tapi (setidaknya dalam Delphi 5), di mana nama yang sedikit berbeda. Apakah Delphi versi lainnya menggunakan nama yang benar, saya tidak bisa mengatakan. Jika ragu, biarkan keluar. Itu Compiler akan melaporkan sudah, baik cara ... Apa dua fungsi lakukan? - "TreeView_SelectItem" menandai entri dalam Kontrol dan diharapkan nya

Page 138: delphi

Menangani. Ini menangani antara lain kita mendapatkan dengan "TreeView_GetDropHilite" di mana kita merekam fungsi ini persediaan, yang paling baru di bawah mouse. Dan kami ingin juga: TreeView_SelectItem (hTreeview, TreeView_GetDropHilite (HTree View)); Jika Anda lebih suka bekerja dengan berita tentang kontrol, Anda juga bisa "TVM_SELECTITEM" dan "TVM_GETNEXTITEM" digunakan (dalam hubungannya dengan bendera TVGN_DROPHILITE): SendMessage (hTreeview, TVM_SELECTITEM, TVGN_CARET, SendMessage (hTreeview, TVM_GETNEXTITEM, TVGN_DROPHILITE, 0)); 4.8.6. Menyalin dan memindahkan pesan Untuk menyalin entri kita dapat mengandalkan terbukti. Kita telah membahas bagaimana teks item yang dipilih dapat menemukan. Gagang item menyeret kita sudah diselamatkan, jadi kita harus kembali dalam variabel TTVItem: tv.hItem = itemFrom; Kali ini kita tertarik lebih dari sekedar teks item, begitu pula kombinasi bendera kita sesuai: tv.mask: = TVIF_HANDLE atau TVIF_TEXT atau TVIF_CHILDREN atau TVIF_IMAGE atau TVIF_SELECTEDIMAGE atau TVIF_PARAM; Di sini kami tertarik bersama dengan teks, gambar, yang menggunakan entri, dan lParam (jika digunakan). Dan penting untuk menyalin item juga pertanyaan apakah ini memiliki entri anak atau tidak. Pembacaan item kemudian berfungsi seperti yang telah sudah dijelaskan. Untuk teks, kita perlu buffer dan ukurannya. Kemudian kita mendapatkan informasi dari item dengan menggunakan "TreeView_GetItem". Jika kita memiliki catatan, kita bisa menyalinnya ke lokasi baru. Posisi baru ini tentu saja Entry, yang terletak di ujung dari operasi tarik bawah mouse. Untuk menyalin (atau lebih baik tempel) kita perlu lagi catatan sudah dikenal dari TTVInsertStruct jenis, yang diisi sebagai berikut: 138 Tampilan struktur pohon tvi.hParent = itemTo; tvi.hInsertAfter: = TVI_SORT; tvi.item: = tv; Kemudian kita sebut "TreeView_InsertItem" untuk menyerahkan rekaman ini dan hasilnya adalah pegangan yang baru dimasukkan item: orangtua: = TreeView_InsertItem (HTV, TVI); Sekarang pertanyaannya adalah: ada beberapa item kecil lainnya? Jawabannya memberi kita variabel anggota cChildren TVITEM catatan. Sayangnya, variabel ini hanya memberikan nilai nol (tidak ada sub-entri), salah satu (Ada satu atau lebih entri bawahan) dan I_CHILDRENCALLBACK sebagai hasilnya. Konstanta dan nilai nol, kita dapat mengabaikan mereka dalam contoh kita. Kami tertarik pada nilai satu. Jadi kita mendapatkan entri anak pertama dengan bantuan "TreeView_GetChild": Anak: = TreeView_GetChild (HTV, itemFrom); Karena program contoh kami menggunakan prosedur terpisah untuk menyalin entri, kita perlu ini

Page 139: delphi

hanya sebut, di mana kita tentukan nilai-nilai baru ditentukan untuk sumber copy dan item yang akan diterima: Salin Produk (HTV, anak, orang tua); Namun, karena mungkin ada beberapa entri, kita sekarang menggunakan "TreeView_GetNextSibling". Fungsi ini mengembalikan item berikutnya, yang terletak pada bidang yang sama. Karena kita sekarang, tetapi pada tingkat anak pertama Item, kita akan mendapatkan di jalan semua entri anak: Anak: = TreeView_GetNextSibling (HTV, anak); Contoh program menggunakan di sini lagi while loop yang akan melewati sepanjang adalah nihil "anak". Dan karena "Produk Copy" prosedur dengan cara ini lagi dan lagi untuk menyebut dirinya, semua bawahan dan di bawah-bawah-bawah-...-tua disalin entri. Tugas akhir kami adalah, oleh karena itu, hanya untuk menghapus entri asli - jika kita ingin. Dalam Contoh program, hal ini terjadi ketika Anda memindahkan item dengan tombol kiri mouse, atau jika Anda adalah hak Gunakan mouse dan pilih "item Move" dari menu pop-up, maka tentu saja. Operasi ini benar-benar dasar: Anda sebut "TreeView_DeleteItem" dan lulus pegangan, sebelum operasi drag lindung nilai item: TreeView_DeleteItem (hTreeview, hOldItem); 4.8.7. The "di tempat" editor Bahkan tampilan struktur pohon memiliki editor built-in yang memungkinkan Anda untuk mengubah teks yang ditampilkan dari item. Untuk dasar-dasar Saya akan merujuk Anda ke pos yang sesuai sehingga tampilan daftar, karena prinsip yang sama adalah. Hanya pemberitahuan dikirim, tentu saja, seperti dalam tampilan struktur pohon!. Membedakan ketat Mereka juga hanya pada awal T - "TVN_BEGINLABELEDIT" bukannya "LVN_BEGINLABELEDIT" misalnya Oleh karena itu saya akan puas dengan Codeausriss singkat, menunjukkan bagaimana (setelah mengubah Itembeschriftung tersebut) teks lama dan baru akan dibandingkan. Prinsipnya adalah setara dengan demo tampilan daftar: 139 Tampilan struktur pohon TVN_ENDLABELEDIT: if (PTVDispInfo (lp) ^ item.pszText <.>'') kemudian mulai tv.hItem: PTVDispInfo = (lp) ^ item.hItem;. tv.mask: = TVIF_TEXT; tv.pszText: = buf; tv.cchTextMax: = sizeof (buf); if (TreeView_GetItem (hdr.hwndFrom, tv)) kemudian mulai MessageBox (wnd, pchar (Format ('"% s" vs "% S"',

Page 140: delphi

[Buf PTVDispInfo (lp) ^ item.pszText.])), NULL, 0); Hasil: = 1; end; end; Dan sebagai untuk tampilan daftar, Anda juga dapat menentukan cara pintas yang memicu mode edit. Shortcut ini mungkin bukan istilah yang tepat, karena Anda benar-benar tampilan struktur pohon dengan "TVN_KEYDOWN" pemberitahuan Interogasi kunci tertentu diperbolehkan. Aku lagi memilih F2 karena ini terkenal bahkan dari Windows Explorer: TVN_KEYDOWN: if (PTVKeyDown (lp) ^ wVKey =. VK_F2) kemudian mulai HitHandle = TreeView_GetSelection (hdr.hwndFrom); if (HitHandle <> nil) kemudian mulai SetFocus (hdr.hwndFrom); TreeView_EditLabel (hdr.hwndFrom, HitHandle); end; end; Saya juga harus menyebutkan bahwa dalam Delphi 5 hilang deklarasi PTVKeyDown. Unit "CommCtrl.pas" berisi Meskipun record (tagTVKEYDOWN) dan deklarasi Borland pencocokan khas (TTVKeyDown), tetapi Pointer Definisi hilang. Karena itu saya menyatakan jenis program sampel itu sendiri: kelas PTVKeyDown TTVKeyDown = ^; Mungkin hal ini tetapi dalam versi Delphi Anda tidak lagi diperlukan. 140 Rebar The 4.9. Rebar The 4.9.1. Control Rebar menghasilkan Control Rebar Anda mungkin dikenal sebagai bar keren (Delphi VCL). Apakah dengan demikian Control, yang pada gilirannya dapat merangkum kontrol lainnya. Anda dapat, misalnya, toolbar, tombol, kotak kombo, dll sebagai apa yang disebut "band" Sisipkan. Jadi, misalnya, Internet Explorer toolbar mewakili nya Untuk bab ini, kami ingin menarik pada contoh kotor Microsoft PSDK. Generasi kontrol rebar tidak berbeda lebih dari kontrol dijelaskan. Menggunakan Seperti biasa, perintah "CreateWindowEx" dengan nama kelas kontrol (di sini REBARCLASSNAME): hwndRebar: = CreateWindowEx (WS_EX_TOOLWINDOW, REBARCLASSNAME, nihil, WS_VISIBLE atau WS_CHILD atau WS_BORDER atau WS_CLIPCHILDREN atau WS_CLIPSIBLINGS atau RBS_VARHEIGHT atau RBS_BANDBORDERS, 0,0,0,0, hwndParent, IDC_REBAR, hInstance, nihil); InitCommonControlsEx Jika perintah "InitCommonControlsEx", Anda perlu dwICC variabel anggota kelas ICC_COOL_CLASSES gunakan. 4.9.2. Khusus window gaya Marilah kita melihat sebentar pada gaya atribut yang digunakan dan pilihan lainnya:

Page 141: delphi

Nilai Arti RBS_VARHEIGHT The masing "band" dapat memiliki ketinggian yang berbeda. Tanpa atribut ini untuk semua "band" digunakan ketinggian yang sama. RBS_BANDBORDERS The "band" individu optik terisolasi. RBS_VERTICALGRIPPER Jika kontrol Rebar dibuat dengan gaya CCS_VERT, gripper ini (elemen untuk memperbesar dan keluar dari band) diwakili vertikal. RBS_AUTOSIZE Control secara otomatis menyesuaikan tali jika yang ukuran atau posisi perubahan. (Atribut tambahan selalu dapat ditemukan di MSDN atau PSDK dari Microsoft.) 4.9.3. Band akan memberikan Sebagai contoh kita, ingin membuat sebagai anak-anak dari combo box dan sebuah tombol, yang kemudian kita Rebar Kontrol Insert. Untuk menciptakan elemen ini sebenarnya tidak lebih untuk mengatakan. Saya sarankan Keraguan melihat mereka posting. Sebagai contoh, di sini adalah semata-mata untuk menunjukkan combobox: hwndChild: = CreateWindowEx (0, 'combobox', nihil, WS_VISIBLE atau WS_CHILD atau WS_TABSTOP atau WS_VSCROLL atau WS_CLIPCHILDREN atau WS_CLIPSIBLINGS atau CBS_AUTOHSCROLL atau CBS_DROPDOWN, 0,0,100,200, hwndRebar, IDC_COMBOBOX, hInstance nil); Yang penting adalah, seperti yang Anda lihat dengan menyoroti merah bahwa elemen sebagai anak Controls Rebar . Produk 141 Rebar The 4.9.3.1. Apa yang sekarang band? Di bawah sebuah band mengacu ke daerah bahwa Pengendalian dalam Rebar menunjukkan tentang:

Yang disebut "gripper" (sorot di sisi kiri) dapat memperbesar atau memperkecil obligasi. Sebuah kontrol rebar dapat memiliki band-band seperti beberapa. Dengan cara ini, pengguna dapat preset Penampilan sesuai dengan kebutuhan sendiri, dll Untuk memasukkan combo box sebagai band di pasar ini, kita harus terlebih dahulu dimensi mereka, seperti yang kita ingin menggunakan atribut gaya yang tepat: GetWindowRect (hwndChild, rc); Selanjutnya, kita menggunakan variabel TRebarBandInfo bahwa kita perlu menginisialisasi dengan ukuran mereka: Nol Memory (@ rbbi, sizeof (TRebarBandInfo)); rbbi.cbSize: = sizeof (TRebarBandInfo); Dalam variabel anggota fmask kita tentukan bendera diinginkan yang menarik bagi kita: rbbi.fMask: = RBBIM_SIZE atau RBBIM_CHILD atau RBBIM_CHILDSIZE atau RBBIM_ID atau RBBIM_STYLE atau RBBIM_TEXT; Nilai Arti RBBIM_SIZE Variabel anggota cx berlaku.

Page 142: delphi

RBBIM_CHILD hwndChild Variabel anggota adalah gültig.Toolbar bitmap Konstanten1 CxMinChild RBBIM_CHILDSIZE, cyMinChild, cyChild, cyMaxChild dan cyIntegral berlaku. RBBIM_ID Wid berlaku. RBBIM_STYLE fStyle Variabel anggota berlaku. RBBIM_TEXT lpText Variabel anggota berlaku. (Bendera tambahan, lihat MSDN atau PSDK) Semua bendera memiliki pengaruh pada desain pita. Mari kita dimensi pertama, dengan RBBIM_SIZE dan RBBOM_CHILDSIZE didefinisikan. Dan bahkan tidak ditentukan bahwa minimal dimensi Band tidak kurang dari ketinggian dan lebar harus combo yang berlaku selama penciptaan: rbbi.cxMinChild: = rc.right - rc.left; rbbi.cyMinChild: = rc.bottom - rc.Top; Apakah Anda mengatur, misalnya nilai cxMinChild ke nol, rekaman itu bisa berbicara dengan berhenti dimensi, dan kontrol termasuk tidak lagi terlihat. - Kembali ke topik: lebar awal band, kita menetapkan 100 piksel: rbbi.cx: = 100; Perlu dicatat bahwa ukuran band ini juga tergantung pada lebar jendela tapi. Ini mungkin terjadi bahwa Band ini jauh lebih luas daripada yang ditunjukkan di sini. Hal ini juga tergantung pada apakah saluran strip berikut dalam baru akan dijalankan atau tidak. Selanjutnya, ada dua gaya atribut: 142 Rebar The rbbi.fStyle: = RBBS_CHILDEDGE atau RBBS_GRIPPERALWAYS; Nilai Arti RBBS_CHILDEDGE band. Pada tepi di bagian atas dan bawah RBBS_GRIPPERALWAYS gripper akan ditampilkan, bahkan jika hanya satu band dalam kontrol rebar hadir. RBBS_BREAK Band ini akan dimulai pada baris baru. (Lihat MSDN atau PSDK untuk atribut gaya yang lebih) Sesuai dengan bendera kita, kita harus memilih band masih lulus ID unik dan pegangan dari kotak combo: rbbi.wID = IDC_COMBOBOX; rbbi.hwndChild: = hwndChild; Akhirnya, kami memberikan band nama yang muncul (terima kasih kepada bendera RBBIM_TEXT) juga: rbbi.lpText: = 'ComboBox'; Dengan "RB_INSERTBAND" pesan Kita sekarang menghasilkan volume pertama, lParam adalah pointer ke Variabel TRebarBandInfo ini. WParam berisi indeks, di mana rekaman itu adalah untuk dimasukkan. Jika nilai -1, Gunakan band baru ditambahkan di akhir (setelah band terbaru): SendMessage (hwndRebar, RB_INSERTBAND, WPARAM (-1), lParam (@ rbbi));

Page 143: delphi

4.9.4. Latar Belakang bitmap Sebagai tambahan kita akan melihat bahkan bagaimana menggunakan bitmap sebagai latar belakang untuk sebuah band. Hal ini diasumsikan bahwa BMP adalah sumber daya program. Jika hal ini terjadi, Pertama, bendera adalah bidang yang dibutuhkan akan diperpanjang: rbbi.fMask: = {... Atau RBBIM_BACKGROUND}; Sehingga kita dapat memuat bitmap dan diserahkan ke variabel anggota hbmBack: rbbi.hbmBack: = LoadBitmap (hInstance, MAKEINTRESOURCE (IDC_BACKBMP)); Murni pada prinsipnya itu sudah. Namun, jika Anda memiliki (set nilai pada efek "watermark" diucapkan Latar belakang tidak boleh diubah dengan cara apapun ketika band dikurangi atau ditambah), maka memberikan akses ke terbaik maupun RBBS_FIXEDBMP atribut gaya: rbbi.fStyle: = {.. Atau RBBS_FIXEDBMP}; Itu saja. 143 Rebar The TRebarBandInfo definisi typedef struct {tagREBARBANDINFO UINT cbSize, Size / / Rekam UINT fmask / / Flags UINT fStyle / / style atribut COLORREF clrFore warna / / foreground COLORREF clrBack / warna / background LPTSTR lpText / / strip teks UINT CCH; iImage int / / gambar untuk daftar Indeks Gambar HwndChild HWND, / / pegangan kontrol anak UINT cxMinChild / / min. Lebar Kontrol Anak UINT cyMinChild / / min. Ketinggian Kontrol Anak UINT cx / / panjang band, dalam piksel HbmBack HBITMAP / / background bitmap UINT Wid / / ID dari pita # Jika (_WIN32_IE> = 0x0400) UINT cyChild; UINT cyMaxChild; UINT cyIntegral; UINT cxIdeal; LParam; UINT cxHeader; # Endif REBARBANDINFO} 4.9.5. Sebuah Imagelist menetapkan ikon Control Rebar memungkinkan ikon yang ditampilkan pada masing-masing band. Untuk Imagelist suatu diperlukan bahwa Anda sudah tahu dari tampilan daftar. Adalah sesuatu yang benar-benar baru, karena itu tidak. Pertama,

Page 144: delphi

kita buat daftar untuk 32x32 Simbol: himlRebar: ImageList_Create = (32.32, atau ILC_COLORDDB ILC_MASK, 1.0); Harap dicatat bahwa contoh program hanya berisi satu simbol. Hal ini di sini (dalam kasus ini) dan tidak mungkin untuk menambahkan ikon ke dalam daftar! Lagi pula, kami dapatkan dari ikon itu sendiri seperti biasa Program sumber daya dan memperpanjang lebih jauh ke daftar gambar: Hico: = LoadIcon (hInstance, MAKEINTRESOURCE (IDC_MAINICON)); ImageList_AddIcon (himlRebar, Hico); Agar Control Rebar sekarang dapat menggunakan daftar ini, kita perlu catatan TRebarInfo, yang pertama-tama kita harus menginisialisasi: Nol Memory (@ RBI, sizeof (RBI)); rbi.cbSize: = sizeof (TRebarInfo); Karena catatan ini hanya mendukung transfer daftar gambar ke Control Rebar, pekerjaan sehingga tentu saja sangat mudah. Hanya ada satu bendera, dan tentu saja juga pegangan daftar gambar kami

Artinya: rbi.fMask = RBIM_IMAGELIST; rbi.himl = himlRebar; Dengan pesan "RB_SETBARINFO" adalah Daftar berlalu akhirnya kontrol dan dengan demikian kami maka ada tersedia SendMessage (hwndRebar, RB_SETBARINFO, 0, lParam (@ RBI)); 144 Rebar The 4.9.5.1. Gunakan ikon Yang terakhir tapi tidak cukup. Simbol belum ditugaskan untuk band sebelum kita dapat melihatnya. Kami memperpanjang bendera variabel anggota fmask dengan pernyataan berikut: rbbi.fMask: = {... Atau RBBIM_IMAGE}; Ia mengatakan bahwa variabel anggota iImage berlaku dan berisi indeks ikon dari daftar gambar harus. Karena kita hanya memiliki simbol yang indeks adalah nol, tentu saja, dengan ini kami menyatakan: rbbi.iImage: = 0; Voila, Anda akan membuat rekaman dengan pengungkapan tambahan, akan terlihat ikon teks band. Dalam Sebagai contoh, Anda dapat memprogram dengan menggunakan USEBMPICO beralih compiler mengerti, bukan default digunakan. TRebarInfo definisi typedef struct {tagREBARINFO UINT cbSize, Size / / Rekam UINT fmask; HIMAGELIST himl / / Menangani ke daftar gambar REBARINFO} 4.9.6. Pita dan resize

Page 145: delphi

Memperbesar dan keluar dari band tertentu, dua pesan dan RB_MAXIMIZEBAND Tersedia RB_MINIMIZEBAND. WParam adalah dalam kedua kasus indeks dari band yang diinginkan (zero-based). Nilai lParam mungkin nol dalam kedua kasus, tetapi hanya jika pesan juga RB_MAXIMIZEBAND nilai yang lebih besar dari nol mungkin. Sebuah nilai yang lebih besar dari nol akan menjadi nilai ideal rekaman itu, untuk memaksimalkan penggunaan adalah: SendMessage (HRB, RB_MAXIMIZEBAND, 0,300); Dalam hal ini band akan dimaksimalkan pada lebar tepatnya 300 piksel. Sebaliknya, jika nol, memaksimalkan pita sejauh mungkin.: SendMessage (HRB, RB_MAXIMIZEBAND, 0.0); Seperti yang saya katakan, ketika Anda meminimalkan lParam pita pada dasarnya hanya bisa nol: SendMessage (HRB, RB_MINIMIZEBAND, 1.0); Petunjuk Berdasarkan metode ini, band pertama selalu bahwa yang terletak di tempat pertama di Control Rebar. Bila Anda memindahkan kaset, perubahan sesuai indeksnya. Tetapi jika Anda ingin meminimalkan atau memaksimalkan pita pertama yang diproduksi, terlepas dari posisinya dalam pasar ini, maka Anda harus mengubah ID di indeks yang berlaku. Untuk melakukan hal ini gunakan "RB_IDTOINDEX" kata ID wParam yang sesuai. Dalam contoh kita, adalah Control diproduksi pertama

combo box, yang dalam band dengan ID dari kotak kombo (IDC_COMBOBOX). Indeks buku ini Oleh karena itu, kita mendapatkan ini: 145 Rebar The i: = SendMessage (HRB, RB_IDTOINDEX, IDC_COMBOBOX, 0); Jika nilai sama dengan -1, kita sekarang salah satu di atas Pesan untuk meminimalkan atau memaksimalkan pita , Yang kita gunakan untuk menentukan nilai indeks sebagai wParam ditentukan. Gunakan dua band memiliki ID yang sama, indeks dari band pertama ditemukan dikembalikan. 4.9.7. Chevrons Dalam bab ini kita akan melihat adalah apa yang disebut "chevrons". Ini adalah kecil Tombol dengan panah ganda di tepi kanan sebuah band, yang dapat dilihat hanya bila band termasuk dalam Control tidak dapat sepenuhnya ditampilkan. Hal ini diketahui bahwa perilaku toolbar, menu, dll Elemen. Namun, min. Versi 5.80 dari "comctl32.dll" ke depan. Jika ragu, di sini membantu untuk memperbarui Internet Explorer. Tentu saja, versi Delphi harus cukup saat ini dan konstanta baru, dan pesan Rekaman tahu. Untuk pemilik Delphi 5 adalah unit khusus ("CommCtrl_Fragment.pas"), ini Prompt informasi. Pemilik versi sebelumnya dapat menggunakan unit ini sebagai ujian, dan pemilik versi yang lebih baru mereka tidak perlu lagi mungkin. Saya berasumsi bahwa Anda sehingga (dalam satu atau lain cara) pada

Page 146: delphi

deklarasi yang tepat miliki. Untuk alasan kami melengkapi program contoh kita dengan toolbar tambahan. Ini menawarkan keuntungan: I dapat dan harus menarik perhatian Anda untuk fitur khusus. Ini fitur khusus adalah sedikit tersembunyi di PSDK: PSDK: Toolbar standar ukuran dan perilaku posisi dapat dimatikan dengan menetapkan CCS_NORESIZE dan CCS_NOPARENTALIGN gaya sepengendali. Toolbar kontrol yang disediakan oleh kontrol rebar harus mengatur gaya ini karena ukuran kontrol rebar dan posisi toolbar. Dalam Jerman yang baik: toolbar yang terletak di sebuah band pasar ini, atribut gaya dan CCS_NORESIZE CCS_NOPARENTALIGN digunakan karena Control Rebar mengontrol posisi dan ukuran dari toolbar. Ketika ini Lupa atau menghilangkan atribut, Anda mendapatkan semua jenis hasil - hanya toolbar tidak pernah Kontrol Rebar muncul. Atau kita katakan, tidak bebas dari kesalahan! Panggilan kita akan terlihat seperti ini: hwndChild: = CreateWindowEx (0, NAMA TOOLBAR KELAS, nihil, atau WS_CHILD WS_VISIBLE atau CCS_NODIVIDER atau CCS_NORESIZE atau CCS_NOPARENTALIGN atau TBSTYLE_FLAT, 0,0,0,0, hwndRebar, IDC_TOOLBAR, hInstance, nihil); Sebagai orang tua lagi, seperti biasa, kontrol Rebar ditentukan. Hal ini juga ada bedanya jika Anda langsung menentukan pegangan jendela utama ("hwndParent" dalam program sampel). Penciptaan tombol toolbar dan bitmap juga tidak masalah di sini. Tapi aku ingin kau titik Toolbar Tutorial. Kami lebih memilih untuk mencurahkan Chevrons - Untuk melihat tombol kecil, kita harus terlebih dahulu menetapkan ukuran ideal dari rekaman itu. Apakah ini Ukuran ideal di bawah ini muncul di sebelah kanan Chevron dan memberitahu pengguna untuk fakta bahwa beberapa elemen tersembunyi. Untuk ukuran yang ideal tapi bahkan menentukan saat membuat band mungkin, tambahan RBBIM_IDEALSIZE Bendera diperlukan: rbbi.fMask: = {... Atau RBBIM_IDEALSIZE}; Ini memberi kita cxIdeal anggota variabel untuk mengisi tersedia. Aku punya sebelumnya, ukuran ideal Toolbar menghitung dalam satu lingkaran dapat, sehingga lebar sebenarnya setiap tombol (termasuk pemisah ya alami sempit) diperhitungkan: iPerfect: = 0; untuk i: = 0 sampai SendMessage (hwndChild, TB_BUTTONCOUNT, 0.0) - 1 lakukan mulai SendMessage (hwndChild, TB_GETITEMRECT, WPARAM (i), lParam (@ rc)); inc (iPerfect (rc.right - rc.left)); end; Nilai ini, sekarang kita lolos ke variabel anggota dari catatan: 146 Rebar The

Page 147: delphi

rbbi.cxIdeal: = iPerfect; Akhirnya, kami memberikan atribut style tambahan untuk Chevron sebenarnya akan: rbbi.fStyle: = {... Atau RBBS_USECHEVRON}; Rekaman itu akan dimasukkan seperti telah dijelaskan sebelumnya. Jika kita menjalankan program setelah semua dan lebar Toolbar mengurangi mereka-voila-adalah sebagai berikut: Untuk pop-up menu, saya akan datang, tapi pertama, kata - lagi khusus untuk toolbar: Anda dapat Toolbar ya seperti yang Anda inginkan untuk memperbesar atau memperkecil. Dalam kasus ini, hal itu mungkin terjadi bahwa beberapa tombol untuk hanya sebagian terlihat ketika toolbar (sebenarnya lebih dekat dengan band Rebar) terlalu kecil. Karena yang terlihat aneh, kami menyediakan dengan TBSTYLE_EX_HIDECLIPPEDBUTTONS atribut gaya lama yang "dipotong" tombol-tombol benar-benar hilang: SendMessage (hwndChild, TB_SETEXTENDEDSTYLE, 0, TBSTYLE_EX_HIDECLIPPEDBUTTONS); 4.9.7.1. Praktis manfaat Bagaimana Anda bisa menggunakan Chevron sekarang? Aplikasi tersebut harus menentukan mana dari non-terlihat tombol toolbar dan menawarkan perintah mereka dalam menu pop-up. Microsoft menawarkan PSDK bawah entri indeks "Menciptakan Internet Explorer Toolbar-style "adalah panduan (" penanganan Chevron ") untuk itu. Namun perlu dicatat bahwa, ketika telah saya bekerja dengan baik. Saya adalah semacam terlalu kecil "caper" dipaksa sebelum saya pada target tiba. Tapi kita melihat diri kita sendiri - Pertama Microsoft menganjurkan bahwa Anda pertama menentukan sejauh mana band. Itu masuk akal, setelah semua, kita harus entah bagaimana belajar yang tombol ke toolbar yang terlihat dan yang tidak. Ada pesan toolbar disebut "TB_ISBUTTONHIDDEN" yang membantu kita di sini sayangnya. Tombol kami tidak terlihat, Namun, mereka tidak tersembunyi (seperti yang didefinisikan oleh pesan di atas). Oleh karena itu, kita perlu berbeda pendekatan masalah ini. Microsoft merekomendasikan Jadi menggunakan pesan "RB_GETRECT" menentukan dimensi strip, indikasi chevron. Kami melakukan ini: SendMessage (HRB, RB_GETRECT, WPARAM (PNMRebarChevron (lp) ^. UBand) LParam (@ RC1)); Kedua Maka Anda harus, sebagaimana ditentukan oleh PSDK, menentukan jumlah tombol toolbar. Untuk pesan "TB_BUTTONCOUNT" digunakan, yang dapat digunakan untuk kesederhanaan dalam untuk loop. Itu Jadi langkah selanjutnya bermain dari dalam baris-baris: untuk i: = 0 sampai SendMessage (HTB, TB_BUTTONCOUNT, 0.0) - 1 lakukan mulai {... } end; Ketiga Kemudian dimensi dari masing-masing tombol individu dapat ditentukan pada toolbar. SendMessage (HTB, TB_GETITEMRECT, WPARAM (i), lParam (@ rc2));

Page 148: delphi

4th Dua persegi panjang (dari Control Rebar dan toolbar) sekarang dengan "IntersectRect" membandingkan. Hasil Fungsi kepentingan kita di sini tidak, kita prihatin dengan yang pertama Fungsi parameter: ia mengembalikan persegi panjang (TRect), sehingga untuk berbicara, bagian dari yang bersama dua persegi panjang yang ditentukan mengandung 147 Rebar The IntersectRect (vis, RC1, rc2); Mari kita membuat contoh. Pada gambar berikut Anda dapat melihat yang bukan "Simpan" tombol benar-benar terlihat. Untuk kejelasan, saya telah menunjukkan di bawah tombol toolbar sepenuhnya, sehingga bahkan melihat area mana dari band ia biasanya melebihi: Penentuan persegi panjang tombol sekarang mengembalikan dimensi lengkap, termasuk bagian non-terlihat (Yaitu sebagai toolbar bawah). Dengan membandingkan ini persegi panjang dengan tombol persegi panjang yang Rebar Band dengan "IntersectRect" akan, tetapi hanya bagian yang terlihat (seperti dalam toolbar atas) dikembalikan. 5th Persegi panjang ini kembali ke ruang bersama sekarang tombol dengan aslinya Rectangular dibandingkan, yang fungsi "EqualRect" digunakan. Di sini kita tertarik pada nilai kembali Tetapi sekali lagi, karena jika dua persegi panjang yang berbeda (hasil palsu) adalah, itu berarti Tombol tidak atau tidak sepenuhnya terlihat dan harus dimasukkan sebagai salah satu item dalam menu popup. Adalah dua identik persegi panjang (hasil sesungguhnya), yaitu, tentu saja, tombol sepenuhnya terlihat: if (tidak EqualRect (vis, rc2)) dan (tb.fsStyle <> BTNS_SEP) maka AppendMenu (hm, MF_STRING, tb.idCommand, pchar (pText)); Anda juga dapat melihat pertanyaan yang sama atau kontrol, apakah itu tombol adalah pemisah. Itu Alasannya adalah jelas: Separator sekarang harus benar-benar masuk ke menu. Secara teoritis, hal ini juga akan tidak ada masalah, karena hal ini sebanding dengan menu ya. : O) Sejauh petunjuk di PSDK Microsoft. Jika Anda mengikuti mereka, Anda akan melihat (mungkin) yang tampilan item menu tidak benar-benar bekerja. Contoh program tidak ke switch compiler PSDK, yang tidak termasuk semua langkah ekstra saya sehingga Anda dapat mencobanya dengan senang hati. Setelah dapat dikatakan: koordinat tombol toolbar akan berubah dalam percobaan sebelumnya. Bohong hanya karena mereka dikembalikan relatif terhadap toolbar. Tidak peduli di mana Anda memindahkan aplikasi juga Tombol pertama akan selalu memiliki dimensi (0,0,54,36). (Nilai-nilai tergantung tentu digunakan pada Gaya atribut dari dan bisa berbeda untuk Anda.) Karena toolbar sekarang secara default kontrol ketiga dihasilkan dan karena itu juga dalam volume ketiga (dan dalam adalah baris kedua), dimensi tombol toolbar dalam banyak kasus akan keluar dari

Page 149: delphi

Band ini. The "IntersectRect" akan selalu dalam kasus-kasus seperti persegi panjang bersama (0,0,0,0) menyediakan. Untuk hasil yang cukup berguna, Anda harus memindahkan toolbar ke atas (ke puncak pasar ini) sehingga kontrol pertama. Maka mungkin terjadi (dan bagi saya itu telah terjadi!) Bahwa tombol tidak terlihat, namun tidak dalam menu popup muncul. Hal ini karena dalam penentuan pita Rectangle, ruang untuk teks dan lebar dari chevron dianggap. Jadi itu berarti: Pertama Begitu kita telah menentukan pada langkah pertama, dimensi rekaman itu, kita harus mencari tahu apa aktual digunakan daerah yang tersedia bagi kita. Ingatlah bahwa Rebar tersebut Contoh Program juga masih menampilkan teks tambahan di sisi kiri. Daerah ini adalah untuk Kontrol tidak dapat digunakan, tetapi dianggap demi langkah 1 dari prosedur di atas. Untuk menentukan aktual ruang yang dapat digunakan, kami menggunakan pesan "RB_GETBANDBORDERS" SendMessage (HRB, RB_GETBANDBORDERS, WPARAM (PNMRebarChevron (lp) ^. UBand) LParam (@ vis)); Sayangnya kita tidak bisa menggunakan pesan ini hanya karena itu benar-benar hanya menyediakan batas. Nilai-nilai Tetapi jika kita menggabungkan hasil dari langkah 1 persegi panjang band. Di sini, nilai-nilai kiri atas Sudut, dimana data dari kanan bawah tetapi dikurangi, jadi kita mengecilkan persegi panjang band: