Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
15-1237743773
Коммуноцентрист1
2009-03-22 20:42
2009.05.31
Зачм так положены трубы?


15-1237592324
Kerk
2009-03-21 02:38
2009.05.31
Посоветуйте чего посмотреть


3-1222062150
Юрий Катунов
2008-09-22 09:42
2009.05.31
Сортировка в DBGrid


15-1237503177
KilkennyCat
2009-03-20 01:52
2009.05.31
Интересные ссылки.


15-1237785548
Б
2009-03-23 08:19
2009.05.31
Ищу 2 книжки по DirectX в Delphi.





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