Форум: "Начинающим";
Текущий архив: 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