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

Переопределить CalcSizingState в TStringGrid.
...
Рейтинг: 0 / 0
11.10.2020, 03:58
    #40007381
Alexander2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
StringGrid, как сделать изменение высоты мышью на простой колонке
rgreat,
хеххх, если б знать как!?
Если переопределить этот параметр для TStringGrid, то во всем проекте, где еще используется StringGrid будет такое?
Или это для конкретной формы?
...
Рейтинг: 0 / 0
11.10.2020, 04:11
    #40007382
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
StringGrid, как сделать изменение высоты мышью на простой колонке
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
11.10.2020, 04:58
    #40007384
Alexander2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
StringGrid, как сделать изменение высоты мышью на простой колонке
rgreat,
аднака работает!!! Спасибо.
Подобный код очень похожий я встречал на корлевстве дельфи, тот не смог запустить, а это подарок зашел хорошо.
Большой респект!
...
Рейтинг: 0 / 0
11.10.2020, 06:12
    #40007385
Alexander2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
StringGrid, как сделать изменение высоты мышью на простой колонке
rgreat,
Получилось так, но есть косяк, при скроллинге вниз меняется только этот stringgrid, в итоге теряется синхронизация с левым гридом, и наоборот. Как обеспечить синхронизацию?
...
Рейтинг: 0 / 0
11.10.2020, 16:04
    #40007444
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
StringGrid, как сделать изменение высоты мышью на простой колонке
Alexander2,

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

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

Alexander2,

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

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

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

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

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


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