2012-10-21 7 views
6

Próbuję poprawić GUI, zmniejszając liczbę kliknięć potrzebnych do wykonania niektórych czynności. Jednak jeden komponent VCL, który mnie niepokoi, to TValueListEditor, który zawiera listę kluczy i wartości, wszystko kontrolowane przez rozwijane listy. Wybór opcji zawsze wymaga trzech kliknięć, kiedy tylko dwa są potrzebne:Zawsze pokazuj listę opcji w TValueListEditor

Bad

W tym momencie w czasie, najwyższy rząd ma fokus, a wartość może być zmieniana za pomocą listy rozwijanej (dwa kliknięcia). Jednakże, gdy użytkownik chce edytować inny klucz, musi najpierw zmienić fokus na ten klucz, zanim będzie mógł skorzystać z menu (trzy kliknięcia).

Czy istnieje sposób na pokazanie strzałki rozwijanej we wszystkich wierszach, aby zapobiec dodatkowemu kliknięciu?

Oto makieta przykładem tego, co chcę osiągnąć:

Good

+1

może być rozwiązaniem byłoby lepiej ustawić ostrość w przypadku rząd onmousemove? – teran

Odpowiedz

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

To wydaje się działać doskonale. Jedna uwaga (zapomniałem o niektórych szczegółach): Używam Delphi 7 i deklaruję usługi kompozycji jako 'ThemeServices' zamiast 'StyleServices', nie eksponuje DrawCellHighlight i definiuje strzałkę rozwijaną jako 'tcDropDownButtonNormal', ale osobno z tego jest to doskonałe rozwiązanie. – Orwell

+0

Czy mogę zaproponować ulepszenie? Przynajmniej w Delphi 7, kiedy ten komponent jest dodawany do palety i używany do projektowania formularzy, EditList może nie zawsze być przypisany, co powoduje spory spływ błędów. Sugeruję dodanie kontrolek "Przypisany (EditList)" do dowolnego miejsca, które z niego korzysta. – Orwell

+0

@ Orwell Nie zaprojektowałem ani nie przetestowałem, aby był zainstalowany jako komponent. Ale możesz/możesz zmienić to tutaj. Może też dodasz odpowiednią właściwość? – NGLN

Powiązane problemy