Sıfırdan bir grafik kitaplığı oluşturma - sayfa 3

 
Maxim Kuznetsov :

Kısaca mühendislik hakkında:

yeniden geliştirme yoluyla bazı "A"ları iyileştirme dürtüsü varsa, kritik eksikliklerini belirtmek gerekir. Bunları listeleyin ve "A"nın evrimsel gelişim sürecinde bunun neden kaçınılmaz olduğunu açıklayın.

öte yandan, kimse yasaklamıyor. Kod yazmayı, yazmayı seviyorum ... "A" yı yeniden yazacaksın, ama kendi yönteminle, ama yeni olacak

Max, merhaba!

Eh, benim açımdan standart kütüphanede ve Anatoly kütüphanesinde gördüğüm "eksiklikleri" defalarca açıkladım.

Her iki kütüphanenin de bence önemli bir dezavantajı var: arayüz ayrık grafik nesneleri üzerine kuruludur, yani arayüzde ne kadar fazla kontrol varsa, grafiğin kendisinde o kadar ayrı nesneler. Bir yandan, bu kendi içinde bir sorun gibi görünmüyor, ancak diğer yandan, sürüklenen tek bir "elemanlı form" nesnesi değil, birçok farklı eleman olduğu için diyalogları sürüklerken sorun yaratıyor. . Ve bu ek kaynaklar gerektirir.

Anatoly'nin kütüphanesi çok şık, ancak kompozisyon açısından karmaşık ve ana programa entegre edilmesi zor. Orijinal mimari bence çok iyi olsa da, standart kütüphane kontrollerde sınırlıdır.

Aslında, en iyi çözüm Petr Konov'un yapmaya çalıştığı şey olurdu: GUI kod oluşturma özelliğine sahip, ancak yalnızca genişletilmiş bir olay modeline sahip bir grafik arayüz tasarımcısı, böylece ana programla entegrasyon sırasında devasa GUI kodu (MVVM analogu gibi bir şey) ve elbette kullanıcıların kendi başlarına genişletebilecekleri nesnelerle.

 
Алексей Барбашин :

Max, merhaba!

Eh, benim açımdan standart kütüphanede ve Anatoly kütüphanesinde gördüğüm "eksiklikleri" defalarca açıkladım.

Her iki kütüphanenin de bence önemli bir dezavantajı var: arayüz ayrık grafik nesneleri üzerine kuruludur, yani arayüzde ne kadar fazla kontrol varsa, grafiğin kendisinde o kadar ayrı nesneler. Bir yandan, bu kendi içinde bir sorun gibi görünmüyor, ancak diğer yandan, sürüklenen tek bir "elemanlı form" nesnesi değil, birçok farklı eleman olduğu için diyalogları sürüklerken sorun yaratıyor. . Ve bu ek kaynaklar gerektirir.

Anatoly'nin kütüphanesi çok şık, ancak kompozisyon açısından karmaşık ve ana programa entegre edilmesi zor. Orijinal mimari bence çok iyi olsa da, standart kütüphane kontrollerde sınırlıdır.

Aslında, en iyi çözüm Petr Konov'un yapmaya çalıştığı şey olurdu: GUI kod oluşturma özelliğine sahip, ancak yalnızca genişletilmiş bir olay modeline sahip bir grafik arayüz tasarımcısı, böylece ana programla entegrasyon sırasında büyük GUI kodu ve elbette kullanıcıların kendilerini genişletebilecekleri nesnelerle.

Alıntı aşağıdan yukarıya doğru okunmalıdır. Aşağıda (altı çizili olan) daha önemlidir. Genel olarak belirler

Tüm İnsan Arayüzünün tüm modern gelişimi ile birlikte, koordinat temsillerinin ve şekil öğelerinin ön plana çıktığını görmek oldukça şaşırtıcı.
Aynı zamanda herkes sakince Rest/Ajax ile tarayıcıları kullanıyor, MVC'nin ne olduğunun farkındalar, ancak danışman ile GUI arasındaki arayüz hakkında düşünmüyorlar.

model açıklanırsa ve onunla nasıl çalışılacağına dair bir protokol varsa, GUI herhangi biri olabilir ve danışmandan kıskançlık olmaz. Pencereleri danışmana yönlendirme yönergesi, bu bir tür kötülük-kötü-kötülüktür. Uzman Danışmanlar için asıl görev ticaret yapmaktır, geri kalan her şey ana koddan çıkarılmalı ve isteğe bağlı olmalıdır.

 
Maxim Kuznetsov :

Alıntı aşağıdan yukarıya doğru okunmalıdır. Aşağıda (altı çizili olan) daha önemlidir. Genel olarak belirler

Tüm İnsan Arayüzünün tüm modern gelişimi ile birlikte, koordinat temsillerinin ve form öğelerinin başa konduğunu görmek oldukça şaşırtıcı.
Aynı zamanda herkes sakince Rest/Ajax ile tarayıcıları kullanıyor, MVC'nin ne olduğunun farkındalar, ancak danışman ile GUI arasındaki arayüz hakkında düşünmüyorlar.

model açıklanırsa ve onunla nasıl çalışılacağına dair bir protokol varsa, GUI herhangi biri olabilir ve danışmandan kıskançlık olmaz. Pencereleri danışmana yönlendirme yönergesi, bu bir tür kötülük-kötü-kötülüktür. Uzman Danışmanlar için asıl görev ticaret yapmaktır, geri kalan her şey ana koddan çıkarılmalı ve isteğe bağlı olmalıdır.

Burada, geliştiricilerin başlangıçta arayüzlerin işlevselliğinin gerekli olabileceği gerçeğini düşünmedikleri gerçeğinden yola çıkmaya değer olduğuna inanıyorum. Hatırlarsanız, ilk dönemlerde mql'de OOP bile yoktu, asıl amacı sadece gösterge yazmaktı ve her şey buna göre ayarlanmıştı.

Ve bugün metakotaların zaten hem soketler hem de veritabanları ile çalıştığını ve program çekirdeğinin kendi düzeyinde olduğunu gözlemliyoruz... Ve kullanıcı ile program arasındaki etkileşim mekanizmaları bir kenara kaldı.

Aynı zamanda, geliştiricilerin kendileri neredeyse on yıl önce, arayüz geliştirmenin kullanıcı ve uygulama arasındaki etkileşim için çok önemli bir mekanizma olduğunu belirttiler ve bu konuda standart bir kütüphane geliştirdiler, ancak sadece görevler için uygulanabilirliğini göstermediler. ve aslında bugün bile birçok programcı onun varlığından haberdar değil.

Boşlukları doldurmaya çalışacağız. Diğer katılımcılar tarafından talep edilmese bile, yine de bir miktar deneyim kazanılacaktır.

 
Alexandr Andreev :

Kitaplığınızla başladım, teşekkür ettim, sonra biraz taradım, sonra bir tane daha, sonra bir tane daha))) sonunda yeniden yazılan çizgi işlevleri dahil her şeyi değiştirdim, ayrıca geniş çizgi işlevi tuval kaynağından, sahte işlevleri kaldırdım , olaya bir taslak koyun. W yapısından henüz tamamen çıkmadı, ancak orada da çok az şey kaldı. Sırasıyla üçüncü taraf öğeler arasında ikili arama ile soldan ve sağdan çubuğun hesaplanması eklendi, ikili aramanın kendisine daha büyük veya daha küçük bir değer seçme yeteneği ile iki yönlü eklendi. Ayrıca herhangi bir tür diziden oluşturma yeteneğini de ekledim (zaman serisi / normal) Ve tasarımı değiştirmenin gerekli olduğu sonucuna vardım)))))

Harika.

Evet, kütüphaneler ya acemi programcılar için evrensel olmalı ya da daha gelişmiş olanlar için dar odaklı olmalıdır.

Farklı amaçlar için kendi iCanvas'ımın birkaç versiyonuna sahibim.

