Konuyu Oyla:
  • Derecelendirme: 5/5 - 1 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Fluent HTML
#1
Bazen bana rahat batıyor... Sanırım aşağıdaki yazıda bunun sebebini daha kolay anlatabileceğim Smile

Zaman zaman C# ile ilgili eğitim videolarını izlerken bazen C# kodu içerisinde HTML kodlarını da çağırdıklarına şahit oluyorum. Bunun sebebi muhtemelen C#'daki bir library veya framework olabilir, o kısmıyla ilgilenmiyorum. Zaten konumuz C#'da html kullanımı da değil açıkçası... Benim ilgilendiğim nokta, odaklandığım kısım, bu olayı Delphi'de nasıl yapabiliriz idi. Yani Delphi'nin kod tamamlama işlevini HTML taglarını kullanabilir hale nasıl getirebiliriz ve bunu doğrudan HTML taglarını kullanarak nasıl bir HTML verisi üretebiliriz çerçevesinde idi...

Eski yazılarımı takip eden arkadaşlar bilirler. Yazılarımdan birinde Fluent Design ile ilgili bir makale yayınlamıştım. O yazımda XML dosyalarını daha kolay, akıcı üretebilmek için bir örnek vermiştim. Fluent Design'ın felsefesini dilim döndüğünce anlatmaya çalışmıştım. Aynı bilgileri yeniden vermenin bir anlamı yok, zira orada anlatılanlar burada da geçerli, o nedenle işin Fluent Design ile ilgili kısmını es gekiyorum ama desenle ilgilenenler, aşağıdaki bağlantıdan o yazıya ulaşabilirler;

http://www.delphican.com/showthread.php?tid=1330

Neyse, Rahat battı ya! Aynı tekniği HTML için de uyarlayabilir miyim diye düşünmeye başladım. Bunu bir denemek istedim. Bunun için HTML taglarının genel yapısını bilmek gerekiyordu, haliyle biraz araştırma yapıp bu tagların ortak "niteliklerini" bir nesnede topladım. Bu noktada Fluent Design yapısını kullanarak bir nesne tanımladım ama iş nesneyi tanımlamakla elette bitmiyordu. Bu seferki örnekte sadece nesnel programlama tekniklerini değil, aynı zamanda prosedürel programlama tekniklerini de işin içine kattım ve ortaya ( en azından benim ihtiyaçlarım açısında ) düzgün bir yapı çıkmış oldu.

Son halini github üzerindeki depomdan temin edebilirsiniz. @Tuğrul HELVACI Üstadın da dediği gibi "Allah Razı Olsun Ware'dir"... Tepe tepe kullanın ama şu fakirin adımı anmayı da unutmayın Wink

https://github.com/uparlayan/FluentHTML

Kullanımı ise gayet basit. Aşağıdaki örnek kodu okuduğunuzda ve HTML'e de aşinaysanız zaten çok kolay bir şekilde adapte olacağınıza eminim.

uses
   Classes_HTML5_            //  THTMLTag Class definition
 , Methods_HTML5_            //  HTML Tags definitions...
 ;

...
...
...

procedure TWebModule.PageProducer1HTMLTag( Sender          : TObject
                                        ; Tag             : TTag
                                        ; const TagString : string
                                        ; TagParams       : TStrings
                                        ; var ReplaceText : string
                                        );
var
 aHTML: THTMLTag;
