Domanda

so che senza controlli non sono magia.Un controllo privo di finestra può avere stato attivo per l'input (ad es.Internet Explorer).Stato attivo per l'Input è niente di più che il disegno sia:

e quando l'utente inizia a schiacciare i tasti, reagendo in modo appropriato.Si sapere i tasti sono pensati per che concentrato di controllo, perché il controllo è attivo.

Nel caso del mio (Windows®) finestra, avrei bisogno di sapere che il mio privi di finestra figlio di controllo (let's fingere è un discendente di TGraphicControl) ottiene gli eventi di tastiera.Così durante il mio modulo OnKeyDown, OnChar, OnKeyUp, avrei bisogno di fingere che stanno andando per la mia privi di finestra figlio di controllo.

Che posso fare, ma è un dolore.

Ma poi l'utente, probabilmente si desidera utilizzare Scheda di navigazione, e dovrò in qualche modo intercettare Delphi normale scheda di controllo di gestione dell'ordine, e il gancio in me stesso per dire che questa cosa è la prossima (e precedenti) in ordine di tabulazione.

Che posso fare, ma è un dolore.

E poi c'è ActiveControl, che non capisce nulla, tranne TWinControl's.Quindi, se Delphi prova mai a capire chi ha il focus, andrà pazzo.Quindi mi piacerebbe avere un'implementazione alternativa di ActiveControl.

Che posso fare, ma è un dolore.

In altre parole: questa è semplicemente troppo lavoro? sto combattendo cosa che Delphi è, in modo che io possa avere una qualche decina di controlli senza finestra accessibile tramite input da tastiera?Delphi progettisti mai contemplato con interactive senza controlli, e se provo ora a lavorare, sarò bloccato a hurtlocker?

Delphi mi ha dato la possibilità di aiutare me volentieri, ma mi hanno scelto la strada del dolore.


Qualche spiegazione ulteriore di controlli senza finestra è necessaria.

Non ogni controllo, di interagire con i, deve essere un controllo di windows.È possibile avere l'attenzione, e inviare l'input da tastiera, un controllo che non è una finestra di Windows.

Per esempio, quasi ogni controllo si vede in una finestra del browser Internet Explorer è un controllo privo di finestra.Nella seguente immagine puoi vedere un modifica di controllo, in cui puoi scrivere, e un pulsante (in questo screenshot) è attivo:

alt text

Si può vedere la linea tratteggiata in rettangolo, e il pulsante è di colore bluastro (che su Windows indica che è attivo).

Se dovessi premere Barra spaziatrice mentre il Google Search il pulsante è attivo, sarebbe premere il pulsante.Il motivo per cui funziona è perché Microsoft ha scritto un intero widget libreria di controlli.Questi controlli guardare e sentire (quasi) esattamente come i normali controlli comuni - sono quasi cloni esatti dei controlli comuni di Windows, fino ai temi di essere applicata.

Mozilla Firefox e Google Chrome anche usare un widget libreria di controlli.Non utilizzare Microsoft built-in controlli con finestre, ma invece di usare una libreria di grafica interattiva, senza finestre widget.

E se si dispone di un adeguato ambiente di sviluppo, quindi privi di finestra widget funzionano solo come "normale" finestre controlli.GTK+ è un widget library, e Glade è un IDE che permette di controlli di layout in quel widget library.

non so in che ambiente di sviluppo di Firefox, Chrome, o Blender sono stati creati, ma la loro widget di supporto senza controlli.


Così ora sulla mia domanda.

Se non mi sbaglio, a me sembra che anche se Delphi supporta una base TControl, (che è la larghezza, l'altezza, e in grado di dipingere se stesso), non può ricevere il focus della tastiera.Mi sembra che Borland mai progettato VCL di Delphi come un generico widget library.L'unica prova che ho a sostegno di questo è che un Modulo ActiveControl è un TWinControl:

property ActiveControl: TWinControl;

Questo non significa che Delphi potrebbe essere, o deve essere, limitato a controlli con finestre.La VCL widget libreria può essere esteso per supportare dando fuoco a controlli senza finestra.

Ma forse Delphi già supporta controlli senza finestra, e io proprio non ne rendiamo conto?C'è già un meccanismo di Delphi supporto, dando fuoco a TControl's?Ma io sono un ragionevolmente ragazzo intelligente, e sono abbastanza sicuro che VCL di Delphi non può fare ciò che gli altri widget che le biblioteche possono fare.

Il che porta ad un'altra domanda: quanto lavoro sarebbe essere sottoclasse di forme e tali che la supportano? C'è qualcun altro là fuori, forse qualcuno TeamB, che è molto più intelligente di me, che ha già provato, ed è giunta alla conclusione che è impossibile?

mi sto chiedendo ora, davanti a tutti, se si tenta di aggiungere senza il supporto del controllo è dannatamente quasi impossibile (cioèinutile) in modo che io non intere settimane su di esso per niente.sto cercando di sfruttare le conoscenze di una comunità di sviluppatori Delphi.

mi sto ponendo una domanda.

È stato utile?

Soluzione

È inutile costruire senza controlli e li adattano VCL di Delphi quadro.

Si apre Internet Explorer, ad esempio.Ma in quel caso, è interamente responsabile di tutto ciò che risiede su di esso.Ha al suo interno un concetto di ciò che il controllo attivo è, ma pensare a quello che sembra dall'esterno:E ' solo un gigante di controllo.Quando si chiede il sistema operativo che ha il focus, l'unico browser di controllo ha, non importa quale browser subcontrols appare per avere la messa a fuoco.

Quando si preme il tasto Tab, si guarda al sistema operativo, come se il browser è semplicemente consumato un carattere di tabulazione, proprio come i controlli di modifica fare.I controlli di modifica spostare il cursore sopra un paio di spazi e aggiungere i caratteri di tabulazione loro interno buffer;controlli del browser spostare il cursore in un'altra regione del display.

Stai pensando di fare tutto questo su un Delphi TForm.Delphi forme già un framework per la gestione il controllo e la gestione della tastiera, e si sta andando ad avere per combattere tutto questo.Se si desidera che i controlli privi di finestra, vai in Internet Explorer percorso e costruire il proprio controllo contenitore a tenere loro in modo che si può rimanere in carica di tutto ciò che accade al suo interno.

Il contenitore può essere un VCL di controllo, ma le cose che si mette su di esso, probabilmente non sarà ancora essere in attesa di utilizzare il VCL messa a fuoco e tastiera regole di gestione.Si noti come non si può mettere ordinaria i controlli di Windows Internet Explorer, sia.Nulla è messo lì deve passare attraverso specifici ActiveX interfacce.Forse avrete bisogno di interfacce, troppo, o forse si può semplicemente fare il vostro proprio insieme di classi di controllo che scendono da alcuni particolari antenato classe di progettazione per lavorare con il vostro contenitore.Non iniziare con TGraphicControl;è troppo radicata nella VCL per essere utilizzabile come base per il ramo libreria di controllo.

Sarà un sacco di lavoro, ma poi di nuovo, quindi era di Internet Explorer.

Altri suggerimenti

Sì, è inutile.
E non è Delphi colpa, sei solo la lotta di Windows stesso.
Se avete bisogno di un controllo che si comporta come un controllo con finestra, utilizzare uno finestrato uno.
E hai ragione, cercando di ricreare l'intero stack API di controlli con finestre da zero è un dolore.

Yup, è praticamente l'hanno capito.Utilizzando i controlli privi di finestra significa che si perde tutto ciò che di Windows può fare per voi.Avere più di una coppia su una singola finestra reale è il dolore.

La maggior parte di questi programmi sono stati più probabile che non è stato originariamente sviluppato utilizzando RAD tipo di strumenti non aveva scelta, ma per re-inventare la ruota.Uno dei maggiori vantaggi di Delfi è il profondo VCL e 3rd party componente di supporto per fornire il look che più ti piace.

Una tecnica che ho utilizzato con successo per ridurre la quantità di maniglie per finestre, utilizzato in un complesso (preparazione di imposta) modulo di base di applicazione per disegnare il testo su una tela, e si è trasferito un singolo TCustomEdit discendente per la posizione che l'utente è stato la modifica.Era banale per catturare la SCHEDA/tasti Up/Down e spostare la modifica nella posizione appropriata.La sfida che abbiamo scoperto è che nel disegno di una vasca rettangolo intorno al mouse aleggiava campo.Abbiamo finito con una griglia gamma di TObject, dove l'elemento di matrice sarebbe nulla (nessun campo), una TLIst (griglia contiene più campi) o di una classe che conteneva il nostro campo descrittore.Questo riduce la quantità di gamma controlli eseguiamo dal momento che è più probabile che la scatola contiene solo un singolo campo, o, al massimo, 4 campi.

fpGUI Toolkit è un esempio di ciò che si desidera.L'ultima fpGUI codice nel repository del codice sorgente è basata su un'architettura multi-finestra di progettazione.Semplice significa che ogni widget/componente dispone di un handle di finestra, ma Windows o Linux non fa nulla con finestra, altro che di base i messaggi di notifica (mouseenter, mouseexit, ecc).fpGUI ha ancora il pieno controllo su cui ogni componente va, se sono attivabili, come sembrano, etc.Alcuni widget/componenti fpGUI non sono finestrato componenti troppo.ad esempio:TfpgScrollbar, TfpgMainMenu, il pulsante in una ComboBox etc.

Se si desidera un vero non finestrato versione, significa che c'è solo una finestra di livello superiore che dispone di un handle di finestra, tutti gli altri widget/componenti all'interno della finestra, in realtà non esiste il sistema operativo (non hanno handle di finestra), quindi fpGUI può aiutare troppo.Il progetto iniziale di fpGUI Toolkit è basata su un disegno.Di nuovo, guardare nel repository del codice sorgente per la v0.4 ramo di codice.Io che di design, fpGUI dovuto gestire tutto, la creazione di mouseenter/mouseleave eventi, tradurre sistemi di coordinate per i componenti contenitore, maniglia (falso) componente concentrarsi stati ecc...Sì, il progetto iniziale è un SACCO di lavoro, ma poi hai un portatile quadro che può essere facilmente applicato ad altri Sistemi operativi troppo.

E sì, fpGUI è completamente implementato in Object Pascal lingua utilizzando il compilatore Free Pascal per darmi supporto cross-platform.Attualmente fpGUI gira su Windows, Linux (32 & 64-bit), Windows Mobile e Linux Embedded (BRACCIO) dispositivi.

Non ho idea di che cosa il vostro problema è, qui, ma credo che questo po ' di storia può essere rilevante...

Abbiamo un'applicazione che riempie una dozzina di forme.L'utente può compilare altri moduli, e anche modificare i valori compilato dall'applicazione della stessa.

Ora, nella nostra prima attuazione, abbiamo utilizzato finestrato componenti per ogni singolo campo di input, in modo che i campi potrebbero ricevere lo stato attivo per l'input.Che si è rivelato essere un grosso problema, perché tutto questo windows ha un sacco di risorse.

Ora abbiamo controlli privi di finestra per ogni campo di input.Ciò significa che tutti abbiamo, è una combinazione di disegno della forma e dei suoi campi di input.Quando l'utente fa clic all'interno del disegno, o utilizza alcune combinazioni di tasti per spostare/impostare la messa a fuoco, si crea una nuova finestra di controllo per la cliccato campo.Quando l'utente si sposta al campo di immissione successivo, si distrugge la prima finestra e crearne uno nuovo.In questo modo abbiamo solo uno con finestra di controllo che ancora una volta ci ha dato un bel miglioramento in termini di velocità.

Di nuovo non ho idea di che cosa realmente desidera gestire.TWinControl è un TWinControl per un motivo, ma ci può essere una soluzione a ciò che si desidera, che cosa mai che sarebbe...

Penso fgGUI può essere molto utile.

Fare controllare il suo Wiki per prima.

Penso che si può utilizzare questo framework per l'applicazione in Delphi come è scritto totalmente in Pascal.In realtà è basato su FreePascal ;)

HTH

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top