Может ли Delphi позволить пользователю изменять размер столбца TStringGrid без фиксированных строк?

Я хочу иметь сетку, в которой все строки выглядят одинаково В Delphi, как я могу позволить пользователю изменять размер столбцов TStringGrid без фиксированных строк? Обычно вы можете настроить только фиксированные строки, и вы не можете сделать фиксированной всю сетку.

Я использую XE2.

ТИА

отметка


person Mark Patterson    schedule 23.10.2013    source источник
comment
столбцы, строки... Пожалуйста, уточните, что именно должно и что не должно быть возможно для пользователя? может быть, есть скриншоты в формате PNG со стрелками, указывающими на изменения? немного не могу понять...   -  person Arioch 'The    schedule 23.10.2013
comment
docwiki.embarcadero.com/Libraries/XE5/en/ Это говорит о том, что размер любого столбца и строки может быть изменен, правильно ли вы его установили?   -  person Arioch 'The    schedule 23.10.2013
comment
Упомянутая здесь проблема заключается в том, что Delphi (AFIAK) будет устанавливать курсор мыши для изменения размера только для столбцов, когда он находится над строкой заголовка (фиксированная строка).   -  person Matt Allwood    schedule 23.10.2013
comment
Да, Мэтт Оллвуд определил проблему. Я хочу, чтобы все ячейки выглядели одинаково, но вы можете изменять размер столбцов только тогда, когда хотя бы один фиксирован (FixedRows := 1), и вы не можете показать сетку со всеми фиксированными строками. Я делал grid.FixedRows := grid.RowCount, и этого бы не потребовалось.   -  person Mark Patterson    schedule 24.10.2013
comment
Что я сделал, так это добавил своего рода строку заголовка. Теперь у меня есть одна фиксированная строка и один фиксированный столбец. Это имеет непреднамеренное последствие, заключающееся в том, что я могу настроить ширину всех строк, кроме строки 0.   -  person Mark Patterson    schedule 28.10.2013


Ответы (1)


Вы можете переопределить CalcSizingState.

Set
— укажите состояние gsRowSizing, если ваше условие выполнено (в приведенном ниже примере проверьте, нажата ли клавиша Alt в MouseMove) и
— индексируйте вычисляемый индекс из MouseDown с помощью MouseToCell.

Возможно, потребуется некоторая тонкая настройка.

type

  TStringGrid = Class(Grids.TStringGrid)
  private
    FIsSizing: Boolean;
    FIndex: Integer;
    procedure CalcSizingState(X, Y: Integer; var State: TGridState; var Index: Longint; var SizingPos, SizingOfs: Integer; var FixedInfo: TGridDrawInfo); override;
    procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
    procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;
  private

  End;

  TForm3 = class(TForm)
    StringGrid1: TStringGrid;
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form3: TForm3;

implementation

{$R *.dfm}
{ TStringGrid }

procedure TStringGrid.CalcSizingState(X, Y: Integer; var State: TGridState; var Index, SizingPos, SizingOfs: Integer; var FixedInfo: TGridDrawInfo);
begin
  inherited;
  if FIsSizing then
    State := gsRowSizing;
  if (FIndex > -1) then
  begin
    Index := FIndex;
  end;
end;

procedure TStringGrid.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
  Col: Integer;
begin
  inherited;
  MouseToCell(X, Y, Col, FIndex);
end;

procedure TStringGrid.MouseMove(Shift: TShiftState; X, Y: Integer);
begin
  inherited;
  FIsSizing := ssAlt in Shift;
end;
person bummi    schedule 23.10.2013