Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.92/25: Рейтинг темы: голосов - 25, средняя оценка - 4.92
0 / 0 / 0
Регистрация: 23.05.2017
Сообщений: 76

Выравнивание в ячейке StringGrid по нажатию по кнопке

19.06.2017, 08:22. Показов 6222. Ответов 47
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как сделать чтобы по нажатию на по кнопке в выделенной ячейке выравнивался текст 3 кнопки (левый край, центр, правый край)
P.S. Как в Excel
Заранее спасибо
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
19.06.2017, 08:22
Ответы с готовыми решениями:

Выравнивание в ячейке StringGrid
Пожалуйста, дайте полный код процедуры по выравниванию текста в ячейке StringGrid. В интернете находил способы для Delphi, но не смог с...

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

Значение одной ячейки первого StringGrid-а присвоить другой ячейке второго StringGrid-а
скажите пожалуйста, вот нам даны две таблицы stringgrid, как значение одной ячейки,первой таблицы, присвоить другой ячейке второй таблице?

47
0 / 0 / 0
Регистрация: 23.05.2017
Сообщений: 76
19.06.2017, 21:07  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Puporev Посмотреть сообщение
А уже новый форум приглядел? Ибо за обсуждение вопросов вне темы можешь и вылететь.
Сорри новичек

Добавлено через 54 секунды
Цитата Сообщение от olympic43 Посмотреть сообщение
TFullControl
я уже новый проект создал, все равно эта хрень

Добавлено через 17 минут
Цитата Сообщение от Puporev Посмотреть сообщение
А уже новый форум приглядел? Ибо за обсуждение вопросов вне темы можешь и вылететь.
новый(
0
Айлурофил
 Аватар для Massaraksh7
518 / 451 / 112
Регистрация: 27.05.2017
Сообщений: 2,749
Записей в блоге: 7
19.06.2017, 21:46
Я обычно делаю так,
Delphi
1
2
3
4
5
6
7
8
9
10
procedure TClForm.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
...
Ts:=(Sender as TStringGrid).Canvas.TextExtent((Sender as TStringGrid).Cells[Acol,Arow]);
x:=Rect.Left;y:=Rect.Top;
   if align=0 then x:=Rect.Left; // влево
   if align=1 then x:=Rect.Right-Ts.cx; // вправо
   if align=2 then x:=(Rect.Right-Ts.cx+Rect.left+1) div 2; // по центру
   (Sender as TStringGrid).Canvas.FillRect(Rect);
   (Sender as TStringGrid).Canvas.TextOut(x,y,(Sender as TStringGrid).Cells[Acol,Arow]);
0
500 / 346 / 200
Регистрация: 20.10.2016
Сообщений: 1,101
20.06.2017, 09:56
Massaraksh7, интересный способ, не встречал раньше такой реализации, но у вас ну учитывается выравнивание текста по вертикали, он всегда будет в самом верху ячейки.
Чутка проабгрейдил ваш код, теперь текст по центру ячейки:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
var x, y: Integer;
    Ts: TSize;
    SG: TStringGrid absolute Sender;
begin
  Ts:=SG.Canvas.TextExtent(SG.Cells[Acol,Arow]);
  x:=Rect.Left;
  y:= Rect.Top + (SG.DefaultRowHeight-Ts.Height) div 2;
  case tAlign of
     0: x:=Rect.Left; // влево
     1: x:=Rect.Right-Ts.cx; // вправо
     2:x:=(Rect.Right-Ts.cx+Rect.left+1) div 2; // по центру
  end;
 SG.Canvas.FillRect(Rect);
 SG.Canvas.TextOut(x,y,SG.Cells[Acol,Arow]);
end;
0
Айлурофил
 Аватар для Massaraksh7
518 / 451 / 112
Регистрация: 27.05.2017
Сообщений: 2,749
Записей в блоге: 7
20.06.2017, 10:35
Цитата Сообщение от TFullControl Посмотреть сообщение
Massaraksh7, интересный способ, не встречал раньше такой реализации
[/DELPHI]
Ну, на самом деле там всё ещё хуже
Кликните здесь для просмотра всего текста

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
125
126
127
128
129
130
131
132
133
134
procedure TClForm.Sg1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
var s:string;i,dif,colx,rowx,n,x,y:integer;fc:TColor;
var a:Extended;
var Ts:TSize;
R:TRect;
begin
if ACol=0 then
   begin
   (Sender as TStringGrid).Canvas.Brush.Color:=RGB(230,230,190);
   if ARow=((Sender as TStringGrid).Tag mod 10000) then (Sender as TStringGrid).Canvas.Brush.Color:=RGB(200,250,220);
   (Sender as TStringGrid).Canvas.Font.Color:=clBlack;
   if (Sender as TStringGrid).Objects[ACol,ARow]<>nil then
      (Sender as TStringGrid).Canvas.Font.Color:=((Sender as TStringGrid).Objects[ACol,ARow] as TGeoCell).FCol;
   (Sender as TStringGrid).Canvas.Font.Style:=[fsBold];
   (Sender as TStringGrid).Canvas.FillRect(Rect);
   (Sender as TStringGrid).Canvas.TextOut(Rect.Left+1,Rect.Top,(Sender as TStringGrid).Cells[Acol,Arow]);
   exit;
   end;
if (Acol>=3) and (Arow=0) then
   begin
   (Sender as TStringGrid).Canvas.Brush.Color:=RGB(150,230,150);
   if ACol=((Sender as TStringGrid).Tag div 10000) then (Sender as TStringGrid).Canvas.Brush.Color:=RGB(200,250,220);
   (Sender as TStringGrid).Canvas.Font.Color:=clBlack;
   (Sender as TStringGrid).Canvas.Font.Style:=[];
   (Sender as TStringGrid).Canvas.FillRect(Rect);
   (Sender as TStringGrid).Canvas.TextOut(Rect.Left+1,Rect.Top,(Sender as TStringGrid).Cells[Acol,Arow]);
   exit;
   end;
if (Acol>=3) and (Arow=1) then
   begin
   R:=Rect;
   (Sender as TStringGrid).Canvas.Brush.Color:=RGB(120,230,230);
   if ACol=((Sender as TStringGrid).Tag div 10000) then (Sender as TStringGrid).Canvas.Brush.Color:=RGB(200,250,220);
   (Sender as TStringGrid).Canvas.Font.Color:=clBlack;
   (Sender as TStringGrid).Canvas.Font.Style:=[];
   (Sender as TStringGrid).Canvas.FillRect(Rect);
   (Sender as TStringGrid).Canvas.TextOut(Rect.Left+1,Rect.Top,(Sender as TStringGrid).Cells[Acol,Arow]);
   exit;
 
   end;
if (Acol=1) or (Acol=2) then
   begin
   if ARow<2 then (Sender as TStringGrid).Canvas.Brush.Color:=RGB(190,230,230)
   else (Sender as TStringGrid).Canvas.Brush.Color:=cl3DLight;
   if ARow=((Sender as TStringGrid).Tag mod 10000) then (Sender as TStringGrid).Canvas.Brush.Color:=RGB(200,250,220);
   if ((Sender as TStringGrid).HelpContext=ARow) and ((Sender as TStringGrid).HelpContext<>0) then (Sender as TStringGrid).Canvas.Brush.Color:=RGB(200,250,220);
   (Sender as TStringGrid).Canvas.Font.Color:=clBlack;
   if (GetCurrentList=2) and (ACol=2) then
      begin
      s:=(Sender as TStringGrid).Cells[Acol,Arow];
      try x:=StrToInt(_Get_Params(s,1,'/')); except x:=-1;end;
      try y:=StrToInt(_Get_Params(s,2,'/')); except y:=-2;end;
      if x=y then (Sender as TStringGrid).Canvas.Font.Color:=clBlue;
      end;
   if (GetCurrentList=2) and (ACol=1) then
      begin
      s:=(Sender as TStringGrid).Cells[Acol,Arow];
      try a:=StrToFloat(_Get_Params(s,1,'/')); except a:=NAN;end;
      if IsNAN(a)=False then (Sender as TStringGrid).Canvas.Font.Color:=cl3DLight;
      end;
   (Sender as TStringGrid).Canvas.Font.Style:=[fsBold];
   (Sender as TStringGrid).Canvas.FillRect(Rect);
   (Sender as TStringGrid).Canvas.TextOut(Rect.Left+1,Rect.Top,(Sender as TStringGrid).Cells[Acol,Arow]);
   exit;
   end;
 
(Sender as TStringGrid).Canvas.Font.Style:=[];
if (Sender as TStringGrid).Objects[ACol,ARow]<>nil then
   begin
   if (((Sender as TStringGrid).Objects[ACol,ARow] as TGeoCell).style and 1)<>0 then (Sender as TStringGrid).Canvas.Font.Style:=(Sender as TStringGrid).Canvas.Font.Style+[fsBold];
   if (((Sender as TStringGrid).Objects[ACol,ARow] as TGeoCell).style and 2)<>0 then (Sender as TStringGrid).Canvas.Font.Style:=(Sender as TStringGrid).Canvas.Font.Style+[fsItalic];
   end;
Ts:=(Sender as TStringGrid).Canvas.TextExtent((Sender as TStringGrid).Cells[Acol,Arow]);
x:=Rect.Left+1;y:=Rect.Top;
if (Sender as TStringGrid).Objects[ACol,ARow]<>nil then
   begin
   if ((Sender as TStringGrid).Objects[ACol,ARow] as TGeoCell).align=1 then x:=Rect.Right-Ts.cx-2;
   if ((Sender as TStringGrid).Objects[ACol,ARow] as TGeoCell).align=2 then x:=(Rect.Right-Ts.cx-2+Rect.left+1) div 2;
   end;
if (Sender as TStringGrid).Objects[ACol,ARow]<>nil then
   (Sender as TStringGrid).Canvas.Brush.Color:=((Sender as TStringGrid).Objects[ACol,ARow] as TGeoCell).Col;
if (Sender as TStringGrid).Objects[ACol,ARow]<>nil then
   (Sender as TStringGrid).Canvas.Font.Color:=((Sender as TStringGrid).Objects[ACol,ARow] as TGeoCell).FCol;
 
fc:=clRed;
colx:=(Sender as TStringGrid).Tag div 10000;
rowx:=(Sender as TStringGrid).Tag mod 10000;
if ((Sender as TStringGrid).Name='Sg2') and (ACol=colx) then
   begin
   dif:=startrowtek-startrow;
   if ARow=rowx-dif then (Sender as TStringGrid).Canvas.Brush.Color:=RGB(220,255,235);
   if ARow=rowx-2*dif then (Sender as TStringGrid).Canvas.Brush.Color:=RGB(220,255,235);
   if ARow=rowx-3*dif then (Sender as TStringGrid).Canvas.Brush.Color:=RGB(220,255,235);
   if ARow=rowx-4*dif then (Sender as TStringGrid).Canvas.Brush.Color:=RGB(220,255,235);
   if ARow=rowx+dif then (Sender as TStringGrid).Canvas.Brush.Color:=RGB(220,255,235);
   if ARow=rowx+2*dif then (Sender as TStringGrid).Canvas.Brush.Color:=RGB(220,255,235);
   if ARow=rowx+3*dif then (Sender as TStringGrid).Canvas.Brush.Color:=RGB(220,255,235);
   if ARow=rowx+4*dif then (Sender as TStringGrid).Canvas.Brush.Color:=RGB(220,255,235);
   end;
 
if (gdSelected in State) then
   begin
   fc:=clYellow;
   (Sender as TStringGrid).Canvas.Brush.Color:=clNavy;
   (Sender as TStringGrid).Canvas.Font.Color:=clWhite;
   end;
 
for i:=0 to nrect-1 do
   begin
   if (ACol>=SelRs[i].Left) and (ACol<=SelRs[i].Right) and (ARow>=SelRs[i].Top) and (ARow<=SelRs[i].Bottom) then
      begin
      (Sender as TStringGrid).Canvas.Brush.Color:=clBlue;
      (Sender as TStringGrid).Canvas.Font.Color:=clWhite;
      end;
   end;
 
(Sender as TStringGrid).Canvas.FillRect(Rect);
(Sender as TStringGrid).Canvas.TextOut(x,y,(Sender as TStringGrid).Cells[Acol,Arow]);
 
s:=(Sender as TStringGrid).Name;
s:=Copy(s,3,1);n:=StrToInt(s)-1;
if (Sender as TStringGrid).Objects[ACol,ARow]<>nil then
   begin
   if Trim(((Sender as TStringGrid).Objects[ACol,ARow] as TGeoCell).hcomm)<>'' then
      begin
      (Sender as TStringGrid).Canvas.Pen.Color:=fc;
      (Sender as TStringGrid).Canvas.MoveTo(Rect.Left,Rect.Top);
      (Sender as TStringGrid).Canvas.LineTo(Rect.Left+3,Rect.Top);
      (Sender as TStringGrid).Canvas.LineTo(Rect.Left,Rect.Top+3);
      (Sender as TStringGrid).Canvas.LineTo(Rect.Left,Rect.Top);
      end;
   end;
end;
0
 Аватар для BOGG ART
592 / 459 / 147
Регистрация: 09.12.2013
Сообщений: 2,385
Записей в блоге: 2
20.06.2017, 19:49
Massaraksh7, ваш код пестрит таким - ((Sender as TStringGrid).... - это ухудшает читаемость. Или так With TStringGrid(Sender) Do ... или через доп-переменную, можно для понту прикрутить "абсолют".
Да и процедурка-то таким макаром выходит неоправдано крупная. А так же много "магических констант" и одинаковых вызовов.

Это делается так - к каждой ячейке прикрепляется объект с настройками, в том числе как выравнивать текст в конкретной ячейке, цвет фона, итд.
Сама процедура OnDrawCell делает только - проверки на существование и покраску, и всё, никаких проверок условий, им там не место.

Есть правда какие-то грабли в какой версии Делфи писать, в новых что-то подполомали и код работает не всегда идентично.

Добавлено через 8 минут
Тем более что ТС пишет:
Цитата Сообщение от olympic43 Посмотреть сообщение
... выравнивался ... в выделенной ячейке ... Как в Excel ...
Без вариантов использование Objects[ACol, ARow].
0
Айлурофил
 Аватар для Massaraksh7
518 / 451 / 112
Регистрация: 27.05.2017
Сообщений: 2,749
Записей в блоге: 7
20.06.2017, 20:26
Цитата Сообщение от BOGG ART Посмотреть сообщение
Это делается так - к каждой ячейке прикрепляется объект с настройками, в том числе как выравнивать текст в конкретной ячейке, цвет фона, итд.
Если не обратили внимание - у меня так и сделано. Плюс много особенностей.
0
 Аватар для Пытливый
3765 / 2272 / 706
Регистрация: 29.05.2013
Сообщений: 9,622
20.06.2017, 20:56
Да зачем же так-то!? Есть же прекрасная функция DrawText, которая все что хотите с текстом сотворит:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
procedure TForm37.FormCreate(Sender: TObject);
begin
 StringGrid1.Cols[1].DelimitedText := ',Центр,Слева,Справа';
 StringGrid1.Objects[1,1] := TObject(DT_CENTER or DT_VCENTER);
 StringGrid1.Objects[1,2] := TObject(DT_LEFT or DT_VCENTER);
 StringGrid1.Objects[1,3] := TObject(DT_RIGHT or DT_VCENTER);
end;
 
procedure TForm37.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);
var
  SG: TStringGrid;
begin
 SG := TStringGrid(Sender);
 if not Assigned(SG.Objects[ACol,ARow]) then Exit;
 SG.Canvas.FillRect(Rect);
 DrawText(SG.Canvas.Handle, SG.Cells[ACol, ARow], Length(SG.Cells[ACol, ARow]), Rect, Word(SG.Objects[ACol,ARow]) or DT_SINGLELINE);
end;
0
500 / 346 / 200
Регистрация: 20.10.2016
Сообщений: 1,101
20.06.2017, 21:08
Пытливый, ваш вариант уже 4-й, ТС пока ни один из предложенных не осилил.
0
 Аватар для Пытливый
3765 / 2272 / 706
Регистрация: 29.05.2013
Сообщений: 9,622
20.06.2017, 21:13
Ну я надеюсь, что чем меньше буковов в коде, тем меньше шанс накосячить. У меня получился самый короткий вариант. Подождемс...
0
 Аватар для BOGG ART
592 / 459 / 147
Регистрация: 09.12.2013
Сообщений: 2,385
Записей в блоге: 2
21.06.2017, 00:25
Massaraksh7, обращения к Tag, обращения и сравнение Name с какими-то константами, сравнение ACol и ARow с какими-то константами - всему этому не место в OnDrawCell.
А зачем в куче мест одинаковое RGB(220,255,235);? В оригинале RGB это макрос, который при компиляции заменяется на константу. В Делфи-то это сделано в виде обычной функции. Разве не удобнее читать и менять константы или глобальные переменные?
Особенно сравнение с Name плохая идея. Вот поменяется имя? Добавится ещё таблица? Код-то рабочий, прям чтоб явных огрехов не нашёл, но читаемость и расширяемость пострадали.

Пытливый,
Практика показывает что неплохо бы проверять ещё и Assigned(Sender). Конечно если проект полностью свой, и самому такие ситуации не допускать - то не обязательно. Но в крупных командных проектах желательно. Возможно исключение бросать. Но это так, к слову.
А вот рисовать через API (функция DrawText() например) на Canvas.Handle по возможности надо бы избегать - код становится непереносимым. Желательно обходиться методами Canvas. Перенос на новые строки был бы трудозатратным, а позиционирование-то несложно вручную.
0
 Аватар для Пытливый
3765 / 2272 / 706
Регистрация: 29.05.2013
Сообщений: 9,622
21.06.2017, 00:40
Перенос на новые строки был бы трудозатратным, а позиционирование-то несложно вручную.
Очень сомневаюсь. Данная функция обладает полным функционалом и в этом плане:
Delphi
1
DrawText(SG.Canvas.Handle, SG.Cells[ACol, ARow], Length(SG.Cells[ACol, ARow]), Rect, Word(SG.Objects[ACol,ARow]) or DT_WORDBREAK);
А если скажем текст длинный, а переносить не хотелось бы, то и такой вариант есть:
Delphi
1
DrawText(SG.Canvas.Handle, SG.Cells[ACol, ARow], Length(SG.Cells[ACol, ARow]), Rect, Word(SG.Objects[ACol,ARow]) or DT_WORD_ELLIPSIS);
0
Айлурофил
 Аватар для Massaraksh7
518 / 451 / 112
Регистрация: 27.05.2017
Сообщений: 2,749
Записей в блоге: 7
21.06.2017, 01:08
Цитата Сообщение от BOGG ART Посмотреть сообщение
Massaraksh7, обращения к Tag, сравнение ACol и ARow с какими-то константами - всему этому не место в OnDrawCell.
Ну это особая обработка фиксированных колонок. А tag - отображение положения селектора в фиксированных колонках и множественная селекция. По-другому не придумал.
А зачем в куче мест одинаковое RGB(220,255,235);? В оригинале RGB это макрос, который при компиляции заменяется на константу. В Делфи-то это сделано в виде обычной функции. Разве не удобнее читать и менять константы или глобальные переменные?
Здесь согласен, в режиме отладки это было необходимо, потом поленился сделать по-нормальному.
Особенно сравнение с Name плохая идея. Вот поменяется имя? Добавится ещё таблица?
А какие варианты, если 9 gridов должны обрабатываться этак, а десятый - по-другому? К 9-и добавится может ещё, а вот десятый точно один.
0
0 / 0 / 0
Регистрация: 23.05.2017
Сообщений: 76
21.06.2017, 09:00  [ТС]
напишите мне то что писать
и в 3 кнопки что писать???

Добавлено через 14 секунд
напишите мне то что писать
и в 3 кнопки что писать???
0
Айлурофил
 Аватар для Massaraksh7
518 / 451 / 112
Регистрация: 27.05.2017
Сообщений: 2,749
Записей в блоге: 7
21.06.2017, 16:10
Цитата Сообщение от olympic43 Посмотреть сообщение
напишите мне то что писать
и в 3 кнопки что писать???
Если это нужно для выделенных ячеек, и чтобы это сохранялось на время жизни gridа, то каждой значимой ячейке надо сопоставлять объект, в который заносить информацию о выравнивании. А это уже должно соотноситься с остальной обработкой грида.

Добавлено через 1 час 5 минут
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
unit Unit13;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, Grids;
 
type
  TForm13 = class(TForm)
    StringGrid1: TStringGrid;
    BitBtn1: TBitBtn;
    BitBtn2: TBitBtn;
    BitBtn3: TBitBtn;
    procedure StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
    procedure BitBtn1Click(Sender: TObject);
    procedure BitBtn2Click(Sender: TObject);
    procedure BitBtn3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  procedure AlignObjects(Sender:TStringGrid;i1,i2,j1,j2,align:integer);
  end;
 
var
  Form13: TForm13;
 
type TAlignCell=class
                private
                public
                align:integer;
                constructor Create;
                end;
 
implementation
 
{$R *.dfm}
 
 
constructor TAlignCell.Create;
begin
align:=0;
end;
 
procedure TForm13.AlignObjects(Sender:TStringGrid;i1,i2,j1,j2,align:integer);
var i,j:integer;
begin
for i:=i1 to i2 do
   for j:=j1 to j2 do
      begin
      if (Sender as TStringGrid).Objects[i,j]=nil then (Sender as TStringGrid).Objects[i,j]:=TAlignCell.Create;
      ((Sender as TStringGrid).Objects[i,j] as TAlignCell).align:=align;
      end;
StringGrid1.Refresh;
end;
 
procedure TForm13.BitBtn1Click(Sender: TObject);
begin
AlignObjects(StringGrid1,StringGrid1.Selection.Left,StringGrid1.Selection.Right,
                    StringGrid1.Selection.Top,StringGrid1.Selection.Bottom,
                    0);
end;
 
procedure TForm13.BitBtn2Click(Sender: TObject);
begin
AlignObjects(StringGrid1,StringGrid1.Selection.Left,StringGrid1.Selection.Right,
                    StringGrid1.Selection.Top,StringGrid1.Selection.Bottom,
                    1);
end;
 
procedure TForm13.BitBtn3Click(Sender: TObject);
begin
AlignObjects(StringGrid1,StringGrid1.Selection.Left,StringGrid1.Selection.Right,
                    StringGrid1.Selection.Top,StringGrid1.Selection.Bottom,
                    2);
end;
 
procedure TForm13.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
  var Ts:TSize;x,y:integer;
begin
Ts:=(Sender as TStringGrid).Canvas.TextExtent((Sender as TStringGrid).Cells[Acol,Arow]);
x:=Rect.Left+1;y:=Rect.Top + ((Sender as TStringGrid).DefaultRowHeight-Ts.cy) div 2;
if (Sender as TStringGrid).Objects[ACol,ARow]<>nil then
   begin
   if ((Sender as TStringGrid).Objects[ACol,ARow] as TAlignCell).align=0 then x:=Rect.Left+1;
   if ((Sender as TStringGrid).Objects[ACol,ARow] as TAlignCell).align=1 then x:=Rect.Right-Ts.cx-2;
   if ((Sender as TStringGrid).Objects[ACol,ARow] as TAlignCell).align=2 then x:=(Rect.Right-Ts.cx-2+Rect.left+1) div 2;
   end;
if (gdSelected in State) then
   begin
   (Sender as TStringGrid).Canvas.Brush.Color:=clNavy;
   (Sender as TStringGrid).Canvas.Font.Color:=clWhite;
   end;
(Sender as TStringGrid).Canvas.FillRect(Rect);
(Sender as TStringGrid).Canvas.TextOut(x,y,(Sender as TStringGrid).Cells[Acol,Arow]);
end;
 
end.
0
 Аватар для BOGG ART
592 / 459 / 147
Регистрация: 09.12.2013
Сообщений: 2,385
Записей в блоге: 2
21.06.2017, 18:59
Цитата Сообщение от Massaraksh7 Посмотреть сообщение
, а десятый - по-другому?
Цитата Сообщение от Massaraksh7 Посмотреть сообщение
, а вот десятый точно один.
Раз уж эдак - здесь возможно логичнее назначить ему отдельный OnDrawCell.
Хотя и не обязательно - когда у каждого грида будут свои объекты (можно сделать два типа - глобальный стиль таблицы и изменённый стиль ячейки), то не важно особенная "десятая" или нет, всё что нужно будет в ассоциированных объектах.
Цитата Сообщение от Massaraksh7 Посмотреть сообщение
Добавлено через 1 час 5 минут
Ну серьёзно, почему не так?:
Кликните здесь для просмотра всего текста
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
Procedure TForm13.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);
Var Text: String; TextSize: TSize; X, Y: Integer;
Begin
If (Not Assigned(Sender)) Or (Not (Sender Is TStringGrid)) Then
      Exit;
With TStringGrid(Sender), Canvas Do
      Begin
      Text:=Cells[ACol, ARow];
      TextSize:=TextExtent(Text);
      Y:=Rect.Top+(DefaultRowHeight-TextSize.cy) Div 2;
      If (Objects[ACol, ARow]<>Nil) Then
            Case TAlignCell(Objects[ACol, ARow]).align Of
                  1:
                        X:=Rect.Right-TextSize.cx-2;
                  2:
                        X:=(Rect.Right-TextSize.cx-2+Rect.Left+1) Div 2;
                  Else
                        X:=Rect.Left+1;
                  End;
      If (gdSelected in State) Then
            Begin
            Brush.Color:=clNavy;
            Font.Color:=clWhite;
            End;
      FillRect(Rect);
      TextOut(X, Y, Text);
      End;
End;

А можно вообще сделать у TAlignCell статические методы для нужных вычислений, и делать без проверок просто TAlignCell(Objects[ACol, ARow]).Draw(Canvas, Rect, Text);.
0
Айлурофил
 Аватар для Massaraksh7
518 / 451 / 112
Регистрация: 27.05.2017
Сообщений: 2,749
Записей в блоге: 7
21.06.2017, 19:19
Цитата Сообщение от BOGG ART Посмотреть сообщение
Раз уж эдак - здесь возможно логичнее назначить ему отдельный OnDrawCell.
Это неудобно. Потому что при изменении общих обработок придётся менять в двух местах.
Цитата Сообщение от BOGG ART Посмотреть сообщение
Хотя и не обязательно - когда у каждого грида будут свои объекты (можно сделать два типа - глобальный стиль таблицы и изменённый стиль ячейки), то не важно особенная "десятая" или нет, всё что нужно будет в ассоциированных объектах.
Там проблема в том, что у десятой таблицы вид одних ячеек зависит от вида других.
Цитата Сообщение от BOGG ART Посмотреть сообщение
Ну серьёзно, почему не так?:
..............
Почему бы и нет?
Цитата Сообщение от BOGG ART Посмотреть сообщение
А можно вообще сделать у TAlignCell статические методы для нужных вычислений, и делать без проверок просто TAlignCell(Objects[ACol, ARow]).Draw(Canvas, Rect, Text);.
Можно, почему нет?
0
0 / 0 / 0
Регистрация: 23.05.2017
Сообщений: 76
22.06.2017, 17:08  [ТС]
Цитата Сообщение от Massaraksh7 Посмотреть сообщение
TAlignCell=class
ругает
0
Айлурофил
 Аватар для Massaraksh7
518 / 451 / 112
Регистрация: 27.05.2017
Сообщений: 2,749
Записей в блоге: 7
22.06.2017, 17:29
Какой delphi?

Добавлено через 12 минут
Весь код покажите.
0
0 / 0 / 0
Регистрация: 23.05.2017
Сообщений: 76
22.06.2017, 20:04  [ТС]
Цитата Сообщение от Massaraksh7 Посмотреть сообщение
Какой delphi?
Delphi 7
0
Айлурофил
 Аватар для Massaraksh7
518 / 451 / 112
Регистрация: 27.05.2017
Сообщений: 2,749
Записей в блоге: 7
22.06.2017, 20:05
Код.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.06.2017, 20:05

Выравнивание в ячейке таблицы
Я понимаю, што подобные темы поднимаются каждую неделю, но чот я уже с ума схожу. Такое ощущение, что у меня сам подход неверный... В...

QTableView выравнивание иконки в ячейке
Здравствуйте форумчане, помогите решить простой вопрос. Есть QTableView с моделью. В ячейках должен отображаться текст и иконка. Делаю...

Выравнивание элементов в ячейке таблицы
Здравствуйте. Подскажите как выровнять ссылки относительно таблицы. Код HTML: &lt;div class=&quot;catalog&quot;&gt; &lt;table...

Вертикальное выравнивание в ячейке TStringGrid
понадобилось мне сделать выравнивание текста по центру ячейки. наваял код procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol,...

Выравнивание QCheckBox в ячейке QTableWidget
Доброго времени суток коллеги. Суть вопроса в следующем: В ячейке таблицы необходимо установить чекбокс. Но не просто так, а выровнять...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Nekobox - outbounds[0].transport: unknown transport type: raw
damix 01.10.2026
Фикс ошибки Правым кликом по серверу -> отладочная информация -> edit Заменить "net": "raw", на "net": "tcp", Нажать кнопку reload.
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru