Форум программистов, компьютерный форум, киберфорум
Lazarus
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.56/25: Рейтинг темы: голосов - 25, средняя оценка - 4.56
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648

Работа с компонентом StringGrid

26.10.2019, 01:10. Показов 5165. Ответов 42
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем здравствуйте.

Поместил на форму компонент StringList, в designtime установил 7x7 квадратных ячеек, без фиксированных строк и столбцов, в редакторе компонента внёс в ячейки текст по одному символу. Установил свойство UseXORFeatures. Вопросы:
- как отключить множественное выделение нескольких ячеек мышью (удерживая левую кнопку и перемещаясь вправо и вниз, например)? Нужно выделение единственной ячейки при клике мышкой или установке фокуса с клавиатуры.
- как программно записать в ячейку с адресом ряд №2 колонка № 3 некоторый текст?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
26.10.2019, 01:10
Ответы с готовыми решениями:

Работа с компонентом TChart
Добрый вечер, мне стало интересно можно ли из легенды компонента TChart выудить следующую информацию? Если в Edit1 ввести название,...

Работа с компонентом TComboBox
Нужно сохранить в ini-файл выбранную строку из combobox'а. Какой тип переменной мне использовать?(string и word не подходит)

Работа с компонентом memo
Такой вопрос: Примерный код: Case RadioGroup1.ItemIndex of 0:sum:=sum+a; 1:sum:= sum+b; 2:sum:= sum+c; При...

42
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33459 / 21559 / 8248
Регистрация: 22.10.2011
Сообщений: 37,016
Записей в блоге: 12
26.10.2019, 11:06
Студворк — интернет-сервис помощи студентам
Можно и так, но я обычно использую Sender, а не прямое указание имени компонента.
0
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
26.10.2019, 11:12  [ТС]
volvo, на всякий случай. Правильно ли я рисую:
Pascal
1
2
3
4
5
6
7
procedure TForm1.StringGrid1DrawCell(Sender: TObject; aCol, aRow: Integer;
    aRect: TRect; aState: TGridDrawState);
begin
    StringGrid1.Canvas.Pen.Color:= clBlue;
    StringGrid1.Canvas.Pen.Width:= 2;
    StringGrid1.Canvas.Line(0 , StringGrid1.DefaultRowHeight, 7*StringGrid1.DefaultColWidth, StringGrid1.DefaultRowHeight);
end;
Добавлено через 3 минуты
так?
Pascal
1
2
3
4
5
6
7
8
9
procedure TForm1.StringGrid1DrawCell(Sender: TObject; aCol, aRow: Integer;
    aRect: TRect; aState: TGridDrawState);
var g: TStringGrid;
begin
    g:= Sender as TStringGrid;
    g.Canvas.Pen.Color:= clBlue;
    g.Canvas.Pen.Width:= 2;
    g.Canvas.Line(0 , g.DefaultRowHeight, 7*g.DefaultColWidth, g.DefaultRowHeight);
end;
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33459 / 21559 / 8248
Регистрация: 22.10.2011
Сообщений: 37,016
Записей в блоге: 12
26.10.2019, 12:35
Зачем же впустую расходовать ресурсы и 49 раз делать перерисовку одной и той же линии, если это можно сделать, рисуя 7 фрагментов всего за 7 раз?

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
procedure TForm1.StringGrid1DrawCell(Sender: TObject; aCol, aRow: Integer;
  aRect: TRect; aState: TGridDrawState);
var Canv : TCanvas;
begin
  Canv := (Sender as TStringGrid).Canvas;
  if ARow = 0 then
  begin
    Canv.Pen.Color := clBlue;
    Canv.Pen.Width := 2;
    Canv.Line(Point(ARect.Left - 1, ARect.Bottom - 1), Point(ARect.Right + 1, ARect.Bottom - 1));
  end;
end;
Результат - тот же.
1
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
26.10.2019, 13:37  [ТС]
volvo, а поверх линий сетки рисовать нельзя? - сетку придётся прятать.
0
Почетный модератор
 Аватар для Puporev
64319 / 47615 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
26.10.2019, 13:40
Сделай таблицу 1х1 и рисуй в этой ячейке.
1
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
26.10.2019, 13:49  [ТС]
никак не получается изменить фон дней недели:
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
procedure TForm1.StringGrid1DrawCell(Sender: TObject; aCol, aRow: Integer;
    aRect: TRect; aState: TGridDrawState);
var i: integer;
    Canv: TCanvas;
    //g: TStringGrid;
begin
    //g:= Sender as TStringGrid;
    //g.Canvas.Pen.Color:= clBlue;
    //g.Canvas.Pen.Width:= 1;
    //g.Canvas.Line(0 , 0, 7*g.DefaultColWidth, 0);                                               // Верхняя горизонталь
    //g.Canvas.Line(0 , g.DefaultRowHeight, 7*g.DefaultColWidth, g.DefaultRowHeight);             // Подчёркивание дней недели
    //g.Canvas.Line(0 , 7*g.DefaultRowHeight-1, 7*g.DefaultColWidth, 7*g.DefaultRowHeight-1);     // Нижхняя горизонталь
    //g.Canvas.Line(0 , 0, 0, 7*g.DefaultRowHeight);                                              // Левая вертикаль
    //for i:= 1 to 6 do
    //    g.Canvas.Line(i*g.DefaultColWidth , 0, i*g.DefaultColWidth, g.DefaultRowHeight);        // Вертикальные чёрточки
    //g.Canvas.Line(7*g.DefaultColWidth-1 , 0, 7*g.DefaultColWidth-1, 7*g.DefaultRowHeight);      // Правая вертикаль
 
    Canv := (Sender as TStringGrid).Canvas;
    Canv.Pen.Color := clBlue;
    Canv.Pen.Width := 1;
    Canv.Brush.Color:= clBtnFace;
    Canv.FillRect(10, 10, 10 ,10);   // <-  ЭТО ДЛЯ ПРОБЫ
    if (ARow = 0) then
    begin
        for i:= 1 to 6 do
            Canv.Line(i*SQUARE - 1 , 0, i*SQUARE - 1, SQUARE);        // Вертикальные чёрточки
        Canv.Line(Point(0, 0), Point(ARect.Right, 0));
        Canv.Line(Point(ARect.Left - 1, ARect.Bottom - 1), Point(ARect.Right + 1, ARect.Bottom - 1));
    end;
    if (ARow = 6) then
    begin
        Canv.Line(Point(ARect.Left - 1, ARect.Bottom - 1), Point(ARect.Right + 1, ARect.Bottom - 1));
    end;
    if (ACol = 0) then
    begin
        Canv.Line(Point(ARect.Left, 0), Point(ARect.Left, ARect.Bottom));
    end;
    if (ACol = 6) then
    begin
        Canv.Line(Point(ARect.Right - 1, 0), Point(ARect.Right - 1, ARect.Bottom));
    end;
 
end;
Добавлено через 2 минуты
ой, у меня же квадрата нет - извините, всё понял.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33459 / 21559 / 8248
Регистрация: 22.10.2011
Сообщений: 37,016
Записей в блоге: 12
26.10.2019, 13:49
Цитата Сообщение от jkrnd Посмотреть сообщение
а поверх линий сетки рисовать нельзя?
Можно, но для этого придется писать перехватчик для класса TStringGrid и переопределять метод DrawCellGrid. Обычная отрисовка идет в таком порядке, что сначала рисуется ячейка, а потом, поверх уже нарисованного - сетка.
1
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
26.10.2019, 13:52  [ТС]
теперь дни недели исчезли. Что ж их теперь каждый раз пропечатывать?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33459 / 21559 / 8248
Регистрация: 22.10.2011
Сообщений: 37,016
Записей в блоге: 12
26.10.2019, 13:56
А для того, чтобы изменить цвет фона - не надо затирать все и рисовать самому. Событие OnPrepareCanvas не просто так придумали, достаточно в нем изменить нужные цвета фона и заливки, и грид отрисуется уже этими цветами. Перестань делать так, как делал в Билдере.

Добавлено через 4 минуты
Короче, ты уже лепишь какого-то монстра. Покажи уже скриншот или рисунок того, что надо получить с описанием, что должно происходить по клике на ячейку. Проще переписать все с нуля, чем разбираться в том месиве, которое ты показываешь...
1
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
26.10.2019, 14:01  [ТС]
а всё уже получилось. Это будет низ моего календарика:
Вот код:
Кликните здесь для просмотра всего текста
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
unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
    Classes, SysUtils, Forms, Controls, Graphics, Dialogs, Grids, StdCtrls,
    Dateutils, Types;
 
type
 
    { TForm1 }
 
    TForm1 = class(TForm)
        Label1: TLabel;
        StringGrid1: TStringGrid;
        procedure FormCreate(Sender: TObject);
        procedure StringGrid1DrawCell(Sender: TObject; aCol, aRow: Integer;
            aRect: TRect; aState: TGridDrawState);
        procedure StringGrid1PrepareCanvas(sender: TObject; aCol,
            aRow: Integer; aState: TGridDrawState);
        procedure StringGrid1SelectCell(Sender: TObject; aCol, aRow: Integer;
            var CanSelect: Boolean);
    private
 
    public
 
    end;
const SQUARE = 30;
var
    Form1: TForm1;
    D: TDateTime;
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.FormCreate(Sender: TObject);
var i, R, C : Integer;
begin
    With StringGrid1 do
    begin
        ColCount:= 7;
        RowCount:= 7;
        FixedCols:= 0;
        FixedRows:= 0;
        DefaultRowHeight:= SQUARE;
        DefaultColWidth:= SQUARE;
        Options:= [goFixedHorzLine, goVertLine, goHorzLine, goDrawFocusSelected]; // главное - сбросить goRangeSelect
        Options:= [goFixedHorzLine, goDrawFocusSelected];
        Width:= 7*DefaultColWidth;
        Height:= 7*DefaultRowHeight;
    end;
 
    StringGrid1.Rows[0].CommaText := 'Пн,Вт,Ср,Чт,Пт,Сб,Вс';
    R := 1; C := DayOfTheWeek(StartOfTheMonth(Now)) - 1;
    for i := 1 to DaysInMonth(Now) do
    begin
        StringGrid1.Cells[C, R] := IntToStr(i);
        Inc(C);
        if C >= StringGrid1.ColCount then
        begin
            C := 0; Inc(R);
        end;
    end;
    // Выясняем координаты ячейки, соответствующей дню месяца = 15
    //for R:= 1 to 6 do
    //begin
    //    for C:= 0 to 6 do
    //    begin
    //        if StringGrid1.Cells[C, R] = '15' then
    //        begin
    //            StringGrid1.Row := R;
    //            StringGrid1.Col := C;
    //            exit;
    //        end;
    //    end;
    //end;
    // Но проще это сделать так
    D := EncodeDate(YearOf(Now), MonthOf(Now), DayOf(Now));
    StringGrid1.Row := WeekOfTheYear(D) - WeekOfTheYear(StartOfTheMonth(Now)) + 1;
    StringGrid1.Col := DayOfTheWeek(D) - 1;
 
end;
 
procedure TForm1.StringGrid1DrawCell(Sender: TObject; aCol, aRow: Integer;
    aRect: TRect; aState: TGridDrawState);
var i: integer;
    Canv: TCanvas;
    //g: TStringGrid;
begin
    //g:= Sender as TStringGrid;
    //g.Canvas.Pen.Color:= clBlue;
    //g.Canvas.Pen.Width:= 1;
    //g.Canvas.Line(0 , 0, 7*g.DefaultColWidth, 0);                                               // Верхняя горизонталь
    //g.Canvas.Line(0 , g.DefaultRowHeight, 7*g.DefaultColWidth, g.DefaultRowHeight);             // Подчёркивание дней недели
    //g.Canvas.Line(0 , 7*g.DefaultRowHeight-1, 7*g.DefaultColWidth, 7*g.DefaultRowHeight-1);     // Нижхняя горизонталь
    //g.Canvas.Line(0 , 0, 0, 7*g.DefaultRowHeight);                                              // Левая вертикаль
    //for i:= 1 to 6 do
    //    g.Canvas.Line(i*g.DefaultColWidth , 0, i*g.DefaultColWidth, g.DefaultRowHeight);        // Вертикальные чёрточки
    //g.Canvas.Line(7*g.DefaultColWidth-1 , 0, 7*g.DefaultColWidth-1, 7*g.DefaultRowHeight);      // Правая вертикаль
 
    Canv := (Sender as TStringGrid).Canvas;
    Canv.Pen.Color := clBlue;
    Canv.Pen.Width := 1;
    if (ARow = 0) then
    begin
        for i:= 1 to 6 do
            Canv.Line(i*SQUARE - 1 , 0, i*SQUARE - 1, SQUARE);        // Вертикальные чёрточки
        Canv.Line(Point(0, 0), Point(ARect.Right, 0));
        Canv.Line(Point(ARect.Left - 1, ARect.Bottom - 1), Point(ARect.Right + 1, ARect.Bottom - 1));
    end;
    if (ARow = 6) then
    begin
        Canv.Line(Point(ARect.Left - 1, ARect.Bottom - 1), Point(ARect.Right + 1, ARect.Bottom - 1));
    end;
    if (ACol = 0) then
    begin
        Canv.Line(Point(ARect.Left, 0), Point(ARect.Left, ARect.Bottom));
    end;
    if (ACol = 6) then
    begin
        Canv.Line(Point(ARect.Right - 1, 0), Point(ARect.Right - 1, ARect.Bottom));
    end;
 
end;
 
procedure TForm1.StringGrid1PrepareCanvas(sender: TObject; aCol, aRow: Integer;
    aState: TGridDrawState);
var
  MyTextStyle: TTextStyle;
  canv : TCanvas;
begin
  canv := (sender as TStringGrid).Canvas;
  MyTextStyle := canv.TextStyle;
  MyTextStyle.Alignment := taCenter; // в данном случае все ячейки будут выровнены по центру
  canv.TextStyle := MyTextStyle;
 
  if aRow = 0 then
  begin
      Canv.Brush.Color:= clBtnFace;
  end;
 
  if aCol = 6 then // Изменение №3
  begin
    canv.Font.Color := clRed;
  end;
 
  if gdFocused in aState then
  begin
    canv.Brush.Color := clHighlight;
    canv.Font.Color := clWhite;
  end;
end;
 
procedure TForm1.StringGrid1SelectCell(Sender: TObject; aCol, aRow: Integer; var CanSelect: Boolean);
var day: integer;
begin
  CanSelect := (aRow > 0);                                          // Запрещаем выбирать(выделять) ячейку с днем недели
  if (StringGrid1.Cells[aCol, aRow] = '') then CanSelect := false;  // Запрещаем выбирать(выделять) пустую ячейку
  TryStrToInt(StringGrid1.Cells[aCol, aRow], day);
  if(day > 0) then  Label1.Caption:= IntToStr(day);
end;
 
end.

вот картинка:
Миниатюры
Работа с компонентом StringGrid  
0
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
26.10.2019, 14:02  [ТС]
Огромное спасибо за помощь.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33459 / 21559 / 8248
Регистрация: 22.10.2011
Сообщений: 37,016
Записей в блоге: 12
26.10.2019, 15:05
Вот это все делается гораздо проще:

1) перед классом формы - перехватчик (+ его реализация ниже, в секции Implemented)
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
type
  { TStringGrid }
  TStringGrid = class(Grids.TStringGrid)
    procedure Paint; override;
  end;
 
// ...
implemented
 
{ TStringGrid }
 
procedure TStringGrid.Paint;
var
  i : Integer;
  R : TRect;
begin
  inherited Paint;
 
  if Tag <> 0 then
  begin
    Canvas.Pen.Color := BorderColor;
    for i := 0 to Pred(ColCount) do
    begin
      R := CellRect(i, 0);
      Canvas.Line(Point(R.Right, R.Top), R.BottomRight);
    end;
    Canvas.Line(0, R.Bottom, Width, R.Bottom);
  end;
end;
, и обработчики OnCreate формы и OnPrepareCanvas/OnSelectCell грида:
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
procedure TForm1.FormCreate(Sender: TObject);
var i, R, C : Integer;
begin
  StringGrid1.Flat := True; // !!! Обязательно !!!
  StringGrid1.BorderColor := clBlue;
  StringGrid1.FixedRows := 1;
  StringGrid1.Options := [];
  StringGrid1.Tag := 1; // Будут рисоваться линии в верхней строке только в этом гриде, остальные - без изменений.
 
  StringGrid1.Rows[0].CommaText := 'Пн,Вт,Ср,Чт,Пт,Сб,Вс';
  R := 1; C := DayOfTheWeek(StartOfTheMonth(Now)) - 1;
  for i := 1 to DaysInMonth(Now) do
  begin
    StringGrid1.Cells[C, R] := IntToStr(i);
    Inc(C);
    if C >= StringGrid1.ColCount then
    begin
      C := 0; Inc(R);
    end;
  end;
end;
 
procedure TForm1.StringGrid1PrepareCanvas(sender: TObject; aCol, aRow: Integer;
  aState: TGridDrawState);
var
  MyTextStyle: TTextStyle;
  canv : TCanvas;
begin
  canv := (sender as TStringGrid).Canvas;
  MyTextStyle := canv.TextStyle;
  MyTextStyle.Alignment := taCenter; // в данном случае все ячейки будут выровнены по центру
  canv.TextStyle := MyTextStyle;
 
  if aCol = 6 then
  begin
    canv.Font.Color := clRed;
  end;
 
  if gdFocused in aState then
  begin
    canv.Brush.Color := clHighlight;
    canv.Font.Color := clWindow;
  end;
end;
 
procedure TForm1.StringGrid1SelectCell(Sender: TObject; aCol, aRow: Integer;
  var CanSelect: Boolean);
var Value : Integer;
begin
  CanSelect := (aRow > 0); // Запрещаем выбирать ячейку с днем недели
  if CanSelect and TryStrToInt((Sender as TStringGrid).Cells[ACol, ARow], Value)
  then Label1.Caption := IntToStr(Value);
end;
, никаких OnDrawCell. Вот что получилось. Найди отличия, что называется:
Миниатюры
Работа с компонентом StringGrid  
1
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
26.10.2019, 17:13  [ТС]
Пытаюсь понять назначение перехвата. Почему-то точка останова внутри его реализации ставится но не срабатывает.
Наконец тупо закомментировал код, чтобы понять его функцию:
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
implementation
 
{$R *.lfm}
//implemented
 
{ TStringGrid }
 
procedure TStringGrid.Paint;
var
  i : Integer;
  R : TRect;
begin
  inherited Paint;
 
  if Tag <> 0 then
  begin
    //Canvas.Pen.Color := BorderColor;
    //for i := 0 to Pred(ColCount) do
    //begin
    //  R := CellRect(i, 0);
    //  Canvas.Line(Point(R.Right, R.Top), R.BottomRight);
    //end;
    //Canvas.Line(0, R.Bottom, Width, R.Bottom);
  end;
end;
{ TForm1 }
Изменений в работе приложения до комментирования и после не обнаружил.
Объясните пожалуйста инструкцию
Pascal
1
for i := 0 to Pred(ColCount) do
Добавлено через 13 минут
немного начинает проясняться, перехват Paint для того чтобы не рисовать в OnDrawCell?

