powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Проблема с прорисовкой StringGrid
25 сообщений из 26, страница 1 из 2
Проблема с прорисовкой StringGrid
    #39486499
Добрый день.
Таблица StringGrid рисуется "вручную" - объединяются ячейки, выводится текст в нужном месте, закрашиваются нужным цветом.
Обнаружилась проблема. Если поверх таблицы выводится какое-то диалоговое окно, то при смещении это окна мышкой или просто исчезновении окна таблица иногда прорисовывается плохо - часть букв исчезает или часть полосок.

Почему это происходит, как устранить?

Ссылка на скриншот:
https://fotki.yandex.ru/next/users/fedordobronravoff/album/556245/view/1861634
...
Рейтинг: 0 / 0
Проблема с прорисовкой StringGrid
    #39486563
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
11.07.2017 13:33, Федор_Федор пишет:
> Таблица StringGrid рисуется "вручную"

всё зависит от того, как именно.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Проблема с прорисовкой StringGrid
    #39486567
Мимопроходящий11.07.2017 13:33, Федор_Федор пишет:
> Таблица 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.
procedure TForm1.sgSourceDataDrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
Var
   SG:TStringGrid;
   i,add:byte;
   S,S1,S2:String;
   CanDraw:Boolean;
   BigCellLength, BigCellHeight,
   TextLength, TextHeight,
   LeftIndent, TopIndent,
   H1,H2,H3,
   L1,L2:Integer;
begin
   SG:=Form1.sgSourceData;{Для сокращения длины записей}
   //Заливка площади ячеек:
   SG.Canvas.Brush.Color := clWhite;{ячейки основной таблицы, белые}
   If ARow<3 then SG.Canvas.Brush.Color := ClFixedCell;{первые три строки - "шапка", серые}
   If (ARow>2) And (ACol in [4..6,10..12]) then
      SG.Canvas.Brush.Color := RGB(240,240,240);  {делаем 6 столбцов серыми (Disbled)}
   SG.Canvas.FillRect(Rect);
   //Границы ячеек:
   If ARow<3 then {ЯЧЕЙКА "ШАПКИ"}
      Begin
         //Рисуем нижнюю границу: ------------------------
         SG.Canvas.Pen.Color := clBlack;
         If (ARow in [0,1]) And (ACol=0) then SG.Canvas.Pen.Color := clFixedCell; {Для ячеек (0,0) и (1,0) указываем цвет, совпадающий с цветом заливки ячейки}
         SG.Canvas.MoveTo(Rect.Left-1,  Rect.Bottom);{курсор - в левый нижний угол ячейки}
         SG.Canvas.LineTo(Rect.Right, Rect.Bottom);{чертим нижнюю границу ячейки}
         //Рисуем правую границу: ------------------------
         SG.Canvas.Pen.Color := clBlack;
         If ((ARow=0) And (ACol in [1..5,7..11]))     Or
            ((ARow=1) And (ACol in [1,2,4,5,7,8,10,11])) then SG.Canvas.Pen.Color := clFixedCell;
         SG.Canvas.MoveTo(Rect.Right, Rect.Top);{курсор - в правый верхний угол ячейки}
         SG.Canvas.LineTo(Rect.Right, Rect.Bottom);{чертим правую границу ячейки}
      End
      Else {ОСНОВНАЯ ТАБЛИЦА}
      Begin
         //Рисуем правую границу: ------------------------
         SG.Canvas.Pen.Color := clLightGrayLines;
         If ACol in [0..3,6..9,12] then SG.Canvas.Pen.Color := clDarkGrayLines;
         SG.Canvas.MoveTo(Rect.Right, Rect.Top);{курсор - в правый верхний угол ячейки}
         SG.Canvas.LineTo(Rect.Right, Rect.Bottom+1);{чертим правую границу ячейки}
         //Рисуем нижнюю границу: ------------------------
         SG.Canvas.Pen.Color := clLightGrayLines;
         If (ACol in [0..3,7..9]) Or (ARow=SG.RowCount-1) then
            SG.Canvas.Pen.Color := clDarkGrayLines;
         SG.Canvas.MoveTo(Rect.Left, Rect.Bottom);{курсор - в левый нижний угол ячейки}
         SG.Canvas.LineTo(Rect.Right, Rect.Bottom);{чертим нижнюю границу ячейки}
      End;
   //3D-ЭФФЕКТ (первые 3 строки):
   If ARow<3 then
      Begin
         //Темная нижняя граница: ----------------------------------------------
         SG.Canvas.Pen.Color := cl3DGrayLines;
         Add:=0; {добавка 1-го пикселя справа}
         If (ARow=0) And (ACol in [1..5,7..11]) then Add:=1;
         If (ARow=1) And (ACol in [1,2,4,5,7,8,10,11]) then Add:=1;
         If not ((ARow<2) And (ACol=0)) then {исключаем две первые строки в первом столбце}
            Begin
               SG.Canvas.MoveTo(Rect.Left, Rect.Bottom-1);{курсор - в левый нижний угол ячейки}
               SG.Canvas.LineTo(Rect.Right+Add, Rect.Bottom-1);{чертим нижнюю полосу}
            End;
        //Темная правая граница: -----------------------------------------------
        Add:=0; {добавка 1-го пикселя снизу}
        CanDraw:=True; {разрешает чертить правую границу}
        If (ARow<2) And (ACol=0) then Add:=1;
        If (ARow=0) And (ACol in [1..5,7..11])        then CanDraw:=False;
        If (ARow=1) And (ACol in [1,2,4,5,7,8,10,11]) then CanDraw:=False;
        If CanDraw then
           Begin
              SG.Canvas.MoveTo(Rect.Right-1, Rect.Top);{курсор - в правый верхний угол ячейки}
              SG.Canvas.LineTo(Rect.Right-1, Rect.Bottom + Add);{чертим правую полосу}
           End;
         //Светлая верхняя граница: --------------------------------------------
         SG.Canvas.Pen.Color := clWhite;
         Add:=0; {добавка 1-го пикселя справа}
         If (ARow=0) And (ACol in [1..5,7..11]) then Add:=1;
         If (ARow=1) And (ACol in [1,2,4,5,7,8,10,11]) then Add:=1;
         If not ((ARow in [1,2]) And (ACol=0)) then {исключаем две строки в первом столбце}
            Begin
               SG.Canvas.MoveTo(Rect.Left, Rect.Top);{курсор - в левый верхний угол ячейки}
               SG.Canvas.LineTo(Rect.Right+Add, Rect.Top);{чертим нижнюю полосу}
            End;
        //Светлая левая граница: ----------------------------------------------
        Add:=0; {добавка 1-го пикселя снизу}
        CanDraw:=True; {разрешает чертить левую границу}
        If (ARow<2) And (ACol=0) then Add:=1;
        If (ARow=0) And (ACol in [2..6,8..12])        then CanDraw:=False;
        If (ARow=1) And (ACol in [2,3,5,6,8,9,11,12]) then CanDraw:=False;
        If CanDraw then
           Begin
              SG.Canvas.MoveTo(Rect.Left, Rect.Top);{курсор - в правый верхний угол ячейки}
              SG.Canvas.LineTo(Rect.Left, Rect.Bottom + Add);{чертим правую полосу}
           End;
     End;{If, 3D effect}
   {---------------------------------------------------------------------------}
   //ТЕКСТ В ЯЧЕЙКАХ
   SG.Canvas.Font.Color:=clBlack;
   //Выводим текст в ячейке (0,0) "Объект измерения"
   If (ARow=2) And (ACol=0) then
      Begin
         S1:=SG.Cells[0,1]; {"Объект"}
         S2:=SG.Cells[0,2]; {"измерения"}
         L1:=SG.Canvas.TextWidth(S1); {длина 1-го слова}
         L2:=SG.Canvas.TextWidth(S2); {длина 2-го слова}
         H1:=SG.Canvas.TextHeight(S1);{высота 1-го слова}
         H2:=SG.Canvas.TextHeight(S2);{высота 2-го слова}
         H3:=Round(0.1*H2); {высота пробельной строки}
         BigCellHeight:= SG.RowHeights[0] + SG.RowHeights[1] + SG.RowHeights[2];{высота объединенной ячейки}
         TopIndent :=Round((BigCellHeight - H1-H2-H3)/2); {отступ сверху (и снизу)}
         //Выводим слово "Объект":
         LeftIndent:=Round((SG.ColWidths[ACol]  - L1)/2);
         SG.Canvas.TextOut(Rect.Right - LeftIndent - L1, Rect.Bottom-1 - TopIndent - H1 - H2 - H3, S1);
         //Выводим слово "измерения":
         LeftIndent:=Round((SG.ColWidths[ACol]  - L2)/2);
         SG.Canvas.TextOut(Rect.Right - LeftIndent - L2, Rect.Bottom-1 - TopIndent - H2, S2);
      End;
   //Выводим текст по центру объединенных ("big") ячеек в 1-й строке:
   If (ARow=0) And (ACol in [6,12]) then
      Begin
         BigCellLength:=0;
         For i:=ACol-5 to ACol do BigCellLength := BigCellLength + SG.ColWidths[ACol];
         S:=SG.Cells[ACol,ARow];
         TextLength:=SG.Canvas.TextWidth(S);
         TextHeight:=SG.Canvas.TextHeight(S);
         LeftIndent:=Round((BigCellLength - TextLength)/2);
         TopIndent:=Round((SG.RowHeights[ARow] - TextHeight)/2);
         SG.Canvas.TextOut(Rect.Right - LeftIndent - TextLength, Rect.Top+TopIndent-1, S);
      End;
   //Выводим текст по центру объединенных ("big") ячеек во 2-й строке:
   If (ARow=1) And (ACol in [3,6,9,12]) then
      Begin
         BigCellLength:=0;
         For i:=ACol-2 to ACol do BigCellLength := BigCellLength + SG.ColWidths[ACol];
         S:=SG.Cells[ACol,ARow];
         TextLength:=SG.Canvas.TextWidth(S);
         TextHeight:=SG.Canvas.TextHeight(S);
         LeftIndent:=Round((BigCellLength - TextLength)/2);
         TopIndent:=Round((SG.RowHeights[ARow] - TextHeight)/2);
         SG.Canvas.TextOut(Rect.Right - LeftIndent - TextLength, Rect.Top+TopIndent-1, S);
      End;
   //Выводим текст в ячейках 3-й строки:
   If (ARow=2) And (ACol>0) then
      Begin
         S:=SG.Cells[ACol,ARow];
         TextLength:=SG.Canvas.TextWidth(S);
         TextHeight:=SG.Canvas.TextHeight(S);
         LeftIndent:=Round((SG.ColWidths[ACol] - TextLength)/2);
         TopIndent:=Round((SG.RowHeights[ARow] - TextHeight)/2);
         Case ACol of
            1,10: SG.Canvas.Font.Color:=clRed;
            2,11: SG.Canvas.Font.Color:=clGreen;
            3,12: SG.Canvas.Font.Color:=clBlue;
         End;{Case}
         SG.Canvas.TextOut(Rect.Right - LeftIndent - TextLength, Rect.Top+TopIndent-1, S);
      End;
   //Выводим текст в строках с данными (4 строка и далее):
   If ARow>2 then
      Begin
         S:=SG.Cells[ACol,ARow];
         //TextLength:=SG.Canvas.TextWidth(S);
         TextHeight:=SG.Canvas.TextHeight(S);
         LeftIndent:=3; //Round((SG.ColWidths[ACol] - TextLength)/2);
         TopIndent:=Round((SG.RowHeights[ARow] - TextHeight)/2);
         SG.Canvas.Font.Color:=clBlack;
         If ACol in [4..6,10..12] then
            Begin
               SG.Canvas.Font.Color:=clWhite;
               SG.Canvas.TextOut(Rect.Left + LeftIndent + 1, Rect.Top+TopIndent-1 + 1, S);
               SG.Canvas.Font.Color:=clGray;
            End;
         SetBkMode(SG.Canvas.Handle, TRANSPARENT);{делаем фон под буквами прозрачным}
         SG.Canvas.TextOut(Rect.Left + LeftIndent, Rect.Top+TopIndent-1, S);
      End;
end;
...
Рейтинг: 0 / 0
Проблема с прорисовкой StringGrid
    #39486649
asutp2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Федор_Федор

для начала сделайте использование двойного буфера при отрисовке, т.е. сначала формируете изображение в памяти, а на экран выводите из сформированного изображения через CopyRect
...
Рейтинг: 0 / 0
Проблема с прорисовкой StringGrid
    #39486662
asutp2,

Большое спасибо!
А как это сделать, не подскажете?
...
Рейтинг: 0 / 0
Проблема с прорисовкой StringGrid
    #39486671
Я просто не понимаю, как это работает... Каждый раз, когда что-то (второе окно) закрывает форму со StringGrid, то, как я понимаю, вызывается метод OnDraw и форма перерисовывается заново. Нужно сделать копию изображения (формы вместе со StringGrid) я, наверное, смогу, а вот как потом ее выводить откуда-то куда-то, да еще сверху ж нужно рисовать закрывающее (второе) окно... Ничего не понимаю...
...
Рейтинг: 0 / 0
Проблема с прорисовкой StringGrid
    #39486672
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Федор_Федорasutp2,

Большое спасибо!
А как это сделать, не подскажете?

А что вам непонятно в словах "буфер в памяти" или "CopyRect"?
...
Рейтинг: 0 / 0
Проблема с прорисовкой StringGrid
    #39486685
Квейд,
Намек понял... Буду изучать.
...
Рейтинг: 0 / 0
Проблема с прорисовкой StringGrid
    #39487444
Почитал про двойную буферизацию, даже программку написал с самолетиком летающим, но не понял при чем тут буфферизация.

Создаем два битмапа: Object.bmp и PartOfBackground.bmp.
Первый - движущийся объект (самолет). Второй - кусочек фона, который закрывает собой движущийся объект. Размеры битмапов одинаковые.

Работает это так:
Repeat
1. Перед тем, как вывести объект, определяем его новое положение относительно фона и копируем во второй битмап кусочек фона под объектом.
2. Выводим объект.
3. Восстанавливаем фон, закрыв наш объект кусочком фона, сохраненным на первом шаге.
Until (рак на горе свистнет)

Я не понимаю, при чем тут "двойная буферизация". Просто работа с двумя битмапами. Я примерно так всегда делал. Полезное отличие лишь в том, что второй битмап - это не фон целиком, а лишь тот его кусочек, который перекроется движущимся объектом.

Не понимаю, как это применить в моем случае. Как-то нужно отлавливать в Виндовс события - появление объектов, которые могут перекрыть рабочее окно моей программы, затем нужно делать скриншот окна программы, и уже затем разрешать "всплывшему" объекту прорисовываться на экране. И затем нужно перехватывать смещение этого объекта и предварительно выводить из битмапа скриншот окна программы... Ничего не понимаю...


Товарищи программисты, подскажите, пожалуйста, куда копать?
...
Рейтинг: 0 / 0
Проблема с прорисовкой StringGrid
    #39487480
asutp2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Федор_Федор

двойная буферизация подразумевает, что изображение формируется в буфер, а на экране отображается только по необходимости. Конкретно в твоем приведенном выше коде видно, что отрисовка ячейки таблицы идет каждый раз заново - сначала закрашивается фон, потом рисуются линии, выводится текст. Визуально это приводит к тому, что во первых изображение ячеек мигает, во вторых из за долгой отрисовки часть событий WM_PAINT теряется, что и подтверждается твоей проблемой с проблемной отрисовкой.

Поэтому и нужно использовать буферизацию. Само изображение в буфере ты изменяешь при изменении таблицы (например по изменению текста либо каких нибудь нужных условий, либо при банальном скролировании в таблице), а в событии OnDataDrawCell должен быть просто вызов CopyRect, который отрисовывает нужную область. CopyRect работает достаточно быстро, поэтому пропуска событий отрисовки не будет.
...
Рейтинг: 0 / 0
Проблема с прорисовкой StringGrid
    #39487578
asutp2, большое спасибо. Потихоньку "врубаюсь".

asutp2 Федор_Федор
Поэтому и нужно использовать буферизацию. Само изображение в буфере ты изменяешь при изменении таблицы (например по изменению текста либо каких нибудь нужных условий, либо при банальном скролировании в таблице), а в событии OnDataDrawCell должен быть просто вызов CopyRect, который отрисовывает нужную область. CopyRect работает достаточно быстро, поэтому пропуска событий отрисовки не будет.

Вот тут не понял. При изменении текста или скроллировании я могу создать битмап и самостоятельно, с нуля, рисовать на канве битмапа таблицу, (правда, это будет большая работа), а затем сохранять это изображение в виде битмпа в память.
А в событии OnDrawCell просто выводить сформированный битмап в заданный прямоугольник формы.

Правда, я не понимаю... Если пользователь захочет ткнуть в ячейку таблицы, то он ткнет в нарисованный на холсте битмап...

"OnDataDrawCell" - это описка? Такого события вроде нет у StringGrid....
...
Рейтинг: 0 / 0
Проблема с прорисовкой StringGrid
    #39487604
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Федор_ФедорЕсли пользователь захочет ткнуть в ячейку таблицы, то он ткнет в нарисованный на холсте битмап...
Так всегда и везде и происходит. В играх, в экселе, в убунту.
Пользователь тыкает в рисунок, а софт смотрит, как это действие интерпретировать. :)
...
Рейтинг: 0 / 0
Проблема с прорисовкой StringGrid
    #39487627
wadman, спасибо.

Правильно ли я понял идею:
1. Создаем процедуру PiantTable, которая "вручную" рисует StringGrid. Для этого я должен самостоятельно написать скрытый от меня механизм "поячеечного" рисования таблицы. То есть создать двойной вложенный цикл для строк и столбцов и в теле цикла уже привести тот код, что сейчас находится в процедуре OnDrawCell. Плюс нужно как-то учесть добавление нового текста в ячейки и изменение картинки при скроллировании.
Процедура PaintTable не рисует таблицу на канве битмапа Buf.bmp. Этот битмап сидит где-то в памяти, то есть как раз в буфере. Так мы рисунок буфферизировали.
2. В обработчиках событий сроллирования, ввода текста, щелчка мышью указываем запуск процедуры PaintTable. Процедура учитывает что мы ввели с клавы или мыши и рисует соответсвующее изображение таблицы, сохраняя его в буфере.
3. В обработчике OnDrawCell стираем абсолютно все и оставляем лишь вывод нашей картинки, которая ранее была сформирована процедурой PaintTable.

Вот что непонятно: зачем мне тогда компонент StringGrid, если я абсолютно все элементы таблицы рисую сам, сам считываю координаты мыши, определяю по какой ячейке пытается кликнуть пользователь, сам выводу текст и т.д. "Заблудилась я"...
...
Рейтинг: 0 / 0
Проблема с прорисовкой StringGrid
    #39487629
"не рисует" заменить на "рисует". Сорри.
...
Рейтинг: 0 / 0
Проблема с прорисовкой StringGrid
    #39487634
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Федор_ФедорПравильно ли я понял идею:
Сначала попробуй
Код: pascal
1.
StringGrid.DoubleBuffered := true;
...
Рейтинг: 0 / 0
Проблема с прорисовкой StringGrid
    #39487642
wadmanФедор_ФедорПравильно ли я понял идею:
Сначала попробуй
Код: pascal
1.
StringGrid.DoubleBuffered := true;


УРА!!!
Получилось!
Вот... Специально ж, наверное, молчали... Целый день угрохал...
СПАСИБО!

P.S.: ну а идею-то я правильно понял с "буфферизацией"? Непонятно, почему она "двойной" называется?
...
Рейтинг: 0 / 0
Проблема с прорисовкой StringGrid
    #39487649
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Федор_ФедорНепонятно, почему она "двойной" называется?
Тем, что без двойной буферизации рисуешь сразу на экран (то есть отрисовка в реальном времени и если что-то рисуется долго, то это заметно), а с дв. буферизацией сначала рисуешь во внутренний буфер (VCL сама его для контролов подставляет, то есть для них нет разницы с точки зрения кода), а затем VCL уже одним махом выводит готовый рисунок .
...
Рейтинг: 0 / 0
Проблема с прорисовкой StringGrid
    #39487669
wadman,

да, буферизация есть - сначала в буфер, а потом из буфера. То есть используется один буфер. Почему именно "двойной" пока не понял. В примере с самолетиком фон рисуется и помещается в одну переменную (один "буфер"), а самолетик рисуется и помещается во второй буфер. А при движении самолета уже ничего не рисуется заново, а просто обе готовые картинки подсовываются из двух буферов...

В общем, туплю, похоже, как обычно...

Спасибо всем за помощь!
...
Рейтинг: 0 / 0
Проблема с прорисовкой StringGrid
    #39487730
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Федор_ФедорПочему именно "двойной" пока не понял.

"As you probably know, a double buffer normally involves creating an off-screen memory buffer the same size as the visual component. Writing/drawing is performed on this buffer and when complete, the entire buffer is "swapped" so that it is now painted on the visual component."

https://stackoverflow.com/questions/1408664/why-is-doublebuffered-disabled-by-default
...
Рейтинг: 0 / 0
Проблема с прорисовкой StringGrid
    #39490506
schi,
спасибо!
...
Рейтинг: 0 / 0
Проблема с прорисовкой StringGrid
    #39490575
На всякий случай, для таких же как я "программистов"...

Самое доходчивое описание двойной буферизации нашел в Википедии: https://ru.wikipedia.org/wiki/Двойная_буферизация

Буфферизация называется "двойной" по той простой причине, что используется не один буфер, а ДВА.
Первый буфер - "экранный". В нем лежит готовая картинка, которую можно в любой момент схватить и вывести на экран.
Второй буфер - "рабочий", в него сохраняется картинка, которая уныло чертится, например, моей процедурой рисования таблицы. Как только картинка начертилась, буферы меняются местами: "экранный" становится "рабочим", а "рабочий" - "экранным". Таким образом, в "экранном" буфере оказывается новая картинка, готовая к выводу на экран. А "рабочий" буфер содержит устаревшую картинку, которую можно "стирать" и чертить новый вариант. Пока тянется процедура формирования новой картинки, для вывода на экран используется "экранный" буфер.

Двойная буфферизация кушает в 2 раза больше памяти. Нет смысла использовать двойную буфферизацию в тех случаях, когда время, необходимое для формирования изображения, меньше, чем период обновления экрана (обычно 1/60 секунды - для LCD).

Все вышеуказанное - мои предположения...
...
Рейтинг: 0 / 0
Проблема с прорисовкой StringGrid
    #39490591
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Федор_ФедорТаблица StringGrid рисуется "вручную" - объединяются ячейки, выводится текст в нужном месте, закрашиваются нужным цветом.

и всё? больше ничего другого?

таких гридов готовых на Торри выше крыши

вот например бесплатный и живой - http://avemey.com/zcolorstringgrid/zcolorstringgrid.php?lang=ru
...
Рейтинг: 0 / 0
Проблема с прорисовкой StringGrid
    #39490646
Любезный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторвот например бесплатный и живой
Он, у целом, нормальный, но бывает, что и подглюкивает. Потому для самых ответственных задач свои способы отрисовки подходят лучше.
...
Рейтинг: 0 / 0
Проблема с прорисовкой StringGrid
    #39490850
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Любезный,

ну а почему бы не подправить и допилить ?

или свой велосипед никогда не подглюкивает и никогда не призходится править ?
...
Рейтинг: 0 / 0
Проблема с прорисовкой StringGrid
    #39490898
Любезный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторну а почему бы не подправить и допилить ?
Как говорится, кто вносит предложение, тот его и исполняет.

авторили свой велосипед никогда не подглюкивает и никогда не призходится править ?
Очень редко, так как велосипед гораздо проще и затачивается под конкретную задачу. Соответственно, и править его гораздо лехче.
...
Рейтинг: 0 / 0
25 сообщений из 26, страница 1 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Проблема с прорисовкой StringGrid
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]