هل من الممكن تحديد أعمدة متعددة في Virtual Treeview؟

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

  •  20-08-2019
  •  | 
  •  

سؤال

أحتاج إلى إضافة وظيفة لنسخ تحديد مستطيل من العقد والأعمدة، ولكن لا يمكنني العثور على أي طريقة لتحديد أعمدة متعددة فعليًا في Virtual Treeview (بجانب toFullRowSelect).

هل أنا فقط في عداد المفقودين شيئا؟وإذا لم يكن الأمر كذلك، فهل هناك سليل مع دعم تحديد متعدد الأعمدة يشبه الشبكة؟

هل كانت مفيدة؟

المحلول

وهكذا بعد بعض التجارب خطرت لي ما يلي، وذلك بفضل ديجي للدفعة إضافية. سوف DrawSelection لا تعمل مع هذا الحل لذلك يجب أن يتم تعطيل. وبما أنني لا أعتقد أنني سوف تحتاج إلى القيام بذلك مرة أخرى قريبا أنا لم أكتب من نسل.

وتعيين toDisableDrawSelection، toExtendedFocus وtoMultiSelect إلى True.

وتعلن ما يلي المتغيرات / خصائص مكان مناسب:

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

وتحديث الأحداث التالية:

وعند_ضغط_مفتاح

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;

وOnFocusChanged

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;

نصائح أخرى

ويمكنك محاولة تمكين / إضافة <م> toGridExtensions في TreeOptions.MiscOptions . وهي تمكن حر الحركة في الأعمدة بواسطة مفاتيح المؤشر، ولكن لا يزال VT إلغاء العمود على مغادرة البلاد. ولكن أنا متأكد من أن من الممكن أن "إصلاح" من قبل العرف رسم وتذكر بدءا عقدة والعمود.

نصيحة أخرى - انظر OnStateChange الحدث، ربما يمكنك استخدام

procedure TSomeForm.VTreeStateChange(Sender: TBaseVirtualTree; Enter,Leave: TVirtualTreeStates);
begin
  if tsDrawSelecting in Enter then
  begin
    // Save position
  end;
end;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top