FAQ VCL
Компоненты\StringGrid

:: Меню ::
:: На главную ::
:: FAQ ::
:: Заметки ::
:: Практика ::
:: Win API ::
:: Проекты ::
:: Скачать ::
:: Секреты ::
:: Ссылки ::

:: Сервис ::
:: Написать ::

:: MVP ::

:: RSS ::

Яндекс.Метрика

Как запретить редактирование ячеек в TStringGrid по условию?

procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;
  var CanSelect: Boolean);
begin
   if (ACol = 1) and (ARow = 1) then
      StringGrid1.Options := StringGrid1.Options - [goEditing]
   else
      StringGrid1.Options := StringGrid1.Options + [goEditing];
end;


Как сделать размер ползунка в TStringGrid пропорциональным содержимому?

procedure TForm1.Button1Click(Sender: TObject);
var
  Info: TScrollInfo;
begin
   FillChar(Info, SizeOf(Info), 0);
   with Info do
   begin
      cbSize := SizeOf(Info);
      fMask := SIF_ALL;
      GetScrollInfo(StringGrid1.Handle, SB_VERT, Info);
      fMask := fMask or SIF_PAGE;
      nPage := 5 * (nMax - nMin) div StringGrid1.RowCount;
   end;
   SetScrollInfo(StringGrid1.Handle, SB_VERT, Info, True);
end;


Как изменить цвет фона редактиреумей ячейки в TStringGrid?

type
  THackStringGrid = class(TStringGrid);

implementation

procedure TForm1.StringGrid1GetEditText(Sender: TObject; ACol, ARow: Integer;
  var Value: string);
begin
   THackStringGrid(Sender).InplaceEditor.Brush.Color := clBlack;
end;

procedure TForm1.StringGrid1SetEditText(Sender: TObject; ACol, ARow: Integer;
  const Value: string);
begin
   THackStringGrid(Sender).InplaceEditor.Brush.Color := clWhite;
end;


Как выделить группу ячеек в TStringGrid?

procedure TForm1.Button1Click(Sender: TObject);
var
  SelectedRect: TGridRect;
begin
   SelectedRect.Left := 1;   // Левая граница
   SelectedRect.Top := 1;    // Верхняя граница
   SelectedRect.Right := 4;  // Правая граница
   SelectedRect.Bottom := 3; // Нижняя граница
   StringGrid1.Selection := SelectedRect;
end;


Как узнать координаты выделенной (текущей) ячейки в TStringGrid, если их нет в обработчике нужного события?

procedure TForm1.StringGrid1Click(Sender: TObject);
var
  l, t: Integer;
begin
   l := StringGrid1.Selection.Left;
   t := StringGrid1.Selection.Top;
   Caption := Format('Left: %d; Top: %d', [l, t]);
end;


Как получить пиксельные координаты ячейки таблицы в TStringGrid?

procedure TForm1.StringGrid1Click(Sender: TObject);
var
  Rect: TRect;
begin
   Rect := StringGrid1.CellRect(StringGrid1.Col, StringGrid1.Row);
   Caption := Format('Left: %d; Top: %d', [Rect.Left, Rect.Top]);
end;

// Если нужно считать от левого верхнего угла клиентской
// части формы а на StringGrid'а, добавьте к полученным
// координатам значения StringGrid1.Left и StringGrid1.Top
procedure TForm1.StringGrid1Click(Sender: TObject);
var
  Rect: TRect;
begin
   Rect := StringGrid1.CellRect(StringGrid1.Col, StringGrid1.Row);
   Caption := Format('Left: %d; Top: %d', [Rect.Left + StringGrid1.Left,
                                           Rect.Top + StringGrid1.Top]);
end;


Как сохранить содержимое TStringGrid в текстовый файл и загрузить обратно?

type
  TStringGrid = class(Vcl.Grids.TStringGrid)
  public
    procedure SaveToFile(FileName: string);
    procedure LoadFromFile(FileName: string);
  end;

implementation

{ TStringGrid }

procedure TStringGrid.SaveToFile(FileName: string);
var
  i, j: Integer;
  sl: TStrings;
  s: string;
begin
   sl := TStringList.Create;
   // В первой строке хранится общее количество и
   // количество фиксированных строк и столбцов
   sl.Add(IntToStr(Self.RowCount) + #9 + IntToStr(Self.ColCount) + #9 +
          IntToStr(Self.FixedRows) + #9 + IntToStr(Self.FixedCols));

   for i := 0 to Self.ColCount-1 do
   begin
      s := '';
      for j := 0 to Self.RowCount-1 do
      begin
         s := s + AnsiQuotedStr(Cells[j, i], '"');
         if j < Self.RowCount-1 then
            s := s + #9;
      end;
      sl.Add(s);
   end;

   sl.SaveToFile(FileName);
   sl.Free;
end;

procedure TStringGrid.LoadFromFile(FileName: string);
var
  i, j, k: Integer;
  sl, tmp: TStrings;
  s: string;
begin
   sl := TStringList.Create;
   sl.LoadFromFile(FileName);

   tmp := TStringList.Create;
   tmp.Delimiter := #9;
   tmp.DelimitedText := sl[0];

   Self.RowCount := StrToInt(tmp[0]);
   Self.ColCount := StrToInt(tmp[1]);
   Self.FixedRows := StrToInt(tmp[2]);
   Self.FixedCols := StrToInt(tmp[3]);

   for i := 1 to sl.Count-1 do
   begin
      tmp.DelimitedText := sl[i];
      for j := 0 to tmp.Count-1 do
         Self.Cells[j, i-1] := AnsiDequotedStr(tmp[j], '"');
   end;

   tmp.Free;
   sl.Free;
end;


Как встроить редактор на основе выподающего списка в ячейку TStringGrid?

type
  TStringGrid = class({Vcl.}Grids.TStringGrid)
  protected
    function CreateEditor: TInplaceEdit; override;
    function GetEditStyle(ACol: Integer; ARow: Integer): TEditStyle; override;
  private
    procedure GetCbxItems(ACol, ARow: Integer; Items: TStrings);
  end;

  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    procedure FormCreate(Sender: TObject);
    {...}
  end;

implementation

{ TForm1 }

procedure TForm29.FormCreate(Sender: TObject);
begin
   StringGrid1.Options := StringGrid1.Options + [goEditing];
end;

{ TStringGrid }

function TStringGrid.CreateEditor: TInplaceEdit;
var
  Inplace: TInplaceEditList;
begin
   Inplace := TInplaceEditList.Create(Self);
   Inplace.DropDownRows := 5;
   Inplace.OnGetPickListitems := GetCbxItems;
   Result := Inplace;
end;

procedure TStringGrid.GetCbxItems(ACol, ARow: Integer; Items: TStrings);
begin
   Items.Clear;

   case ACol of
      2: begin
         Items.Add('Вариант 1');
         Items.Add('Вариант 2');
         Items.Add('Вариант 3');
      end;
   else
      Items.Add('Поле 1');
      Items.Add('Поле 2');
      Items.Add('Поле 3');
   end;
end;

function TStringGrid.GetEditStyle(ACol, ARow: Integer): TEditStyle;
begin
   Result := esPickList;
end;

При использовании материала - ссылка на сайт обязательна