2012-08-12 27 views
4

当网格失去焦点到另一个非模态窗体时,Delphi XE2中有没有一种方法可以保留StringGrid中InPlaceEditor的高光?当失去焦点时保持InPlaceEditor高亮

我现在的StringGrid选项有:

enter image description here

如果没有,我希望利用下面的代码失去焦点后保存当前小区的一大亮点,但我有一些麻烦与它离开当它们不再是当前单元格时,单元格会突出显示。

我是否需要在下面的代码中添加一个“else”以将颜色更改回原始的非选定单元格?任何警告?

procedure TForm1.sgMultiDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);  
    begin 
    if (ACol = sgMulti.Col) and (ARow = sgMulti.Row) then 
    begin 
     sgMulti.Canvas.Brush.Color := clYellow; 
     sgMulti.Canvas.FillRect(Rect); 
     sgMulti.Canvas.TextRect(Rect, Rect.Left, Rect.Top, sgMulti.Cells[ACol, ARow]); 
     if gdFocused in State then 
     sgMulti.Canvas.DrawFocusRect(Rect); user 
    end; 
    end; { sgMultiDrawCell} 

编辑:下面的屏幕截图阐明它是如何表现的今天。我想当前单元格,失去焦点的时候,比底部的屏幕捕捉更加清晰

enter image description here

+0

@TLama:我的目标是细胞在失去焦点时仍然以某种方式突出显示。正如你所说,我没有想到,这意味着将InPlaceEditor置于编辑模式。在我看来,使用InPlaceEditor不太可能或者更可取,因为你已经这么做了。也许我应该在没有重点时自己突出显示自己? (如果未聚焦时的突出显示与编辑模式突出显示不同,则可以。) – RobertFrank 2012-08-12 16:33:28

+1

您尝试删除'goAlwaysShowEditor'选项吗? – kludg 2012-08-12 16:42:42

+1

@Serg和TLama:我认为你是对的。删除goAlwaysShowEditor是我想要的,特别是因为goEditing已启用。我想我前段时间可能会设置goAlwaysShowEditor以突出亮点。要突出显示的边界框或颜色有多难? Serg:请将您以前的评论发布为答案。感谢你们两位。 – RobertFrank 2012-08-12 17:53:37

回答

6

如果你想保持启用goAlwaysShowEditor选项,并强调只是始终显示编辑器,你需要访问InplaceEditor属性。这需要子类化您的字符串网格类并更改就地编辑器的颜色,这是默认情况下TCustomMaskEdit控件类。
在这个代码显示,如何改变就地编辑的颜色,这取决于当字符串电网
集中与否:

type 
    TStringGrid = class(Grids.TStringGrid) 
    private 
    procedure CMEnter(var Message: TCMEnter); message CM_ENTER; 
    procedure CMExit(var Message: TCMExit); message CM_EXIT; 
    protected 
    function CreateEditor: TInplaceEdit; override; 
    end; 

implementation 

{ TStringGrid } 

procedure TStringGrid.CMEnter(var Message: TCMEnter); 
begin 
    inherited; 
    if Assigned(InplaceEditor) then 
    TMaskEdit(InplaceEditor).Color := $0000FFBF; 
end; 

procedure TStringGrid.CMExit(var Message: TCMExit); 
begin 
    inherited; 
    if Assigned(InplaceEditor) then 
    TMaskEdit(InplaceEditor).Color := $0000A6FF; 
end; 

function TStringGrid.CreateEditor: TInplaceEdit; 
begin 
    Result := inherited; 
    if Focused then 
    TMaskEdit(Result).Color := $0000FFBF 
    else 
    TMaskEdit(Result).Color := $0000A6FF; 
end; 

而且随着聚焦而散电网状态的结果:

enter image description here

+2

哇!完全是我正在尝试做的。谢谢,@TLama !!! – RobertFrank 2012-08-12 20:08:31

+1

很高兴帮助;-) – TLama 2012-08-12 20:19:55