![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
мусор в StringGrid [D5, WinXP]
Sherev © (2002-09-23 16:24:00)Имеется обработчик события OnDrawCell у StringGrid:
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);
var X,Y,dx,dy: Integer;
begin
with StringGrid1.Canvas do begin
X:=TextWidth(Cells[ACol,ARow]);
Y:=TextHeight(Cells[ACol,ARow]);
dx:=(Rect.BottomRight.x-Rect.TopLeft.x-x) div 2;
dy:=(Rect.BottomRight.y-Rect.TopLeft.y-y) div 2;
if (ACol=SelC)and(ARow=SelR) then Brush.Color:=clLime
else Brush.Color:=clBtnFace;
SetBkMode(StringGrid1.Canvas.Handle,TRANSPARENT);
FillRect(Rect);
Font.Color:=clWhite;
TextOut(Rect.Left+dx+1,Rect.Top+dy+1,Cells[ACol,ARow]);
Font.Color:=clWindowText;
TextOut(Rect.Left+dx,Rect.Top+dy,Cells[ACol,ARow]);
end;
end;
но почему-то первые 3 строки (и только 3) StringGrid выводятся с мусором. Подскажите, в чем проблема?
Dimka Maslov (2002-09-23 18:59:00) [1]Я сталкивался с такой проблемой. Дело в том, что свойство Cells передаёт строки таким образом, что длина строки больше чем индекс завершающего строку нулевого символа. Решение проблемы таково
var
S: String;
...
S:=StringGrid1.Cells[ACol, ARow];
S:=PChar(@S[1]); // Здесь мусор очищается
TextOut(X, Y, S);
Sherev (2002-09-23 16:48:00) [2]... TextRect работает,
TextRect(Rect, Rect.Left+dx+1,Rect.Top+dy+1,Cells[ACol,ARow]);
TextRect(Rect, Rect.Left+dx,Rect.Top+dy,Cells[ACol,ARow]);
но если написать
TextRect(Rect, Rect.Left+dx+1,Rect.Top+dy+1,StringGrid1.Cells[ACol,ARow]);
TextRect(Rect, Rect.Left+dx,Rect.Top+dy,StringGrid1.Cells[ACol,ARow]);
то в ячейках вообще ничего не выводится.
забыл сказать: вывод осуществляется на FixedCells и проверяется по разными Windows (в XP такого эффекта нет, а в 95-м есть).
Андрей Прокофьев (2002-09-23 16:44:00) [3]Скорее всего, ширина текста больше, чем ширина колонки
X:=TextWidth(Cells[ACol,ARow]);
И все вычисляется неверно
Андрей Прокофьев (2002-09-23 16:39:00) [4]Попробуйте
TextRect(Rect, Rect.Left+dx+1,Rect.Top+dy+1,StringGrid1.Cells[ACol,ARow]);
Font.Color:=clWindowText;
TextRect(Rect, Rect.Left+dx,Rect.Top+dy,StringGrid1.Cells[ACol,ARow]);
MBo (2002-09-23 16:31:00) [5]Ничего криминального в коде нет