2012-06-02 13 views
7

Sto provando a creare un semplice "editor di proprietà" a due colonne basato su VirtualTreeView.Come mantenere vivo l'editor in Virtualtreeview?

(voglio imitare sguardo e l'esperienza utente visto su ispettore oggetto IDE di Delphi)


Il componente sta lavorando quasi e in grado di gestire più editori, ma io sono di fronte un fastidioso bug:

Quando faccio clic su un nuovo nodo (una nuova riga), il nodo viene selezionato e viene visualizzato l'editor, indipendentemente dalla colonna su cui ho fatto clic. È previsto e OK.

Quindi, quando faccio clic sulla prima colonna della stessa riga, mi aspetto di vedere il mio contenuto dell'editor convalidato e l'editor che mantiene l'attenzione (come nell'oggetto di ispezione dell'oggetto delphi).

Ma il contenuto dell'editor viene convalidato, quindi scompare e viene selezionato l'intero nodo (riga). L'editor non tornerà (anche se clicco sulla seconda colonna), finché non seleziono un altro nodo e clicco sul nodo precedentemente selezionato.

MODIFICA: aggiunta illustrazione e precisione sul mio codice.

illustration of the problem

sul codice: io non ho inserito il codice qui perché ho usato (come punto di partenza), lo stesso codice esattamente come quello trovato su Avanzate Demo (pagina delle proprietà)


quello che ho cercato e scoperto:

la demo (proprietà pagina albero) avanzata del 2003 compilato found here sembra opere come quello Mi aspetto dal mio componente (e dalla vista ad albero virtuale).

Ma quando compilo questa stessa demo (ho provato con le versioni 4.5.2, 4.8.7 e anche 5.0.0 dal trunk corrente su google code, su entrambi delphi 2007 e 2009) riappare l'errore!

Innanzitutto penso che ci sia stato un cambio di rottura documentato tra il 2003 e le versioni più recenti, ma non riesco a trovare nulla. Ho anche giocato con tutte le opzioni disponibili cercando di risolvere questo, ma senza successo.

Non riesco ancora a capire se questo problema provenga da una nuova delta RTL o da una modifica (bug?) In virtualtreeview.

Così le mie domande:

  • avete lo stesso problema quando si compila demo avanzata?
  • qualsiasi suggerimento o soluzione alternativa nel codice per risolvere il mio problema?

Come nota a margine, ho quasi rinunciare con virtualtreeview questo pomeriggio e ho voluto provare una soluzione con un altro componente ...Ho trovato questo interesting question e ho deciso di provare componente di Berg, ma fu fermato nel processo di acquisto quando si legge un consiglio sulla loro home page (vedi il mio commento sulla relativa questione)

+2

C'è un motivo per cui non si sta usando il 'TValueListEditor' che viene fornito nella VCL? È specificamente progettato per fare ciò che stai cercando di fare da solo (fornire un elenco di chiavi e consentire di modificare valori, come l'Object Inspector). Implementa il comportamento che stai cercando impostando 'KeyOptions.KeyEdit' su True. Ha gestori di eventi 'OnGet' che ti permettono di fornire liste e modificare maschere, e ha un evento' OnEditButtonClick' che consente il pulsante di tipo '...'. –

+0

@KenWhite Un buon punto, ma l'unica ragione che posso vedere è che ho notato il pulsante [-] a sinistra, quindi Damien potrebbe avere funzionalità di compressione, che il 'TValueListEditor' potrebbe non avere. –

+1

Sì, ho bisogno di funzionalità collassanti (come nell'editor delle proprietà di IDE). Beh, sono riuscito ad avvicinarmi al comportamento voluto, aggiungendo messaggi WM_STARTEDITING in molti eventi (onDblclick, ecc.) Ma penso ancora che ci possa essere qualcosa di rotto in virtualtreeview (ho iniziato a guardare gli interni del controllo e sembra che tsEditPending lo stato interno non viene gestito correttamente) – DamienD

risposta

3

Il VST onChange appena viene chiamato cambiando la selezione dei nodi . Lo stato non cambierà più, se il nodo è già selezionato. Quindi, devi implementare un comportamento simile a Object Inspector da solo, ad es. chiamando VST EditNode() - Metodo della OnClick-richiamata:

procedure TMainForm.VSTClick(Sender: TObject); 
var node: PVirtualNode; 
begin 
    node:= VST.GetFirstSelected(); 
    if(node <> nil) then 
    VST.EditNode(node, EDITABLE_COLUMN_INDEX); 
end; 
+0

grazie per la spiegazione e il codice di esempio. – DamienD

Problemi correlati