С Новым годом! Форум программистов, компьютерный форум, киберфорум
Lazarus
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 16.03.2023
Сообщений: 22
1

Controls в ячейках StringGrid. Артефакты

25.03.2024, 00:08. Показов 1564. Ответов 29

Author24 — интернет-сервис помощи студентам
Дорого времени суток!
Есть StringGrid. В ячейки вписаны чекбоксы и комбобоксы. При отрисовке появляются артефакты. А при прокрутке вообще жесть - в отдельных местах появляется то, чего не должно быть, или пропадает часть изображения. Если жмякнуть мышой в любом месте грида, изображение приходит в норму (ну визуально вроде норм). Если прокрутить вниз до упора, контролы в верхней части грида наползают на заголовок (т.е. если первая видимая частично ушла под титл, то контрол ложится на него), и это мышой не лечится. И по форуму лазил, и в инете гуглил... Рекомендуемые решения (по сути из всего множества найденного их было всего два) к желаемому результату не привели.
Помогите, плз.
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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
unit uFMain;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, Grids, StdCtrls,
  LResources, FileUtil, RTTIGrids, Types;
 
type
 
  { TFMain }
 
  TFMain = class(TForm)
    SGr: TStringGrid;
    procedure FormCreate(Sender: TObject);
    procedure SGrDrawCell(Sender: TObject; aCol, aRow: Integer; aRect: TRect; aState: TGridDrawState);
    procedure SGrTopLeftChanged(Sender: TObject);
  private
 
  public
 
  end;
 
var
  FMain: TFMain;
  //листы для контролов
  ListChBox:TList;
  ListChBox2:TList;
  ListCmBox:TList;
 
  tr,vr,lc,vc: Integer; //для окна наблюдения
 
implementation
 
{$R *.lfm}
 
{ TFMain }
 
procedure TFMain.FormCreate(Sender: TObject);
var
    pChBox:^TCheckBox;
    pChBox2:^TCheckBox;
    pCmBox:^TComboBox;
    i:integer;
begin
 
  SGr.RowCount:=25;  //строка 24 последняя
 
  ListChBox:=TList.Create;
  ListChBox.Capacity:=SGr.RowCount;
 
  ListChBox2:=TList.Create;
  ListChBox2.Capacity:=SGr.RowCount;
 
  ListCmBox:=TList.Create;
  ListCmBox.Capacity:=SGr.RowCount;
 
 
 
   for i:=0 to SGr.RowCount-1 do
   begin
      //для col[2]
      new(pChBox);
      pChBox^:=TCheckBox.Create(SGr);
      pChBox^.Parent:=SGr;
      pChBox^.Visible:=False;
      ListChBox.Add(pChBox);
      //для col[3]
      new(pChBox2);
      pChBox2^:=TCheckBox.Create(SGr);
      pChBox2^.Parent:=SGr;
      pChBox2^.Visible:=False;
      ListChBox2.Add(pChBox2);
      //для col[1]
      new(pCmBox);
      pCmBox^:=TComboBox.Create(SGr);
      pCmBox^.Parent:=SGr;
      pCmBox^.Visible:=False;
      pCmBox^.Items.Add(i.ToString); //для теста пишем в итем номер строки, где должен быть контрол
      ListCmBox.Add(pCmBox);
   end;
 
   //в первый солбец (col[0]) пишем номера строк
   for i:=1 to SGr.RowCount-1 do  // в заголовок не пишем (title.caption из инспектора)
   begin
      SGr.Cells[0,i]:=i.ToString;
   end;
 
  //подгоняем высоту строк под ComboBox
  SGr.DefaultRowHeight:=TComboBox(ListCmBox[3]^).Height;
end;
 
