Fazendo um projeto de crowdsourced em Tela - página 23

 
Реter Konow:

))) Então por que eu comecei este tópico? ) Vou estudar agora o OOP.


Essa é a vantagem do seu caminho - da prática à teoria. Eu também já fiz isso. Meu instinto costumava resistir ao paradigma OOP por muito tempo, porque comecei a programar quando ele não existia na natureza. Mas agora entendo que esta é a invenção mais valiosa na programação. E às vezes me parece que se o AOP não tivesse sido inventado até agora, eu mesmo o teria inventado :))
Você, Peter, vai gostar e ficará encantado quando perceber as maravilhas do OOP e as oportunidades que ele abre. Garanto-lhe :))). E não há nada de complicado e confuso no OOP, especialmente para você com sua experiência em programação. E me parece que, no seu caso, a documentação do Metacvots pode até ser suficiente para chegar ao fundo da questão. Há muita literatura por aí.
Tag Konow:

Mas Nikolay, eu ainda não entendo o que eu estava perguntando - existe a possibilidade de definir uma cor específica para linhas de gradiente da moldura na classe CCcanvas? Olhando para o seu exemplo, você pode pensar que há... Em caso afirmativo, você pode desenhar algo semelhante ao meu exemplo?

OK, OK. Embora não seja um tópico deste tópico, mas tentarei esclarecer coisas que parecem óbvias para programadores conhecedores, mas não óbvias para programadores que se deparam com a Tela pela primeira vez.
Então, o que é Tela. Traduzido do inglês, é uma tela. Trata-se simplesmente de qualquer área da tela dentro de uma janela à qual é anexada. Suas principais características são seu tamanho (Largura e Altura). E na verdade, é uma matriz unidimensional de pontos do tipo uint (4 bytes) com tamanho Largura*Altura. Na implementação da classe CCanvas esta matriz é chamada de m_pixels, e por padrão é privada (o que significa que é acessível somente dentro da classe), mas eu pessoalmente sempre a torno pública (acessível não somente dentro da classe, mas também em aplicações do usuário), porque eu quero operar com a matriz de dados diretamente. Cada ponto nesta tela pode ter qualquer valor de tipo de cor (também 4 bytes como uint, um byte reservado), o que significa um ponto de qualquer cor RGB. Cada cor (vermelho, verde ou azul) corresponde a um byte (256 valores), portanto há 256*256*256=16.777.216 cores RGB no total.

Para colocar um ponto vermelho nas coordenadas X, Y, onde X pode tomar valores de 0 até (Largura-1) e Y de 0 até (Altura-1) basta atribuir um valor vermelho a uma célula de array m_pixels numerados (Y*Largura+X) :

m_pixels[Y*Width+X]=clrRed;

ou o que é o mesmo:

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

Isso é TUDO!!!
Agora você não pode nem mesmo usar funções embutidas da classe CCanvas (o que é uma tolice, porque há muitas coisas úteis lá). Se você pode colocar um ponto na tela em qualquer lugar e em qualquer cor - você Deus o que quiser e desenhá-lo: botões, gráficos, criar seu próprio GDI, etc., etc.

E se alguém pensa que o kanvas é lento, está errado. Kanvas é incrivelmente rápido e é um crédito para a equipe de desenvolvimento. Eu testei a velocidade de desenho do Kanvas muitas vezes usando bibliotecas Dll escritas em C++ também. Agora depois da atualização do último ano, a tela no MT5 é quase tão rápida como se você a tivesse escrito no Visual Studio em C++. É apenas 10-15% mais lento. E não se esqueça - o Windows está escrito em C++ e é tudo Tela. Esta é a beleza e a promessa do MT5 com sua MQL5!!! Nem Java nem C# serão capazes de se gabar de tal velocidade, como alguns já escreveram neste tópico.

Não é por nada que os desenvolvedores introduziram recentemente uma nova propriedade CHART_SHOW para desativar a renderização gráfica.
Vou demonstrar isto com um exemplo de um roteiro:

//+------------------------------------------------------------------+
//|                                                  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(); // Теперь выводим это на экран
  }

Funcionamento deste roteiro:


A tela é limpa, mas o acesso às citações permanece e podemos usar esta tela em branco para fazer nossa própria interface gráfica, tal como esta com um gradiente:


Regex Konow:

Mas Nikolai, eu ainda não entendi o que estava perguntando - existe uma opção na classe CCcanvas para definir uma cor específica para as linhas de gradiente da moldura? Olhando para o seu exemplo, pode-se pensar que há... Em caso afirmativo, você pode desenhar algo semelhante ao meu exemplo?

A cor é definida dentro da classe GButton, e há até duas funções para misturar as duas cores e criar uma gama de cores para fluir de uma cor para outra, ou seja, apenas para o gradiente. É apenas uma questão de definir o conceito de gradiente. No meu entendimento, um gradiente (ou preenchimento de gradiente) é um fluxo suave de uma cor para outra. Em seu exemplo não há gradiente, apenas 4 cores. No meu exemplo, dentro da classe GButton, 4 cores adicionais são formadas com brilho diferente da cor e uma variedade de cores é formada para o preenchimento do gradiente. Isto é feito precisamente para facilitar a vida do usuário final da classe. Por que ele deveria se preocupar com a formação dessas cores?
Desenhe algo semelhante ao seu exemplo - é o seu dever de casa, Peter :)) Vamos lá, comece a entender as aulas, daí o OOP.
Boa sorte!
 
Nikolai Semko:

Boa sorte!

OK, Nikolai. Obrigado e boa sorte para você também!
 
Nikolai Semko:

Nikolai, eu queria responder ao seu posto informativo ontem, mas não consegui coletar minhas idéias. Agora eu reuni meus pensamentos e percebi que preciso escrever do meu coração, não da minha mente, caso contrário não explicarei nada. É claro que seria fora de tópico e os moderadores provavelmente o apagariam, mas mesmo assim...

O que você escreve sobre o OOP é inspirador. Eu já iniciei o estudo com a intenção séria de dominá-lo. Entretanto, no processo de aprendizagem, fui constantemente bombardeado com perguntas da categoria "por que tomar o caminho mais longo quando há um atalho? Eu via constantemente maneiras fáceis, concisas e claras de resolver problemas, e era como se me dissessem: "Não! No OOP, isto não é uma solução. Você tem que fazê-lo de uma forma formal, formal e nobre". Em resposta, eu me perguntei: "Mas como pode ser? Eu não preciso dessas entidades. Por que eu deveria adicioná-los ao código? Eles são supérfluos. Eu quero comprimir o código". E eu disse: "Não, não é profissional". Isso é código ruim".

Eu estava discutindo muito sobre o assunto do OOP, tentando descobrir quais eram suas vantagens para mim. Eu pensei: "Se eu resolvo tarefas perfeitamente bem e facilmente sem OOP, por que eu deveria usá-lo? Por que eu deveria complicar adicionalmente as coisas simples e claras para mim? Como, onde e por que eu deveria colocar algo em meu código que eu não preciso?". Então decidi que não preciso de OOP porque eu mesmo faço tudo e sou muito bom nisso. Quando você faz tudo sozinho e não espera conectar nada e além disso procura e encontra soluções mais eficazes, surge uma pergunta natural: "Por que mais? Parece que o OOP lhe dá conforto e ordem a um programa. Sim, é verdade. Mas eu tenho meu próprio pedido. Minha própria estrutura. Minhas próprias entidades. Minhas próprias regras. Então, por que eu deveria rejeitá-lo?

Assim como nossos corpos rejeitam tecido alienígena, também eu não podia "fundir-me" com o produto do pensamento alienígena. Em todos os lugares e em tudo me senti rejeitado. Para mim, a OLP foi uma ordem criada pelo pensamento de outra pessoa e não passou no meu teste de eficácia. Foi este teste que foi o fator decisivo para mim. Percebi que se eu usar o OOP serei um programador mais fraco do que se eu seguir meu próprio caminho e resolver todos os problemas sozinho. Minha "força de programação" é que escrevo em uma linguagem que compreendo em russo, uso uma memória global compartilhada para objetos gráficos, que chamo de "kernel" e crio mecanismos grandes e complexos que funcionam com este kernel. Esta é a minha abordagem.

Não programarei o OOP até que alguém me derrote com esta abordagem. Até que façam com ela o que eu faço, mas ainda mais eficientemente.

Perguntei sobre o kanvas porque queria entender por que meu mecanismo acaba sendo mais eficaz de fato. Não em teorias, não em códigos de beleza, mas na prática.

De qualquer forma, obrigado Nikolay por me inspirar e orientar. ))

 
Реter Konow:

...

Eu não programarei o OOP até que alguém me bata com esta abordagem.

...


Que alguém é provavelmente um daqueles moinhos de vento que você luta tão freneticamente em sua imaginação. )
 
Anatoli Kazharski:

Este alguém deve ser um daqueles moinhos de vento que você luta tão freneticamente em sua imaginação. )
Aí está! Trolls estão chegando...))
 
Реter Konow:
Aí está! Trolls estão chegando...))
Acalme-se Peter. Eles são apenas moinhos. Eles apenas ficam ali, desempenham uma determinada função e não tentam lhe bater. Embora quem sabe como ela é visualizada em sua imaginação fértil. De todas as aparências, ele parece muito espetacular. )
 
Реter Konow:

Eu não sou absolutamente um fã do OOP, mas você deve saber e ser capaz de usá-lo claramente se você se considera um programador, pelo menos para o bem da auto-educação.

Mas usá-lo ou não para resolver suas tarefas de aplicação depende de você.

 
Anatoli Kazharski:
Acalme-se Peter. Eles são apenas moinhos. Eles estão apenas de pé, desempenhando uma determinada função e não tentando derrotá-lo. Embora quem sabe como ela está sendo visualizada em sua imaginação fértil. De todas as aparências, ele parece muito espetacular. )

Anatoly, moinhos ou não, eu gosto de lutar e vencer. Especialmente naquilo em que eu sou bom. Gosto de competição ao vivo, duelos e outras coisas... Tudo isso faz parte da evolução e da seleção natural. Então está tudo bem... Desde que as regras sejam justas.

Colaborar com pessoas que pensam da mesma forma, participar de projetos comuns, trabalhar em equipe também é legal. E a imaginação, é claro, não deve substituir a realidade. Se é isso que você quer dizer, eu concordo.

 
Комбинатор:

... Mas você deve saber e ser capaz de usá-lo claramente se você se considera um programador, pelo menos por uma questão de auto-educação.

Mas cabe a você utilizá-lo ou não para resolver seus problemas de aplicação.

Não se pode discordar disso.
 
Реter Konow:

Não programarei o OOP até que alguém me derrote com esta abordagem. Até que façam com ela o que eu faço, mas ainda mais eficientemente.

Perguntei sobre o kanvas porque queria entender por que meu mecanismo acaba sendo mais eficaz de fato. Não em teorias ou códigos de beleza, mas na prática.

Em qualquer caso, obrigado Nikolay por me inspirar e orientar. ))

Se dois programadores com experiência e inteligência iguais estão competindo enquanto criamgrandes projetos similares. Mas a primeira utiliza apenas funções, enquanto a segunda utiliza funções e classes. O segundo certamente ganhará. Mas, repito, se for um projeto volumoso, este último o fará mais rápido porque haverá menos bugs e mais ordem. E o produto do segundo será mais legível, de manutenção e mais facilmente atualizado e complementado. Esta nem sequer é a minha imho, é apenas uma declaração de fato. É mais fácil cavar um buraco com uma pá do que com uma colher de pedreiro. Se você implementasse seu mecanismo não apenas em funções, mas também em classes, ele se tornaria mais eficiente. Essa é a minha imho.

E, Peter, dei uma rápida olhada em seu código e percebi que você está usando tela em toda a sua extensão (embora não na classe CCanvas, mas quem se importa). Por que todas essas perguntas sobre telas e por que estou tentando explicar todas essas coisas aqui? :)).

Razão: