Come può il controllo TreeView Virtuale essere fatta scorrere sempre dalle linee?

StackOverflow https://stackoverflow.com/questions/929600

  •  06-09-2019
  •  | 
  •  

Domanda

TreeView scorre virtuali verticalmente di pixel, a differenza del modo in cui lo standard di Delphi griglie, TListView e TTreeView (o la maggior parte degli altri tali controlli che sono a conoscenza di) scroll per riga e mantenere una linea completa visibile nella parte superiore della controllo in ogni momento. Quando uso i tasti cursore per navigare, quindi a seconda della direzione o la prima o l'ultima riga è completamente visibile. Quando si scorre con il mouse non v'è alcun allineamento di sorta.

Questo comportamento può essere osservato, ad esempio con la finestra Struttura in Delphi 2007 e nel 2009.

C'è un modo per impostare le molte proprietà di avere il comportamento dei controlli standard delle finestre? O c'è un insieme di patch da qualche parte per raggiungere questo obiettivo?

È stato utile?

Soluzione

Si potrebbe intercettare l'evento TBaseVirtualTree.OnScroll e utilizzare il valore della tela del controllo TreeView virtuale cambio di textHeight ( 'M') come la quantità di cambiare TBaseVirtualTree.offsety al fine di incrementare (scorrere verso l'alto) o decremento (scorrere verso il basso). Potrebbe anche test per assicurarsi che il pre-scroll posizione modulo textHeight ( 'M') è pari a zero (per evitare lo scorrimento dalla giusta quantità dalla posizione sbagliata).

In alternativa, questo post sul Treeview virtuale forum suggerisce un altro approccio: nascondere le barre di scorrimento native del controllo TreeView virtuale con barre di scorrimento VCL e poi fare lo scorrimento da soli (cattura eventi di scorrimento VCL e di programmazione scorrendo la vista ad albero virtuale).

Altri suggerimenti

Questo è ciò che mi si avvicinò con l'aiuto di Argalatyr, sembra che fa quello che voglio che:

procedure TForm1.FormCreate(Sender: TObject);
begin
  VirtualStringTree1.ScrollBarOptions.VerticalIncrement :=
    VirtualStringTree1.DefaultNodeHeight;
end;

procedure TForm1.VirtualStringTree1Resize(Sender: TObject);
var
  DY: integer;
begin
  with VirtualStringTree1 do begin
    DY := VirtualStringTree1.DefaultNodeHeight;
    BottomSpace := ClientHeight mod DY;
    VirtualStringTree1.OffsetY := Round(VirtualStringTree1.OffsetY / DY) * DY;
  end;
end;

procedure TForm1.VirtualStringTree1Scroll(Sender: TBaseVirtualTree; DeltaX,
  DeltaY: Integer);
var
  DY: integer;
begin
  if DeltaY <> 0 then begin
    DY := VirtualStringTree1.DefaultNodeHeight;
    VirtualStringTree1.OffsetY := Round(VirtualStringTree1.OffsetY / DY) * DY;
  end;
end;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top