Dalam Virtual Treeview Mike Lischke, ada kode solusi yang ditambahkan untuk memperbaiki bug saat menggunakan < kontrol kuat>TWebBrowser pada formulir yang sama.
Masalahnya adalah jika pengguna mencoba berinteraksi dengan TOleControl (yang menjadi asal TWebBrowser), klik mouse pertama akan dimakan. Mereka kemudian harus mengklik lagi untuk memberikan fokus kontrol. Kemudian mereka dapat berinteraksi dengan kontrol.
Dia memiliki komentar untuk dijelaskan:
Setiap kontrol yang diturunkan dari
TOleControl
berpotensi menimbulkan masalah fokus.Untuk menghindari penyertaan unit OleCtrls (yang antara lain akan menyertakan Varian), yang memungkinkan pengujian kelas
TOleControl
, antarmukaIOleClientSite
digunakan untuk tes yang didukung olehTOleControl
dan indikator yang baik.
Dari cuplikan lengkap:
procedure TBaseVirtualTree.WMKillFocus(var Msg: TWMKillFocus);
var
Form: TCustomForm;
Control: TWinControl;
Pos: TSmallPoint;
Unknown: IUnknown;
begin
inherited;
[snip]
{
Workaround for wrapped non-VCL controls (like TWebBrowser),
which do not use VCL mechanisms and
leave the ActiveControl property in the wrong state,
which causes trouble when the control is refocused.
}
Form := GetParentForm(Self);
if Assigned(Form) and (Form.ActiveControl = Self) then
begin
Cardinal(Pos) := GetMessagePos;
Control := FindVCLWindow(SmallPointToPoint(Pos));
{
Every control derived from TOleControl has potentially
the focus problem. In order to avoid including
the OleCtrls unit (which will, among others, include Variants),
which would allow to test for the TOleControl
class, the IOleClientSite interface is used for the test,
which is supported by TOleControl and a good indicator.
}
if Assigned(Control) and Control.GetInterface(IOleClientSite, Unknown) then
Form.ActiveControl := nil;
// For other classes the active control should not be modified. Otherwise you need two clicks to select it.
end;
end;
Masalahnya adalah solusi tersebut tidak lagi berhasil untuk saya. Dan sejujurnya saya tidak tahu apa masalahnya sebenarnya, dan bagaimana solusinya memperbaikinya.
Adakah orang yang mengetahui komentarnya, memahami apa yang dia bicarakan, dapat menjelaskan apa masalahnya, dan bagaimana cara yang dia lakukan untuk memperbaikinya?
Solusi untuk kontrol non-VCL yang dibungkus (seperti TWebBrowser), yang tidak menggunakan mekanisme VCL dan membiarkan properti ActiveControl dalam kondisi yang salah, yang menyebabkan masalah saat kontrol difokuskan ulang. Setiap kontrol yang berasal dari TOleControl berpotensi memiliki masalah fokus.
Kode sudah mencapai tujuan
Form.ActiveControl := nil;
pernyataan, tapi itu tidak berhasil.
saya akan memperbaikinya, tetapi saya tidak tahu bagaimana dia menemukannya, atau bagaimana hal itu bisa terjadi sehingga TOleControl tidak menggunakan mekanisme VCL dan meninggalkan properti ActiveControl dalam keadaan yang salah< /em>.
Bonus Bacaan
Saya pertama kali menanyakan pertanyaan ini di borland.public.delphi.nativeapi.win32
newsgroup pada tahun 2008
Bump 20110515 (12 bulan kemudian)
Bump 20150401 (7 tahun kemudian): Masih tidak berfungsi di XE6
Bump 20210309 (11 tahun kemudian)