Форум программистов, компьютерный форум, киберфорум
Delphi
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
 Аватар для Пытливый
3763 / 2267 / 705
Регистрация: 29.05.2013
Сообщений: 9,622

Тюнинг TStringGrid

25.03.2022, 14:20. Показов 1869. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Удобный компонент TStringGrid, но есть некоторые вещи, которые хотелось бы в него встроить, без написания своего потомка. Например заполнить его случайными числами:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
type
  TStringGridHelper = class helper for TStringGrid
  public
    procedure RandomData(AStartRange: Integer = 0; AFinishRange: Integer = 0); overload;
  end;
...
procedure TStringGridHelper.RandomData(AStartRange: Integer; AFinishRange: Integer);
var
  Row,Col: Integer;
begin
 for Row := FixedRows to RowCount-1
 do for Col := FixedCols to ColCount-1
    do Cells[Col,Row] := IntToStr(AStartRange + Random(AFinishRange - AStartRange));
end;
И теперь просто вызываем новый метод:
Delphi
1
2
3
4
procedure TForm1.FormCreate(Sender: TObject);
begin
 StringGrid1.RandomData(-50, 50);
end;
Отлично, работает. Чего бы еще такого полезного в него зафигачить? О! Цвет и шрифт отдельной ячейки наверное будет полезен и может еще чего потом придумаю.
Delphi
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
type
  TCellProperty = class
  private
    FColor: TColor;
    FFont: TFont;
    FCol: Integer;
    FRow: Integer;
  public
    constructor Create(ACol, ARow: Integer; AColor: TColor; AFont: TFont);
    property Col: Integer read FCol write FCol;
    property Row: Integer read FRow write FRow;
    property Font: TFont read FFont write FFont;
    property Color: TColor read FColor write FColor;
  end;
 
  TStringGridHelper = class helper for TStringGrid
  private
    class var FCellProperties: TList;
    function GetCellProperty(ACol, ARow: Integer): TCellProperty;
  public
    procedure RandomData(AStartRange: Integer = 0; AFinishRange: Integer = 0); overload;
    property CellProperty[ACol, ARow: Integer]: TCellProperty read GetCellProperty;
  end;
 
  TForm1 = class(TForm)
    SG: TStringGrid;
    procedure FormCreate(Sender: TObject);
    procedure SGDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
uses System.Types;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
 SG.RandomData(-50, 50);
 with SG.CellProperty[1,1]
 do begin
    Color := clBlue;
    Font.Size := 20;
    Font.Name := 'Segue UI';
    Font.Color := clWhite;
    end;
 with SG.CellProperty[2,2]
 do begin
    Color := clRed;
    Font.Size := 14;
    Font.Name := 'Times New Roman';
    Font.Color := clYellow;
    end;
end;
 
procedure TForm1.SGDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);
begin
 SG.Canvas.Brush.Color := SG.CellProperty[ACol,ARow].Color;
 SG.Canvas.Font := SG.CellProperty[ACol,ARow].Font;
 SG.Canvas.FillRect(Rect);
 DrawText(SG.Canvas.Handle, SG.Cells[ACol,ARow], Length(SG.Cells[ACol,ARow]), Rect, DT_SINGLELINE or DT_CENTER or DT_VCENTER);
end;
 
 
{ TStringGridHelper }
 
procedure TStringGridHelper.RandomData(AStartRange: Integer; AFinishRange: Integer);
var
  Row,Col: Integer;
begin
 for Row := FixedRows to RowCount-1
 do for Col := FixedCols to ColCount-1
    do Cells[Col,Row] := IntToStr(AStartRange + Random(AFinishRange - AStartRange));
end;
 
function TStringGridHelper.GetCellProperty(ACol, ARow: Integer): TCellProperty;
var
  i: Integer;
begin
 if not Assigned(FCellProperties) then FCellProperties := TList.Create;
 for i := 0 to FCellProperties.Count-1
 do with TCellProperty(FCellProperties[i])
    do if (FCol = ACol) and (FRow = ARow)
       then begin
            Result := FCellProperties[i];
            Exit;
            end;
 Result := FCellProperties[FCellProperties.Add(TCellProperty.Create(ACol, ARow, Color, Font))];
