Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

stringgrid


Страницы:   1 2

Мануха ©   (2007-07-24 20:31:00) 

рисую на канве stringgrid в обработчике drawcell
при использовании полос прокрутки изображения начинают налазить друг на друга, требуется   stringgrid1.Invalidate
запихивал его в тот же drawcell, сие добавляет только тормоза.
Как быть может кто знает?


Мануха   (2007-07-25 10:19:00) [1]

Побольше бы таких ка ты, и не только в программировании :)


{RASkov}   (2007-07-25 00:58:00) [2]

> [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)

Да не за что :).... просто самому интересно иногда... и время есть свободное.


{RASkov}   (2007-07-24 23:56:00) [3]

> [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_VSCROLLthen
  StringGrid1DrawCell(StringGrid1, 0, StringGrid1.TopRow, StringGrid1.CellRect(0, StringGrid1.TopRow), [gdFixed]);
 OldWnd(Message);
end;

Только вместо WM_VSCROLL нужно нечто другое сообщение ловить, т.е. конец прокрутки, но я фик знаю какое оно там.
И соответственно подправить метод StringGrid1DrawCell, так как "первая" (верхняя) строка "рисуется через одну"(думаю понял о чем я:), хотя может и не поможет этот танец с бубном....


Мануха   (2007-07-24 23:13:00) [4]

опередил :)


Мануха   (2007-07-24 23:12:00) [5]

хм...все таки если пользоваться скроллбаром вертикальным, то появляется глюк перерисовки.. :)


{RASkov}   (2007-07-24 23:10:00) [6]

Хотя... нет. С прокруткой опять косяк... тогда врядли получится такое реализовать с обычным гридом.... имхо, но может кто и предложит вариант.


Мануха   (2007-07-24 23:10:00) [7]

{RASkov},мне бы твои знания!
Спасибо тебе большое что тратишь на нас оболтусов свое время.


{RASkov}   (2007-07-24 23:04:00) [8]

> [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 22:20:00) [9]

хотя при go[Fixed]HorzLine примерно то,только хоризонт линию все равно придется рисовать уже самому в нужном месте


Мануха   (2007-07-24 22:18:00) [10]

не, две фиксированные ячейки скажем 1 и 2, это должна быть одна большая
состоящая как бы из двух ячеек, как я  на скрине показывал.

Т.е. вместо 1 и 2 ячейки должна быть большая цифра 2.
DrawText для конкретной ячейки тут не прокатит.


{RASkov}   (2007-07-24 22:12:00) [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 21:54:00) [12]

понял как шрифт менять... но этот способ не подходит ведь вы правильно поняли что рисунки это были цифры с задним фоном (прямоугольная картинка по середине которой цифра). И рна прикрывала линию между разными строками...


Мануха   (2007-07-24 21:41:00) [13]

хм... DrawText - удобная штука, только не поня Л( ;)) как шрифт сделать другой....


{RASkov}   (2007-07-24 21:25:00) [14]

> Рисуй их на канве в данном обработчике.... указав нужные
> параметры шрифту и, лучше для этой цели АПИ DrawText с параметрми
> DT_CENTER и DT_VCENTER

Ну да.... а "рисовать" т.е. "писать" нужно IntToStr(ARow)....


{RASkov}   (2007-07-24 21:23:00) [15]

> [6] Мануха   (24.07.07 21:06)

Не совсем понял по рисунку, но думаю, если я правильно понял, что рисунки это есть "большие цифры" - то незачем вообще этих рисунков...
Рисуй их на канве в данном обработчике.... указав нужные параметры шрифту и, лучше для этой цели АПИ DrawText с параметрми DT_CENTER и DT_VCENTER
Когда обработчик(OnDrawCell) вызывается, в нем можно узнать какая в данный момент ячейка рисуется, и если "наша" то рисовать "так" - иначе "так".
Уловил(а)? Посмотри здесь в факе, помоему, пример про многострочный грид, хоть он и не по теме, но многое там узнаешь....


Мануха   (2007-07-24 21:06:00) [16]

ОК,
понадобилось сделать в фиксированном столбце ячейки "двойные" .
http://bagitima.narod.ru/213123123.jpgпроще будет на скрине посмотреть :)
ну вот собственно и рисовал их...криво так


{RASkov}   (2007-07-24 20:53:00) [17]

> [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 20:52:00) [18]

вообщем - да :)


Loginov Dmitry   (2007-07-24 20:48:00) [19]

> 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:42:00) [20]

упс ;)

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);


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо