Pergunta

Estou ficando questões de desenho usando OnAfterItemPaint evento quando a rolagem horizontal é executada.

Basicamente o que eu quero alcançar é a fusão de efeito células selecionado, digamos, por exemplo, 1 de texto para a coluna 1 e 2, um outro texto para a coluna 3 e 4, etc ... Até agora VT não tem qualquer apoio para coluna de fusão, então eu tenho que desenhá-lo manualmente.

Existe uma solução alternativa ou outro evento que eu deveria usar em vez disso?

Usando: Delphi 7 + VirtualTreeview 4.8.5

Origem do evento:

begin
  TargetCanvas.TextOut(ItemRect.Left+ VT1.OffsetX, ItemRect.Top,
    '1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF');
end;

Antes de rolagem:

alt texto http://a.imagehost.org/0869/screen1.gif

Depois de rolagem (Scroll Right, em seguida, role para a esquerda):

alt texto http://a.imagehost.org/0645/screen2.gif

Foi útil?

Solução

É difícil dizer o que você quer alcançar, mas vendo que você tem um longo texto que abrange várias colunas Eu não tenho certeza que você usar o evento apropriado - geralmente deseja que o texto a ser truncado se for muito longo para a sua coluna .

De qualquer forma, a melhor coisa é ler a seção 5.2 "Pinte ciclos e estágios" na VirtualTreeView.pdf arquivo de documentação, e encontrar o evento adequado a ser usado para o que você quer pintar. Para OnAfterItemPaint ele afirma:

A após o estágio de pintura item é usado para adicionar material específico nó como quadros e similares que dizem respeito a todas as colunas desse nó e é chamado uma vez por nó.

então eu acho que é provavelmente não o que você deseja usar.

Editar:

OK, se você estiver indo para a fusão de células que você só precisa remover a adição de VT1.OffsetX (e adicionar VT1.TextMargin vez) para obter o comportamento correto. Isso pressupõe, naturalmente, você quer começar a saída de texto na primeira coluna (índice 0), caso contrário, você tem que calcular a posição do texto horizontal das larguras de coluna.

Mas a partir da descrição das etapas de pintura eu ainda prefiro usar o evento BeforeItemPaint e definir o parâmetro CustomDraw var para True para ignorar qualquer pintura padrão.

Outras dicas

Você já tentou isso:

TreeOptions.AutoOptions := TreeOptions.AutoOptions + [toAutoSpanColumns];

É praticamente faz o que você precisa. Eles único problema pode ser que você não pode especificar quais colunas é habilitado para. Provavelmente, você pode contornar isso limitação, definindo o celltext a um espaço em branco para as colunas que não querem espaço para.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top