end;
 
{ TCellProperty }
 
constructor TCellProperty.Create(ACol, ARow: Integer; AColor: TColor; AFont: TFont);
begin
 FCol := ACol;
 FRow := ARow;
 FColor := AColor;
 FFont := TFont.Create;
 FFont.Assign(AFont);
end;
Миниатюры
Тюнинг TStringGrid  
2
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.03.2022, 14:20
Ответы с готовыми решениями:

TStringGrid
Есть на форме элемент StringGrid1. В его 0 ячейку не влезает название "Расстояния до точек изменения площадей сечения , см". Можно...

Работа с TStringGrid.
Вобщем я создал программу для хранения оценок и мне надо ,чтобы оценки в form1.stringrid1 подсчитывались ,находилось их среднее...

Работа с TStringGrid.
всем доброго времени суток!!! проблема у меня такого рода. Мне необходимо создать таблицу и счелкнув по одной из ячеек необходимо что бы...

8
AxBxC=X
 Аватар для harrybook
155 / 135 / 58
Регистрация: 27.04.2016
Сообщений: 549
26.03.2022, 06:26
Чего бы еще такого полезного в него зафигачить?
1) Пятнашки, морской бой, тетрис
2) Excel (minimal edition)
0
 Аватар для Пытливый
3763 / 2267 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
26.03.2022, 11:24  [ТС]
Решение аля Эксель, с расчетом формул я уже публиковал, но без хэлпера, можно сделать и для него. Пока добавил выравнивание текста в ячейке и многострочность.
Кликните здесь для просмотра всего текста
Delphi
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
type
  TCellProperty = class
  private
    FCol: Integer;
    FRow: Integer;
    FColor: TColor;
    FFont: TFont;
    FWordWrap: Boolean;
    FAlignment: TAlignment;
  public
    constructor Create(ACol, ARow: Integer; AColor: TColor; AFont: TFont; AAlignment: TAlignment = taCenter; AWordWrap: Boolean = False);
    property Col: Integer read FCol write FCol;
    property Row: Integer read FRow write FRow;
    property Font: TFont read FFont write FFont;
    property Color: TColor read FColor write FColor;
    property WordWrap: Boolean read FWordWrap write FWordWrap;
    property Alignment: TAlignment read FAlignment write FAlignment;
  end;
 
  TStringGridHelper = class helper for TStringGrid
  private
    class var FCellProperties: TList;
    function GetCellProperty(ACol, ARow: Integer): TCellProperty;
  public
    procedure RandomData(AStartRange: Integer = 0; AFinishRange: Integer = 0); overload;
    property CellProperty[ACol, ARow: Integer]: TCellProperty read GetCellProperty;
  end;
 
  TForm1 = class(TForm)
    SG: TStringGrid;
    procedure FormCreate(Sender: TObject);
    procedure SGDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
uses System.Types;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
 SG.RandomData(-50, 50);
 SG.Cells[1,1] := 'one row'#13'two row';
 with SG.CellProperty[1,1]
 do begin
    Color := clBlue;
    Font.Size := 8;
    Font.Name := 'Segue UI';
    Font.Color := clWhite;
    WordWrap := True;
    Alignment := taCenter;
    end;
 with SG.CellProperty[2,2]
 do begin
    Color := clRed;
    Font.Size := 14;
    Font.Name := 'Times New Roman';
    Font.Color := clYellow;
    end;
end;
 
procedure TForm1.SGDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);
var
  Options: Cardinal;
begin
 SG.Canvas.Brush.Color := SG.CellProperty[ACol,ARow].Color;
 SG.Canvas.Font := SG.CellProperty[ACol,ARow].Font;
 SG.Canvas.FillRect(Rect);
 Options := DT_VCENTER;
 case SG.CellProperty[ACol,ARow].Alignment
 of taLeftJustify: Options := Options or DT_LEFT;
    taCenter: Options := Options or DT_CENTER;
    taRightJustify: Options := Options or DT_RIGHT;
 end;
 if SG.CellProperty[ACol,ARow].WordWrap
 then Options := Options or DT_WORDBREAK
 else Options := Options or DT_SINGLELINE;
 DrawText(SG.Canvas.Handle, SG.Cells[ACol,ARow], Length(SG.Cells[ACol,ARow]), Rect, Options);
end;
 
{ TStringGridHelper }
 
procedure TStringGridHelper.RandomData(AStartRange: Integer; AFinishRange: Integer);
var
  Row,Col: Integer;
begin
 for Row := FixedRows to RowCount-1
 do for Col := FixedCols to ColCount-1
    do Cells[Col,Row] := IntToStr(AStartRange + Random(AFinishRange - AStartRange));
end;
 
function TStringGridHelper.GetCellProperty(ACol, ARow: Integer): TCellProperty;
var
  i: Integer;
begin
 if not Assigned(FCellProperties) then FCellProperties := TList.Create;
 for i := 0 to FCellProperties.Count-1
 do with TCellProperty(FCellProperties[i])
    do if (FCol = ACol) and (FRow = ARow)
       then begin
            Result := FCellProperties[i];
            Exit;
            end;
 Result := FCellProperties[FCellProperties.Add(TCellProperty.Create(ACol, ARow, Color, Font))];
end;
 
{ TCellProperty }
 
constructor TCellProperty.Create(ACol, ARow: Integer; AColor: TColor; AFont: TFont; AAlignment: TAlignment; AWordWrap: Boolean);
begin
 FCol := ACol;
 FRow := ARow;
 FColor := AColor;
 FFont := TFont.Create;
 FFont.Assign(AFont);
 FAlignment := AAlignment;
 FWordWrap := AWordWrap;
end;
 
end.
0
 Аватар для Пытливый
3763 / 2267 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
09.04.2022, 11:09  [ТС]
Продолжаю глумится над гридом. Добавил поддержку цветовых тем, чередование строк,колонок. Возник эстетический вопрос. Если выбрано чередование строк и колонок, то как должен выглядеть грид?
Шахматка.

Крест
3
 Аватар для Пытливый
3763 / 2267 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
09.04.2022, 11:16  [ТС]
Сам себе и отвечу - оба варианта. Просто шахматку как отдельный вариант сделал.
0
 Аватар для k245
0 / 0 / 0
Регистрация: 17.12.2022
Сообщений: 5
19.12.2022, 09:42
У меня несколько вопросов по вашей теме.
1) Почему вы не хотите писать своего потомка?
2) Зачем добавлять возможности без запроса со стороны бизнеса?
0
 Аватар для Пытливый
3763 / 2267 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
19.12.2022, 12:15  [ТС]
Цитата Сообщение от k245 Посмотреть сообщение
Почему вы не хотите писать своего потомка?
Тема называется "Тюнинг TStringGrid", т.е. изначально идея состояла именно в дополнении существующего класса некоторыми расширенными возможностями, без создания потомка.
0
5975 / 4550 / 1095
Регистрация: 29.08.2013
Сообщений: 28,170
Записей в блоге: 3
21.12.2022, 12:28
нужен еще экспорт этой цветной красоты в html
0
 Аватар для Пытливый
3763 / 2267 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
21.12.2022, 13:53  [ТС]
Цитата Сообщение от qwertehok Посмотреть сообщение
нужен еще экспорт этой цветной красоты в html
Насчет экспорта... вроде ничего сложного, надо попробовать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.12.2022, 13:53
Помогаю со студенческими работами здесь

комоненты TStringGrid и TDrawGrid
Таблица, представляющая собой типичное двухнедельное расписание (столбцы - недели, строки - пары). Разные недели, а также пары,...

TStringGrid отрисовка ячеек
добрый вечер. Есть ValueListEditor (по сути тот же StringGrid). естественно, рисуется с учетом текущей темы или стиля. так вот. можно ли...

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

Как отловить событие изменения ширины столбца (когда меняешь мышой) у компонента TStringGrid?
добрый вечер. как отловить событие изменения ширины столбца (когда меняешь мышой) у компонента TStringGrid?

Сортировка в TStringGrid.
procedure SgSort(aSg : TStringGrid; const aCol : Integer); var SlSort, SlRow : TStringList; i, j : Integer; begin SlSort :=...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru