Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.12.16;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.048 c
1-1190905720
Lamer666
2007-09-27 19:08
2007.12.16
TreeView.OnEdited


11-1181055188
=BuckLr=
2007-06-05 18:53
2007.12.16
То, что у меня не работает в RichEdit


2-1195670411
greengeneral
2007-11-21 21:40
2007.12.16
MaxLength в StringGrid


15-1195333258
lookin
2007-11-18 00:00
2007.12.16
Самолеты, самолеты....


2-1195689628
Неместная
2007-11-22 03:00
2007.12.16
Bitmap &amp; Stream





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский