Bir TaskDialog'da kullanıcıya gösterilmeden önce bazı değişiklikler yapmam gerekiyor. Windows API çağrılarını, iletişim kutusundaki her denetimin üzerinde çalışmak için kullanmak oldukça basittir. Hangi düğmeyi bulduğumdan emin olmalıyım. Basıldığında, düğmenin vereceği sonucu okuyabileceğim bir yer bulmayı beklerdim.Bir formdaki denetimler arasında yineleme yaparken, belirli düğmeleri nasıl tanımlayabilirim?
başka bir deyişle, 100 değerini döndüren bir değere (Delphi'de, modal sonuç olarak adlandırılır) neden olan bir düğmeye bastığımda, orada ne olduğunu bulmak için arayabileceğim bir API çağrısı olmasını beklerdim. düğmenin "dönüş değeri" olurdu. Henüz böyle bir arama bulamadım.
Ben düğme metni güvenmek istemiyorum ..
İşte ben bugüne kadar ne var.
function EnumWindowsProcToFindDlgControls(hWindow: HWND; _param:LPARAM): BOOL; stdcall;
var
sClassName:string;
hBMP:THandle;
i:integer;
begin
SetLength(sClassName, MAX_PATH);
GetClassName(hWindow, PChar(sClassName), MAX_PATH);
SetLength(sClassName, StrLen(PChar(sClassName)));
if sClassName='Button' then
begin
// always 0...
i:=GetDlgCtrlID(hWindow);
if (i=100) or (i=102) then
begin
hBmp := LoadImage(HInstance, 'DISA', IMAGE_BITMAP, 0, 0, LR_DEFAULTSIZE or LR_LOADTRANSPARENT);
SendMessage(hWindow, BM_SETIMAGE, WPARAM(IMAGE_BITMAP), LPARAM(hBmp));
end;
end;
// keep looking
Result:=true;
end;
procedure TForm2.TaskDialog1DialogConstructed(Sender: TObject);
begin
EnumChildWindows(TaskDialog1.Handle, @EnumWindowsProcToFindDlgControls, 0);
end;
Bir iletişim kutusuyla bunun gibi şeyler yapmak tamamen "saygın" olmadığından şüpheleniyorum.
Bu, Delphi'nin Windows görev diyalogu özelliğinin etrafındaki sarıcı olan VCL TTaskDialog bileşenini kullanan bir Delphi 10 Win32 uygulamasıdır. gösterilmeden önce, bu kodu yürüten OnConstructed olayı harekete geçirilir.
Yardımlarınız için teşekkür ederiz!
Ben kodunuzu okumadım, ama onların kimliğine göre belirli düğmeler tanımlayabilir. Sadece değiştirmek istediğiniz kontrollerin kimliğini bilmek zorundasınız. –
Windows'da görev iletişim rutini tarafından oluşturulduğunda kimlik her zaman 0 olur. –
FWIW, 'SetLength (sClassName, StrLen (PChar (sClassName)));' ve benzeri kodu sClassName: = PChar (sClassName); 'ile değiştirebilirsiniz. Bu aynı şeyi gerçekleştirecek. –