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

Вниз

Компонент Линия   Найти похожие ветки 

 
Kolan ©   (2009-08-31 14:45) [0]

Здравствуйте!

Где бы взять такой компонент, который бы позволял рисовать линии на формах? Просто прямые, как в графическом редакторе.


 
test ©   (2009-08-31 14:47) [1]

TCanvas рисуй что хочешь.


 
Kolan ©   (2009-08-31 14:48) [2]

Рисовать хочется в дизайнере.


 
test ©   (2009-08-31 14:50) [3]

Kolan ©   (31.08.09 14:48) [2]
Напиши, будет тебе дизайнер или используйте то что есть Paint, GIMP, Photoshop.


 
Игорь Шевченко ©   (2009-08-31 14:53) [4]

TShape ?


 
Kolan ©   (2009-08-31 15:05) [5]

А как TShape рисовать линию? Диагональные линии тоже нужны.


 
Kolan ©   (2009-08-31 15:07) [6]

Ладно, сделал свой.

unit KUILine;

interface
uses
 SysUtils, Classes, Controls, Graphics;

type
 TUILine = class(TGraphicControl)
 private
   function GetPen: TPen;
   procedure SetPen(const Value: TPen);
 protected
   procedure Paint; override;
 published
   property Pen: TPen read GetPen write SetPen;
 end;

procedure Register;

implementation

procedure Register;
begin
 RegisterComponents("KSoftWare", [TUILine]);
end;

{ TUILine }

function TUILine.GetPen: TPen;
begin
 Result := Canvas.Pen;
end;

procedure TUILine.Paint;
begin
 Canvas.LineTo(Left, Top);
 Canvas.MoveTo(Left+Width, Top+Height);
end;

procedure TUILine.SetPen(const Value: TPen);
begin
 Canvas.Pen.Assign(Value);
end;

end.


Когда таскаешь по форме — линия пропадает, почему?


 
Медвежонок Пятачок ©   (2009-08-31 15:09) [7]

потому что не перерисовывается


 
Kolan ©   (2009-08-31 15:14) [8]

А где правильно сделать перерисовку?


 
Ega23 ©   (2009-08-31 15:25) [9]


> А где правильно сделать перерисовку?


Есть канва. Есть список объектов, которые каким-то образом отображаются на канве (и, кстати, во вполне определённом порядке).
Вот и перерисовываешь всё это дело.


 
Kolan ©   (2009-08-31 15:27) [10]

А, я забыл, что координаты внутри контроля нужно использовать.

procedure TUILine.Paint;
begin
 Canvas.LineTo(0, 0);
 Canvas.MoveTo(Width, Height);
end;


Заодно вопрос для общего развития.

Зачем в TShape объявлены свои TPen и TBrush, а не используется конва?


 
KSergey ©   (2009-08-31 15:27) [11]

Если сравнить с исходниками TShape, то думаю причина вот в чем:

procedure TShape.Paint;
begin
 with Canvas do
 begin
   Pen := FPen;
   Brush := FBrush;


И только после этого рисуем.

А устанавливать свойства канвы в "левом" методе procedure TUILine.SetPen видимо бессмысленно.


 
Kolan ©   (2009-08-31 15:29) [12]

KSergey, нет, причина того, что не перерисовывалось была в неверных координатах.


 
Ega23 ©   (2009-08-31 15:31) [13]

procedure TUILine.Paint;
begin
Canvas.LineTo(0, 0);
Canvas.MoveTo(Width, Height);
end;


Может наоборот?


 
Kolan ©   (2009-08-31 15:32) [14]

Да, Ega23, когда писал никак не мог вспомнить что для чего.

Вспомнил так: Начать линию в координатах (LineTo) и протянуть до координат (MoveTo) :)


 
Anatoly Podgoretsky ©   (2009-08-31 15:35) [15]


> procedure TUILine.Paint;
> begin
>  Canvas.LineTo(0, 0);
>  Canvas.MoveTo(Width, Height);
> end;

А это что за гадость еще, лишь бы что ни будь нарисовать, если получится.


 
Anatoly Podgoretsky ©   (2009-08-31 15:38) [16]

> Kolan  (31.08.2009 15:29:12)  [12]

И в Pen/Brush тоже, тебе пока везет, а как получишь белое на белом, то куда ты побежишь?


 
Ega23 ©   (2009-08-31 15:40) [17]

Нет. Есть Canvas, у него есть Pen. У него есть текущие координаты (какие-то).
MoveTo(X, Y) - смена текущих координат в точку с координатами (X, Y)
LineTo(X, Y) - провести линию из текущих координат в точку (X,Y)

Соответственно, код
with Canvas.Pen do
begin
 MoveTo(100, 100);
 LineTo(200, 200);
end;

нарисует диагональную линию из точки (100,100) в точку (200, 200) относительно данногой канвы.
При этом, текущей координатой "карандаша" останется точка (200, 200).


 
Kolan ©   (2009-08-31 15:49) [18]

Ega23, я понял, я исправил, спасибо. Это я по запарке.

Анатолий, про ручку с кисточкой расскажите как надо сделать (видимо как в TShape) и, главное,  почему?


 
Anatoly Podgoretsky ©   (2009-08-31 15:55) [19]

Затем, что ты можешь захотеть рисовать линию любым цветом, аналогично по Brush


 
Ega23 ©   (2009-08-31 15:57) [20]


> про ручку с кисточкой расскажите как надо сделать (видимо
> как в TShape) и, главное,  почему?


Есть TCanvas. У него всегда есть Pen (ручка) и Brush (это, скорее, "заливка").
Также есть Font (для надписей).
Основные методы:
TCanvas.MoveTo - передвигает координаты ручки
TCanvas.LineTo - рисует линию (в соответствии с текущем стилем ручки)
TCanvas.Rectangle - рисует прямоугольник (края - как стиль ручки, заливка - стилем Brush)
TCanvas.Ellipse - рисует эллипс
TCanvas.Arc - рисует дугу

ну и т.д.


 
Игорь Шевченко ©   (2009-08-31 16:00) [21]

умный человек качает готовый компонент и не парит мозг окружающим :)


 
Ega23 ©   (2009-08-31 16:04) [22]


> умный человек качает готовый компонент и не парит мозг окружающим  :)


Ага, "кАмпАнент" TMSPaint...  :)


 
Kolan ©   (2009-08-31 16:05) [23]

Ega23, да самые простые основы я знаю, я не могу понять, зачем борландовцы создали в TShape свой TPen и TBrush. И еще не понятно, что имел в виду Анатолий.

Вдруг это важно.


 
Суслик_   (2009-08-31 16:10) [24]

>Kolan ©   (31.08.09 16:05) [23]
>И еще не понятно, что имел в виду Анатолий.
>Вдруг это важно.

Конечно важно, иначе как ты также научишься также окружающих подкалывать.

)


 
Eraser ©   (2009-08-31 16:12) [25]

> [22] Ega23 ©   (31.08.09 16:04)


> TMSPaint

TOLEContainer )


 
KSergey ©   (2009-08-31 16:17) [26]

У меня есть какое-то воспоминание, что свойства Canvas надо устанавливать непосредственно перед рисования.
сейчас еще посмотрел исодники - оно вот почему.
Нет как такогово объекта "канва" у каждого компонента. Это лишь обертка над виндовых device context. Который один на всех. И его поочереди всем отдают, чтобы на нем порисовать. И каждый, понятно, перенастраивает его так, чтобы порисовать как надо.

И по исходникам видно, что объект канвы никаких свойсв по сути не хранит. Вернее он их хранит, но только чтобы потом было что прочитать из них. А вот самой канве (девайс контексту) это свойства не устанавливает "просто так"

procedure TGraphicControl.WMPaint(var Message: TWMPaint);
begin
 if Message.DC <> 0 then
 begin
   Canvas.Lock;
   try
     Canvas.Handle := Message.DC;
     try
       Paint;
     finally
       Canvas.Handle := 0;
     end;
   finally
     Canvas.Unlock;
   end;
 end;
end;


Видно, что мы привязали DC к нашему объекту канвы (почле чего вызовется Pinnt), но никакие свойства у DC не установили, т.е. рисоваться будет неизвестно чем. И настроить параметры отрисовки надо в самом начале метода Paint. (В методе TCanvas.SetHandle немного действий выполняется, но только по установке места "карандаша" в предыдущее, где он закончил рисовать для этого объекта, на сколько я понимаю)


 
Игорь Шевченко ©   (2009-08-31 16:23) [27]


> Видно, что мы привязали DC к нашему объекту канвы (почле
> чего вызовется Pinnt), но никакие свойства у DC не установили


рисоваться будет тем, что выбрано в текущем DC. Выбрать нечто (кисть, шрифт и еще кучу объектов) в текущем DC вполне можно в методе TGraphicControl.Paint, что, собственно говоря, и делается в стандартных наследниках TGraphicControl


 
clickmaker ©   (2009-08-31 16:23) [28]

> зачем борландовцы создали в TShape свой TPen и TBrush

в дизайнере нельзя задавать параметры канвы. Но можно пен и браш


 
Kolan ©   (2009-08-31 16:28) [29]

clickmaker, видите как я в [6] поступил, так что как бы можно.

Благодарю, KSergey, теперь понятно, что параметры ручки и кисточки нужно сохранять в полях для того, чтобы применить их непосредственно перед рисованием, иначе они могут быть испорчены.


 
Ega23 ©   (2009-08-31 16:32) [30]


> я не могу понять, зачем борландовцы создали в TShape свой
> TPen и TBrush.


"Свой TPen и TBrush" есть у каждого TCanvas.
Просто сам TCanvas открывать в published - бессмысленно. А вот его конкретные свойства - why not?
Тебя же не смущает свойство Font у TEdit. А это не что иное, как TEdit.Canvas.Font


 
Kolan ©   (2009-08-31 16:40) [31]


> А вот его конкретные свойства - why not?

Ну так они же не открыли их, а заместо этого сделали:

TShape = class(TGraphicControl)
 private
   FPen: TPen;
   FBrush: TBrush;
...


а потом

procedure TShape.Paint;
var
 X, Y, W, H, S: Integer;
begin
 with Canvas do
 begin
   Pen := FPen;
   Brush := FBrush;
...


Вот я и переживаю :)


 
Игорь Шевченко ©   (2009-08-31 16:44) [32]


>
> Вот я и переживаю :)


Непонятны переживания. У TEdit собственный Canvas, у TShape - Canvas родительского контрола. Понятное дело, что открыть свойства Canvas родителського контрола и положить на него пару TShape, то они друг с другом могут вступать в забавные отношения посредством общего Canvas. Поэтому свойства Pen и Brush у TShape используются для рисования только в определенные период времени, а хранятся так, как им удобно - в виде классов TPen и TBrush для установки их свойств.


 
Kolan ©   (2009-08-31 16:46) [33]

Теперь понял, Игорь.

Благодарю.



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

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

Наверх




Память: 0.55 MB
Время: 0.011 c
3-1228933006
alex810
2008-12-10 21:16
2009.11.01
Oracle и интернет


15-1251805431
netdancer
2009-09-01 15:43
2009.11.01
BDE и Windows Vista


1-1222072613
vecna
2008-09-22 12:36
2009.11.01
Crystal Reports X + UFL


2-1252096753
Shyrick
2009-09-05 00:39
2009.11.01
Межпроцессное взаимодействие IPC


8-1198227742
T54
2007-12-21 12:02
2009.11.01
NTSC-PAL