Форум: "Начинающим";
Текущий архив: 2009.05.31;
Скачать: [xml.tar.bz2];
ВнизDrawGrid и рисование Найти похожие ветки
← →
Андрей (начинающий) (2009-04-15 22:12) [0]Можно ли поверх Drawgrid с данными вывести какой-нибудь рисунок? Например стрелку из ячейки 1,1 в ячейку 9,8. Или прямоугольник с вершинами в центрах ячеек.
← →
{RASkov} © (2009-04-15 22:41) [1]> [0] Андрей (начинающий) (15.04.09 22:12)
перерисовка нужна?
...или достаточно разового вывода? если да, то drawgrid.Canvas. и вперед...
← →
Андрей (начинающий) (2009-04-15 22:50) [2]
> {RASkov} © (15.04.09 22:41) [1]
>перерисовка нужна?
что значит перерисовка?
← →
Андрей (начинающий) (2009-04-15 22:52) [3]скорее всего будет нужна, т.к., например, DG изменяет размеры ячеек в зависимости от размера формы
← →
MsGuns © (2009-04-15 23:13) [4]Ищем на королевстве статью "Полосатый грид" и просвещаемся
← →
Amoeba © (2009-04-15 23:48) [5]
> MsGuns © (15.04.09 23:13) [4]
>
> Ищем на королевстве статью "Полосатый грид" и просвещаемся
Даю ссылку, а то человек век будет искать:
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=168
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=170
← →
Игорь Шевченко © (2009-04-16 00:07) [6]
> Даю ссылку, а то человек век будет искать:
зря, материал по ссылке не поможет.
← →
Андрей (начинающий) (2009-04-16 00:08) [7]
> Amoeba © (15.04.09 23:48) [5]
Найти не проблема, только пробежал глазами статью и не совсем понял. В ней рассказывается как раскрасить строки/ячейки, а мне надо вывести картинку, перекрывающую несколько ячеек. Единственно, что каким-то боком из статьи можно применить, так это:
// А теперь пусть ImageList нарисует ее на канве DBGrid"а
ImageList.Draw(TDBGrid(Sender).Canvas,Rect.Left,Rect.Top, ImageIndex );
Но, возьмем пример со стрелкой из [0]. Хорошо, если я заранее знаю, что мне надо будет нарисовать ее из центра 1,1 в центр 2,2. А если заранее не известны номера ячеек и по ходу программы мне надо будет вывести ту же стрелку из 5,5 в 28,30? Не рисовать же картинки на все случаи жизни и загонять их в ImageList? Тем более, если Drawgrid масштабируется в зависимости от размеров основной формы и заранее не известно количество строк/столбцов.
← →
MsGuns © (2009-04-16 00:15) [8]>Игорь Шевченко © (16.04.09 00:07) [6]
>зря, материал по ссылке не поможет.
Ну почему же ?Задача вторая
- как поместить в поле TDBGrid вместо текста какой-либо объект (картинку или другой control).
← →
Игорь Шевченко © (2009-04-16 00:18) [9]Андрей (начинающий) (16.04.09 00:08) [7]
> Можно ли поверх Drawgrid с данными вывести какой-нибудь
> рисунок? Например стрелку из ячейки 1,1 в ячейку 9,8. Или
> прямоугольник с вершинами в центрах ячеек.
Можно, только надо наследника сделать от TDrawGrid, перекрыть ему метод Paint, вызвать inherited, а дальше рисовать что угодно.
← →
Германн © (2009-04-16 00:44) [10]А если поверх грида поместить TImage? Прозрачный.
← →
Игорь Шевченко © (2009-04-16 00:53) [11]
> А если поверх грида поместить TImage? Прозрачный
будет TImage поверх грида.
← →
Игорь Шевченко © (2009-04-16 01:17) [12]Где-то так: рисуется линия от центра ячейки 1,1 до центра ячейки 3,3 на краях линии по мелкому кружку.
наследникunit HsStringGrid;
interface
uses
Classes, Grids;
type
THSStringGrid = class(TStringGrid)
private
FOnPaint: TNotifyEvent;
protected
procedure Paint; override;
procedure Resize; override;
public
property Onpaint: TNotifyEvent read FOnPaint write FOnPaint;
procedure Assign (ASource: TPersistent); override;
end;
implementation
{ THSStringGrid }
procedure THSStringGrid.Assign(ASource: TPersistent);
var
I, J: Integer;
SourceGrid : TStringGrid;
begin
if ASource is TStringGrid then
begin
SourceGrid := TStringGrid(ASource);
BoundsRect := SourceGrid.BoundsRect;
Options := SourceGrid.Options;
DefaultRowHeight := SourceGrid.DefaultRowHeight;
RowCount := SourceGrid.RowCount;
ColCount := SourceGrid.ColCount;
Anchors := SourceGrid.Anchors;
{ TODO: Копирование остальных свойств добавить по вкусу }
for I:= 0 to Pred(ColCount) do
for J:= 0 to Pred(RowCount) do
Cells[I, J] := SourceGrid.Cells[I, J];
end
else
inherited;
end;
procedure THSStringGrid.Paint;
begin
inherited;
if Assigned(FOnPaint) then
FOnPaint(Self);
end;
procedure THSStringGrid.Resize;
begin
inherited;
Invalidate;
end;
end.
главная формаunit main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, HSStringGrid;
type
TForm1 = class(TForm)
StringGrid1: TStringGrid;
procedure FormCreate(Sender: TObject);
private
FGrid: THSStringGrid;
procedure GridPaint (Sender: TObject);
end;
var
Form1: TForm1;
implementation
uses
Types;
{$R *.dfm}
{ TForm1 }
procedure TForm1.FormCreate(Sender: TObject);
begin
FGrid := THSStringGrid.Create(Self);
with FGrid do
begin
Parent := Self;
Assign(StringGrid1);
OnPaint := GridPaint;
end;
StringGrid1.Free;
end;
function RectCenter (const Rect: TRect): TPoint;
begin
Result.X := (Rect.Right - Rect.Left) div 2 + Rect.Left;
Result.Y := (Rect.Bottom - Rect.Top) div 2 + Rect.Top;
end;
procedure TForm1.GridPaint(Sender: TObject);
var
RTop, RBottom: TRect;
ATopLeft, ABottomRight: TPoint;
CircleRect: TRect;
begin
RTop := FGrid.CellRect(1, 1);
RBottom := FGrid.CellRect(3, 3);
if IsRectEmpty(RTop) or IsRectEmpty(RBottom) then
Exit; //Если одна из ячеек невидима, не рисуем
ATopLeft := RectCenter(RTop);
ABottomRight := RectCenter(RBottom);
with (Sender as THsStringGrid).Canvas do
begin
Pen.Color := clRed;
MoveTo(ATopLeft.X, ATopLeft.Y);
CircleRect := Rect(ATopLeft.X -2, ATopLeft.Y - 2, ATopLeft.X + 2,
ATopLeft.Y + 2);
Ellipse(CircleRect);
LineTo(ABottomRight.X, ABottomRight.Y);
CircleRect := Rect(ABottomRight.X -2, ABottomRight.Y - 2, ABottomRight.X + 2,
ABottomRight.Y + 2);
Ellipse(CircleRect);
end;
end;
end.
← →
Игорь Шевченко © (2009-04-16 01:18) [13]StringGrid является наследником DrawGrid, так что указанное применимо и к DrawGrid
← →
Германн © (2009-04-16 01:27) [14]
> Игорь Шевченко © (16.04.09 00:53) [11]
>
>
> > А если поверх грида поместить TImage? Прозрачный
>
>
> будет TImage поверх грида.
>
т.е. будет стрелка "из ячейки 1,1 в ячейку 9,8"?
Или я не прав?
← →
Игорь Шевченко © (2009-04-16 01:31) [15]Германн © (16.04.09 01:27) [14]
Так Image не будет синхронизирован с гридом. Автор указал, что у него размеры ячеек меняются при изменении размера формы, сам грид может тоже свои размеры менять, или, не дай Аллах, скроллироваться...
← →
Германн © (2009-04-16 01:39) [16]
> Игорь Шевченко © (16.04.09 01:31) [15]
>
> Германн © (16.04.09 01:27) [14]
>
> Так Image не будет синхронизирован с гридом.
А ну да. Не обратил внимание. :(
Прочитал только сабж. А всё остальное - пробежал взглядом.
← →
Андрей (начинающий) (2009-04-16 08:01) [17]Пронулся, а у меня столько ответов :) Приятно. Буду сегодня разбираться. Всем спасибо.
← →
ЮЮ © (2009-04-16 12:11) [18]Более того, TImage невозможно разместить поверх грида.
Однако разместив его под гридом именно таким образом, как мы бы его хотели бы видеть над гридом мы получим на его канвасе все то, что можно перрисовать на канвас грида в методе рисования ячейки.
З.Ы. А тебе действительно нужен DrawGrid? Уж что, что а нарисовать сетку на канвасе не самое сложное.
← →
Игорь Шевченко © (2009-04-16 12:27) [19]
> Более того, TImage невозможно разместить поверх грида.
почему ?
← →
ЮЮ © (2009-04-16 12:42) [20]
>
> почему ?
Ну, Игорь, ты даешь? Давно батонокидательством не занимался и всё позабыл? :)
Ну, во-первых, потому что TDrawGrid идет от TWinControl-а, а TImage - от TGraphicControl.Puts the control in front of all other controls in its parent control.
procedure BringToFront;
Description
Call BringToFront to ensure that a form is visible or to reorder overlapping controls within a form.
Note that controls that wrap Windows screen objects (control classes descended from TWinControl) always "stack" above lightweight controls (control classes descended from TGraphicControl). BringToFront can force a lightweight control, such as a Shape, to stack above other lightweight controls, but wraped controls, such as an Edit, will still stack above the Shape.
Without BringToFront, controls are stacked in their order they were placed on the form.
А, во вторых, в чем сермяжный смысл грида, закрытого сверху чем бы то ни было?
← →
Игорь Шевченко © (2009-04-16 12:44) [21]
> Ну, Игорь, ты даешь? Давно батонокидательством не занимался
> и всё позабыл? :)
>
> Ну, во-первых, потому что TDrawGrid идет от TWinControl-
> а, а TImage - от TGraphicControl.
даже назначение Parent-а не поможет ? :)
← →
Андрей (начинающий) (2009-04-17 10:50) [22]
> Игорь Шевченко © (16.04.09 00:18) [9]
> Можно, только надо наследника сделать от TDrawGrid, перекрыть
> ему метод Paint, вызвать inherited, а дальше рисовать что
> угодно.
А нельзя разве просто нарисовать в обработчике DrawCell? С помощью тех же
MoveTo(...);
LineTo(...)
Я попробовал, нарисовалось. Есть в этом какой-то подвох? :)
← →
Игорь Шевченко © (2009-04-17 11:00) [23]
> Есть в этом какой-то подвох? :)
Непременно есть. DrawCell рисует одну ячейку, Paint рисует весь грид. В этом и подвох
← →
Не занят (2009-04-18 20:24) [24]Прекрасно можно DrawCell использовать, элементарно выяснить часть линии, проходящую через текущую ячейку, и рисовать только её.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2009.05.31;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.004 c