Arayüz hazırlarken HTML’den faydalanmak

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;</p>

<p>// 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)

  1. programlardan birinde bu olayi gormus ve cok begenmistim. nasil yapmis acaba diye dusunurken aklima hicbir baslangic noktasi gelmedi. en son emule nin de buna benzer bir yol kullandigini dusunup kodlarini incelemistim. ilgili yeri ve registry de nerelere hangi degerleri kaydettigini bulmustum ama yine de bu olayi yapamamistim :) cozumu cok farkli yerlerde aramisim. hafizamdaki bir soru isaretini giderdigin icin tesekkurler :)

  2. ibrahim dursun

    Sadettin, ben de senden farklı düşünmemiştim ilk başta. Dinamik yardımı nasıl yapıyorlar diye baya kafa patlattım. Protokol tanımlıyorlar falan sanmıştım. Bir projem için lazım oldu en sonunda bu yöntem aklıma geldi.

    Yalnız, emule ciddi ciddi protokol kaydı ekliyor. Firefoxtan ed2k linklerine tıkladığımda emule açılıyor bende.

  3. Aslında bu tarz arayüzlerle çok fazla karşılaşmaya başladık. Bu birazda normal gibi, zira son kullanıcılara alışık oldukları HTML arayüzünü sunmak çok mantıklı. Bunun için benim aklıma şöyle bir yöntem geliyor. Eğer modüler programlar geliştiriyorsanız .Net te de olduğu gibi Dll leri bir browserdan çağırmak mümkün. Tabiki bunun için local bir servis sağlayıcı gerekli(IIS, Apache). Dll leri ilgili web diline register ettikten sonra exe ye bile ihtiyaç kalmadan browser üstünden işinizi görebilirsiniz. Zaten .Net te çok benzer bir mantıkla çalışıyorç Konu biraz Web e kaydı gibi :) Kolay gelsin.

Leave a Comment


NOTE - You can use these HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>