Forum: Projeler turna RSS
XmlElement [Helper'da Ne Kaldı?]
Sayfa:  önceki  1  2  3  4  sonraki 
acehreli (Moderatör) #31
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4396 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj ID 3797
Nasıl? Bende jeton düşmedi daha? :) Ben de <form>'dan bahsediyorum. Web sayfalarına form eklenebiliyorsa, onun adı Form olsun. Demek istediğim o.

Ali
erdem (Moderatör) #32
Üye Tem 2009 tarihinden beri · 901 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Ama sadece Form elemanını mı yapıyoruz. Örneğin başlıklar, tablolar, resimler vs.. bir sürü başka elemanlar var. Benim biraz kafam karıştı galiba ..

Örneğin bir XmlElement sınıfımız var. Sonra gene bir HtmlElement sınıfına da ihtiyacımız olmaz mı. Örneğin HtmlElement, XmlElement'in biraz özelleşmiş biçimidir. Sadece belirli etiketleri içerebilir. Form da bir html elemanıdır.

Burada HtmlElement sınıfını oluşturmasak da tüm html elemanlarını yazmayacakmıyız. Neden sadece Form yazıyoruz onu anlamadım  :huh:
acehreli (Moderatör) #33
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4396 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Daha önce sorulduğu için ben özellikle Form üzerinde durdum. Tabii ki ötekiler de yapılmalı.

HtmlElement diye tek sınıf bütün HTML elemanlarına uymaz gibi geliyor. Sanırım bazıları fazla özel. Örneğin Form'un POST veya GET gibi çeşitleri var ama diğer HTML elemanlarında böyle bir şey yok.

Yani "br" HTML elemanı oluşturup sonra ona addAttribute("method", "POST") diyememeliyiz. Kütüphanemiz buna izin vermemeli.

HtmlElement diye bir sınıfta da bunu kısıtlayabiliriz ama ancak çalışma zamanında olabilir... addAttribute() dendiğinde, HtmlElement içindeki tag'e bakar ve ancak "form" ise izin verir. Olabilir... Ama daha iyisi, tür güvenliği yoluyla buna zaten izin vermemek olmalı. Örneğin "br" elemanının addAttribute() diye bir işlevi bile olmamalı. (Acaba "br"nin nitelikleri olabiliyor mu?)

Yanlış programlamaya kalktığımız an derleme hatası almalıyız.

Ali
erdem (Moderatör) #34
Üye Tem 2009 tarihinden beri · 901 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj ID 3792
Kadir Can:
        auto result = new XmlElement("input","type",type,name)
Sizce ne durumda?

Bir de sanırım yapmak istediğimiz bu:

<input type="text" name="giriş" />

Bunu biraz kısaltarak yazdım. Aslında bununla eşit :)

<input type="text" name="giriş" ></ input>

Ama program şu şekilde çıktı üretiyor:

<form><input type="text">giriş</input></form>

Hatta daha yaygın kullanımını düşünürsek şu şekilde kullanabilmeliyiz:
<form>
First name: <input type="text" name="firstname" /><br />
Last name : <input type="text" name="lastname" />
</form>
erdem (Moderatör) #35
Üye Tem 2009 tarihinden beri · 901 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
O zaman diğer form elemanlarını da XmlElement sınıfından türetip kullanabiliriz.

class TextField : XmlElement {
 
    string label_;
    string name_;
 
    this () {
        super("input", "type", "text");
    }
 
    this (string label, string name="") {
        label_ = label;
        name_ = name;
        attributes_["name"] ~= name;
        super("input", "type", "text");
        
    }
    
}
gene gönderme düğmesi Button da aynı şekilde olabilir. Sonra form düğme, şifre giriş kutusu vs.. gibi bu elementlere sahip olabilir.

O zaman bu şekilde kullanabiliyoruz:
    auto e = new Form();
 
    auto c = new TextField("","deneme");
  
    e.addElement(c);
 
    writeln(e);
Hatta form elemanının bir  TextField textfield_; alanı mı olsun.

Bir de bu etiketi yazdırmak için bir numara bulmamız lazım :)

Elemanları yazdır kısmına bir kontrol ekleyip eğer eleman TextField ise elemandan önce etiketi mi yazsın. Buradaki First Name etiketi gibi.
First name: <input type="text" name="firstname" />
Bu mesaj 4 defa değişti; son değiştiren: erdem; zaman: 2011-04-20, 05:52.
acehreli (Moderatör) #36
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4396 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yani, tarayıcıda oturan kişinin girdiği isim, soyad gibi değerleri sonradan programda alabilmek için o "text field"lere isim vermemiz gerekiyor.

Yine daha önceki düşünceme devam ediyorum: eğer TextField olabilmek için label ve isim şartsa, ikisi de kurucu parametresi olarak gelmeli. (Erdem name'i seçime bağlı bırakmış; öyle de kullanılabiliyor herhalde. (?))

Ali
acehreli (Moderatör) #37
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4396 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #35
erdem:
        name_ = name;
        attributes_["name"] ~= name;

Aynı bilgiden iki tane bulunması karışıklığa neden olabilir mi sonradan? Eğer burada name_'i sonra kullanmayacaksan üst sınıfın addAttribute()'ını çağırabiliriz galiba:

    addAttribute("name", name);

Hatta form elemanının bir  TextField textfield_; alanı mı olsun.

Tabii birden fazla TextField olabilir, değil mi?

Bir de bu etiketi yazdırmak için bir numara bulmamız lazım :)

Hatta bu örneklerdeki gibi serbest metin değil de bir resim bile olabiliyor sanırım. O zaman bence formun içeriği aslında oldukça serbest. Kullanıcılarımız istedikleri elemanları istedikleri sırada addElement() ile eklesinler ve XmlElement'ın yazdırma kodu normal işleyişi ile yazdırsın.

Öyle olur, değil mi?

Ali
erdem (Moderatör) #38
Üye Tem 2009 tarihinden beri · 901 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #36
acehreli:
Yine daha önceki düşünceme devam ediyorum: eğer TextField olabilmek için label ve isim şartsa, ikisi de kurucu parametresi olarak gelmeli. (Erdem name'i seçime bağlı bırakmış; öyle de kullanılabiliyor herhalde. (?))

Hımm. Bu değerleri almak için onlara isim verilmesi gerektiğini bilmiyordum. O zaman verebiliriz. Ben kullanıcı uzun uzun yazmaktan erinir diye düşündüm. Ya da belki program verir diye. Örneğin textfield1, textfield2 .. gibi

Evet name'i kullanmamak hata ya da uyarı vermiyor ama dediğiniz gibi kullanmak en iyisi galiba.

http://validator.w3.org/check

Burdan denedim ama çok ilginç bir şey dikkatimi çekti. Örneğin form için action niteliği tanımlanmak zorunda. Yoksa hata veriyor.

acehreli:
Bir de bu etiketi yazdırmak için bir numara bulmamız lazım :)

Hatta bu örneklerdeki gibi serbest metin değil de bir resim bile olabiliyor sanırım. O zaman bence formun içeriği aslında oldukça serbest. Kullanıcılarımız istedikleri elemanları istedikleri sırada addElement() ile eklesinler ve XmlElement'ın yazdırma kodu normal işleyişi ile yazdırsın.

Öyle olur, değil mi?

Bence gayet güzel olur :)

Evet bahsettiğiniz gibi ekleme kısmı  da şu an oldukça esnek. Ama ben kullanıcılar nasıl eklesinler onu bilmiyorum. Örneğin gene sizin yazdığınız bir örnekteki yazım şekli oldukça güzel.

En iyisi siz kütüphaneyi program içinden nasıl kullanmak istediğimizi yazın. Biz Kadir Can'la kodunu yazmaya çalışalım :)
Bu mesaj erdem tarafından değiştirildi; zaman: 2011-04-20, 10:26.
acehreli (Moderatör) #39
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4396 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
erdem:
http://validator.w3.org/check

Güzel bir araç. Denetimleri geçmeliyiz.

Örneğin gene sizin yazdığınız bir örnekteki yazım şekli oldukça güzel.

O denemeyi kendim yazdığıma göre öyle kullanımları sevdiğim belli herhalde. :) Bunu da daha önce konuşmuştuk ama yalnızca parametre olarak kullanılacak olan değişkenlere isim vermeyi sevmiyorum. Bu iyi:

foo(Bar(7), Zar(42));

Şu bana gereksiz geliyor:

auto bar = Bar(7);
auto zar = Zar(42);
foo(bar, zar);

Gereksiz değişken kullanmayınca daha bir "tablo" gibi oluyor. Hatta verdiğin bağlantıdaki gibi kullanınca belgenin şekli de kod içinde görünüyor gibi.

En iyisi siz kütüphaneyi program içinden nasıl kullanmak istediğimizi yazın. Biz Kadir Can'la kodunu yazmaya çalışalım :)

Üstü kapalı olarak geçen ilkelerimizi listeleyelim:

- Bahsettiğin "action" gibi şart olan veriler kurucu parametreleri olmalı. Böylece eksik kurulmuş nesne hatalarımız olamaz.

- Seçime bağlı olan veriler ya varsayılan değerli kurucu parametreleri olur, ya da üye işlevlerle sonradan verilebilir

- Gösterdiğin yerdeki kodda formları örneğin postFormu() diye bir işlevle oluşturmuşum. O işlev bir XmlElement döndürdüğü için fazla esnek oluyor. Onun yerine, HTML standardının bütün parçalarını özel tür olarak belirlersek tam denetimli ve neredeyse hatasız belgeler oluşturabiliriz (Form, vs. tanımlayarak zaten böyle yapıyoruz.)

- Kullanım kolay olmalı. Bu muallak bir ilke; kütüphaneyi kendimiz kullandıkça nasıl daha kullanışlı olacağını anlar ve değiştiririz

Ali
Kadir Can #40
Üye Haz 2010 tarihinden beri · 413 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
En son hali şu:
Başka değişikliklere ihtiyaç var mı?
helper.d;
import std.stdio;
import std.string;
class XmlElement{
    string tag;
    string[string] attributes;
    string content;
    XmlElement[] elements;
 
    this(string tag_) {
        tag = tag_;
    }
 
    @property setAttributes(string[string] attributes_){
        attributes = attributes_;
    }
 
    @property setContent(string content_){
        content=content_;
    }
 
    void addElement(XmlElement element ){
        elements ~= element;
    }
 
    override string toString () {
        string result;
        result ~= "<"~tag;
        foreach ( key , value ; attributes ) {
            result ~= format(" %s=\"%s\"",key,value);
        }
        result ~= ">"~content;
        foreach (element ; elements ){
            result ~= element.toString();
        }
        result ~= "</"~tag~">";
        result ~= "\n";
    return result;
    }
}
 
/*void main(){
    auto link = new XmlElement("a");
    auto a = ["href":"www.google.com.tr"];
    auto b = "Google";
    link.setAttributes(a);
    link.setContent(b);
    writeln(link);
}
*/
htmlForm.d;
import std.stdio;
import helper;
 
enum method { get , post };
 
class HtmlForm : XmlElement {
 
    this( method type){
        super("form");
        final switch( type ){
            case type.get : setAttributes(["method":"GET"]); break;
            case type.post : setAttributes(["method":"POST"]); break;
        }
    }
 
} 
 
void main(){
    auto form = new HtmlForm(method.get);
    writeln(form);
}
Bu mesaj 2 defa değişti; son değiştiren: erdem; zaman: 2011-04-22, 01:41.
Değişiklik nedeni: override ekledim
acehreli (Moderatör) #41
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4396 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Metod için enum kullanman güzel. Daha önce konuştuğumuz konuları da güzelce halletmişsin.

Erdem'in uyardığı gibi, "action" da şart. Onu da kurucu parametresi yapmalıyız.

Gözüme çarpan bir şey, bütün niteliklerin hep birden veriliyor olması kullanışsız olabilir. XmlElement'tan türeyen sınıflar kendi istedikleri nitelikleri kurucularında ayarladıktan sonra, kullanıcılar ayrıca ek yapamazlar. Yani bir de setAttribute() gibi bir işlev yararlı olacak:

void setAttribute(string key, string value)

Ali
erdem (Moderatör) #42
Üye Tem 2009 tarihinden beri · 901 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Ben de beğendim. Gayet güzel ve okunaklı olmuş :)

Ayrıca kurucu işlevde enum ve switch case ifadesinden faydalanman da gayet şık.
Kadir Can #43
Üye Haz 2010 tarihinden beri · 413 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Teşekkür ederim.

Artık yeni işlevlere yelken alma zamanı :)
erdem (Moderatör) #44
Üye Tem 2009 tarihinden beri · 901 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Textfield'den başka sırada daha Password Field, Radio Buttons, Checkboxes ve Submit Button var.

Ben şu sayfayı kullanıyorum yazarken. Böylece nasıl kullanıldığını görmüş oluyorum:

http://www.w3schools.com/html/html_forms.asp

Benim de udumu elime alma zamanı :)
Avatar
mert #45
Üye Ara 2010 tarihinden beri · 193 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: override
 override string toString () {
        string result;
        result ~= "<"~tag;
        foreach ( key , value ; attributes ) {
            result ~= format(" %s=\"%s\"",key,value);
        }
        result ~= ">"~content;
        foreach (element ; elements ){
            result ~= element.toString();
        }
        result ~= "</"~tag~">";
        result ~= "\n";
    return result;
    }

toString işlevi override anahtar sözcüğü olmadan benim derleyicimde hata veriyor.
mert
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Sayfa:  önceki  1  2  3  4  sonraki 
Forum: Projeler turna RSS
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-05-25, 16:53:05 (UTC -07:00)