Fare un progetto in crowdsourcing su Canvas - pagina 13

 
Igor Volodin:


Per me, è più facile creare un team di sviluppo del prodotto, i cui membri, in misura concordata, riceveranno un profitto dalle vendite del prodotto (forse qualcuno è l'ideologo del progetto, qualcuno finanzia per una quota, qualcuno è il programmatore).

E dato che tutti sono motivati finanziariamente, per implementare anche le librerie necessarie per l'interfaccia come parte del progetto.

d'accordo, ma la biblioteca stessa dovrebbe essere open source (crowdsourced)
 
o_O:
Igor Volodin:


Per me, è più facile creare un team di sviluppo del prodotto, i cui membri, in misura concordata, riceveranno un profitto dalle vendite del prodotto (forse qualcuno è l'ideologo del progetto, qualcuno finanzia per una quota, qualcuno è il programmatore).

E poiché tutti sono finanziariamente motivati - per implementare all'interno del progetto e le librerie necessarie per l'interfaccia.

Sono d'accordo, ma la libreria stessa dovrebbe essere open-source crowdsourced).
Ho letto il thread e non ho capito per cosa è necessario - per disegnare il pulsante su tela da zero. Puoi spiegare senza emozioni?
 
Alexey Volchanskiy:
Ho letto il thread e ancora non capisco perché sia necessario disegnare un pulsante su Canvas da zero. Puoi spiegare senza emozioni?
Ho scelto tra ObjectCreate e ResourceCreate.
perché gli sviluppatori di MT non sono onnipotenti ed è dispendioso in termini di tempo disturbarli con richieste insignificanti
 

Perché potrebbe essere utile:

1. l'interfaccia della bitmap è veloce. Così veloce che è quasi indistinguibile da quella del sistema. Per esempio, ho implementato elementi semitrasparenti con gradienti eanche quando si muovono sono resi in modo fluido senza ritardi visibili, tenendo conto della miscelazione dei colori e del calcolo del canale alfa su altri oggetti con gradienti semitrasparenti.

2. l'interfaccia è scalabile. Potete rendere l'applicazione più complessa e non rallenterà a causa della cancellazione e della creazione di un gran numero di oggetti del grafico. I costi di ridisegno sono minimi, appena un millesimo di secondo.

3. si possono creare controlli già pronti e se ne possono creare di nuovi, poiché si può fornire il proprio pool di eventi, per esempio:

OnMouseDown - ha premuto la LKM

OnMouseUp - ha premuto la LKM

OnMouseHoverOn - fa passare il cursore del mouse sopra un oggetto

OnMouseHoverOut - sposta il cursore del mouse dall'oggetto

OnMouseClick - preme e clicca entro i confini dell'oggetto

OnMouseDblClick - doppio clic del mouse entro i limiti dell'oggetto

OnDragStart - evento che si verifica una volta all'inizio del movimento con il tasto sinistro del mouse premuto

OnDragMove - evento generato durante il movimento con il tasto sinistro del mouse

OnDragEnd - evento generato dopo lo spostamento con LKM

OnPut - l'oggetto è castato in un altro oggetto

OnGet - l'oggetto viene scaricato in un altro oggetto

OnFocus - l'oggetto è stato messo a fuoco

OnBlur - l'oggetto perde il focus

OnResize - l'oggetto ha cambiato dimensione

OnParentResize - l'oggetto padre ha cambiato dimensione

OnKeyPress - tasto premuto

OnChange - valore di un campo cambiato

ecc.

 
Igor Volodin:

Perché potrebbe essere utile:

1. l'interfaccia della bitmap è veloce. Così veloce che è praticamente indistinguibile dall'interfaccia del sistema. Per esempio, ho implementato elementi semitrasparenti con gradienti eanche quando si muovono, sono resi in modo fluido senza alcun ritardo visibile, tenendo conto della miscelazione dei colori e del calcolo del canale alfa su altri oggetti con gradienti semitrasparenti.

2. l'interfaccia è scalabile. Potete rendere l'applicazione più complessa e non rallenterà a causa della cancellazione e della creazione di un gran numero di oggetti del grafico. Il costo del ridisegno è minimo, è solo una sostituzione dell'immagine in un millesimo di secondo.

3. si possono creare controlli già pronti e se ne possono creare di nuovi, poiché si può fornire il proprio pool di eventi, per esempio:

OnMouseDown - ha premuto la LKM

OnMouseUp - ha premuto la LKM

OnMouseHoverOn - fa passare il cursore del mouse sopra un oggetto

OnMouseHoverOut - sposta il cursore del mouse dall'oggetto

OnMouseClick - preme e clicca entro i confini dell'oggetto

OnMouseDblClick - doppio clic del mouse entro i limiti dell'oggetto

OnDragStart - evento che si verifica una volta all'inizio del movimento con il tasto sinistro del mouse premuto

OnDragMove - evento generato durante il movimento con il tasto sinistro del mouse

OnDragEnd - evento generato dopo lo spostamento con LKM

OnPut - l'oggetto è castato in un altro oggetto

OnGet - l'oggetto viene scaricato in un altro oggetto

OnFocus - l'oggetto è stato messo a fuoco

OnBlur - l'oggetto perde il focus

OnResize - l'oggetto ha cambiato dimensione

OnParentResize - l'oggetto padre ha cambiato dimensione

OnKeyPress - un tasto premuto

OnChange - valore di un campo cambiato

ecc.

Esauriente, grazie!

 
Leggi il thread, interessante. È un peccato che non ci sia stato un tale putiferio sulle interfacce circa 3 anni fa.

Non vedo alcun senso nel postare il mio codice poiché c'è un'alta probabilità che l'iniziativa muoia a causa della pigrizia e delle difficoltà di comunicazione tra i partecipanti (e sono già osservate) il mio codice sarà trascinato via in cantina per la revisione e io (e la comunità) non ne trarremo alcun beneficio.

Ma per partecipare al progetto ho potuto, a partire dalla discussione delle caratteristiche necessarie e casting dettagli specifici di attuazione, in quanto vi è un vantaggio in tale, chiamiamolo un quadro.

Il beneficio è semplice, espresso da Alex nei primi post. La comunità può influenzare gli sviluppatori del terminale per introdurre modifiche nella piattaforma MQL.

Le mie speranze di miglioramento (direttamente legate alle interfacce di programmazione) sono le seguenti:

  1. Applicazione MQL - come un tipo separato di programma che non annulla gli altri (non ha onTick e nessuna possibilità di fare riferimento al simbolo predefinito - è una reliquia del passato, ma con la possibilità di ottenere un ambiente di trading di qualsiasi simbolo e commercio, perché tutto è multicurrency), l'applicazione non dovrebbe iniziare sul grafico di un particolare simbolo, ma nella propria finestra. Se trascinate un tale programma su un grafico, si aprirà una nuova finestra. E il drag and drop non è necessario - 2 clic nel navigatore - apre anche una nuova finestra. Questo è simile alla richiesta di alcune persone di fornire API al terminale per lo sviluppo in un altro linguaggio. Sviluppare l'argomento - può essere assunto che un tale programma, appositamente compilato, può essere eseguito senza un terminale (e per motivi di sicurezza, permettere questa compilazione solo attraverso il mercato). Può sembrare assurdo, ma se fosse così?
  2. Supporto per i font vettoriali di terze parti presentati come un file separato e la possibilità di compilare come risorsa (dichiarato nella documentazione, ma non implementato)
  3. Cattura dell'evento di scorrimento del mouse
  4. Blocco del menu con il tasto destro del mouse. Il pulsante destro è ora gestito, ma è inutile.
  5. Gestione degli appunti di sistema, per creare i propri controlli di modifica del testo (incluso l'editor multi-linea), la barra spaziatrice e l'invio possono già essere bloccati - bene.
 

@Igor Volodin, @Combinator, @Anatoli Kazharski

Comincerò con l'argomento dolente).
La questione che mi preoccupa di più è una sorta di universalità/astrazione per la memorizzazione dei parametri di rendering.

----

Come si capisce, tutti i controlli usano allo stesso modo il carattere, il colore dello sfondo e il colore del testo, ecc.
Quando tutti questi parametri sono uguali per tutti i controlli, allora l'interfaccia ha un aspetto comune con un unico concetto.

Ma come memorizzarli? perché i controlli non usano sempre tutti i parametri.
+ Il sistema è complicato dal fatto che gli elementi hanno diversi stati che dovrebbero usare i colori del carattere e dello sfondo in modo diverso. Sono Active, Disable, Over, o Select, ecc.
+ ci sono gruppi di controllori - rilievo (come Button) e campi di input (come Edit, List), e quando è lo sfondo per renderli

----

Nell'attuale idea di lavoro ho un elemento di attributo minimo di classe GAttribBase, che contiene 5 parametri di base (carattere/dimensione, colore di sfondo/bordo, dimensione del bordo)

Questi elementi di base sono utilizzati per formare un array per gli stati della classe GAttribut(Active/Disabvle/Over/Select, ecc.).

E poi GAttribut è popolato per i diversi tipi di elementi - Rilievo, modificabile, ecc.


Così, compiliamo i parametri di rendering una volta (li memorizziamo in xml), possono essere modificati per creare diversi design e li usiamo globalmente senza definirli per ogni controller.

Naturalmente, se qualche controllore ha bisogno di avere i propri parametri di rendering definiti - basta creare il proprio oggetto GAttributribut nel controllo e specificare i colori desiderati.

----

Questo modello funziona, il design unificato si ottiene in poco tempo, tutti i controlli prendono i colori dalla matrice comune.

Ma secondo me, non è universale. L'utente non capisce quali parametri della base GAttribBase sono usati per il rendering di questo o quel controllo.
Perché il codificatore sappia esattamente quale colore deve essere cambiato, dovrebbe guardare nella funzione di rendering del controllo. Il che è davvero fastidioso.

-----

Comunque, qualche idea per il codificatore per essere libero dalla gestione dei colori (per usare subito i colori predefiniti e non preoccuparsene all'inizio).

D'altra parte, se vuole ricolorare alcuni dei controlli sullo schermo, non deve indagare su quale GAttribBase è usato e in quale caso.

 
o_O:

@Igor Volodin, @Combinator, @Anatoli Kazharski

In generale - che idee avete per il codificatore per essere libero dal lavoro sui colori da un lato (in modo che usi subito i colori posati e non si preoccupi di loro all'inizio)

E d'altra parte, se vogliono ricolorare alcuni dei controlli sullo schermo, possono farlo senza entrare nel labirinto delle funzioni di disegno e cercare quale GAttribBase è usato e in quale caso.

Ok, temi.

Per esempio, l'oggetto principale della nostra applicazione, chiamiamolo App, è associato all'oggetto ConcreteTheme.

Cos'è un oggetto a tema:
colori (sfondo, primo piano, disabilitato, attivo, ecc.), dimensioni di base, dimensioni dei caratteri per i casi standard: titlesize, commonsize, ecc. sprites per: pannelli, pulsanti, caselle di controllo, ecc.

Un nuovo tema è una nuova classe/struttura con valori cambiati. Ma è meglio che i temi possano essere ereditati sovrascrivendo solo certi parametri.


Il resto - la gerarchia dei controlli in cui ogni controllore usa uno dei valori necessari dell'oggetto-tema per default. Se ha bisogno di sovrascrivere questo, chiamiamo un metodo per lavorare con quella proprietà, specificando il nuovo valore.

Per esempio SetBgColor(XRGB(255,0,128));

CView - una classe di base che fornisce un'interazione di base basata sugli eventi
- CRect - coordinate
- Cpanel ha un bgcolor
- CButton ha un oggetto stato, ogni stato ha bg
- CText ha un colore del testo e proprietà del carattere
- CCircolo

E così via.

Se vuoi usare xml per descrivere gli elementi,

poi per ogni controllo o primitiva di classe dobbiamo creare una classe generatrice chiamiamola "build-container" che mapperà gli attributi (bgcolor="(255,0,128)") ai metodi corrispondenti ( SetBgColor(attrValue) ) della classe. Tali contenitori di build saranno analizzati dal parser XML, l'output sarà un oggetto inizializzato con i valori necessari, o con quelli predefiniti se non sono stati specificati valori.

 

Qui Theme è uguale al mio - un insieme di GAttributors per diversi tipi di controlli e i loro stati.

ma tu suggerisci già il primo passo sulla via della trasparenza per i coder - aggiungere funzioni a controlli specifici per cambiare le loro proprietà di rendering (SetBgColor ecc.)

Fondamentalmente sono d'accordo, sarà chiaro quali colori ha e cosa può essere cambiato.


una tale domanda allora - Theme implica una ridondanza di parametri inutilizzati?

Diciamo che nel mio GAttribBase di base per qualche controllo (per esempio il pulsante) usiamo solo il colore di sfondo e la dimensione, e altri parametri - spessore del bordo ecc. non sono usati in questo controllo.

Cioè - avete un elemento di base per tutti i controlli? dove è memorizzata l'informazione "per tutti i casi", o tutti i controlli hanno solo i loro parametri senza l'overhead dell'universalità?

 
o_O:

...

In generale - quali sono alcune idee per il codificatore per essere libero dalla gestione dei colori (in modo che usi i colori di default e non si preoccupi di loro all'inizio)

E d'altra parte - in modo che se vuole ricolorare qualche controllore sullo schermo, non deve immergersi nel deserto delle funzioni di rendering e scoprire quale GAttribBase è usato e in quale caso.

Impostare i valori predefiniti per ogni voce. Se l'utente ha bisogno di cambiare qualcosa, per ogni proprietà dell'elemento dovrebbe esserci un metodo per impostare il nuovo valore. Questo è il modo in cui l'ho fatto ora.

Non ce l'ho ancora:

Se avete bisogno di cambiare le proprietà di tutti gli elementi in "due conti", allora basta creare metodi separati (per le proprietà comuni che sono legate al design e applicabili a tutti gli elementi) in quella classe dove tutti gli elementi dell'interfaccia sono accessibili.

In linea di principio, posso già vedere come questo potrebbe essere implementato nel mio schema. Per esempio, attraverso gli eventi. Ma poi nel gestore di eventi di ogni elemento è necessario gestire questo evento (il codice è gonfiato). Seconda opzione, creare un metodo pubblico speciale in una classe che gestisce gli eventi comuni della GUI, o anche più in alto, dove sono memorizzati tutti i puntatori agli elementi della GUI. Entrambi sono classi base della classe MQL-application personalizzata, e l'utente avrà accesso diretto a loro. Può essere qualcosa come i metodi ObjectSet sovraccaricati in MQL (per esempio,ElementSet), dove (1) proprietà e valore o (2) proprietà, modificatore e valore devono essere specificati.

Ma tutto questo è il mio ragionamento sul mio schema. Non escludo che cambierà ancora molto quando inizierò la transizione. Quindi tutto quello che ho scritto sopra potrebbe non essere più rilevante per l'argomento in discussione qui. )

Motivazione: