2012-06-02 8 views
7

Estoy intentando construir un simple "editor de propiedad" de grillas de 2 columnas basado en VirtualTreeView.¿Cómo mantener vivo el editor en Virtualtreeview?

(Quiero imitar aspecto y la experiencia del usuario se ve en inspector de objetos IDE de Delphi)


El componente está funcionando casi y puede manejar varios editores, pero estoy frente a un insecto molesto:

Cuando hago clic en un nuevo nodo (una nueva fila), se selecciona el nodo y aparece el editor, independientemente de la columna en la que he hecho clic. Se espera y está bien.

Luego, cuando hago clic en la primera columna de la misma fila, espero ver el contenido de mi editor validado y el editor manteniendo el foco (como en el inspector de objetos de Delphi).

Pero el contenido del editor se valida y luego desaparece y se selecciona todo el nodo (fila). El editor no volverá (incluso si hago clic en la segunda columna), hasta que seleccione otro nodo y haga clic en el nodo seleccionado previamente.

EDIT: se ha agregado una ilustración y precisión sobre mi código.

illustration of the problem

sobre el código: mi no me ha insertado código aquí porque he usado (como punto de partida) exactamente el mismo código como el que se encuentra en el Sistema Avanzado de demostración (página de propiedades)


lo que intenté y descubrí:

la demo (propiedades del árbol de páginas) de 2003 compilado avanzada found here parece a obras como lo Espero de mi componente (y de treeview virtual).

Pero cuando compilo esta misma demostración (probé con las versiones 4.5.2, 4.8.7 e incluso 5.0.0 desde la línea troncal actual en el código de Google, tanto en delphi 2007 como en 2009) ¡el error reaparece!

Primero creo que hubo un cambio documentado entre 2003 y las versiones más recientes, , pero no puedo encontrar nada. También jugué con todas las opciones disponibles tratando de resolver esto, pero sin éxito.

Todavía no sé si este problema proviene de una nueva RTL de delphi o un cambio de rotura (¿error?) En virtualtreeview.

así que mis preguntas:

  • ¿tiene el mismo problema al compilar demostración avanzada?
  • ¿Alguna sugerencia o solución en el código para resolver mi problema?

Como nota al margen, casi me dan por vencidos con VirtualTreeview esta tarde y que quería probar una solución con otro componente ...Encontré este interesting question y decidí probar el componente de berg, pero me detuve en el proceso de compra cuando leía un consejo en su página de inicio (ver mi comentario sobre la pregunta relacionada)

+2

¿Hay alguna razón usted no está utilizando el 'TValueListEditor' que se proporciona en la VCL? Está específicamente diseñado para hacer lo que intenta hacer usted mismo (proporcione una lista de claves y le permita editar valores, como el Inspector de Objetos). Implementa el comportamiento que está buscando al establecer 'KeyOptions.KeyEdit' en True. Tiene manejadores de eventos 'OnGet' que le permiten proporcionar listas y editar máscaras, y tiene un evento' OnEditButtonClick' que permite el botón de tipo '...'. –

+0

@KenWhite Buen punto, pero la única razón por la que puedo ver es que noté el botón [-] a la izquierda, por lo que Damien podría tener capacidades colapsadas, que el 'TValueListEditor' podría no tener. –

+1

Sí, necesito capacidades para colapsar (como en el editor de propiedades de IDE). Bueno, me las arreglé para acercarme al comportamiento deseado, agregué mensajes WM_STARTEDITING en muchos eventos (onDblclick, etc.) pero todavía creo que puede haber algo roto en virtualtreeview (comencé a mirar las partes internas del control y parece que tsEditPending el estado interno no se maneja correctamente) – DamienD

Respuesta

3

El VSTs onChange se llama cambiando la selección de nodos . El estado ya no cambiará más, si el nodo ya está seleccionado. Por lo tanto, debe implementar un comportamiento similar al de Object Inspector por su cuenta, p. llamando VSTs EditNode() - Método en el OnClick-Devolución de llamada:

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

gracias por la explicación y el código de muestra. – DamienD

Cuestiones relacionadas