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

Вниз

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

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

Наверх





Память: 0.54 MB
Время: 0.007 c
2-1252426330
Alexei
2009-09-08 20:12
2009.11.01
Программное нажатие клавиши или сочетания клавиш


1-1222101477
RustB
2008-09-22 20:37
2009.11.01
Смена стартовой страницы в браузере по умолчанию


15-1251651605
Astaldo
2009-08-30 21:00
2009.11.01
FAR


2-1252331505
noob_one
2009-09-07 17:51
2009.11.01
Кто-нибудь пользовался свойством Origin объекта Tfield?


15-1251556679
Дмитрий С
2009-08-29 18:37
2009.11.01
Почему MS не подписывает такие файлы как kernel32.dll?





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