begin
  try
     if SameText(TagString, 'userprofile') then begin
        aHTML:= table([
                        thead([
                                tr( [ th('Kullanıcı Profili').colspan('2')              ])
                              , tr( [ th('Alan')          , th('Değer')                 ])
                              ])
                      , tbody([
                                tr( [ td('ID')            , td(Oturum.User.ID.ToString) ])
                              , tr( [ td('Kullanıcı Adı') , td(Oturum.User.UserName)    ])
                              , tr( [ td('Şifre')         , td(Oturum.User.Password)    ])
                              , tr( [ td('Ad Soyad')      , td(Oturum.User.AdSoyad)     ])
                              , tr( [ td('Eposta')        , td(Oturum.User.Eposta)      ])
                              , tr( [ td('Dil')           , td(Oturum.User.Dil)         ])
                              , tr( [ td('Durum')         , td(Oturum.User.Durum)       ])
                              ])
                      ]).class_('vg'); 
        ReplaceText := aHTML.ToString;
    end else
    if SameText(TagString, 'userprofileform') then begin
       aHTML:= form(
                   [ fieldset('Kullanıcı Profilinizi Düzenleyin')
                   , label_( 'Kullanıcı Adı'   , [ br, input.placeholder('Lütfen bir kullanıcı adı belirtin'     ).id('username_id').name('username').value('').type_('text').autocomplete('off') ])
                   , br
                   , label_( 'Şifreniz'        , [ br, input.placeholder('Lütfen 8 basamaklı bir şifre yazınız'  ).id('password_id').name('password').value('').type_('password').autocomplete('off') ])
                   , br
                   , label_( 'Ad ve Soyadınız' , [ br, input.placeholder('Lütfen tam adınızı yazınız'            ).id('fullname_id').name('fullname').value('').type_('text').autocomplete('off') ])
                   , br
                   , label_( 'Eposta Adresiniz', [ br, input.placeholder('Size ait Eposta adresinizi yazınız'    ).id('emailadr_id').name('emailadr').value('').type_('text').autocomplete('off') ])
                   , br
                   , label_( 'Arabirim Dili'   , [ br, input.placeholder('Bu siteyi hangi dilde kullanacaksınız?').id('language_id').name('language').value('').type_('text').autocomplete('off') ])
                   ]).action('/profileedit').method('post');
        ReplaceText := aHTML.ToString;
    end else
    begin
      { Standart else sonu }
    end;
  finally
    if Assigned(aHTML) then FreeAndNil(aHTML);
  end;
end;
YouTube Delphi Tips
"Yaşlanarak değil, yaşayarak tecrübe kazanılır. Zaman insanları değil, armutları olgunlaştırır" Peyami Safa
WWW
Cevapla
#2
Ellerinize sağlık. Allah razı olsun üstadım.
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla
#3
Elinize sağlık @uparlayan abi. Allah razı olsun. Desen üstadı Smile
PostgreSQL - Linux - Delphi, Poliüretan
WWW
Cevapla
#4
Teşekkürler @uparlayan bey
Cevapla
#5
Makaleniz, sakin bir kafa ile ne kadar güzel işler çıkabileceğinin bir örneği olmuş.
Emek ve çalışmalarınızdan dolayı çok teşekkür ederim @uparlayan hocam.
Hep alan değil, aldığının bir miktarını da vermek bizim toplumumuzun en büyük özelliğidir. 

Tüm DelphiCan'ların bir defa da olsa müsait zamanlarında bir makale paylaşmasının çok zor olmadığını düşünüyorum.
Cevapla
#6
(10-06-2019, Saat: 14:24)Tuğrul HELVACI Adlı Kullanıcıdan Alıntı: Ellerinize sağlık. Allah razı olsun üstadım.
Sizden de Allah Razı Olsun,

(10-06-2019, Saat: 16:46)3ddark Adlı Kullanıcıdan Alıntı: Elinize sağlık @uparlayan abi. Allah razı olsun. Desen üstadı Smile
Sizden de Allah Razı Olsun,

(10-06-2019, Saat: 17:19)frmman Adlı Kullanıcıdan Alıntı: Teşekkürler @uparlayan bey
Rica ederim,
(11-06-2019, Saat: 08:39)Fesih ARSLAN Adlı Kullanıcıdan Alıntı: Makaleniz, sakin bir kafa ile ne kadar güzel işler çıkabileceğinin bir örneği olmuş.
Emek ve çalışmalarınızdan dolayı çok teşekkür ederim @uparlayan hocam.
Hep alan değil, aldığının bir miktarını da vermek bizim toplumumuzun en büyük özelliğidir. 

Tüm DelphiCan'ların bir defa da olsa müsait zamanlarında bir makale paylaşmasının çok zor olmadığını düşünüyorum.
Ne diyebilirim ki, haklısınız üstat,

-----------------

Bu arada, yazıyı beğenen arkadaşlar gerek cevap yazarak gerekse puan vererek içeriği beğendiklerini gösteriyor ve biz de bundan gurur duyuyoruz, doğru yolda olduğumuzu anlıyoruz. Bu bize azim ve şevk veriyor.

