2012-10-21 16 views
6

में विकल्प ड्रॉपडाउन दिखाएं मैं कुछ क्रियाओं को करने के लिए आवश्यक क्लिकों की मात्रा को कम करके एक जीयूआई सुधारने की कोशिश कर रहा हूं। हालांकि, एक वीसीएल घटक जो मुझे परेशान कर रहा है वह एक टीवीएलयू लिस्ट एडिटर है जिसमें कुंजी और मूल्यों की एक सूची होती है, जो सभी ड्रॉपडाउन द्वारा नियंत्रित होती हैं। एक विकल्प का चयन करना हमेशा तीन क्लिक, की आवश्यकता है जब केवल दो की जरूरत है:हमेशा टीवीalueListEditor

Bad

समय में इस बिंदु पर, सर्वोच्च पंक्ति ध्यान केंद्रित किया है, और मूल्य लटकती (दो क्लिक) का उपयोग करके बदला जा सकता है। हालांकि, जब उपयोगकर्ता एक अलग कुंजी संपादित करना चाहता है, तो उसे ड्रॉपडाउन (तीन क्लिक) का उपयोग करने से पहले उस कुंजी पर ध्यान केंद्रित करना होगा।

क्या अतिरिक्त क्लिक को रोकने के लिए सभी पंक्तियों पर ड्रॉपडाउन तीर दिखाने का कोई तरीका है?

यहाँ मैं क्या हासिल करना चाहते एक mockup उदाहरण है:

Good

+1

onMouseMove स्थिति में बेहतर समाधान निर्धारित किया जाएगा पंक्ति फोकस हो सकता है? – teran

उत्तर

8
uses 
    Vcl.Themes; 

type 
    TValueListEditor = class(Vcl.ValEdit.TValueListEditor) 
    private 
    procedure DrawDropDownButton(ACol, ARow: Integer; ARect: TRect; 
     AState: TGridDrawState); 
    function MouseOverButton(X: Integer): Boolean; 
    protected 
    procedure DrawCell(ACol, ARow: Integer; ARect: TRect; 
     AState: TGridDrawState); override; 
    procedure DrawCellHighlight(const ARect: TRect; AState: TGridDrawState; 
     ACol, ARow: Integer); override; 
    procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, 
     Y: Integer); override; 
    end; 

{ TValueListEditor } 

type 
    TInplaceEditListAccess = class(Vcl.Grids.TInplaceEditList); 

procedure TValueListEditor.DrawCell(ACol, ARow: Integer; ARect: TRect; 
    AState: TGridDrawState); 
begin 
    inherited DrawCell(ACol, ARow, ARect, AState); 
    DrawDropDownButton(ACol, ARow, ARect, AState); 
end; 

procedure TValueListEditor.DrawCellHighlight(const ARect: TRect; 
    AState: TGridDrawState; ACol, ARow: Integer); 
var 
    R: TRect; 
begin 
    R := ARect; 
    if ItemProps[ARow - FixedRows].HasPickList then 
    Dec(R.Right, EditList.ButtonWidth); 
    inherited DrawCellHighLight(R, AState, ACol, ARow); 
    DrawDropDownButton(ACol, ARow, ARect, AState); 
end; 

procedure TValueListEditor.DrawDropDownButton(ACol, ARow: Integer; 
    ARect: TRect; AState: TGridDrawState); 
var 
    Details: TThemedElementDetails; 
begin 
    if (ACol = 1) and (ARow >= FixedRows) and not (gdFocused in AState) and 
    ItemProps[ARow - FixedRows].HasPickList then 
    begin 
    ARect.Left := ARect.Right - EditList.ButtonWidth; 
    Details := StyleServices.GetElementDetails(tgDropDownButtonNormal); 
    StyleServices.DrawElement(Canvas.Handle, Details, ARect); 
    end; 
end; 

procedure TValueListEditor.MouseDown(Button: TMouseButton; Shift: TShiftState; 
    X, Y: Integer); 
var 
    ACol: Integer; 
    ARow: Integer; 
begin 
    inherited MouseDown(Button, Shift, X, Y); 
    MouseToCell(X, Y, ACol, ARow); 
    if (Button = mbLeft) and (ARow > FixedRows) and 
    ItemProps[ARow - FixedRows].HasPickList and 
    not EditList.ListVisible and MouseOverButton(X) then 
    begin 
    EditorMode := True; 
    TInplaceEditListAccess(EditList).DropDown; 
    end; 
end; 

function TValueListEditor.MouseOverButton(X: Integer): Boolean; 
begin 
    Result := (UseRightToLeftAlignment and (X < EditList.ButtonWidth)) or 
    (not UseRightToLeftAlignment and (X > ClientWidth - EditList.ButtonWidth)); 
end; 

enter image description here

+0

ऐसा लगता है कि यह बिल्कुल ठीक काम करता है। एक पक्ष नोट हालांकि (कुछ विवरण मैं उल्लेख करना भूल गया): मैं डेल्फी 7 का उपयोग करता हूं और यह 'स्टाइल सर्विसेज' के बजाय थीम सर्विसेज को 'थीम सर्विसेज' के रूप में घोषित करता है, यह DrawCellHighlight का पर्दाफाश नहीं करता है और यह ड्रॉपडाउन तीर को 'tcDropDownButtonNormal' के रूप में परिभाषित करता है लेकिन अलग उस से, यह एक उत्कृष्ट समाधान है। – Orwell

+0

क्या मैं एक सुधार का सुझाव दे सकता हूं? कम से कम डेल्फी 7 में, जब यह घटक पैलेट में जोड़ा जाता है और फॉर्मों को डिज़ाइन करने के लिए उपयोग किया जाता है, तो एडिटलिस्ट को हमेशा असाइन नहीं किया जा सकता है, जिसके परिणामस्वरूप त्रुटि त्रुटि होती है। मैं किसी भी स्थान पर 'असाइन किए गए (एडिटलिस्ट)' के लिए चेक जोड़ने का सुझाव देता हूं जो इसका उपयोग करता है। – Orwell

+0

@ ऑरवेल मैंने डिजाइन नहीं किया और न ही इसे एक घटक के रूप में स्थापित करने के लिए परीक्षण किया। लेकिन आप इसे स्वयं यहां बदल सकते हैं/बदल सकते हैं। शायद तब भी एक संबंधित संपत्ति जोड़ें? – NGLN

संबंधित मुद्दे