2013-05-23 8 views
3

Я пытаюсь скрыть границу (прямоугольник фокусировки), которую Delphi рисует вокруг текущей выделенной ячейки в StringGrid. Я рисую чертеж владельца, чтобы настроить внешний вид сетки строк. Мне удалось избавиться от всего, кроме выбора.Скрытие focusRectangle для StringGrid: Delphi

Я использовал

GR.Left := -1; 
GR.Top := -1; 
GR.Right := -1; 
GR.Bottom := -1; 
StringGrid.Selection := GR; 

Но что дает ошибку, если вы установите это очень быстро (у меня это работает в OnMouseMove). Я имею в виду, что это хорошо работает, но если я назову этот конкретный фрагмент кода достаточно быстро, я получаю исключение в рендеринг StringGrid (таким образом, я не могу просто попробовать, кроме него).

Любые идеи о том, как я могу решить это надежно?

+0

Здравствуйте, Дайетсу, вы пробовали TZColorStringGrid? Это потомок TStringGrid и обладает способностью персонализировать каждую ячейку. Может быть, вы можете посмотреть: http://avemey.com/ –

ответ

2

Вы можете использовать класс interposer для TStringgrid и переопределить процедуру Paint, чтобы удалить обратный фокус rect.

unit Unit2; 

interface 

uses 
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
    Dialogs, StdCtrls, Grids; 

type 
    TStringgrid=Class(Grids.TStringGrid) 
    private 
    FHideFocusRect: Boolean; 
    protected 
    Procedure Paint;override; 
    public 
    Property HideFocusRect:Boolean Read FHideFocusRect Write FHideFocusRect; 
    End; 
    TForm2 = class(TForm) 
    StringGrid1: TStringGrid; 
    Button1: TButton; 
    procedure Button1Click(Sender: TObject); 
    private 
    public 
    end; 

var 
    Form2: TForm2; 

implementation 

{$R *.dfm} 

procedure TStringgrid.Paint; 
var 
L_Rect:Trect; 
begin 
    inherited; 
    if HideFocusRect then 
     begin 
     L_Rect := CellRect(Col,Row); 
     if DrawingStyle = gdsThemed then InflateRect(L_Rect,-1,-1); 
     DrawFocusrect(Canvas.Handle,L_Rect) 
     end; 
end; 

procedure TForm2.Button1Click(Sender: TObject); 
begin 
    StringGrid1.HideFocusRect := not StringGrid1.HideFocusRect; 
end; 

end. 
0

В OnDrawCell случае добавьте

with Sender as TStringgrid do 
begin 
    if (gdSelected in State) then 
    begin 
     Canvas.Brush.Color := Color; 
     Canvas.Font.Color := Font.Color; 
     Canvas.TextRect(Rect, Rect.Left +2,Rect.Top +2, Cells[Col,Row]); 
    end; 
end; 

В OnSelectCell случае добавьте

CanSelect := False

0

Установите DefaultDrawing свойство ложны и onDrawCell событие нарисовать текст что-то вроде этого (это чередует цвет строки и центральный текст в ячейке):

procedure GridDrawCell(Sender: TObject; ACol,ARow: Integer; Rect: TRect; State: TGridDrawState); 
var S: string; 
     c:TColor; 
     SavedAlign: word; 
begin 
    S := Grid.Cells[ACol, ARow]; 
    SavedAlign := SetTextAlign(Grid.Canvas.Handle,TA_CENTER); 
    if (ARow mod 2 = 0) 
    then c:=clWhite 
    else c:=$00E8E8E8; 
    // Fill rectangle with colour 
    Grid.Canvas.Brush.Color := c; 
    Grid.Canvas.FillRect(Rect); 
    // Next, draw the text in the rectangle 
    if (ACol=1) or (ACol=3) or (ACol=5) then 
    begin 
    Grid.Canvas.Font.Color := $005F5F5F; 
    end 
    else 
    begin 
    Grid.Canvas.Font.Color := $005F5F5F; 
    end; 
    Grid.Canvas.TextRect(Rect,Rect.Left + (Rect.Right - Rect.Left) div 2, Rect.Top + 2, S); 
    SetTextAlign(Grid.Canvas.Handle, SavedAlign); 
end; 

 Смежные вопросы

  • Нет связанных вопросов^_^