Добавлено через 12 минут
Цитата Сообщение от jkrnd Посмотреть сообщение
не обнаружил
потому, что оставил нетронутой процедуру OnDrawCell

Добавлено через 52 минуты
всё, разобрался. Буду пользоваться Вашим вариантом.
Pascal
1
Pred(ColCount) == ColCount-1
, но откуда компилятор узнаёт чьё свойство ColCount? И зачем всё-таки Tag=1?

Добавлено через 1 минуту

Не по теме:

можно ли в Lazarus пользоваться интерфейсом с "приклееными" окнами как в XE-4?

0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33459 / 21559 / 8248
Регистрация: 22.10.2011
Сообщений: 37,016
Записей в блоге: 12
26.10.2019, 19:00
Цитата Сообщение от jkrnd Посмотреть сообщение
но откуда компилятор узнаёт чьё свойство ColCount?
Это перехватчик, там ничего кроме свойств TStringGrid-а не существует.
Цитата Сообщение от jkrnd Посмотреть сообщение
И зачем всё-таки Tag=1?
Затем, чтобы отделить те гриды, в которых будут отображаться календари, от обычных гридов, если вдруг они понадобятся на форме. По умолчанию свойство Tag = 0, так что никакой специальной отрисовки не произойдет, переопределенный метод Paint отработает как дефолтный метод класса Grids.TStringGrid. Чтобы она произошла - нужно изменить Tag.

Не по теме:

Цитата Сообщение от jkrnd Посмотреть сообщение
можно ли в Lazarus пользоваться интерфейсом с "приклееными" окнами как в XE-4?
Можно, но он не всегда стабильный, там глюки, которые не очень-то разработчиками самого Лазаруса правятся (если честно - разработчики как-то говорили, что их -- как и большинство пользователей -- вполне устраивает тот интерфейс, который есть сейчас, поэтому они не будут разрабатывать однооконный интерфейс. Все, что есть - это сторонние компоненты, на свой страх и риск)

1
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
26.10.2019, 19:55  [ТС]
Цитата Сообщение от volvo Посмотреть сообщение
отделить те гриды, в которых будут отображаться календари, от обычных гридов
а я специально свойство в перехватчике TEdit создавал, чтобы отличить одни окна от других! Кошмар! Оказывается можно было поступить по-другому, просто и красиво.
0
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
28.10.2019, 22:02  [ТС]
volvo, Выравнивание текста по центру выполняется только для ячеек, которые могут быть выделены, а для самого верхнего ряда (заголовка) выравнивание не срабатывает.

Добавлено через 24 минуты
и при изменении DPI дисплея шрифт заголовка остаётся неизменным, хотя шрифт в ячейках , которые могут быть выделены, при увеличении DPI значительно увеличивается в размере.
0
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
28.10.2019, 22:42  [ТС]
вот скрин на dpi == 150
Изображения
 
0
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
28.10.2019, 22:44  [ТС]
выравнивание в строке заголовка по-центру сделано следующим образом:
Pascal
1
2
3
4
5
6
7
8
        //Rows[0].CommaText := 'Пн,Вт,Ср,Чт,Пт,Сб,Вс';
        Cells[0,0]:= ' Пн';
        Cells[1,0]:= ' Вт';
        Cells[2,0]:= ' Ср';
        Cells[3,0]:= ' Чт';
        Cells[4,0]:= ' Пт';
        Cells[5,0]:= ' Сб';
        Cells[6,0]:= ' Вс';
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33459 / 21559 / 8248
Регистрация: 22.10.2011
Сообщений: 37,016
Записей в блоге: 12
28.10.2019, 23:09
Не нужно добивать пробелами. Это не даст правильного выравнивания, обязательно найдется коэффициент, где будет выравниваться не так, как нужно. Лучше отказаться от использования фиксированной строки (в OnCreate формы убрать соответствующую настройку), и переписать OnPrepareCanvas:
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
procedure TForm1.StringGrid1PrepareCanvas(sender: TObject; aCol, aRow: Integer;
  aState: TGridDrawState);
var
  MyTextStyle: TTextStyle;
  canv : TCanvas;
begin
  canv := (sender as TStringGrid).Canvas;
  MyTextStyle := canv.TextStyle;
  MyTextStyle.Alignment := taCenter;
  canv.TextStyle := MyTextStyle;
 
  if aRow = 0 then // вот этот код добавляем
  begin
    canv.Brush.Color := clBtnFace;
  end;
 
  if aCol = 6 then
  begin
    canv.Font.Color := clRed;
  end;
 
  if gdFocused in aState then
  begin
    canv.Brush.Color := clHighlight;
    canv.Font.Color := clWindow;
  end;
end;
1
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
28.10.2019, 23:41  [ТС]
всё равно нет выравнивания
Изображения
 
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.10.2019, 23:41

Работа с компонентом StringGrid
здраствуйте, уважаемые форумчане! помогите эту задачку решить имеется массив данных о работающих на фабрике: фамилия, имя отчество, адрес...

Работа с компонентом StringGrid
Новичок в работе с StringGrid, поэтому вопросы таковы: 1. Есть выделенная строка (из нескольких столбов), как вывести на Label'ы...

Создание двумерных массивов в Delphi с компонентом StringGrid
Всем доброго времени суток! Необходима помощь. Мне нужно понять, как отображается(копируется) один массив в другой. А иначе задания по...

Задача: Сформировать матрицу указанного размера с компонентом StringGrid
Сформировать матрицу указанного размера с помощью компонента StringGrid, ввести элементы матрицы и выполнить индивидуальное задание. ...

Компонентом StringGrid, как оформить шапку таблицы, т.е вписать дисциплины и фамилии
Вот вроде бы основам научился, но вот с компонентом StringGrid вообще почему то работать у меня не получается: Ну вот дали такое...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Установка нескольких штампов электронной подписи в строго определенных местах файла docx
ВладимирСамохин 19.07.2026
(В!) Работа с Электронной подписью - это неотъемлемая часть современного документооборота. Но что делать, если нужно поставить несколько штампов электронной подписи в строго определенных местах. . .
сукцессия 35. Научная статья о проделанной работе
anaschu 19.07.2026
Написал в формате латекс и пдф
Вангую, что это не пройдёт модерацию, и на неделе я запущу свой сервер.
Hrethgir 19.07.2026
Эта публикация сейчас в песочнице и ждёт приглашения. https:/ / habr. com/ ru/ sandbox/ 295048/ начало и оглавление - Как «пернатого» заставить осваивать новые горизонты опыта через масштабирование. . .
сукцессия 33. открытые вопросы от клауде
anaschu 19.07.2026
"Что накопилось за эту часть А — тринадцать правок, из которых шесть пришли из ваших вопросов и каждая оказалась реальной ошибкой, а не калибровкой: односторонний симбиоз, отсутствующий листопад,. . .
32 сукцессия
anaschu 19.07.2026
сукцессия 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не «подкручивает» сходимость —. . .
сукцессия 31: модель микоризы - это модель ещё нескольких явлений, социальных и экономических
anaschu 18.07.2026
Теория «Всего»: апдейт v1. 1. 2 — 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не. . .
сукцессия 30. Массив проверяющих друг друга моделей
anaschu 18.07.2026
Архитектура сети взаимопроверяющих моделей микоризной сукцессии (v2. 0) Развитие тензорного ОДУ-ядра и создание кросс-платформенного калибровочного полигона Уважаемые коллеги! В продолжение. . .
Грибы - это женщины, деревья - это мужчины. Анти инь янь для союза мужчины и женщины.
anaschu 18.07.2026
ГЛАВНЫЙ НАУЧНО-ФИЛОСОФСКИЙ ВЫВОД: Сексуально-Репродуктивный Капитализм против Государства Моногамии Коллеги, мы вышли на финишную прямую 20-мерного ОДУ-моделирования вековой сукцессии (ветка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru