Fare un progetto in crowdsourcing su Canvas - pagina 23

 
Реter Konow:

))) Allora perché ho iniziato questo topic? ) Ora vado a studiare OOP.


Questo è il vantaggio della tua strada: dalla pratica alla teoria. Anch'io ho fatto così. Il mio istinto ha resistito a lungo al paradigma OOP, perché ho iniziato a programmare quando non esisteva in natura. Ma ora capisco che questa è l'invenzione più preziosa della programmazione. E a volte mi sembra che se AOP non fosse stato inventato finora, l'avrei inventato io stesso :))
A te, Peter, piacerà e sarai felice quando ti renderai conto della meraviglia dell'OOP e delle opportunità che apre. Te lo assicuro :)). E non c'è niente di complicato e ingarbugliato nell'OOP, specialmente per te che hai esperienza di programmazione. E mi sembra che, nel tuo caso, la documentazione di Metacvots potrebbe anche essere sufficiente per arrivare in fondo. C'è molta letteratura in giro.
Tag Konow:

Ma Nikolay, non ho ancora capito cosa stavo chiedendo - c'è la possibilità di impostare un colore specifico per le linee di sfumatura della cornice nella classe CCcanvas? Guardando il tuo esempio, si potrebbe pensare che ci sia... Se sì, puoi disegnare qualcosa di simile al mio esempio?

OK, OK. Anche se non è un argomento di questo thread, ma cercherò di chiarire cose che sembrano ovvie ai programmatori esperti, ma non ovvie ai programmatori che incontrano Canvas per la prima volta.
Quindi, cos'è Canvas. Tradotto dall'inglese è una tela. Si tratta semplicemente di un'area dello schermo all'interno di una finestra alla quale è poi attaccata. Le sue caratteristiche principali sono le dimensioni (larghezza e altezza). E infatti è un array unidimensionale di punti di tipo uint (4 byte) con dimensione Width*Height. Nell'implementazione della classe CCanvas questo array è chiamato m_pixels, e per default è privato (che significa accessibile solo all'interno della classe), ma io personalmente lo rendo sempre pubblico (accessibile non solo all'interno della classe, ma anche nelle applicazioni utente), perché voglio operare direttamente con l'array di dati. Ogni punto su questa tela può prendere qualsiasi valore di tipo colore (anche 4 byte come uint, un byte riservato), il che significa un punto di qualsiasi colore RGB. Ogni colore (rosso, verde o blu) corrisponde a un byte (256 valori), quindi ci sono 256*256*256=16.777.216 colori RGB in totale.

Per mettere un punto rosso in coordinate X,Y, dove X può assumere valori da 0 a (Larghezza-1) e Y da 0 a (Altezza-1) basta assegnare un valore rosso a una cella dell'array m_pixels numerata (Y*Larghezza+X):

m_pixels[Y*Width+X]=clrRed;

o quello che è lo stesso:

m_pixels[Y*Width+X] = 0x0000FF; // 0x00FF00 зеленый, - 0xFF0000 - синий, 0x00FFFF - желтый и т.д.

Questo è tutto!!!
Ora non puoi nemmeno usare le funzioni integrate della classe CCanvas (il che è ovviamente stupido, perché c'è un sacco di roba utile lì). Se puoi mettere un punto sullo schermo in qualsiasi punto e in qualsiasi colore - tu Dio cosa vuoi e lo disegni: pulsanti, grafica, creare il tuo GDI, ecc. ecc.

E se qualcuno pensa che kanvas sia lento, si sbaglia. Kanvas è incredibilmente veloce ed è un merito del team di sviluppo. Ho testato molte volte la velocità di disegno di kanvas usando anche librerie Dll scritte in C++. Ora dopo gli aggiornamenti dell'ultimo anno il canvas su MT5 è quasi veloce come se lo avessi scritto in Visual Studio in C++. È solo il 10-15% più lento. E non dimenticate - Windows è scritto in C++ ed è tutto Canvas. Questa è la bellezza e la promessa di MT5 con il suo MQL5!!! Né Java né C# potranno vantare una tale velocità, come alcuni hanno scritto in questo thread.

Non per niente gli sviluppatori hanno recentemente introdotto una nuova proprietà CHART_SHOW per disabilitare il rendering del grafico.
Lo dimostrerò con un esempio di script:

//+------------------------------------------------------------------+
//|                                                  CleanScreen.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+

// Внимание !!! В классе CCanvas массив m_pixels должен быть определен как public
#include <Canvas\Canvas.mqh>

void OnStart()
  {
   ChartSetInteger(0,CHART_SHOW,false); // очищаем экран от всего
   int Width =(int)ChartGetInteger(0,CHART_WIDTH_IN_PIXELS);  // получаем Ширину экрана
   int Height=(int)ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS); // получаем Высоту экрана

   CCanvas C;   // создаем объект Canvas
   if(!C.CreateBitmapLabel(0,0,"CleanScreen",0,0,Width,Height,COLOR_FORMAT_XRGB_NOALPHA)) // Создаем холст на весь экран
      Print("Error creating canvas: ",GetLastError());

// Теперь что-нибудь нарисуем на этом чистом экране
// например красную точку в центре экрана
   int X=Width/2;
   int Y=Height/2;
   C.m_pixels[Y*Width+X]=0xFF0000; // красный
                                   // или нарисуем окружность в центре с радиусом 100 по точкам фиолетового цвета
   int r=100;
   int q=(int)ceil(r*M_SQRT1_2);
   int r2=r*r;
   for(int x=0; x<=q; x++)
     {
      int y=(int)round(sqrt(r2-x*x));
      C.m_pixels[(Y+y)*Width+X+x]=0xFF00FF;
      C.m_pixels[(Y+y)*Width+X-x]=0xFF00FF;
      C.m_pixels[(Y-y)*Width+X+x]=0xFF00FF;
      C.m_pixels[(Y-y)*Width+X-x]=0xFF00FF;
      C.m_pixels[(Y+x)*Width+X+y]=0xFF00FF;
      C.m_pixels[(Y+x)*Width+X-y]=0xFF00FF;
      C.m_pixels[(Y-x)*Width+X+y]=0xFF00FF;
      C.m_pixels[(Y-x)*Width+X-y]=0xFF00FF;
     }
// конечно же можно окружность построить проще :) - через встроенную функцию класса CCanvas:
   C.Circle(X,Y,r+20,0xFFFF00); // желтого цвета
   C.Update(); // Теперь выводим это на экран
  }

Funzionamento di questo script:


Lo schermo viene cancellato, ma l'accesso alle quotazioni rimane e possiamo usare questa tela vuota per fare la nostra interfaccia grafica, come questa con un gradiente:


Regex Konow:

Ma Nikolai, non ho ancora capito cosa stavo chiedendo - c'è un'opzione nella classe CCcanvas per impostare un colore specifico alle linee del gradiente della cornice? Guardando il tuo esempio, si potrebbe pensare che ci sia... Se sì, puoi disegnare qualcosa di simile al mio esempio?

Il colore è definito all'interno della classe GButton, e ci sono anche due funzioni per mescolare i due colori e creare un array di colori per passare da un colore all'altro, cioè solo per il gradiente. Si tratta solo di definire il concetto di gradiente. Nella mia comprensione, un gradiente (o riempimento a gradiente) è un flusso regolare di un colore verso un altro. Nel tuo esempio non c'è nessun gradiente, solo 4 colori. Nel mio esempio, all'interno della classe GButton, si formano 4 colori aggiuntivi con diverse luminosità del colore e un array di colori per il riempimento del gradiente. Questo è fatto proprio per rendere la vita più facile all'utente finale della classe. Perché dovrebbe preoccuparsi della formazione di questi colori?
Disegna qualcosa di simile al tuo esempio - è il tuo compito, Peter :)) Dai, comincia a capire le classi, da cui l'OOP.
Buona fortuna!
 
Nikolai Semko:

Buona fortuna!

Ok, Nikolai. Grazie e buona fortuna anche a te!
 
Nikolai Semko:

Nikolai, volevo rispondere al tuo post informativo di ieri, ma non ho potuto raccogliere i miei pensieri. Ora ho raccolto i miei pensieri e ho capito che ho bisogno di scrivere dal mio cuore, non dalla mia mente, altrimenti non spiegherò nulla. Naturalmente, sarebbe off-topic e i moderatori probabilmente lo cancellerebbero, ma comunque...

Quello che scrivi su OOP è stimolante. Ho già iniziato a studiarlo con la seria intenzione di padroneggiarlo. Tuttavia, nel processo di apprendimento, sono stato costantemente bombardato da domande della categoria "perché prendere la strada lunga quando c'è una scorciatoia? Vedevo costantemente modi facili, concisi e chiari di risolvere i problemi, ed era come se mi venisse detto: "No! In OOP questa non è una soluzione. Bisogna farlo in modo formale, formale e nobile". In risposta mi sono chiesto: "Ma come può essere? Non ho bisogno di quelle entità. Perché dovrei aggiungerli al codice? Sono superflui. Voglio ridurre il codice". E io ho detto: "No, non è professionale. Questo è un cattivo codice".

Stavo discutendo molto con me stesso sull'OOP cercando di capire quali fossero i suoi vantaggi per me. Ho pensato: "Se risolvo perfettamente e facilmente i compiti senza OOP, perché dovrei usarla? Perché dovrei complicare anche cose semplici e chiare per me? Come, dove e perché dovrei mettere nel mio codice qualcosa che non mi serve?". Poi ho deciso che non ho bisogno di OOP perché faccio tutto da solo e sono molto bravo. Quando fai tutto da solo e non ti aspetti di tappare nulla e inoltre cerchi e trovi le soluzioni più efficaci, allora sorge una domanda naturale: "Perché altrimenti? Sembrerebbe che l'OOP dia conforto e ordine a un programma. Sì, è così. Ma io ho il mio ordine. La mia struttura personale. Le mie entità. Le mie regole. Allora perché dovrei rifiutarlo?

Proprio come il nostro corpo rifiuta il tessuto di altre persone, io non potevo "fondermi" con il prodotto dei pensieri di altre persone. Ovunque e in ogni cosa mi sentivo rifiutato. Per me, l'OLP era un ordine creato dal pensiero di qualcun altro e non ha superato il mio test di efficacia. È stato questo test il fattore decisivo per me. Ho capito che se uso OOP sarò un programmatore più debole che se vado per la mia strada e risolvo tutti i problemi da solo. La mia "forza di programmazione" è che scrivo in un linguaggio russo comprensibile, uso una memoria globale condivisa per gli oggetti grafici, che chiamo "kernel" e creo meccanismi grandi e complessi che lavorano con questo kernel. Questo è il mio approccio.

Non programmerò OOP finché qualcuno non mi sconfiggerà con questo approccio. Finché non fa quello che faccio io, ma in modo ancora più efficace.

Ho chiesto di kanvas perché volevo capire perché il mio meccanismo risulta essere più efficace nei fatti. Non nelle teorie, non nella bellezza del codice, ma nella pratica.

Comunque, grazie Nikolay per avermi ispirato e guidato. ))

 
Реter Konow:

...

Non programmerò OOP finché qualcuno non mi batterà con questo approccio.

...


Quel qualcuno è probabilmente uno di quei mulini a vento che combatti così freneticamente nella tua immaginazione. )
 
Anatoli Kazharski:

Questo qualcuno deve essere uno di quei mulini a vento che combatti così freneticamente nella tua immaginazione. )
Ecco fatto! I troll stanno arrivando...))
 
Реter Konow:
Ecco fatto! I troll stanno arrivando...))
Calmati Peter. Sono solo dei mulini. Stanno semplicemente lì, svolgono una certa funzione e non cercano di batterti. Anche se chissà come viene visualizzato nella vostra fertile immaginazione. Da tutte le apparenze, sembra molto spettacolare. )
 
Реter Konow:

Non sono assolutamente un fan dell'OOP, ma bisogna conoscerla e saperla usare chiaramente se ci si considera un programmatore, almeno per l'autoformazione.

Ma usarlo o meno per risolvere i vostri compiti applicativi dipende da voi.

 
Anatoli Kazharski:
Calmati Peter. Sono solo dei mulini. Stanno solo in piedi, svolgendo una certa funzione e non cercando di batterti. Anche se chissà come viene visualizzato nella vostra fertile immaginazione. Da tutte le apparenze, sembra molto spettacolare. )

Anatoly, mulini o no, mi piace combattere e vincere. Soprattutto in quello in cui sono bravo. Mi piace la competizione dal vivo, i duelli e il resto... Fa tutto parte dell'evoluzione e della selezione naturale. Quindi va bene... Basta che le regole siano giuste.

Collaborare con persone che la pensano come me, partecipare a progetti comuni, lavorare come parte di una squadra è anche bello. E l'immaginazione, ovviamente, non deve sostituire la realtà. Se è questo che intende, sono d'accordo.

 
Комбинатор:

... Ma devi conoscerlo e saperlo usare chiaramente se ti consideri un programmatore, almeno per l'autoformazione.

Ma sta a voi decidere se usarlo o meno per risolvere i vostri problemi applicativi.

Non si può non essere d'accordo con questo.
 
Реter Konow:

Non programmerò OOP finché qualcuno non mi sconfiggerà con questo approccio. Finché non ci fanno quello che faccio io, ma in modo ancora più efficiente.

Ho chiesto di kanvas perché volevo capire perché il mio meccanismo risulta essere più efficace nei fatti. Non nelle teorie o nella bellezza del codice, ma nella pratica.

In ogni caso, grazie Nikolay per avermi ispirato e guidato. ))

Se due programmatori con la stessa esperienza e intelligenza sono in competizione mentre creanograndi progetti simili. Ma il primo usa solo funzioni, mentre il secondo usa funzioni e classi. Il secondo vincerà sicuramente. Ma, ripeto, se si tratta di un progetto voluminoso, quest'ultimo lo renderà più veloce perché ci saranno meno bug e più ordine. E il prodotto del secondo sarà più leggibile, mantenibile e più facilmente aggiornabile e integrabile. Questo non è nemmeno il mio imho, è solo una dichiarazione di fatto. È più facile scavare una buca con una pala che con una cazzuola. Se tu implementassi il tuo meccanismo non solo sulle funzioni, ma anche sulle classi, diventerebbe più efficiente. Questo è il mio imho.

E, Peter, ho dato una rapida occhiata al tuo codice e mi sono reso conto che stai usando canvas al massimo (anche se non la classe CCanvas, ma a chi importa). Allora perché tutte queste domande sulla tela e perché sto cercando di spiegare tutte queste cose qui? :)).

Motivazione: