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

Вниз

картинка в фоне грида   Найти похожие ветки 

 
piko   (2007-11-18 13:55) [0]

народ привет, каким образом вставить картинку в качестве фона в stringgrid или dbgrid???не нашел инфы на эту тему...


 
Anatoly Podgoretsky ©   (2007-11-18 14:03) [1]

> piko  (18.11.2007 13:55:00)  [0]

И чего только не придумают, лишь бы не работать.


 
piko   (2007-11-18 14:06) [2]

поработал уже, есть картинка с данными и заказчик попросил вставить ее в грид., думаю в ondrawcell рисовать, но может есть другие способы?


 
Anatoly Podgoretsky ©   (2007-11-18 14:13) [3]

ondrawcell это для отрисовки одной ячейки


 
piko   (2007-11-18 14:16) [4]

и как быть?


 
Anatoly Podgoretsky ©   (2007-11-18 14:17) [5]

Займись делом.


 
Amoeba ©   (2007-11-18 15:48) [6]


> есть картинка с данными и заказчик попросил вставить ее
> в грид.

Не надо потакать всякой блажи дурака-заказчика.


 
Anatoly Podgoretsky ©   (2007-11-18 16:17) [7]

> Amoeba  (18.11.2007 15:48:06)  [6]

Можно потакать, если он оплатит и откажется от будущих претензий. Но лучше делом заняться.


 
Nightmare   (2007-11-18 16:31) [8]

Пишешь эту процедуру в ondrawcell(bmp это битмап который надо рисовать)

 Bitblt(Canvas.Handle, 0, 0, ARect.Right, ARect.Bottom, bmp.canvas.Handle, ARect.Left, ARect.Top, ARect.Right, ARect.Bottom, SCRCOPY);


 
Nightmare   (2007-11-18 16:32) [9]

извиняюсь немного не так написал

Bitblt(Canvas.Handle, 0, 0, ARect.Right, ARect.Bottom, bmp.canvas.Handle, ARect.Left, ARect.Top,  SCRCOPY);


 
{RASkov}   (2007-11-18 16:50) [10]

> [8, 9] Nightmare

Не хороший совет... да и не правильный...


 
Nightmare   (2007-11-18 16:57) [11]

SCRCOPY->SRCCOPY

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


 
piko   (2007-11-18 17:05) [12]

всем спасибо за ответы.{RASkov}, что можете вы посоветовать?


 
{RASkov}   (2007-11-18 17:14) [13]

> [11] Nightmare   (18.11.07 16:57)
> SCRCOPY->SRCCOPY

Я про "не правильный" не из-за этого, а в целом.

> хотя проце было бы во время прорисовки первой ячейки нарисовать весь фон.

А последующая отрисовка ячеек его сотрет :)
Нет... здесь подход не верен....

> [12] piko   (18.11.07 17:05)

Как вариант и с учетом "начинающих", можно попробывать при отрисовки очередной ячейки высчитать его Рект на общей поверхности битмапа, размер которого равен ширина - ColCount*ColWidth и высота RowCount*RowHeight с учетом, что отдельные колонки/ряды могут иметь "свои" размеры.
В расчетах нужно использовать ARow, ACol, ColWidth[ACol] и RowHeight[ARow] рисуемой в данной момент ячейки в событии OnDrawCell...
Ну и соответственно
StringGrid.Canvas.CoipyRect(Rect, BMP.Canvas, R);
где Rect - это параметр в обработчике OnDrawCell
   BMP - TBitMap с фоновой картинкой
   R -   высчитанная область....
Если фоновая картинка не должна скролится, то соответствующие изменения нужно внести, такие, например, как размер битмапа с картинкой
ну и расчет области (R)....
Просто версия, но я не уверен, что все будет "гладко".... Может и вообще ничего не получится.... в данный момент проверить не могу, если только позже или завтра)


 
Nightmare   (2007-11-18 17:31) [14]


> А последующая отрисовка ячеек его сотрет :)
> Нет... здесь подход не верен....

Дак зачем рисовать другие ячейки, просто рисуйте текст.


 
{RASkov}   (2007-11-18 17:52) [15]

> [14] Nightmare   (18.11.07 17:31)
> Дак зачем рисовать другие ячейки, просто рисуйте текст.


> во время прорисовки первой ячейки нарисовать весь фон.

А если есть необходимость перерисовать честь ячеек, но при этом нет необходимости перерисовывать первую?
переместили окно над нашем гридом не задев первую ячейку грида....


 
{RASkov}   (2007-11-18 21:47) [16]

> [12] piko   (18.11.07 17:05)

Так... вот примерная реализация [13] )
Вот глянь. Код не совсем "правильный", но может идею схватишь... Так же возможно в расчетах ошибки - из меня плохой математик :)

unit Unit1;
interface
uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, Grids, StdCtrls;

type
 TForm1 = class(TForm)
   CheckBox1: TCheckBox;
   StringGrid1: TStringGrid;
   procedure FormCreate(Sender: TObject);
   procedure StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);
   procedure CheckBox1Click(Sender: TObject);
   procedure StringGrid1TopLeftChanged(Sender: TObject);
 private
   BFon: TBitMap;
   procedure ResizeBMP;
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.ResizeBMP;
var TmpB: TBitMap; W, H: Integer;
begin
 TmpB:=TBitMap.Create;
 try
  TmpB.LoadFromFile("2.bmp");
//Тут нужно внимательно пересмотреть(переделать) расчеты...
  if CheckBox1.Checked then begin
   W:=(StringGrid1.ColCount-1)*StringGrid1.ColWidths[0]+StringGrid1.ColCount*StringGrid1.GridLineWidth;
   H:=(StringGrid1.RowCount-1)*StringGrid1.RowHeights[0]+StringGrid1.RowCount*StringGrid1.GridLineWidth;
  end else begin
   W:=(StringGrid1.VisibleColCount)*StringGrid1.ColWidths[0]+StringGrid1.VisibleColCount*StringGrid1.GridLineWidth;
   if StringGrid1.ColCount-StringGrid1.FixedCols>StringGrid1.VisibleColCount then W:=W+StringGrid1.ColWidths[0];
   H:=(StringGrid1.VisibleRowCount)*StringGrid1.RowHeights[0]+StringGrid1.VisibleRowCount*StringGrid1.GridLineWidth;
   if StringGrid1.RowCount-StringGrid1.FixedRows>StringGrid1.VisibleRowCount then H:=H+StringGrid1.RowHeights[0];
  end;

  BFon.Width:=W;
  BFon.Height:=H;
  BFon.Canvas.StretchDraw(BFon.Canvas.ClipRect, TmpB);
  StringGrid1.Invalidate;
 finally
  TmpB.Free;
 end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 BFon:=TBitMap.Create;
 ResizeBMP;
end;

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);
var L, T, W, H: Integer;
begin
 if CheckBox1.Checked then begin
  L:=(ACol-1)*StringGrid1.DefaultColWidth;
  T:=(ARow-1)*StringGrid1.DefaultRowHeight;  
 end else begin
  L:=(ACol-StringGrid1.LeftCol)*StringGrid1.DefaultColWidth;
  T:=(ARow-StringGrid1.TopRow)*StringGrid1.DefaultRowHeight;
 end;
 W:=L+StringGrid1.ColWidths[ACol];
 H:=T+StringGrid1.RowHeights[ARow];
 with StringGrid1.Canvas do begin
  CopyRect(Rect, BFon.Canvas, Classes.Rect(L, T, W, H));
  Brush.Style:=bsClear;
  if (ACol<>0) and (ARow<>0) then
   TextRect(Rect, Rect.Left, Rect.Top, Format("(%d,%d)", [ACol, ARow]));
 end;
end;

procedure TForm1.CheckBox1Click(Sender: TObject);
begin
 ResizeBMP;
end;

procedure TForm1.StringGrid1TopLeftChanged(Sender: TObject);
begin
 //Сильно :) ТАК ДЕЛАТЬ НЕ НУЖНО!, но на более у меня сегодня голова уже не сооброжает :(
 if not CheckBox1.Checked then StringGrid1.Invalidate;
end;

end.


Если фон прокручивается, то все нормально, а если нет - то..... вобщем нужно подумать:)
CheckBox1 как раз указывает как вести себя фону - скролиться или нет.

В общем сделал "на коленке", поэтому возможно на корню все не верно. :( Пробуй.

ЗЫЖ Так же в данном коде не учтен вариант с разными размерами колонок/рядов.... и не только это :)


 
piko   (2007-11-19 00:19) [17]

фух...спасибоо,есть над чем подумать!)))



Страницы: 1 вся ветка

Текущий архив: 2007.12.16;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.027 c
15-1194128449
Сусл
2007-11-04 01:20
2007.12.16
Посоветуйте книгу про продвижение продукта в сети


15-1195422004
Черный Шаман
2007-11-19 00:40
2007.12.16
Поможем российскому Стивену Кингу


2-1195478395
marik
2007-11-19 16:19
2007.12.16
изменение размеров при BorderStyle = bsNone


15-1195199758
Ega23
2007-11-16 10:55
2007.12.16
Несколько фреймов в одном юните - никак не сделать?


15-1195071418
Chelovek12345
2007-11-14 23:16
2007.12.16
Сканер сканирует рывками. HP scanjet 2400