powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / StringGrid, как сделать изменение высоты мышью на простой колонке
14 сообщений из 14, страница 1 из 1
StringGrid, как сделать изменение высоты мышью на простой колонке
    #40007379
Alexander2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При включенной опции goRowSizing можно менять мышкой высоту строк через FixedColumn.
А как сделать, чтобы менять высоту строки можно было и в простой колонке, то есть повторить аналоичный event.
В ачаче проект. Как грубый workaround - делать fixedcolumn узким (3-4 пикселя) и все равно через него менять высоту.
...
Рейтинг: 0 / 0
StringGrid, как сделать изменение высоты мышью на простой колонке
    #40007380
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexander2,

Переопределить CalcSizingState в TStringGrid.
...
Рейтинг: 0 / 0
StringGrid, как сделать изменение высоты мышью на простой колонке
    #40007381
Alexander2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat,
хеххх, если б знать как!?
Если переопределить этот параметр для TStringGrid, то во всем проекте, где еще используется StringGrid будет такое?
Или это для конкретной формы?
...
Рейтинг: 0 / 0
StringGrid, как сделать изменение высоты мышью на простой колонке
    #40007382
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexander2,

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
unit Unit16;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Grids;

type
  TStringGrid = class(Vcl.Grids.TStringGrid)
  protected
    procedure CalcSizingState(X, Y: Integer; var State: TGridState; var Index: Longint; var SizingPos,
      SizingOfs: Integer; var FixedInfo: TGridDrawInfo); override;
  end;

  TForm16 = class(TForm)
    StringGrid1: TStringGrid;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form16: TForm16;

implementation

{$R *.dfm}


procedure TStringGrid.CalcSizingState(X, Y: Integer; var State: TGridState;
  var Index: Longint; var SizingPos, SizingOfs: Integer;
  var FixedInfo: TGridDrawInfo);

  procedure CalcAxisState(const AxisInfo: TGridAxisDrawInfo; Pos: Integer;
    NewState: TGridState);
  var
    I, Line, Back, Range: Integer;
  begin
    if (NewState = gsColSizing) and UseRightToLeftAlignment then
      Pos := ClientWidth - Pos;
    with AxisInfo do
    begin
      Line := FixedBoundary;
      Range := EffectiveLineWidth;
      Back := 0;
      if Range < 7 then
      begin
        Range := 7;
        Back := (Range - EffectiveLineWidth) shr 1;
      end;
      for I := FirstGridCell to GridCellCount - 1 do
      begin
        Inc(Line, AxisInfo.GetExtent(I));
        if Line > GridBoundary then Break;
        if (Pos >= Line - Back) and (Pos <= Line - Back + Range) then
        begin
          State := NewState;
          SizingPos := Line;
          SizingOfs := Line - Pos;
          Index := I;
          Exit;
        end;
        Inc(Line, EffectiveLineWidth);
      end;
      if (GridBoundary = GridExtent) and (Pos >= GridExtent - Back)
        and (Pos <= GridExtent) then
      begin
        State := NewState;
        SizingPos := GridExtent;
        SizingOfs := GridExtent - Pos;
        Index := LastFullVisibleCell + 1;
      end;
    end;
  end;

var
  EffectiveOptions: TGridOptions;
begin
  State := gsNormal;
  Index := -1;
  EffectiveOptions := Options;
  if csDesigning in ComponentState then
    EffectiveOptions := EffectiveOptions + DesignOptionsBoost;
  if [goColSizing, goRowSizing] * EffectiveOptions <> [] then
    with FixedInfo do
    begin
      Vert.GridExtent := ClientHeight;
      Horz.GridExtent := ClientWidth;

      if (goColSizing in EffectiveOptions) then CalcAxisState(Horz, X, gsColSizing); // Собственно вот оно
      if (goRowSizing in EffectiveOptions) then CalcAxisState(Vert, Y, gsRowSizing); // Собственно вот оно
    end;
end;

end.
...
Рейтинг: 0 / 0
StringGrid, как сделать изменение высоты мышью на простой колонке
    #40007384
Alexander2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat,
аднака работает!!! Спасибо.
Подобный код очень похожий я встречал на корлевстве дельфи, тот не смог запустить, а это подарок зашел хорошо.
Большой респект!
...
Рейтинг: 0 / 0
StringGrid, как сделать изменение высоты мышью на простой колонке
    #40007385
Alexander2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat,
Получилось так, но есть косяк, при скроллинге вниз меняется только этот stringgrid, в итоге теряется синхронизация с левым гридом, и наоборот. Как обеспечить синхронизацию?
...
Рейтинг: 0 / 0
StringGrid, как сделать изменение высоты мышью на простой колонке
    #40007444
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexander2,

Тут програмист нужен.
...
Рейтинг: 0 / 0
StringGrid, как сделать изменение высоты мышью на простой колонке
    #40007847
Alexander2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat,

Добился синхронизации, хотя это не совсем так, просто заблокировал нажатие стрелок вниз-вверх на гридах, а также возможность скроллинга в гридах; вложил оба грида в scrollbox и в нем спускаюсь вниз по гридам.
Но есть баг-фича = при нажатии на какую-нибудь ячейку после прокрутки в скролбоксе или при поптке ее растянуть - выскакивает в самый верх скроллбокса.
...
Рейтинг: 0 / 0
StringGrid, как сделать изменение высоты мышью на простой колонке
    #40007871
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alexander2
...Как обеспечить синхронизацию?
...

Alexander2,

а посмотри, как решена твоя задача в демке Advanced к TVirtualStringTree, модуль VisibilityDemo.pas - там как раз демонстрируется задача синхронизации двух гридов. И вообще - нафиг тебе этот стринггрид. :)
...
Рейтинг: 0 / 0
StringGrid, как сделать изменение высоты мышью на простой колонке
    #40007873
Alexander2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ъъъъъ,
да с радостью попробую.

Я тут еще проектик накидал, без всяких синхронизаций - если с нуля два стрингрида вложить в скроллбокс, заполнить их штук 100 строк в каждом, проскроллить вниз, в каком-нибудь стрингриде нажать на ячейку - то внезапно фокус перепрыгивает вверх по скроллбоксу к самой верхней части стрингридов. То есть это как-то по умолчанию связано с поведением стрингрида.
...
Рейтинг: 0 / 0
StringGrid, как сделать изменение высоты мышью на простой колонке
    #40007898
Alexander2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ъъъъъ,

Посмотрел, не совсем то что нужно. Вероятно, я немного ввел в заблуждение говоря о синхронизации гридов.
Задача не в синхрнонизации (когда я заблокировал любую навигацию по гридам, то почти добился своего), а в том, чтобы самый левый грид с четко определенным числом строк ( от 10- до 1000, до 2000 и так далее...) отражал шкалу глубины и был заморожен как реперный объект для других гридов. Добившись возможности в прилегающем гриде менять высоту произвольной ячейки, задача оказалась почти решена. Но... даже если не делять никаких ухищрений, а кинуть в скроллбокс два смежных стрингрида, сместиться по скролбоксу вниз, то при случайных кликах на любую ячейку любого из гридов - фокус выбрасывает в верх скроллбокса в первые строчки стригридов.
...
Рейтинг: 0 / 0
StringGrid, как сделать изменение высоты мышью на простой колонке
    #40007902
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нужно понятнее излагать задачу, тогда и решения могут быть другими.
...
Рейтинг: 0 / 0
StringGrid, как сделать изменение высоты мышью на простой колонке
    #40007904
Alexander2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DimaBr,

Вот тут Похожую проблему как-то решили = How can I disable the scroll-into-view behavior of TScrollBox?

Но что-то не удается "присобачить" в моем тестовом проекте и заблокировать прыжки в топ.
...
Рейтинг: 0 / 0
StringGrid, как сделать изменение высоты мышью на простой колонке
    #40007906
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я то знаю условия задачи, другие не знают
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / StringGrid, как сделать изменение высоты мышью на простой колонке
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]