Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
0 / 0 / 0
Регистрация: 04.10.2015
Сообщений: 71

Выделение в StringGrid

20.02.2016, 17:37. Показов 2709. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В стринггриде мне нужно выделить область после чего подсчитать сколько в ней 1 и 0 после чего закрасить выделенную область. Проблема в том, что до этого работать с выделением мне не приходилось. Побродив по форуму набросал кое-какой код но он не работает.
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
procedure TForm1.strngrd1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
  i,j:Integer;
  begin
   if (Button = mbRight) and dlgColor1.Execute then
      with strngrd1.Selection do
          for i:=Left to Right do
             for j:=Top to Bottom do
                 CellColors[i,j]:=dlgColor1.Color;
  end;
 
procedure TForm1.strngrd1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
  var
    i,j,l:Integer;
 begin
   begin
 
  with strngrd1.Selection do
   if gdSelected in State then
   begin
   l:=0;
   if (strngrd1.cell[ACol,ARow] = '1') or (strngrd1.cell[ACol,ARow] = '0') then
   l:=l+1;      
      with (Sender as TStringGrid),Canvas do
            if CellColors[ACol,ARow]<>0 then
              begin
                 Brush.Color:=CellColors[ACol,ARow];
                 FillRect(Rect);
                 TextOut(Rect.Left+2,Rect.Top+2,Cells[ACol,ARow]);
                 
            
              end;
 
    end;
   lst1.Items.Add(IntToStr(l));
 end;
 end;
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.02.2016, 17:37
Ответы с готовыми решениями:

Выделение ячеек StringGrid
Ребят, что-то я совсем туплю... У меня есть Листбокс и СтрингГрид. В ListBOx 7 строчек в StringGrid 6 столбцов и 7 строчек. Хочу...

StringGrid выделение строк
Возможно ли выделять в стандартном StringGrid'е хаотично несколько строк. Например строки 2-5, 8, 14-16 выделить через Ctrl?

StringGrid: Выделение и закрашивание
Вот задачка появилась на мою голову. Как сделать чтобы при выделении ячеек на Stringgrid и нажатии например кнопки &quot;Button&quot;, то...

5
138 / 136 / 100
Регистрация: 10.03.2015
Сообщений: 553
20.02.2016, 18:15
Цитата Сообщение от symbians60v5 Посмотреть сообщение
(Sender as TStringGrid),Canvas
(Sender as TStringGrid).Canvas
0
Почетный модератор
 Аватар для Puporev
64315 / 47611 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
20.02.2016, 18:35
Делфи 7.
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
var
  Form1: TForm1;
  f:boolean=false;
implementation
 
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
var i,j:byte;
begin
randomize;
for i:=0 to StringGrid1.RowCount-1 do
for j:=0 to StringGrid1.ColCount-1 do
StringGrid1.Cells[j,i]:=inttostr(random(2));
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var i,j,k0,k1:integer;
begin
k0:=0;
k1:=0;
with StringGrid1 do
for i:=Selection.Top to Selection.Bottom do
for j:=Selection.Left to Selection.Right do
if Cells[j,i]='1' then inc(k1)else inc(k0);
Edit1.Text:='0='+inttostr(k0)+'  1='+ inttostr(k1);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
f:=true; //меняем флаг
StringGrid1.Repaint;//перерисовываем
end;
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
if f then
with StringGrid1 do
  begin
    if gdSelected in state then
    begin
      Canvas.Brush.Color:=clYellow;
      Canvas.FillRect(Rect);
      Canvas.Font:=Font;
      Canvas.TextRect (Rect, Rect.Left + 2, Rect.Top + 2, StringGrid1.Cells[ACol,ARow]);
    end;
  end;
end;
1
 Аватар для Пытливый
3763 / 2267 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
20.02.2016, 18:38
В этом компоненте есть собственное выделение, но работает оно только если в Options флаг goEditing выставлен в False. Т.е. все сводится к тому, что надо включать и отключать этот флаг в зависимости от ситуации.
1
Почетный модератор
 Аватар для Puporev