Bu nedenle, bir niyet ve hedefler listesi oluşturmaktan veya en azından yönü belirtmekten bahsetmeye başladım. Ve düzenlenebilir durumdayken bu listeyi ilk gönderiye koyun.

 
//whats TD (template define)? because TT is busy
//почемуто этот код в шаблонах на мкл не хочет компилироваться поэтому через дефайн - это Плохо надо бы через шаблоны как то придумать.... привет метаквотам
#define TD1 int
#define TD2 double 
#define EMPY -1 
#define GET this.operator>> 
#define SET this.operator<< 
class CCoordD; 
class CSizeD;
class CCoordBaseD //полностью внутрений класс
   {
   private:
   #define ME CCoordBaseD 
   TEMPL1(T)
   bool Chek(T *a)                  {return CheckPointer(a)!=POINTER_INVALID;}
   TEMPL1(T)
   bool Chek(T a)                   {return a!=(T)EMPY;}
   TD1 Error()                      {Print(__FUNCTION__," ",__LINE__," POINTER_INVALID size"); int a[]; a[0]=0; return (TD1)EMPY;};//wtf??? =P CRASH Error
   TD1 GetA()                       {return c.GetA()+ar;}
   TD1 GetP()                       {return c.Result() + size.GetP()*(TD1)pr;}
   public:
   ME()                                   {Init();} 
   ME(TD1 a)                              {Init(a);} 
   ME(TD1 a,CCoordD &b)                   {Init(a,b);} 
   ME(TD1 a,CCoordD &b,CSizeD &x)         {Init(a,b,x);} 
   ME(TD2 a,CSizeD &b)                    {Init(a,b);} 
   ME(TD2 a,CCoordD &b,CSizeD &x)         {Init(a,b,x);} 
   CCoordD *c;//one coord
   CSizeD *size;//size 
   TD1 ar;
   TD2 pr;//percent проценты
   void Init()                            {ar=(TD1)EMPY; pr=(TD2)EMPY; }  
   TD1 Result()                           {return Chek(ar)?Chek(c)?GetA():ar:Chek(pr)?Chek(size)?GetP():Error():(TD1)EMPY;}
   ME *GetMe()                            {return &this;}
   ME *GetCoorBase()                      {return c;}
   ME *GetSizeBase()                      {return size;} 
   CCoordD *GetCoor()                     {return c;}
   CSizeD *GetSize()                      {return size;} 
   void Init(TD1 a)                       {Init(); SET(a);}
   void Init(TD1 a,CCoordD &b)            {Init(); SET(a); SET(b);}
   void Init(TD1 a,CCoordD &b,CSizeD &x)  {Init(); SET(a); SET(b); SET(x);}
 //  void Init(TD2 p)                     {Init(); pr=p_;}
   void Init(TD2 a,CSizeD &b)             {Init(); SET(a); SET(b);}
   void Init(TD2 a,CCoordD &b,CSizeD &x)  {Init(); SET(a); SET(b); SET(x);}
   void operator >> (TD1 &a)              {a=ar;} 
   void operator >> (TD2 &a)              {a=pr;}  
   void operator >> (CCoordD &a)          {a=GetPointer(c);}  
   void operator >> (CSizeD &s)           {s=GetPointer(size);}  
   void operator << (TD1 &a)              {ar=a;} 
   void operator << (TD2 &a)              {pr=a;}  
   void operator << (CCoordD &a)          {c=GetPointer(a);}  
   void operator << (CSizeD &s)           {size=GetPointer(s);}  
   void operator << (ME &a)               {a>>c; a>>ar; a>>pr; a>>size;}  
   void operator = (CCoordD &a)           {SET(a);}
   void operator = (CSizeD &a)            {SET(a);}
   void operator = (ME &a)                {SET(a);} 
   #undef ME
   #undef TD1
   #undef TD2
   #undef GET 
   #undef SET
   };
   
class CSizeD : public CCoordBaseD
   {
   public:
   CSizeD(){};
   };
   
class CCoordD : public CCoordBaseD
   {
   public:
   CCoordD(){};
   };

class CTX {public:CTX(){}}; 
class CTY {public:CTY(){}};
class CTZ {public:CTZ(){}};
TEMPL(T)
class CCoordA : public T
   {
   public:
   CCoordA() {};
   CSizeD size;
   CCoordD ar; 
   void operator <<(CSizeD &a)   {return ;}
   void operator <<(CCoordD &a)  {return ;}
   };
   
class CCoord
   {  
   public: 
   CCoordA<CTX> X;
   CCoordA<CTY> Y; 
   CCoord ()                              {} 
   bool MouseOn(CMouse &mouse)//px
      {
      //return X.ar.Result()<=mouse.X && X.ar.Result()+X.size.Result()>=mouse.X && GetY()<=mouse.Y && GetY()+GetH()>=mouse.Y;
      return false;
      }
   };  
 

Genel olarak, ya yanlış bir şey yapıyorum ya da sınıfları (boş) bildirmek için şablonlar çalışmak istemiyor. Kodu özellikle uygun olmayan kılan nedir?

Nasıl değiştirileceğini düşünmek

 
Böyle güzel bir kod ancak sergiye götürülebilir. Neden, nasıl ve neye karar verdiği bilinmiyor ama çok güzel...
 
Beyler, madem bana öğrettiniz, ben de size öğreteyim.

Önce GUI mekanizmalarının nasıl çalıştığını anlamalı, ardından kod yazmaya başlamalısınız. Elementlerin yapısını ve davranışlarını, çeşitli durumlarda tepkilerini bilmelidir. Önce bunları şablonlar olarak sunun ve ardından olay modeli, durum işleyicileri, fenomenler, koordinatlar, bağlamalar ve çizim dahil olmak üzere hazırlanmış bir teknik temelde örnekler oluşturun. Sonunda, tuval üzerinde ham bir grafik kitaplığına sahip olacaksınız. İşaretleme dili hala çok uzakta. Editörden bahsetmiyorum bile. Ama bekle.

Hazır bir şeyi alıp daha yüksek bir seviyeye çıkarabileceğinizi düşünüyorsanız, o zaman hiçbir zaman ciddi bir şey geliştirmediniz.
 
Реter Konow :
Çocuklar, madem bana öğrettiniz, ben de size öğreteyim.

Önce GUI mekanizmalarının nasıl çalıştığını anlamalı, ardından kod yazmaya başlamalısınız. Elementlerin yapısını ve davranışlarını, çeşitli durumlarda tepkilerini bilmelidir. Önce bunları şablonlar olarak sunun ve ardından olay modeli, durum işleyicileri, fenomenler, koordinatlar, bağlamalar ve çizim dahil olmak üzere hazırlanmış bir teknik temelde örnekler oluşturun. Sonunda, tuval üzerinde ham bir grafik kitaplığına sahip olacaksınız. İşaretleme dili hala çok uzakta. Editörden bahsetmiyorum bile. Ama bekle.

Hazır bir şeyi alıp daha yüksek bir seviyeye çıkarabileceğinizi düşünüyorsanız, o zaman hiçbir zaman ciddi bir şey geliştirmediniz.

Bir dakika - bu, temellerin temelinden başka bir şey değil. Ve GUI'yi bitireceğim gerçeği pek olası değil - bunu en başta söyledim. Büyük projelerle ilgili olarak - Bunu kodunuzda söyleyeceğim, büyük projelerle rekabet etmek için yeterli satır yok .....


şimdi soru bu hile neden çalışmıyor

 class CB; 
class CC;

class CBx{ public : CBx(){};};
class CBy{ public : CBy(){};};
TEMPL(T) 
class CA : public T
   {
   public :
   CA(){}
   CB<T> *b;
   CC<T> *c;
   };
    
TEMPL(T) 
class CB : public CA<T>
   {
   public :
   CB(){}
   };
    
TEMPL(T) 
class CC : public CA<T>
   {
   public :
   CC(){}
   }; 

CB<CBy> cc;
 
Alexandr Andreev :

...

şimdi soru bu hile neden çalışmıyor

Kim bilir neden çalışmıyor...

Önce kütüphane şeması derlenmeli, ardından kodlar yazılmalıdır. Genellikle bunu yaparlar.
Neden: