2009-01-29 13 views
6

Dikdörtgen bir düğüm ve sütun seçimini kopyalamak için işlevsellik eklemem gerekiyor, ancak bir Sanal Ağaç Görünümü'nde (FullRowSelect öğesinin yanında) birden çok sütun seçmenin bir yolunu bulamıyorum.Sanal Ağaç Görünümünde birden çok sütun seçmek mümkün mü?

Sadece bir şey özlüyor muyum? Ve değilse, orada ızgara benzeri multicolumn select desteği olan bir varis var mı?

cevap

6

Bazı testlerden sonra aşağıdakileri buldum, fazladan itme için teşekkürler DiGi. DrawSelection bu çözümle çalışmaz, bu nedenle devre dışı bırakılması gerekir. Ben bunu bir daha düşünmem gerekmediğini düşündüğümden beri bir soydaş yazmamıştım. True

Seti toDisableDrawSelection, toExtendedFocus ve toMultiSelect.

yere uygun Aşağıdaki değişkenler/özelliklerini bildirin:

StartSelectedColumn: integer; 
FirstSelectedColumn: integer; 
LastSelectedColumn: integer; 
Selecting: boolean; 

Güncelleme aşağıdaki olaylar:

onkeydown

if (not Selecting) and (Key = VK_SHIFT) then 
begin 
    StartSelectedColumn := vtMain.FocusedColumn; 
    FirstSelectedColumn := StartSelectedColumn; 
    LastSelectedColumn := StartSelectedColumn; 
    Selecting := true; 
end; 

onkeyup

if Key = VK_SHIFT then 
    Selecting := false; 

Açık

if Selecting then 
begin 
    if column < StartSelectedColumn then 
    begin 
    FirstSelectedColumn := column; 
    LastSelectedColumn := StartSelectedColumn; 
    end 
    else if column > StartSelectedColumn then 
    begin 
    FirstSelectedColumn := StartSelectedColumn; 
    LastSelectedColumn := column 
    end 
    else 
    begin 
    FirstSelectedColumn := column; 
    LastSelectedColumn := column; 
    end; 
end 
else 
begin 
    StartSelectedColumn := column; 
    FirstSelectedColumn := column; 
    LastSelectedColumn := column; 
end; 

OnBeforeCellPaint

if vtMain.Selected[node] and InRange(column, FirstSelectedColumn, LastSelectedColumn) then 
begin 
    if vtMain.Focused then 
    TargetCanvas.Brush.Color := vtMain.Colors.FocusedSelectionColor 
    else 
    TargetCanvas.Brush.Color := vtMain.Colors.UnfocusedSelectionColor; 
    TargetCanvas.Brush.Style := bsSolid; 
    TargetCanvas.FillRect(CellRect); 
end; 

OnPaintText

if vtMain.Selected[node] and InRange(column, FirstSelectedColumn, LastSelectedColumn) then 
begin 
    if vtMain.Focused then 
    TargetCanvas.Font.Color := clHighlightText 
    else 
    TargetCanvas.Font.Color := vtMain.Font.Color; 
end; 
1

etkinleştirebilir/denemek toGridExtensionsyılında TreeOptions.MiscOptions ekleyebilir. Imleç tuşları ile sütunlarda serbest hareket etmeyi sağlar, ancak VT hala bırakarak sütunun seçimini kaldırır. Ama eminim ki, özel bir çizim yaparak ve başlangıç ​​düğümü ve sütunu hatırlayarak bunu "düzeltmek" mümkün.

+0

kullanabilirsiniz Bunu denedim ve bir fare kullanmak istediğinizde çok iyi çalışmıyor. Bununla birlikte, problemi "çözüyor". :) – PetriW

1

Bir ipucu daha FocusChanged - OnStateChange olay bakmak, belki ben ettik

procedure TSomeForm.VTreeStateChange(Sender: TBaseVirtualTree; Enter,Leave: TVirtualTreeStates); 
begin 
    if tsDrawSelecting in Enter then 
    begin 
    // Save position 
    end; 
end; 
+0

İlginç, daha sonra ona bakacağım. :) Teşekkürler! – PetriW