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

Вниз

Как провести линию на форме?   Найти похожие ветки 

 
isasa ©   (2005-08-18 14:23) [0]

Дурацкий вопрос, но на форме лежит TFrame у которого нет Canvas.
TImage.Canvas.LineTo рисует, но вертикальную линию, например, я не могу провести
до  нижнего конца формы(появляется "мертвая зона"). Тот-же еффект при ReSize.
TPanel работает нормально, но у него нет Canvas. :)

Поделитесь идеями рисования.


 
Юрий Зотов ©   (2005-08-18 14:48) [1]

> на форме лежит TFrame у которого нет Canvas.

Зато у него есть DC. Это практически то же самое.

> TImage.Canvas.LineTo рисует

На форме лежал фрейм. Откуда же взялся TImage?

> вертикальную линию, например, я не могу провести
> до  нижнего конца формы(появляется "мертвая зона").

Если линия рисуется на канве TImage, то, естественно, только в пределах TImage она и может рисоваться. Что тут странного?

> TPanel работает нормально, но у него нет Canvas.

1. На форме лежал фрейм. Потом откуда-то же взялся TImage. Потом откуда-то взялась еще и панель. Остается только догадываться, что же Вам все-таки нужно получить.

2. У панели есть Canvas, но он в protected. Получить к нему доступ можно так:

type
 TFriendPanel = class(TPanel);
...
 with TFriendPanel(Panel1).Canvas do ...

> Поделитесь идеями рисования.

Как уже отмечалось, можно только догадываться, что же Вам все-таки нужно, но если нужно рисовать прямо на форме, то для этого у формы есть Canvas и событие OnPaint.


 
isasa ©   (2005-08-18 15:00) [2]

Для того, чтобы нарисовать линию на фрейм кладу TImage.
TForm->TFrame->TImage

Интересный эффект
Self.Canvas.LineTo прорисовывает до конца, а
Image1.Canvas.LineTo нет.
Зависит от первоначального размера окна.
Размер Image1 изменяется нормально.


unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, ExtCtrls, StdCtrls;

type
 TForm1 = class(TForm)
   Panel1: TPanel;
   Image1: TImage;
   Label1: TLabel;
   procedure FormResize(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormResize(Sender: TObject);
begin
 Image1.Top:=0;
 Image1.Height:=Image1.Parent.Height;
 Image1.Canvas.Brush:=Image1.Parent.Brush;
 Image1.Canvas.FillRect(Image1.ClientRect);
 Image1.Canvas.MoveTo(0,0);
 Image1.Canvas.LineTo(0,Image1.Height-5);
 Image1.Canvas.MoveTo(0,Image1.Height-5);
 Image1.Canvas.LineTo(Image1.Width,Image1.Height-5);
 Label1.Caption:=format("Image1 Width=%d Height=%d",[Image1.Width,Image1.Height]);
 Self.Canvas.FillRect(Self.ClientRect);
 Self.Canvas.MoveTo(Panel1.Width+10,0);
 Self.Canvas.LineTo(Panel1.Width+10,Self.ClientRect.Bottom-10);
 Self.Canvas.MoveTo(Panel1.Width+10,ClientRect.Bottom-10);
 Self.Canvas.LineTo(Self.Width,ClientRect.Bottom-10);
end;

end.


 
Суслик ©   (2005-08-18 15:11) [3]


>  [2] isasa ©   (18.08.05 15:00)


не в том методе рисуешь


 
Юрий Зотов ©   (2005-08-18 15:13) [4]

> isasa ©   (18.08.05 15:00) [2]

> Для того, чтобы нарисовать линию на фрейм кладу TImage.

Вместо того, чтобы посмотреть справку или хотя бы просто в Инспектор Объектов.

> Интересный эффект
> Self.Canvas.LineTo прорисовывает до конца,
> а Image1.Canvas.LineTo нет.

Человек задает вопрос, но не читает ответов. Действительно, эффект интересный.

> Зависит от первоначального размера окна.

Если рисовать в OnResize (!!!) - то еще как зависит.

> Размер Image1 изменяется нормально.

Ну, хоть это хорошо.

> (куча кода)

Все выбрасываем в помойку, пишем обработчик OnPaint и в нем рисуем все, что угодно на канве самой формы.

И не имеем никаких проблем.


 
isasa ©   (2005-08-18 15:25) [5]

Не надо быть столь категоричным.
Форму с вышеперечесленным бредом составил только для проверки
существования эффекта.
А рисовать  на канве самой формы можно, но неудобно,
если учитывать координаты объектов находящихся во фрейме,
с заранее не известной позицией.

OnPaint хорошо, но зачем дергать все изображение.


 
Юрий Зотов ©   (2005-08-18 15:31) [6]

> isasa ©   (18.08.05 15:25) [5]

Вы правы, быть категоричным действительно не стоит. Ведь, в конце концов, что, где, чем и как рисовать - дело хозяйское. Пробовать советы в деле, или не пробовать - тоже дело хозяйское.


 
Defunct ©   (2005-08-18 16:11) [7]

> если учитывать координаты объектов находящихся во фрейме,
с заранее не известной позицией.


Причем тут фрейм вообще?
Что за дурь ты пишешь?

Если контейнером изображения у тебя является фрейм, то рисуй только на фрейме. Если форма - на форме. На кой черт котлеты с мухами лепить?


 
isasa ©   (2005-08-18 16:34) [8]

Тааак. Пошли пинать ногами.

Изменю формулировку вопроса.

Как соединить два объекта, находящихся во фрейме, вертикальной линией. Связь не должна разрываться при изменении размеров фрейма.

Фрейм вписан(Client) в элемент TTabSheet. TTabSheet
в свою очередь вписан в TForm дочерного окна приложения.


 
isasa ©   (2005-08-18 16:35) [9]

Defunct ©   (18.08.05 16:11) [7]

Интересно, как провести линию на фрайме. Пример.


 
Суслик ©   (2005-08-18 16:59) [10]

положи, например, на фрейм tpaintbox и рисуй в нем


 
Суслик ©   (2005-08-18 17:03) [11]


> положи, например, на фрейм tpaintbox и рисуй в нем

in event onpaint


 
isasa ©   (2005-08-18 17:08) [12]

>положи, например, на фрейм tpaintbox и рисуй в нем

:)
клал TImage, с ним проблемы. Попробую TPaintBox.


 
Юрий Зотов ©   (2005-08-18 17:34) [13]

> isasa ©   (18.08.05 16:34) [8]

> Как соединить два объекта, находящихся во фрейме,
> вертикальной линией. Связь не должна разрываться при
> изменении размеров фрейма.

Вот с ЭТОГО и надо было начинать. Теперь задача понятна.

type
 TFrame1 = class(TFrame)
   Edit1: TEdit;
   Edit2: TEdit;
 private
   FCanvas: TCanvas;
   FOnPaint: TNotifyEvent;
   procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
 protected
   procedure DoPaint; dynamic;
   procedure Resize; override;
 public
   constructor Create(AOwner: TComponent); override;
   destructor Destroy; override;
   property Canvas: TCanvas read FCanvas;
   property OnPaint: TNotifyEvent read FOnPaint write FOnPaint;
 end;

constructor TFrame1.Create(AOwner: TComponent);
begin
 inherited;
 FCanvas := TControlCanvas.Create;
 TControlCanvas(FCanvas).Control := Self;
 Edit1.Align := alTop;
 Edit2.Align := alBottom
end;

destructor TFrame1.Destroy;
begin
 FCanvas.Free;
 inherited
end;

procedure TFrame1.DoPaint;
begin
 if Assigned(FOnPaint) then
   FOnPaint(Self)
end;

procedure TFrame1.WMPaint(var Message: TWMPaint);
begin
 inherited;
 DoPaint
end;

procedure TFrame1.Resize;
begin
 inherited;
 Invalidate
end;

Мы ввели в класс фрейма канву и событие OnPaint, а кроме того заставили его перерисовываться при изменении размеров. Теперь можем все это спокойно использовать где и как угодно. Например:

type
 TForm1 = class(TForm)
   procedure FormCreate(Sender: TObject);
 private
   FFrame: TFrame1;
   procedure FramePaint(Sender: TObject);
 end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 FFrame := TFrame1.Create(Self);
 with FFrame do
 begin
   OnPaint := FramePaint;
   Parent := Self;
   Align := alClient
 end
end;

procedure TForm1.FramePaint(Sender: TObject);
begin
 with FFrame, Canvas do
 begin
   Brush.Color := Color;
   FillRect(ClipRect);
   with Edit1 do
     MoveTo(Left + Width div 2, Top + Height);
   with Edit2 do
     LineTo(Left + Width div 2, Top)
 end
end;


 
isasa ©   (2005-08-18 21:46) [14]

Все Ok! Спасибо. Классическое решение. Снимаю шляпу.



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

Форум: "Основная";
Текущий архив: 2005.09.11;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.01 c
1-1123948940
ArtemESC
2005-08-13 20:02
2005.09.11
Быстрое удаление байта в TMemoryStream


1-1124632605
chortik
2005-08-21 17:56
2005.09.11
scrollbar


14-1124327707
Гриха
2005-08-18 05:15
2005.09.11
Мыла нет (Вообще;))


3-1122397417
pasha_golub
2005-07-26 21:03
2005.09.11
Cached updates. To be or not to be?


14-1124171482
Jamik
2005-08-16 09:51
2005.09.11
Аналитика по торговлю





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