Выделение ячеек
Автор: Jeff Fisher
Я пытаюсь показать StringGrid без выделенной ячейки. Первая нефиксированная ячейка всегда имеет состояние "инвертированного" цвета. Я не хочу позволить пользователю редактировать сетку, но эта выделенная ячейка производит впечатление того, что сетка имеет возможность редактирования...
Вам необходимо создать обработчик события OnDrawCell. Это легче чем вы думаете. Вот образец кода, который сделает вас счастливым:
- Подробности
- Родительская категория: StringGrid
- Категория: Выделение ячеек
Code: |
unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Grids;
type TForm1 = class(TForm) StringGrid1: TStringGrid; procedure FormCreate(Sender: TObject); procedure StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject); var C, R: Integer; begin for C := 0 to StringGrid1.ColCount - 1 do begin for R := 0 to StringGrid1.RowCount - 1 do begin if (C < StringGrid1.FixedCols) or (R < StringGrid1.FixedRows) then StringGrid1.Cells[C, R] := Format('Fixed Cell (%dx%xd)', [C, R]) else StringGrid1.Cells[C, R] := Format('Cell (%dx%d)', [C, R]); end; end; end;
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); var I: Integer; begin with StringGrid1 do if gdFixed in State then begin Canvas.FillRect(Rect); InflateRect(Rect, -2, 0); if (ACol = Col) or (ARow = Row) then Canvas.Font.Style := [fsBold] else Canvas.Font.Style := []; DrawText(Canvas.Handle, PChar(Cells[ACol, ARow]), -1, Rect, DT_SINGLELINE or DT_VCENTER); end else begin Rect := CellRect(ACol, 0); for I := 1 to FixedRows - 1 do with CellRect(ACol, I) do Inc(Rect.Bottom, Bottom - Top); InvalidateRect(Handle, @Rect, True);
Rect := CellRect(0, ARow); for I := 1 to FixedCols - 1 do with CellRect(I, ARow) do Inc(Rect.Right, Right - Left); InvalidateRect(Handle, @Rect, True); end; end;
end. |
- Подробности
- Родительская категория: StringGrid
- Категория: Выделение ячеек
То же самое я проделывал и с DBGrid. (Пока не реализован Shift-MouseDown, только Ctrl-MouseDown).
Для TStringGrid вам нужно выполнить следующие шаги:
Заполните сетку, связывая Objects[0, ARow] с некоторым логическим объектом типа:
- Подробности
- Родительская категория: StringGrid
- Категория: Выделение ячеек
Автор: Neil J. Rubenking
Вот функция, выбирающая при нажатии на кнопку первую строку сетки. Это работает независимо от размера сетки и количества фиксированных строк/колонок.
- Подробности
- Родительская категория: StringGrid
- Категория: Выделение ячеек
Code: |
function IsCellSelected(StringGrid: TStringGrid; X, Y: Longint): Boolean; begin Result := False; try if (X >= StringGrid.Selection.Left) and (X <= StringGrid.Selection.Right) and (Y >= StringGrid.Selection.Top) and (Y <= StringGrid.Selection.Bottom) then Result := True; except end; end;
procedure TForm1.Button1Click(Sender: TObject); begin if IsCellSelected(stringgrid1, 2, 2) then ShowMessage('Cell (2,2) is selected.'); end; |
- Подробности
- Родительская категория: StringGrid
- Категория: Выделение ячеек
Если Вы хотете избавиться от выделенных ячеек TStringGrid, которые не имеют фокуса либо используются только для отображения данных, то попробуйте воспользоваться следующей небольшой процедурой.
- Подробности
- Родительская категория: StringGrid
- Категория: Выделение ячеек
Code: |
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); const SelectedColor = Clblue; begin if (state = [gdSelected]) then with TStringGrid(Sender), Canvas do begin Brush.Color := SelectedColor; FillRect(Rect); TextRect(Rect, Rect.Left + 2, Rect.Top + 2, Cells[aCol, aRow]); end; end;
|
- Подробности
- Родительская категория: StringGrid
- Категория: Выделение ячеек