هل من الممكن تحديد أعمدة متعددة في Virtual Treeview؟
-
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;