64315 / 47611 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
20.02.2016, 18:42
Выделение мышкой при goRangeSelect=true.
0
138 / 136 / 100
Регистрация: 10.03.2015
Сообщений: 553
20.02.2016, 18:43
Лучший ответ Сообщение было отмечено symbians60v5 как решение

Решение

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
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Grids, StdCtrls;
 
type
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    procedure StringGrid1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure StringGrid1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Button1Click(Sender: TObject);
    procedure StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
    procedure FormCreate(Sender: TObject);
    procedure StringGrid1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
uses StrUtils;
 
{$R *.dfm}
 
var
   ACol1, ARow1, ACol2, ARow2: integer;
   b: boolean;
 
procedure TForm1.StringGrid1MouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
     b := false;
     StringGrid1.MouseToCell(X, Y, ACol1, ARow1);
end;
 
procedure TForm1.StringGrid1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
   sellRect: TGridRect;
   i, j, count_0, count_1: integer;
begin
     b := true;
     sellRect.Top := -1;
     sellRect.Left := -1;
     sellRect.Right := -1;
     sellRect.Bottom := -1;
     StringGrid1.Selection := sellRect;
 
 
     count_0 := 0;
     count_1 := 0;
     for j := ACol1 to ACol2 do
       for i := ARow1 to ARow2 do
         if (StringGrid1.Cells[j, i] = '0') then
           count_0 := count_0 + 1
         else
           if (StringGrid1.Cells[j, i] = '1') then
             count_1 := count_1 + 1;
     Caption := 'Количесиво нулей: ' + IntToStr(count_0) + '; ' + 'Количесиво едениц: ' + IntToStr(count_1);
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var
   i, j, count_0, count_1: integer;
begin
     count_0 := 0;
     count_1 := 1;
     for j := ACol1 to ACol2 do
       for i := ARow1 to ARow2 do
         if (StringGrid1.Cells[j, i] = '0') then
           count_0 := count_0 + 1
         else
           if (StringGrid1.Cells[j, i] = '1') then
             count_1 := count_1 + 1;
end;
 
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
var
   i, j: integer;
begin
     if (b = true) then
       begin
         if ((ACol >= ACol1) and (ACol <= ACol2) and (ARow >= ARow1) and (ARow <= ARow2)) then
           begin
             StringGrid1.Canvas.Brush.Color:=clRed;
             StringGrid1.Canvas.FillRect(Rect);
             StringGrid1.Canvas.TextOut(Rect.Left+2, Rect.Top+2, StringGrid1.Cells[ACol, ARow]);
           end;
       end;
end;
 
procedure TForm1.FormCreate(Sender: TObject);
var
   i, j: integer;
begin
     b := false;
     for j := 0 to StringGrid1.ColCount - 1 do
       for i := 0 to StringGrid1.RowCount - 1 do
         StringGrid1.Cells[j, i] := IntToStr(Random(10));
end;
 
procedure TForm1.StringGrid1MouseMove(Sender: TObject; Shift: TShiftState;
  X, Y: Integer);
begin
     StringGrid1.MouseToCell(X, Y, ACol2, ARow2);
end;
 
end.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
20.02.2016, 18:43
Помогаю со студенческими работами здесь

Выделение области в Stringgrid
подскажите, как обрабатывать выделенную область Stringgrid (выделение я задавал с помощью TGRIDRECT, далее присваивал переменную этого типа...

Выделение столбцов Stringgrid
Доброго времени суток форумчане ;) Если кто знает как выделить столбец по нажатию на загаловок сетки то помогите кодом :)

StringGrid жирное выделение
Привет еще раз...:) Подскажите можно ли в StringGrid сделать некоторые линии столбцов жирными???

StringGrid - Выделение текста в ячейке
Как сделать возможность выделения текста в ячейке без возможности редактирования?

Выделение цветом ячеек Stringgrid
Почитала в нете про выделение строк и ячеек, но к сожалению мало чего поняла. Ищу, как можно короче сделать выделение по принципу,...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
[В процессе разработки] SDL3 для Web (WebAssembly): Сборка библиотек SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru