Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.042 c
2-1184672236
Iggor
2007-07-17 15:37
2007.08.19
MS SQL ADO


15-1185103037
oldman
2007-07-22 15:17
2007.08.19
Все были правы, от Инета никуда не деться...


2-1185480232
copron
2007-07-27 00:03
2007.08.19
messagebox


5-1160287104
o_serg
2006-10-08 09:58
2007.08.19
Компонент для распаковку/упаковки *.JAR


15-1185256532
dimaL
2007-07-24 09:55
2007.08.19
Вкладка Interbase





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский