»
Y
A
N
M
E
N
Ü
«
Arayüz hazırlarken HTML’den faydalanmak
ibrahim dursun @ 6 Temmuz 2007 23:27

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)


3 Yorum  
Fatih Çolak
11 Eylül 2008 23:11

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.

sadettinpolat
11 Temmuz 2007 00:33

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 :)

ibrahim dursun
12 Temmuz 2007 20:16

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.

Bir yorum bırakın

»  Substance: WordPress   »  Style: Ahren Ahimsa