Ama, yazıyı okuyup da hiç tepki vermeyen bir çok arkadaşımız var. Kim olduklarının bir önemi yok, zaten sayfanın en altında rumuzları gözüküyor Smile Benim merak ettiğim, bu arkadaşlar içeriği beğendiler mi, beğenmediler mi, gereksiz mi buldular yoksa çok sığ mı geldi, bunu anlayamıyoruz. Hani deseler ki "şurası olmamış", "burası eksik", "burası yanlış" biz de "eyvallah" diyeceğiz, düzeltip yeni ufuklara açılacağız ama o kısım olmuyor bir türlü Smile
YouTube Delphi Tips
"Yaşlanarak değil, yaşayarak tecrübe kazanılır. Zaman insanları değil, armutları olgunlaştırır" Peyami Safa
WWW
Cevapla
#7
Elinize sağlık
Cevapla
#8
(10-06-2019, Saat: 13:45)uparlayan Adlı Kullanıcıdan Alıntı: Bazen bana rahat batıyor... Sanırım aşağıdaki yazıda bunun sebebini daha kolay anlatabileceğim Smile

Zaman zaman C# ile ilgili eğitim videolarını izlerken bazen C# kodu içerisinde HTML kodlarını da çağırdıklarına şahit oluyorum. Bunun sebebi muhtemelen C#'daki bir library veya framework olabilir, o kısmıyla ilgilenmiyorum. Zaten konumuz C#'da html kullanımı da değil açıkçası... Benim ilgilendiğim nokta, odaklandığım kısım, bu olayı Delphi'de nasıl yapabiliriz idi. Yani Delphi'nin kod tamamlama işlevini HTML taglarını kullanabilir hale nasıl getirebiliriz ve bunu doğrudan HTML taglarını kullanarak nasıl bir HTML verisi üretebiliriz çerçevesinde idi...

Eski yazılarımı takip eden arkadaşlar bilirler. Yazılarımdan birinde Fluent Design ile ilgili bir makale yayınlamıştım. O yazımda XML dosyalarını daha kolay, akıcı üretebilmek için bir örnek vermiştim. Fluent Design'ın felsefesini dilim döndüğünce anlatmaya çalışmıştım. Aynı bilgileri yeniden vermenin bir anlamı yok, zira orada anlatılanlar burada da geçerli, o nedenle işin Fluent Design ile ilgili kısmını es gekiyorum ama desenle ilgilenenler, aşağıdaki bağlantıdan o yazıya ulaşabilirler;

http://www.delphican.com/showthread.php?tid=1330

Neyse, Rahat battı ya! Aynı tekniği HTML için de uyarlayabilir miyim diye düşünmeye başladım. Bunu bir denemek istedim. Bunun için HTML taglarının genel yapısını bilmek gerekiyordu, haliyle biraz araştırma yapıp bu tagların ortak "niteliklerini" bir nesnede topladım. Bu noktada Fluent Design yapısını kullanarak bir nesne tanımladım ama iş nesneyi tanımlamakla elette bitmiyordu. Bu seferki örnekte sadece nesnel programlama tekniklerini değil, aynı zamanda prosedürel programlama tekniklerini de işin içine kattım ve ortaya ( en azından benim ihtiyaçlarım açısında ) düzgün bir yapı çıkmış oldu.

Son halini github üzerindeki depomdan temin edebilirsiniz. @Tuğrul HELVACI Üstadın da dediği gibi "Allah Razı Olsun Ware'dir"... Tepe tepe kullanın ama şu fakirin adımı anmayı da unutmayın Wink

https://github.com/uparlayan/FluentHTML

Kullanımı ise gayet basit. Aşağıdaki örnek kodu okuduğunuzda ve HTML'e de aşinaysanız zaten çok kolay bir şekilde adapte olacağınıza eminim.

uses
   Classes_HTML5_            //  THTMLTag Class definition
 , Methods_HTML5_            //  HTML Tags definitions...
 ;

...
...
...

procedure TWebModule.PageProducer1HTMLTag( Sender          : TObject
                                        ; Tag             : TTag
                                        ; const TagString : string
                                        ; TagParams       : TStrings
                                        ; var ReplaceText : string
                                        );
var
 aHTML: THTMLTag;
begin
  try
    if  SameText(TagString, 'userprofile') then begin
      aHTML:= table([
                      thead([
                              tr( [ th('Kullanıcı Profili').colspan('2')              ])
                            , tr( [ th('Alan')          , th('Değer')                 ])
                            ])
                    , tbody([
                              tr( [ td('ID')            , td(Oturum.User.ID.ToString) ])
                            , tr( [ td('Kullanıcı Adı') , td(Oturum.User.UserName)    ])
                            , tr( [ td('Şifre')         , td(Oturum.User.Password)    ])
                            , tr( [ td('Ad Soyad')      , td(Oturum.User.AdSoyad)     ])
                            , tr( [ td('Eposta')        , td(Oturum.User.Eposta)      ])
                            , tr( [ td('Dil')           , td(Oturum.User.Dil)         ])
                            , tr( [ td('Durum')         , td(Oturum.User.Durum)       ])
                            ])
                    ]).class_('vg');
 
      ReplaceText := aHTML.ToString;
  end else
  if  SameText(TagString, 'userprofileform') then begin
      aHTML:= form(
              [ fieldset('Kullanıcı Profilinizi Düzenleyin')
              , label_( 'Kullanıcı Adı'   , [ br, input.placeholder('Lütfen bir kullanıcı adı belirtin'     ).id('username_id').name('username').value('').type_('text').autocomplete('off') ])
              , br
              , label_( 'Şifreniz'        , [ br, input.placeholder('Lütfen 8 basamaklı bir şifre yazınız'  ).id('password_id').name('password').value('').type_('password').autocomplete('off') ])
              , br
              , label_( 'Ad ve Soyadınız' , [ br, input.placeholder('Lütfen tam adınızı yazınız'            ).id('fullname_id').name('fullname').value('').type_('text').autocomplete('off') ])
              , br
              , label_( 'Eposta Adresiniz', [ br, input.placeholder('Size ait Eposta adresinizi yazınız'    ).id('emailadr_id').name('emailadr').value('').type_('text').autocomplete('off') ])
              , br
              , label_( 'Arabirim Dili'   , [ br, input.placeholder('Bu siteyi hangi dilde kullanacaksınız?').id('language_id').name('language').value('').type_('text').autocomplete('off') ])
              ]).action('/profileedit').method('post');
      aHTML:= table([
                      thead([
                              tr( [ th('Kullanıcı Profili').colspan('2')               ])
                            , tr( [ th('Alan')          , th('Değer')                 ])
                            ])
                    , tbody([
                              tr( [ td('ID')            , td(Oturum.User.ID.ToString) ])
                            , tr( [ td('Kullanıcı Adı') , td(Oturum.User.UserName)    ])
                            , tr( [ td('Şifre')         , td(Oturum.User.Password)    ])
                            , tr( [ td('Ad Soyad')      , td(Oturum.User.AdSoyad)     ])
                            , tr( [ td('Eposta')        , td(Oturum.User.Eposta)      ])
                            , tr( [ td('Dil')           , td(Oturum.User.Dil)         ])
                            , tr( [ td('Durum')         , td(Oturum.User.Durum)       ])
                            ])
                    ]).class_('vg');
      ReplaceText := aHTML.ToString;
  end else
  begin
    { Standart else sonu }
  end;
  finally
    if Assigned(aHTML) then FreeAndNil(aHTML);
  end;
end;

Merhabalar,

Bütün paylaşımlarınız her zaman ki gibi çok güzel.
Elinize sağlık, çok teşekkürler.

Kolay gelsin.
Amaç, bilginin de/aklın da zekat'ını vermek.
Cevapla
#9
Emeğinize sağlık. Bence çok yararlı ve bir o kadar da yol gösterici bir makale olmuş.
There's no place like 127.0.0.1
WWW
Cevapla
#10
@uparlayan

Yazdıklarınızı görmeden puan verdim. Puanla ilgili yazdıklarınızı yukarı kaydırdığımda fark ettim.
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Web Sitesine Login Olma ve HTML Parse SimaWB 15 16.678 18-09-2021, Saat: 21:26
Son Yorum: 10.Köy
  TWebBrowser Lafınızı Dinlesin, HTML 5'ten anlasın uparlayan 14 11.258 18-08-2021, Saat: 20:48
Son Yorum: rahman
  Tasarım Desenleri : Fluent Design uparlayan 19 11.840 17-08-2020, Saat: 18:15
Son Yorum: uparlayan
  Web Sitesine Login Olma ve HTML Parse - 2 SimaWB 10 9.537 15-02-2019, Saat: 03:02
Son Yorum: BasK
  Tüm Platformlar için (cross-platform) HTML Dosyası Oluşturma TescilsizUzman 0 3.354 21-10-2016, Saat: 11:53
Son Yorum: TescilsizUzman



Konuyu Okuyanlar: 1 Ziyaretçi