Genellikle yazılımlarımızda HTML içeriği görüntülememiz gerektiğinde, VCL ile gelen WebBrowser bileşeninden faydalanırız.
Bir adım ileri gidip bu bileşenden ve HTML’den yararlanarak görsel bakımdan zengin arayüzler oluşturmamız mümkündür. Aslında çok küçük bir hile ile HTML kullanarak hazırladığımız sayfalarla tek yönlü olarak haberleşebiliriz.
HTML kullanarak dinamik yardım veya menüler oluşturabilir ve HTML sayfasındaki bağlantılara tıklanıldığı zamanda yapılması gereken işlemi
WebBrowser nesnesinin BeforeNavigate2 olayını kullanarak değiştirebiliriz.
Bunu yapmak için HTML içinde belirtilen bağlantı yollarının http’den farklı, kendimizin belirlediği bir protokolle şekillendirilmiş olması yeterlidir.
Örneğin :
Yardımı görüntüle
procedure TForm1.WebBrowserBeforeNavigate2(Sender: TObject;
const pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData,
Headers: OleVariant; var Cancel: WordBool);
var
ActionName : string;
Action : TContainedAction;
begin
ActionName := '';
// başında app stringi olan URL'lerden action adını çıkarıyoruz.
if pos('app:',URL)=1 then
ActionName := copy(URL,5,length(URL)-4);
// action adı çıkarabildiysek bu URL'yi biz işleyeceğiz
// dolayısıyla WebBrowser nesnesinin işlem yapmasını iptal ediyoruz.
Cancel := Length(ActionName) > 0;
// ActionList'ten action bulmaya çalışıyoruz.
Action := FindAction(ActionList,ActionName);
// Eğer bulduysak çalıştırıyoruz.
if Assigned(Action) then
Action.Execute;
end;
Yukarıdaki kodda sadece gidilmesi istenen URL’nin app protokolü ile mi başladığını kontrol edip, eğer öyle ise ActionListten aynı isimli bir action arıyoruz.
Bulduğumuzda da çalıştırıyoruz.
FindAction fonksiyonu ise şu şekilde:
function TForm1.FindAction(anActionList: TActionList;
actionName: String): TContainedAction;
var
i: Integer;
begin
Result := nil;
for I := 0 to anActionList.ActionCount - 1 do
if UpperCase(anActionList.Actions[i].Name) = UpperCase(actionName) then begin
Result := anActionList.Actions[i];
exit;
end;
end;
İki tane örnek uygulama:
html_arayuz.zip (257 KB)
dinamikyardim.zip (268 KB)