Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.08.19;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.03 c
15-1184712286
Германн
2007-07-18 02:44
2007.08.19
Как молоды мы были, как искренне любили


4-1173091631
Углук
2007-03-05 13:47
2007.08.19
Странность с вызовом функции из DLL


2-1184916648
waif
2007-07-20 11:30
2007.08.19
SQL запрос в Access через делфи....


4-1171957830
Sunflower
2007-02-20 10:50
2007.08.19
Как удаленно установить клиентскую часть программы?


2-1185294697
Мануха
2007-07-24 20:31
2007.08.19
stringgrid