Форум: "Начинающим";
Текущий архив: 2007.08.19;
Скачать: [xml.tar.bz2];
Внизstringgrid Найти похожие ветки
← →
Мануха (2007-07-24 20:31) [0]рисую на канве stringgrid в обработчике drawcell
при использовании полос прокрутки изображения начинают налазить друг на друга, требуется stringgrid1.Invalidate
запихивал его в тот же drawcell, сие добавляет только тормоза.
Как быть может кто знает?
← →
{RASkov} © (2007-07-24 20:34) [1]> [0] Мануха (24.07.07 20:31)
А что ты там рисуешь? Этот обработчик OnDrawCell следует использовать ТОЛЬКО для одной ячейки грида которая передается в параметрах ACol и ARow
И т.д. для всех ячеек грида. Покажи свой drawcell....
← →
Мануха (2007-07-24 20:42) [2]упс ;)
var
B_2,B_3:TBitmap;
begin
B_2 := TBitmap.Create;
B_2.Assign(image1.Picture.Bitmap);
Stringgrid1.Canvas.Draw(0,22,B_2);
B_3 := TBitmap.Create;
B_3.Assign(image2.Picture.Bitmap);
Stringgrid1.Canvas.Draw(0,64,B_3);
← →
Loginov Dmitry © (2007-07-24 20:48) [3]> B_2 := TBitmap.Create;
> B_2.Assign(image1.Picture.Bitmap);
> Stringgrid1.Canvas.Draw(0,22,B_2);
> B_3 := TBitmap.Create;
> B_3.Assign(image2.Picture.Bitmap);
> Stringgrid1.Canvas.Draw(0,64,B_3);
И что-нибудь рисуется?
← →
Мануха (2007-07-24 20:52) [4]вообщем - да :)
← →
{RASkov} © (2007-07-24 20:53) [5]> [2] Мануха (24.07.07 20:42)
Имхо... неверно все в корне...
Зачем переменные B_2,B_3 ??? если есть image1[2].Picture.Bitmap....
И
> Stringgrid1.Canvas.Draw(0,64,B_3);
Смысл всего этого в OnDrawCell ????? См[1].
Объясни, что должно в итоге получиться, и тогда поможем в этом разобраться....
← →
Мануха (2007-07-24 21:06) [6]ОК,
понадобилось сделать в фиксированном столбце ячейки "двойные" .
http://bagitima.narod.ru/213123123.jpg проще будет на скрине посмотреть :)
ну вот собственно и рисовал их...криво так
← →
{RASkov} © (2007-07-24 21:23) [7]> [6] Мануха (24.07.07 21:06)
Не совсем понял по рисунку, но думаю, если я правильно понял, что рисунки это есть "большие цифры" - то незачем вообще этих рисунков...
Рисуй их на канве в данном обработчике.... указав нужные параметры шрифту и, лучше для этой цели АПИ DrawText с параметрми DT_CENTER и DT_VCENTER
Когда обработчик(OnDrawCell) вызывается, в нем можно узнать какая в данный момент ячейка рисуется, и если "наша" то рисовать "так" - иначе "так".
Уловил(а)? Посмотри здесь в факе, помоему, пример про многострочный грид, хоть он и не по теме, но многое там узнаешь....
← →
{RASkov} © (2007-07-24 21:25) [8]> Рисуй их на канве в данном обработчике.... указав нужные
> параметры шрифту и, лучше для этой цели АПИ DrawText с параметрми
> DT_CENTER и DT_VCENTER
Ну да.... а "рисовать" т.е. "писать" нужно IntToStr(ARow)....
← →
Мануха (2007-07-24 21:41) [9]хм... DrawText - удобная штука, только не поняЛ(;)) как шрифт сделать другой....
← →
Мануха (2007-07-24 21:54) [10]понял как шрифт менять... но этот способ не подходит ведь вы правильно поняли что рисунки это были цифры с задним фоном (прямоугольная картинка по середине которой цифра). И рна прикрывала линию между разными строками...
← →
{RASkov} © (2007-07-24 22:12) [11]> [10] Мануха (24.07.07 21:54)
Попробуй так:procedure TForm1.FormCreate(Sender: TObject);
var C, R: Integer;
begin
for C:=StringGrid1.FixedCols to StringGrid1.ColCount-1 do
for R := StringGrid1.FixedRows to StringGrid1.RowCount-1 do
StringGrid1.Cells[C, R]:=Format("[%d,%d]", [C, R]);
end;
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);
begin
if (ACol<StringGrid1.FixedCols) and (ARow>0) then begin
with (Sender as TStringGrid).Canvas do begin
Font.Size:=15;
Font.Style:=[fsBold];
DrawText(Handle, PChar(IntToStr(ARow)), -1, Rect, DT_CENTER);
end;
end;
if (ARow<StringGrid1.FixedRows) and (ACol>0) then begin
with (Sender as TStringGrid).Canvas do begin
Font.Size:=15;
Font.Style:=[fsBold];
DrawText(Handle, PChar(IntToStr(ACol)), -1, Rect, DT_CENTER);
end;
end;
end;
> И рна прикрывала линию между разными строками...
Так линия должна быть или нет?
Если нет, то Options:=Options-[go[Fixed]HorzLine]...
← →
Мануха (2007-07-24 22:18) [12]не, две фиксированные ячейки скажем 1 и 2, это должна быть одна большая
состоящая как бы из двух ячеек, как я на скрине показывал.
Т.е. вместо 1 и 2 ячейки должна быть большая цифра 2.
DrawText для конкретной ячейки тут не прокатит.
← →
Мануха (2007-07-24 22:20) [13]хотя при go[Fixed]HorzLine примерно то,только хоризонт линию все равно придется рисовать уже самому в нужном месте
← →
{RASkov} © (2007-07-24 23:04) [14]> [12] Мануха (24.07.07 22:20)
Тогда так попробуй:procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);
begin
if gdFixed in State then (Sender as TStringGrid).Canvas.Brush.Color:=(Sender as TStringGrid).FixedColor else
if gdSelected in State then (Sender as TStringGrid).Canvas.Brush.Color:=clHighlight else
(Sender as TStringGrid).Canvas.Brush.Color:=clWindow;
if (ACol<(Sender as TStringGrid).FixedCols) and ODD(ARow) and (ARow>0) then begin
with (Sender as TStringGrid).Canvas do begin
Font.Size:=15;
Font.Style:=[fsBold];
Rect.Bottom:=Rect.Bottom+(Rect.Bottom-Rect.Top);
Brush.Color:=(Sender as TStringGrid).FixedColor;
FillRect(Rect);
DrawText(Handle, PChar(IntToStr(1+ARow div 2)), -1, Rect, DT_SINGLELINE or DT_CENTER or DT_VCENTER);
end;
end else if ACol>=(Sender as TStringGrid).FixedCols then (Sender as TStringGrid).Canvas.FillRect(Rect);
end;
Остальное думаю сам разберешься....
А, да.... StringGrid1.DefaultDrawing = False :)
← →
Мануха (2007-07-24 23:10) [15]{RASkov},мне бы твои знания!
Спасибо тебе большое что тратишь на нас оболтусов свое время.
← →
{RASkov} © (2007-07-24 23:10) [16]Хотя... нет. С прокруткой опять косяк... тогда врядли получится такое реализовать с обычным гридом.... имхо, но может кто и предложит вариант.
← →
Мануха (2007-07-24 23:12) [17]хм...все таки если пользоваться скроллбаром вертикальным, то появляется глюк перерисовки.. :)
← →
Мануха (2007-07-24 23:13) [18]опередил :)
← →
{RASkov} © (2007-07-24 23:56) [19]> [17] Мануха (24.07.07 23:12)
Можно "подлечить" этот косяк примерно так:private
OldWnd: TWndMethod;
procedure SGWnd(var Message: TMessage);
{ Private declarations }
.....
procedure TForm1.FormCreate(Sender: TObject);
begin
OldWnd:=StringGrid1.WindowProc;
StringGrid1.WindowProc:=SGWnd;
end;
procedure TForm1.SGWnd(var Message: TMessage);
begin
if Message.Msg = WM_VSCROLL then
StringGrid1DrawCell(StringGrid1, 0, StringGrid1.TopRow, StringGrid1.CellRect(0, StringGrid1.TopRow), [gdFixed]);
OldWnd(Message);
end;
Только вместо WM_VSCROLL нужно нечто другое сообщение ловить, т.е. конец прокрутки, но я фик знаю какое оно там.
И соответственно подправить метод StringGrid1DrawCell, так как "первая" (верхняя) строка "рисуется через одну"(думаю понял о чем я:), хотя может и не поможет этот танец с бубном....
← →
{RASkov} © (2007-07-25 00:58) [20]> [19] {RASkov} © (24.07.07 23:56)
[19] - Нафик не надо :)
Вот вроде так нормально:procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);
var N: Integer;
begin
if (ACol=0) and (ARow=0) then (Sender as TStringGrid).Canvas.Brush.Color:=clGray else
if gdFixed in State then (Sender as TStringGrid).Canvas.Brush.Color:=(Sender as TStringGrid).FixedColor else
if gdSelected in State then (Sender as TStringGrid).Canvas.Brush.Color:=clHighlight else
(Sender as TStringGrid).Canvas.Brush.Color:=clWindow;
with (Sender as TStringGrid).Canvas do
if gdFixed in State then begin
Font.Style:=[fsBold]; N:=0; //N=0 - это чтоб хинта не было)
if ARow>0 then begin
if ODD(ARow) then begin
Rect.Bottom:=Rect.Bottom+(Rect.Bottom-Rect.Top)+1;
N:=1+ARow div 2;
end else begin
Rect.Top:=Rect.Top-(Rect.Bottom-Rect.Top)-1;
N:=ARow div 2;
end;
Font.Size:=15;
end else begin
if ACol>0 then N:=ACol;
Font.Size:=8;
end;
Rectangle(Rect);
if (ACol>0)or(ARow>0)then DrawText(Handle, PChar(IntToStr(N)), -1, Rect, DT_SINGLELINE or DT_CENTER or DT_VCENTER);
end else begin
FillRect(Rect);
Font.Assign((Sender as TStringGrid).Font);
if gdFocused in State then DrawFocusRect(Rect);
DEC(Rect.Right, 2);
DrawText(Handle, PChar((Sender as TStringGrid).Cells[ACol, ARow]), -1, Rect, DT_SINGLELINE or DT_RIGHT or DT_VCENTER);
end;
end;
В общем я тут понаворатил, разбирайся :) вроде как надо работает, ну если что - подправишь, где нужно...
> [15] Мануха (24.07.07 23:10)
Да не за что :).... просто самому интересно иногда... и время есть свободное.
← →
Мануха (2007-07-25 10:19) [21]Побольше бы таких ка ты, и не только в программировании :)
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.08.19;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.053 c