procedure TFMain.SGrDrawCell(Sender: TObject; aCol, aRow: Integer; aRect: TRect; aState: TGridDrawState);
begin
  //для окна наблюдения
   tr:=SGr.TopRow;
   vr:=SGr.VisibleRowCount;
   lc:=SGr.LeftCol;
   vc:=SGr.VisibleColCount;
 
  if (aRow>tr-1) and (arow<tr+vr+1) and
     (aCol>=lc) and (aCol<lc+vc) then
  begin
 
      if (acol=1) then
      begin
        TComboBox(ListCmBox[aRow]^).Width:= SGr.Columns.Items[acol].Width;
        TComboBox(ListCmBox[aRow]^).Top:=arect.Top;
        TComboBox(ListCmBox[aRow]^).Left:=arect.Left;
        TComboBox(ListCmBox[aRow]^).Visible:=True;
      end;
 
      if (acol=2) then
      begin
        TCheckBox(ListChBox[aRow]^).Top:=(arect.Top+
          Trunc(SGr.RowHeights[aRow]/2)-
          Trunc(TCheckBox(ListChBox[aRow]^).Height/2)-1);
        TCheckBox(ListChBox[aRow]^).Left:=arect.Left+
          Trunc(SGr.Columns.Items[acol].Width/2)-
          Trunc(TCheckBox(ListChBox[aRow]^).Width/2)+acol;
        TCheckBox(ListChBox[aRow]^).Visible:=True;
      end;
 
      if  (acol=3) and (aRow=3)then
      begin
        TCheckBox(ListChBox2[aRow]^).Top:=
          (arect.Top+
          Trunc(SGr.RowHeights[aRow]/2)-Trunc(TCheckBox(ListChBox2[aRow]^).Height/2)-1);
        TCheckBox(ListChBox2[aRow]^).Left:=
          arect.Left+
          Trunc(SGr.Columns.Items[acol].Width/2)-Trunc(TCheckBox(ListChBox2[aRow]^).Width/2)+3;
        TCheckBox(ListChBox2[aRow]^).Visible:=True;
      end;
  end else
  begin
    TCheckBox(ListChBox[aRow]^).Visible:=false;
    TCheckBox(ListChBox2[aRow]^).Visible:=false;
    TComboBox(ListCmBox[aRow]^).Visible:=false;
  end;
end;
 
procedure TFMain.SGrTopLeftChanged(Sender: TObject);
var
    i: Integer;
begin
 
 for i:=1 to sgr.RowCount-1 do
 begin
   if (i>tr-1) and (i<tr+vr) and
      (sgr.Col>=lc) and (sgr.Col<lc+vc+1) then
   begin
       if (sgr.Col=1) then
       begin
         TComboBox(ListCmBox[i]^).Width:= SGr.Columns.Items[sgr.Col].Width;
         TComboBox(ListCmBox[i]^).Visible:=True;
       end;
 
       if (sgr.Col=2) then
       begin
         TCheckBox(ListChBox[i]^).Visible:=True;
       end;
 
       if  (sgr.Col=3) and (i=3)then
       begin
         TCheckBox(ListChBox2[i]^).Visible:=True;
       end;
   end else
   begin
     TCheckBox(ListChBox[i]^).Visible:=false;
     TCheckBox(ListChBox2[i]^).Visible:=false;
     TComboBox(ListCmBox[i]^).Visible:=false;
   end;
 end;
end;
 
end.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.03.2024, 00:08
Ответы с готовыми решениями:

Изображения в ячейках StringGrid
Доброго времени суток, формчане. Есть группа кнопок SpeedButton с изображениями BMP на каждой, и...

Вычисления в ячейках StringGrid
Здравствуйте! Помогите пожалуйста с возникшей проблемой. procedure...

Выравнивание в ячейках StringGrid
народ !!! подскажите как можно задать выравнивание текста в ячейке StringGrid.Заранее благодарен.

Изменение значения в ячейках stringgrid
Здравствуйте, такая проблема, суть задачи в замене столбцов в которых лежат наибольший и наименьший...

Убрать повторения в ячейках StringGrid
В ячейках StringGrid есть текст пример: (пр)(о)(пр)(о) как оставить только (пр)(о) Во всей...

29
Злостный нарушитель
9598 / 5191 / 1185
Регистрация: 12.03.2015
Сообщений: 24,513
25.03.2024, 08:09 2
Это чо за БДСМ такой? Зачем??

Controls в ячейках StringGrid. Артефакты
0
Злостный нарушитель
9598 / 5191 / 1185
Регистрация: 12.03.2015
Сообщений: 24,513
25.03.2024, 08:11 3
Цитата Сообщение от leospb Посмотреть сообщение
Рекомендуемые решения (по сути из всего множества найденного их было всего два) к желаемому результату не привели.
И чо это были за решения?
0
0 / 0 / 0
Регистрация: 16.03.2023
Сообщений: 22
25.03.2024, 10:59  [ТС] 4
Цитата Сообщение от Verevkin Посмотреть сообщение
Это чо за БДСМ такой? Зачем??
Ну ниже по коду же видно для чего. Если есть более интересное и правильное решение, приму с глубочайшим почтением.

Цитата Сообщение от Verevkin Посмотреть сообщение
Цитата Сообщение от leospb Посмотреть сообщение
Рекомендуемые решения (по сути из всего множества найденного их было всего два) к желаемому результату не привели.
И чо это были за решения?
Использовать DrawCell (что я и сам знал) и TopLeftChanged.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32993 / 21299 / 8180
Регистрация: 22.10.2011
Сообщений: 36,594
Записей в блоге: 8
25.03.2024, 11:09 5
Цитата Сообщение от leospb Посмотреть сообщение
Рекомендуемые решения
Правильное решение - использовать Columns, в которых выставлен нужный ButtonStyle + PickList, если нужно... А все вот эти ручные встраивания не нужны.
1
Злостный нарушитель
9598 / 5191 / 1185
Регистрация: 12.03.2015
Сообщений: 24,513
25.03.2024, 11:26 6
Цитата Сообщение от leospb Посмотреть сообщение
Ну ниже по коду же видно для чего. Если есть более интересное и правильное решение, приму с глубочайшим почтением.
Классовые типы - это уже указатели. TCheckBox, TComboBox и т.д. - это указатели. Это не С++, это Delphi.
0
680 / 290 / 74
Регистрация: 07.01.2023
Сообщений: 1,202
25.03.2024, 11:30 7
Цитата Сообщение от leospb Посмотреть сообщение
Если есть более интересное и правильное решение, приму с глубочайшим почтением.
Не отображать компонент в ячейке, а отрисовывать его там. Отображать, только если ячейчас перешла в режим редактирования. Посмотрите как сделан ExpressQuantumGrid
0
0 / 0 / 0
Регистрация: 16.03.2023
Сообщений: 22
25.03.2024, 23:03  [ТС] 8
Цитата Сообщение от volvo Посмотреть сообщение
Правильное решение - использовать Columns, в которых выставлен нужный ButtonStyle + PickList, если нужно...
ComboBox через SelectEditor - да, вполне нормальное решение. Ткнулся на редактирование, увидел комбик, выбрал.
А как быть CheckBox? Он то должен отображаться всегда. И далеко не всегда во всех ячейках столбца (как при выборе Columns.Items[i].ButtonStyle:=cbsCheckboxColumn). Если знаете способ, подскажите, плз.
0
Айлурофил
476 / 410 / 109
Регистрация: 27.05.2017
Сообщений: 2,361
Записей в блоге: 1
25.03.2024, 23:22 9
Цитата Сообщение от leospb Посмотреть сообщение
А как быть CheckBox? Он то должен отображаться всегда. И далеко не всегда во всех ячейках столбца
Вот так, например.
Миниатюры
Controls в ячейках StringGrid. Артефакты  
0
0 / 0 / 0
Регистрация: 16.03.2023
Сообщений: 22
25.03.2024, 23:35  [ТС] 10
Цитата Сообщение от Massaraksh7 Посмотреть сообщение
Вот так, например.
Картинка красивая. У меня таких тоже есть.
Но это никак не решает проблему.
Как получен сей результат?
В коде выше я тоже получаю нечто похожее, и в статике выглядит не хуже, и контролы рабочие. А при скроллинге опа.
0
Айлурофил
476 / 410 / 109
Регистрация: 27.05.2017
Сообщений: 2,361
Записей в блоге: 1
25.03.2024, 23:40 11
Цитата Сообщение от leospb Посмотреть сообщение
Но это никак не решает проблему.
Решает. Реально, там нет компонента CheckBox, есть "нарисованный CheckBox", информация о его состоянии хранится в Objects ячейки. Сейчас динамику покажу.
0
Айлурофил
476 / 410 / 109
Регистрация: 27.05.2017
Сообщений: 2,361
Записей в блоге: 1
25.03.2024, 23:44 12
***
Миниатюры
Controls в ячейках StringGrid. Артефакты  
0
0 / 0 / 0
Регистрация: 16.03.2023
Сообщений: 22
25.03.2024, 23:53  [ТС] 13
Красиво, но непонятно.
Чеки нарисованные или картинки?
0
Айлурофил
476 / 410 / 109
Регистрация: 27.05.2017
Сообщений: 2,361
Записей в блоге: 1
26.03.2024, 00:56 14
Непонятно мне, что непонятно. "Чекбокс" - это нарисованная картинка. В зависимости от "состояния".

Добавлено через 52 минуты
Состояние хранится в TStringGrid.Objects[col,row]
1
пофигист широкого профиля
4753 / 3190 / 860
Регистрация: 15.07.2013
Сообщений: 18,478
26.03.2024, 02:11 15
Цитата Сообщение от leospb Посмотреть сообщение
А как быть CheckBox? Он то должен отображаться всегда. И далеко не всегда во всех ячейках столбца (как при выборе Columns.Items[i].ButtonStyle:=cbsCheckboxColumn).
CheckBox в отдельных ячейках StringGrid???
Какого же ужасного для пользователей монстра вы пытаетесь сотворить?
0
Massaraksh7
26.03.2024, 18:45
  #16

Не по теме:

Цитата Сообщение от northener Посмотреть сообщение
CheckBox в отдельных ячейках StringGrid???
Какого же ужасного для пользователей монстра вы пытаетесь сотворить?
There are more things in heaven and earth, Horatio,
Than are dreamt of in your philosophy.

0
0 / 0 / 0
Регистрация: 16.03.2023
Сообщений: 22
26.03.2024, 20:51  [ТС] 17
Цитата Сообщение от Massaraksh7 Посмотреть сообщение
"Чекбокс" - это нарисованная картинка. В зависимости от "состояния".
Добавлено через 52 минуты
Состояние хранится в TStringGrid.Objects[col,row]
Спасибо за мыслю.
Дерзаю. Правда с TStringGrid.Objects ещё не работал, как то без него обходился.
Картинки нарисовал, в ячейки вставил, центровку сделал. тепрь надо всё вместе как то
0
пофигист широкого профиля
4753 / 3190 / 860
Регистрация: 15.07.2013
Сообщений: 18,478
27.03.2024, 01:53 18

Не по теме:

Цитата Сообщение от Massaraksh7 Посмотреть сообщение
There are more things in heaven and earth, Horatio,
Than are dreamt of in your philosophy.
Не надо тревожить дух Вильяма нашего, Шекспира! Он уж точно не при чем.


1
Айлурофил
476 / 410 / 109
Регистрация: 27.05.2017
Сообщений: 2,361
Записей в блоге: 1
27.03.2024, 04:20 19
Цитата Сообщение от leospb Посмотреть сообщение
тепрь надо всё вместе как то
В событии OnDrawCell проверяется номер строки и столбца грида, если он тот, где должен быть "чекбокс", то рисуется картинка (чекнутая или не чекнутая, в зависимости от состояния, которое где-то хранится). При OnClick на соответствующей ячейке грида состояние меняется.
Собственно, всё.
1
0 / 0 / 0
Регистрация: 16.03.2023
Сообщений: 22
27.03.2024, 20:05  [ТС] 20
Цитата Сообщение от Massaraksh7 Посмотреть сообщение
Состояние хранится в TStringGrid.Objects[col,row]
Извини за вопрос, но меня за живое задело.
А как ты значения в Objeсts заталкиваешь?
Справочник читал, в нете смотрел и примеры (там про картинки и фон, ну и про контролы).
Пытался по аналогии - ни шиша не выходит. (я через TStrings пытался).
0
27.03.2024, 20:05
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.03.2024, 20:05
Помогаю со студенческими работами здесь

Перенос слов в ячейках StringGrid'a
Необходимо настроить перенос слов в ячейках таблицы.... Гугл, как и CYberForum выдает массу...

Замена значений в ячейках StringGrid
Добрый день! Имеется такая проблема: в StringGrid в ячейках находятся значения, заранее написанные...

Перенос текста в ячейках StringGrid
Нашел дельфиский код c использованием API procedure TForm1.StringGrid1DrawCell(Sender: TObject;...

Сложение значений в ячейках StringGrid
Задание: Ввести в StringGrid массив из 13 вещественных чисел. Создать два новых массива: в первый...

Проскроллить StringGrid с компонентами в ячейках
Ребята, здравствуйте. Наитупейший вопрос. Но я застрял на пол дня. Есть на форме StringGrid. В...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru