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

Вниз

TLabel; Не рисуется T Canvas при запуске формы.   Найти похожие ветки 

 
JetAPI ©   (2007-08-17 21:48) [0]

Здравствуйте всем.
Помогите пожалуйста понять: почему, при запуске программы, в TLabel, не работает TCanvas? Что нужно сделать?.. Никак не могу понять?
Если сделать в обработчичике OnClick (кнопки), то все рисуется. А вот при запуске, этого не происходит.
Вот код:

unit Unit1;

interface

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

type
 TForm1 = class(TForm)
   Label1: TLabel;
   procedure FormCreate(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
Label1.Width:=150;
Label1.AutoSize:=False;
Label1.Canvas.Brush.Color:=clWindow;
Label1.Canvas.FillRect(clientrect);
Label1.Canvas.Font.Color:=clLime;
Label1.Canvas.TextOut(6,0,"01");
Label1.Canvas.Font.Color:=clBlue;
Label1.Canvas.TextOut(26,0,"02");
end;

end.

Спасибо за любой ответ.


 
Leonid Troyanovsky ©   (2007-08-17 22:04) [1]


> JetAPI ©   (17.08.07 21:48)  

> Спасибо за любой ответ.


procedure TForm1.FormPaint(Sender: TObject); // OnPaint
begin
 Canvas.Font.Color:=clBlue;
 Canvas.TextOut(26,0,"02");
end;

--
Regards, LVT.


 
JetAPI ©   (2007-08-17 23:08) [2]

Leonid Troyanovsky, да, так рисуется.... все получается...
Но в том то и дело, мне нужно вывести именно на TLabel.
Пробовал вот так...

procedure TForm1.FormPaint(Sender: TObject);
begin
Label1.Canvas.Font.Color:=clBlue;
Label1.Canvas.TextOut(26,50,"02");
end;

Но так не получается... Голова кругом идет, а я даже близко подойти не могу, чтобы научиться рисовать на лейбле.

Можно еще что-нибудь посоветовать?


 
{RASkov} ©   (2007-08-18 03:18) [3]

> [2] JetAPI ©   (17.08.07 23:08)
> Пробовал вот так...
> Label1.Canvas.TextOut(26,50,"02");
> Но так не получается... Голова кругом идет, а я даже близко подойти не могу, чтобы научиться рисовать на лейбле.

А у тебя хватает размеров Лэйблы для вывода функцией TextOut? )

В общем ты наверное не понимаешь, что такое канва и как происходит на нее вывод... Я может тоже не совсем правильно понимаю, но скорее не смогу правильно объяснить...
Вот смотри, твой пример.
Окно получило сообщение на перерисовку... оно перерисовалось и нарисовало на канве метки - "02", (пусть будет так - Label1.Canvas.TextOut(0, 0, "02"); - это все в твоем примере из [2]), но следом перерисовалась сама метка(У нее тоже есть Paint) вот оно и затерло "твое художество"...

А с методом TForm1.FormCreate из [1]...., не понял еще? :)
Так вот там ты нарисовал "это дело" на канве, пусть даже на форме... да на любой, а что происходит потом.... потом идет вызов еще кучи методов, такие как например OnResize, OnActivate, OnShow.... и последним OnPaint... т.е. хоть у тебя в [1] и не было ничего в этом(OnPaint) обработчике, но окно получило команду перерисоваться и ему(окну) пофик что ты рисовал на его создании.... ведь рисунок на канве нигде не храниться.... все что мы видим все перерисовывается....

И в заключении..... зачем использовать TLabel если нам нужна канва на которой мы хотим что-то рисовать??? А TPaintBox чем не устроил?
Нужен пример?


 
{RASkov} ©   (2007-08-18 03:33) [4]

> А у тебя хватает размеров Лэйблы для вывода функцией TextOut?

Сорри... не особо обратил внимание на размеры метки и автосайз, так как смысла всего в [1] в FormCreate - нет.

Ладно вот попробуй, чисто для примера, но не прямой ответ на твой вопрос.
Брось на форму TPaintBox и TCheckBox и вот ихи обработчики:

procedure TForm1.PaintBox1Paint(Sender: TObject);
var R: Trect;  // Это нужно Var-параметром для DrawText.....
begin
 R:=PaintBox1.ClientRect;  // ..... но можно и не использовать DrawText, и соответственно R будет не нужна.
 DrawText(PaintBox1.Canvas.Handle, "Текст метки", -1, R, DT_RIGHT); //Выводим текст "якобы" метки
 if CheckBox1.Checked then begin          // Если какие-то дополнительные параметры рисования
  PaintBox1.Canvas.Font.Color:=clBlue;    // то выстовляем параметры...
  PaintBox1.Canvas.TextOut(0, 0, "02");   // ...и собственно рисуем
 end;
end;

procedure TForm1.CheckBox1Click(Sender: TObject);
begin
 PaintBox1.Invalidate; //Просто застовляем обновится(перерисоваться) ПаинтБокс
end;


Кстати... еслиб мы делали так
PaintBox1.Font.Color:=clBlue; Вместо PaintBox1.Canvas.Font.Color:=clBlue;
то нам пришлось бы восстанавливать каждый раз фонт перед прорисовкой...


 
Leonid Troyanovsky ©   (2007-08-18 11:26) [5]


> JetAPI ©   (17.08.07 23:08) [2]

> Но так не получается... Голова кругом идет, а я даже близко
> подойти не могу, чтобы научиться рисовать на лейбле.


type
 TMyLabel = class(TLabel)
   procedure Paint; override;
 end;

procedure TMyLabel.Paint;
begin
 inherited;
 Canvas.Font.Color := clBlue;
 Canvas.Brush.Style := bsClear;
 Canvas.TextOut(0, 0,"---");
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 with Tmylabel.Create(Self) do
   begin
     Parent := Self;
     Caption := "mylabel";
     SetBounds(0, 0, 50, 20);
   end;
end;


--
Regards, LVT.


 
JetAPI ©   (2007-08-18 13:07) [6]

Ой!.. сейчас... всё попорядочку...
to Raskov во-первых, самое искреннее спасибо за ответ и на достаточно понятное объяснение! Теперь...

> А у тебя хватает размеров Лэйблы для вывода функцией TextOut?

Да. К тому же тексАут в 30 пикселей шириной сделал... хватает

> В общем ты наверное не понимаешь, что такое канва и как
> происходит на нее вывод...

!00% понял, что прорисовка в Делфи это не такое уж простое дело. Шагу ступить не возможно, чтоб не споткнуться... Впрочем, это может только у меня так.

> Окно получило сообщение на перерисовку... оно перерисовалось
> и нарисовало на канве метки - "02", (пусть будет так - Label1.
> Canvas.TextOut(0, 0, "02"); - это все в твоем примере из
> [2]), но следом перерисовалась сама метка(У нее тоже есть
> Paint) вот оно и затерло "твое художество"...

Теперь я это понимаю... Но до этого-то, я это не знал.... Голову всем морочу, зато узнал. Там даже сложнее все... Виндос  компоненту посылает сообщение WM_PAINT, чтобы сам себя перересовал. Я до такого уровня еще не дошел... Вот поэтому и поселился на форуме...

> Так вот там ты нарисовал "это дело" на канве, пусть даже
> на форме... да на любой, а что происходит потом.... потом
> идет вызов еще кучи методов, такие как например OnResize,
>  OnActivate, OnShow.... и последним OnPaint... т.е. хоть
> у тебя в [1] и не было ничего в этом(OnPaint) обработчике,
>  но окно получило команду перерисоваться и ему(окну) пофик
> что ты рисовал на его создании.... ведь рисунок на канве
> нигде не храниться.... все что мы видим все перерисовывается.
> ...

Блин... Как все сложно... Как все сложно... Но хотя бы, хоть чуть стало кое-что развеиваться...

> И в заключении..... зачем использовать TLabel если нам нужна
> канва на которой мы хотим что-то рисовать??? А TPaintBox
> чем не устроил?

100% Вы правы... Вначале, я думал, что TLabel TPaintBox разница мизер... В общем найвный. А теперь вот столкнулся, и вижу: что нет... TPaintBox это TPaintBolx, а TLabel это TLabel, и каждый предназначен для своего.
Для рисования, TPaintBox, это действитель, оптимальный вариант.

> Нужен пример?

Да... Примеры, это лучше все... Но вы уже и Leonid Troyanovsky ©, привели... Сейчас в редактор "забью", и буду смотреть...  Спасибо.

Leonid Troyanovsky , спасибо большое ответ!
Это то!!!!!!!
Все получается и работает... Я только код чуть подправил под себя - чтобы проще понимать было.

В общем понятно: чтобы перерисовать, мы создали свой класс - TMyLabel/
Теперь, как я понял, Виндоус нам никаких команд не посылает.
Но тут, у меня сразу другой вопрос возник, который, мне кажется, еще сложней.
Разбейся на осколки, но понять не могу: причем здесь свойствой Caption?
Вот причем?!.. Если мы уберем эту строку:

 Caption := "MyLabel";

,..нам ничего не нарисуется. Я просто не понимаю: как   Caption := "MyLabel";, и каким образом влияет на прорисовку?
Прошу, пожалуйста, объясните... Иначе, все впустую будет, если не понимать, что и как.

И вот сразу еще одна непонятность возникла...
Захотел вывести , точно таким же образом, второй лейбл - т.е., чтобы было, например: MyLabel1, MyLabel2, и никак не могу.
Попробовал так... Попробовал по другому,.. Ничего не получается.
Подскажите, если не затруднит, как это правильно делается.
Спасибо.


 
JetAPI ©   (2007-08-18 13:10) [7]

to Leonid Troyanovsky
Ой!.. код забыл...

procedure TMyLabel.Paint;
begin
inherited;
{Canvas.Brush.Style := bsClear;}
Canvas.Brush.Color:=clWindow;
Canvas.FillRect(clientrect);
Canvas.Font.Color:=clLime;
Canvas.TextOut(6,0,"01");
Canvas.Font.Color:=clBlue;
Canvas.TextOut(26,0,"02");
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
with Tmylabel.Create(Self) do begin
 Parent := Self;
 Left:=20;
 Top:=20;
 Caption := "MyLabel";
{ SetBounds(0, 0, 50, 20);}
end;
end;


 
tmp   (2007-08-18 13:22) [8]


type
 TForm1 = class(TForm)
   Label1: TLabel;
   procedure FormCreate(Sender: TObject);
 private
   procedure WMPaint(var MsgPaint: TWMPaint); message WM_PAINT;
 public
 end;

var
 Form1: TForm1;

implementation

procedure TForm1.WMPaint(var MsgPaint: TWMPaint);
begin
 inherited;
   Label1.Width:=150;
   Label1.AutoSize:=False;
   Label1.Canvas.Brush.Color:=clWindow;
   Label1.Canvas.FillRect(clientrect);
   Label1.Canvas.Font.Color:=clLime;
   Label1.Canvas.TextOut(6,0,"01");
   Label1.Canvas.Font.Color:=clBlue;
   Label1.Canvas.TextOut(26,0,"02");
end;


 
JetAPI ©   (2007-08-18 13:49) [9]

to mp
Да... Это тоже работает... И работает без создание какого-либо класса. После сворачивания в панель, данные тоже не затираются... Вот это!..
Ламмеру есть чему удивиться.!
Сейчас стараюсь понять, что же предпочтительней и практичней.


 
JetAPI ©   (2007-08-18 14:06) [10]

to tmp  
А как сделать теперь, если, скажем, мы на форму положили 2-ой Label2 и еще кнопку (Button1), по нажатию которой, в Label2 тоже происходила прорисовка чего-нибудь (не важно чего)?
Как Label2 привязать к procedure WMPaint(var MsgPaint: TWMPaint); message WM_PAINT; ?
Можете еще один пример показать?.. (если не трудно).


 
tmp   (2007-08-18 14:11) [11]


> JetAPI ©   (18.08.07 13:49) [9]

Здесь ничего особенного не происходит: просто перехватывется сообщение Windows на отрисовку WM_PAINT, где инструкцией inherited вызываются стандартные процедуры отрисовки, в том числе и метод Paint Label"а, который выводит на канву содержание Caption, а уже потом затираем выведенное ранее и помещаем на канву нечто своё.
 А вот, если сначала попытаться манипулировать канвой Label"а, а уже потом вызвать inherited, стандартная процедура отрисовки Label"а Paint выведет на канву содержание Caption.


 
Leonid Troyanovsky ©   (2007-08-18 14:15) [12]


> JetAPI ©   (18.08.07 13:07) [6]


> Caption := "MyLabel";, и каким образом влияет на прорисовку?

А ширину будет задавать Пушкин? Width := 50;

> Захотел вывести , точно таким же образом, второй лейбл -
>  т.е., чтобы было, например: MyLabel1, MyLabel2, и никак
> не могу.

Меняй второй метке координаты.

--
Regards, LVT.


 
tmp   (2007-08-18 14:16) [13]


> JetAPI ©   (18.08.07 14:06) [10]

Не совсем понял, что ты хочешь. Может так?


procedure TForm1.WMPaint(var MsgPaint: TWMPaint);
begin
 inherited;
 Button1Click(self);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   Label2.Width:=150;
   Label2.AutoSize:=False;
   Label2.Canvas.Brush.Color:=clWindow;
   Label2.Canvas.FillRect(clientrect);
   Label2.Canvas.Font.Color:=clLime;
   Label2.Canvas.TextOut(6,0,"01");
   Label2.Canvas.Font.Color:=clBlue;
   Label2.Canvas.TextOut(26,0,"02");
end;


 
Leonid Troyanovsky ©   (2007-08-18 14:17) [14]


> JetAPI ©   (18.08.07 13:49) [9]

> Сейчас стараюсь понять, что же предпочтительней и практичней.

Вот и изучай [1].
OnPaint - это значит этот обработчик надо назначить OnPaint формы.

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2007-08-18 14:24) [15]


> JetAPI ©   (18.08.07 14:06) [10]

> в Label2 тоже происходила прорисовка чего-нибудь (не важно
> чего)?

Прорисовка не важно чего происходит в TImage.

--
Regards, LVT.


 
tmp   (2007-08-18 14:24) [16]

Практичней - не всегда предпочтительней. Если воспользоваться примером, который привёл для тебя Leonid Troynovsky, т.е. создать своего наследника и переопределить процедуру Paint - не будут происходить лишние манипуляции с канвой для вывода текста Caption"а. Если же воспользоваться перехватом WM_PAINT, то сначала отрисуется всё стандартное, а потом - что хочешь ты, но в этом случае меньше стучать по клавишам:)


 
{RASkov} ©   (2007-08-18 14:54) [17]

> [9] JetAPI ©   (18.08.07 13:49)
> Сейчас стараюсь понять, что же предпочтительней и практичней.

Да ты не "заморачивайся" на этом вопросе.... главное пойми как в Windows происходит прорисовка....
и здесь ты выйдешь на procedure WMPaint(var MsgPaint: TWMPaint); message WM_PAINT;
Которое в TGraphicControl"ах реализовано процедурой Paint, и если ты перекроешь ее у себя, то можешь рисовать все, что захочешь и где захочешь(TgraphicControl, например TLabel, TPaintBox)...
Inherited; - это, как уже обяснили, вызов того же самого метода у предка.... поэтому если эту строку убрать, то можно полностью заменить "рисунок" в контроле..... и еще отсюда же - нет смысла вызывать inherited в последнюю очередь.... так как все старания затрутся методом предка.
Я бы так [8], в конкретном случае, не делал.... зачем рисовать два раза на одном и том же месте?

> procedure TForm1.WMPaint(var MsgPaint: TWMPaint);
> begin
> inherited;   - // первый раз
>   Label1.Width:=150;
>   Label1.AutoSize:=False;
>   Label1.Canvas.Brush.Color:=clWindow;
>   Label1.Canvas.FillRect(clientrect);  //все стерли и ниже второй раз

Имхо.... я уже упомянул, об..... зачем извращатся над не преднозначенными для этого контролами (TLabel)..... почему-бы не использовать Паинт?
А уж стандартную метку в нем(в его методе Paint) изобразить раз плюнуть....


 
{RASkov} ©   (2007-08-18 15:03) [18]

> > procedure TForm1.WMPaint(var MsgPaint: TWMPaint);
> > begin
> > inherited;   - // первый раз
> >   Label1.Width:=150;
> >   Label1.AutoSize:=False;

Да еще и размеры менять в этом методе..... не серьезно....
Я понимаю, что это было для примера, но..... нужно и это учесть. В методе прорисовки, лучше не менять ничего не касающего TPen, TBrush, TFont....

И вот еще.... я все прорисовка да прорисовка... объясняю:
есть у меня понятие рисование и прорисовка
первое - это как бы разовое. Нарисовали и забыли...
а второе - то самое первое, но рисуется(прорисовывается) тогда когда необходимо....например по сообщению WM_PAINT...
И поэтому мы контролы видим такими какими мы их видим, потому что они прорисовываются при необходимости....


 
JetAPI ©   (2007-08-18 15:08) [19]

tmp
Нет... именно все так и поняли... По нажатию кнопки выполнить прорисовку в Лайбл2. Это делает... Но как только добавляю...

procedure TForm1.WMPaint(var MsgPaint: TWMPaint);
begin
inherited;
Button1Click(self);
end;

Не могу откомпилировать... выдает 2 ошибки...

[Pascal Error] TLabel02_Unit1.pas(47): E2004 Identifier redeclared: "TForm1.WMPaint"
[Pascal Fatal Error] TLabel02_Project.dpr(5): F2063 Could not compile used unit "TLabel02_Unit1.pas"

Вот весь код целиком...

unit TLabel02_Unit1;

interface

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

type
 TForm1 = class(TForm)
   Label1: TLabel;
   Label2: TLabel;
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 procedure WMPaint(var MsgPaint: TWMPaint); message WM_PAINT;
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation
{$R *.dfm}

procedure TForm1.WMPaint(var MsgPaint: TWMPaint);
begin
inherited;
Button1Click(self);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Label2.Width:=150;
Label2.AutoSize:=False;
Label2.Canvas.Brush.Color:=clWindow;
Label2.Canvas.FillRect(clientrect);
Label2.Canvas.Font.Color:=clLime;
Label2.Canvas.TextOut(6,0,"01");
Label2.Canvas.Font.Color:=clBlue;
Label2.Canvas.TextOut(26,0,"02");
end;

procedure TForm1.WMPaint(var MsgPaint: TWMPaint);
begin
inherited;
Label1.Width:=150;
Label1.AutoSize:=False;
Label1.Canvas.Brush.Color:=clWindow;
Label1.Canvas.FillRect(clientrect);
Label1.Canvas.Font.Color:=clLime;
Label1.Canvas.TextOut(6,0,"01");
Label1.Canvas.Font.Color:=clBlue;
Label1.Canvas.TextOut(26,0,"02");
end;

end.

В чем же ошибка?.. Вроде же все правильно написал...


 
JetAPI ©   (2007-08-18 15:16) [20]

Ко всем...
Я только учусь... Только постигаю... Поэтому для меня важна каждая мелочь.
Каждое ваше слово ловлю и мотаю на "ус".
Если очень дотошен и назойлив... прошу прощения!
Постарайтесь понять ламмера.  
Все равно спасибо всем.

ЗЫ.
Все ваши примеры и коментарии сохраняю в отдельной папке. Это для меня, как учебник.
Спасибо огромное всем.


 
{RASkov} ©   (2007-08-18 15:21) [21]

> [19] JetAPI ©   (18.08.07 15:08)


> Identifier redeclared

И зачем два раза реализовал WMPaint????

А [17,18] прочитал?


 
{RASkov} ©   (2007-08-18 15:24) [22]

Все что в [8] и у тебя в [19] - это и есть метод OnPaint у формы :)

Можно было и проще:

procedure TForm1.Paint();
begin
 Label1.Width:=150;
 Label1.AutoSize:=False;
 Label1.Canvas.Brush.Color:=clWindow;
 Label1.Canvas.FillRect(clientrect);
 Label1.Canvas.Font.Color:=clLime;
 Label1.Canvas.TextOut(6,0,"01");
 Label1.Canvas.Font.Color:=clBlue;
 Label1.Canvas.TextOut(26,0,"02");
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 Invalidate;
end;
:o)


 
JetAPI ©   (2007-08-18 15:41) [23]

to Raskov Да... Да... Прочитал.
Просто разбираюсь и с одним и другим....


 
JetAPI ©   (2007-08-18 17:39) [24]

Фу-уууу!.. Я тако-ой  урок получил!.. что просто вообще-е!..
Все сделал... Все получается... Все работает....
Главное понял!
Leonid Troyanovsky, tmp , RASkov, спасибо всем Вам за терпение и помощь!
Вот рабочий код:
(При запуске появляются 2 MyLabel; при нажатии на кнопку MyLabel3.)

unit TLabel_Unit1;

interface

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

type
 TMyLabel = class(TCustomLabel)
 protected
   procedure Paint; override;
 end;

 TForm1 = class(TForm)
   Button1: TButton;
   procedure FormCreate(Sender: TObject);
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
   MyLabel1: TMyLabel;
   MyLabel2: TMyLabel;
   MyLabel3: TMyLabel;
 end;

var
 Form1: TForm1;

implementation
{$R *.dfm}

procedure TMyLabel.Paint;
begin
inherited;
{Canvas.Brush.Style := bsClear;}
Canvas.Brush.Color:=clWindow;
Canvas.FillRect(clientrect);
Canvas.Font.Color:=clLime;
Canvas.TextOut(6,0,"01");
Canvas.Font.Color:=clBlue;
Canvas.TextOut(26,0,"02");
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
MyLabel3:=TMyLabel.Create(Self);
MyLabel3.Parent:=Self;
MyLabel3.Left:=20;
MyLabel3.Top:=80;
MyLabel3.Caption:="MyLabe3";
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
MyLabel1:=TMyLabel.Create(Self);
MyLabel1.Parent:=Self;
MyLabel1.Left:=20;
MyLabel1.Top:=20;
MyLabel1.Caption:="MyLabel";
MyLabel2:=TMyLabel.Create(Self);
MyLabel2.Parent:= Self;
MyLabel2.Left:=20;
MyLabel2.Top:=50;
MyLabel2.Caption := "MyLabe2";
{ SetBounds(0, 0, 50, 20);}
end;

end.


п.с.
А можно его упростить?..
Мне все равно кажется, что сделал что-то не так...  Посмотрите пожалуйста, если не затруднит.

to Raskov про TPaintBox, помню... Он на подходе... Я его уже прробовал. Не хотел просто перед TLabel пасовать.

Сейчас вариант от  tmp буду юзать... Не могу никак откомпилировать.


 
tmp   (2007-08-18 18:01) [25]


> {RASkov} ©   (18.08.07 15:03) [18]
> > > procedure TForm1.WMPaint(var MsgPaint: TWMPaint);
> > > begin
> > > inherited;   - // первый раз
> > >   Label1.Width:=150;
> > >   Label1.AutoSize:=False;
>
> Да еще и размеры менять в этом методе..... не серьезно..
> ..
> Я понимаю, что это было для примера, но..... нужно и это
> учесть. В методе прорисовки, лучше не менять ничего не касающего
> TPen, TBrush, TFont....


Хи-хи. Я просто скопировал текст из сабжа. Главное ведь не в этом? :-)


> {RASkov} ©   (18.08.07 15:24) [22]
> Все что в [8] и у тебя в [19] - это и есть метод OnPaint
> у формы :)
>
> Можно было и проще:
>
> procedure TForm1.Paint();
> begin
>  Label1.Width:=150;
>  Label1.AutoSize:=False;
>  Label1.Canvas.Brush.Color:=clWindow;
>  Label1.Canvas.FillRect(clientrect);
>  Label1.Canvas.Font.Color:=clLime;
>  Label1.Canvas.TextOut(6,0,"01");
>  Label1.Canvas.Font.Color:=clBlue;
>  Label1.Canvas.TextOut(26,0,"02");
> end;
>
> procedure TForm1.Button1Click(Sender: TObject);
> begin
>  Invalidate;
> end;
> :o)


Ага. Попробуй сначала. Дело в том, что сначала прорисовывается форма и уже только после этого прорисовываются элементы, находящиеся на этой форме,  ну и, разумеется, в этом случае, если методы Paint данных элементов не перекрыты - вызываются стандартные. А стандартный метод Paint в TLabel выводит содержание Caption на Canvas. Поэтому или перекрывать Paint, или перехватывать событие WM_PAINT.


> JetAPI ©   (18.08.07 17:39) [24]
> Сейчас вариант от  tmp буду юзать... Не могу никак откомпилировать.

Нет. Ты не разобрался - что к чему.

Реализация процедуры должна быть только один раз:-)

procedure TForm1.WMPaint(var MsgPaint: TWMPaint);
begin
 inherited;
 Label1.Width:=150;
 Label1.AutoSize:=False;
 Label1.Canvas.Brush.Color:=clWindow;
 Label1.Canvas.FillRect(clientrect);
 Label1.Canvas.Font.Color:=clLime;
 Label1.Canvas.TextOut(6,0,"01");
 Label1.Canvas.Font.Color:=clBlue;
 Label1.Canvas.TextOut(26,0,"02");

 Button1Click(self);
end;


 
{RASkov} ©   (2007-08-18 18:04) [26]

> to Raskov про TPaintBox, помню...


> А можно его упростить?..

Конечно можно... См TPaintBox ;)

А вот это(жирное) не обязательно:

> procedure TMyLabel.Paint;
> begin
> inherited;   < Зачем рисовать сначала предком...
> {Canvas.Brush.Style := bsClear;}
> Canvas.Brush.Color:=clWindow;
> Canvas.FillRect(clientrect); < .....потом все это стирать
> Canvas.Font.Color:=clLime;  < .... переопределяем парметры
> Canvas.TextOut(6,0,"01");
> Canvas.Font.Color:=clBlue;
> Canvas.TextOut(26,0,"02"); < ... и "рисуем" заного
> end;


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

Ты же затираешь все, что рисовалось в методе Paint TLabel"а... и используешь его канву в своем назначении....

Посмотри: TLabel и TPaintBox (стандартные) не долеко друг от друга ушли, и не так долеко от их общего предка TGraphicControl...
По сему никчему издеваться над TLabel"ом :)

Ты пример из [4] пробывал? Удачи.


> Сейчас вариант от  tmp буду юзать... Не могу никак откомпилировать.

Это ты про [19]? Я же тебе написал где у тебя ошибка.... причем глупая :)


 
{RASkov} ©   (2007-08-18 18:13) [27]

> [25] tmp   (18.08.07 18:01)
> Ага. Попробуй сначала. Дело в том, что сначала прорисовывается

Да пробывал... и знаю разницу того что предложил в [22] и твой способ.... и вообщем-то я про это и рассказывал... автору...
Тем более это не есть хороший способ что [8] что [22]...
А вот это:

> procedure TForm1.WMPaint(var MsgPaint: TWMPaint);
> begin
> inherited;
> Label1.Width:=150;
> Label1.AutoSize:=False;
> Label1.Canvas.Brush.Color:=clWindow;
> Label1.Canvas.FillRect(clientrect);
> Label1.Canvas.Font.Color:=clLime;
> Label1.Canvas.TextOut(6,0,"01");
> Label1.Canvas.Font.Color:=clBlue;
> Label1.Canvas.TextOut(26,0,"02");
>
> Button1Click(self);
> end;

Имхо.... тоже изврат.... :)
Вообщем не на ту дорогу автора ставишь....


 
tmp   (2007-08-18 18:21) [28]

Да я не ставлю никого и никуда:-) Есть вопрос и также есть на него ответ.
Я так понимаю, что он в самом-мамом начале, поэтому нет ничего страшного испытать - какие есть вобще возможности для того или иного. А всё остальное приложится.
А вобще, чем тебе не нравится Button1Click(self)?


 
{RASkov} ©   (2007-08-18 18:29) [29]

> [28] tmp   (18.08.07 18:21)
> А вобще, чем тебе не нравится Button1Click(self)?


> В методе прорисовки, лучше не менять ничего не касающего TPen, TBrush, TFont....


Впрочем.... ладно... согласен с

> Да я не ставлю никого и никуда:-) Есть вопрос и также есть на него ответ.

ЗЫ Все.....я уехал на рыбалку.... приеду гляну что здесь получилось :)


 
JetAPI ©   (2007-08-19 17:27) [30]

tmp

> Нет. Ты не разобрался - что к чему.

К своему стыду... да... Плаваю... плаваю... плаваю....  и точно: я еще в самом-самом начале, поэтому и заципился за этот момент с "прорисовкой".

Мне проще будет понять, если поправят ошибки... Это моя бедя, что я их не вижу. Внизу код, "в принципе, все делает", но Label2 не перерисовывает!
Подправте пожалуйста...
Хочу сохранить для сябя Ваш вариант... С созданием класса TMyLabel, с трудом с трудом, но справился. А вот с вариантом перехвата WM_PAINT, туго... и тупо!
Мне нужно чтобы Label1 рисовался при запуске программы (рисуется), а Label2, рисовался и перерисовывался по нажатию Button1 (рисуется но не перерисовывается).

unit TLabel02_Unit1;

interface

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

type
 TForm1 = class(TForm)
   Label1: TLabel;
   Button1: TButton;
   Label2: TLabel;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 procedure WMPaint(var MsgPaint: TWMPaint); message WM_PAINT;
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation
{$R *.dfm}

procedure TForm1.WMPaint(var MsgPaint: TWMPaint);
begin
inherited;
Label1.Width:=150;
Label1.AutoSize:=False;
Label1.Canvas.Brush.Color:=clWindow;
Label1.Canvas.FillRect(clientrect);
Label1.Canvas.Font.Color:=clLime;
Label1.Canvas.TextOut(6,0,"01");
Label1.Canvas.Font.Color:=clBlue;
Label1.Canvas.TextOut(26,0,"01");
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Label2.Width:=150;
Label2.AutoSize:=False;
Label2.Canvas.Brush.Color:=clWindow;
Label2.Canvas.FillRect(clientrect);
Label2.Canvas.Font.Color:=clLime;
Label2.Canvas.TextOut(6,0,"02");
Label2.Canvas.Font.Color:=clBlue;
Label2.Canvas.TextOut(26,0,"02");
end;

end.


 
JetAPI ©   (2007-08-19 17:44) [31]

Raskov

> > Сейчас вариант от  tmp буду юзать... Не могу никак откомпилировать.
> Это ты про [19]? Я же тебе написал где у тебя ошибка....
>  причем глупая :)

Два раза использовал WMPaint.... понятно... Но если использую один раз, при запуске программы Label1 не рисуется. Я этот момент и не могу просечь... а бросать не хочется... столько Вы все вложили меня!
Если можно и не затруднит, поправьте рукой... что делаю не так?
Как нужно, чтобы 1-й Label1 рисовался по запуску программы, а 2-й Label1 по нажатию кнопки?

Честное слово... обидно!


 
Leonid Troyanovsky ©   (2007-08-19 18:41) [32]


> JetAPI ©   (19.08.07 17:44) [31]

>  а 2-й Label1 по нажатию кнопки?


procedure TForm2.Button1Click(Sender: TObject);
begin
 Label1Second.Invalidate
end;

Неужель, книжечку не хочется почитать?

--
Regards, LVT.


 
JetAPI ©   (2007-08-19 18:53) [33]

Сейчас читаю.... Но с Вашеим вариантом справился ж... :)!


 
Leonid Troyanovsky ©   (2007-08-19 19:16) [34]


> JetAPI ©   (19.08.07 18:53) [33]

> Сейчас читаю.... Но с Вашеим вариантом справился ж... :)!

Чисто мыслительным усилием? :)
Я-то ж старался сущности не умножать.

--
Regards, LVT.


 
JetAPI ©   (2007-08-19 22:39) [35]

Leonid Troyanovsky

> > Сейчас читаю.... Но с Вашеим вариантом справился ж...
> :)!
>
> Чисто мыслительным усилием? :)
> Я-то ж старался сущности не умножать.

Я думал Вам будет приятно, что Ваш совет и подсказка нашли место быть и у меня всё получилось.
Конечно... я больше не буду лезть с распросами и докучать. Просто, меня заинтересовали уже не TLabel и перерисовка, а перехват WM_PAINT.
Я хотел этот вариант сохранить у себя, именно для этой цели... как пример...
Вот и всё... Теперь отставлю...


 
Leonid Troyanovsky ©   (2007-08-19 22:51) [36]


> JetAPI ©   (19.08.07 22:39) [35]

> Вот и всё... Теперь отставлю...

Не стоит сразу дуться, я, например, вовсе не противник WM_PAINT,
и сохраняй, что пожелаешь.

--
Regards, LVT.


 
tmp   (2007-08-19 23:24) [37]


> JetAPI ©   (19.08.07 17:27) [30]
> tmp
>
> > Нет. Ты не разобрался - что к чему.
>
> К своему стыду... да... Плаваю... плаваю... плаваю....  
> и точно: я еще в самом-самом начале, поэтому и заципился
> за этот момент с "прорисовкой".
>
> Мне проще будет понять, если поправят ошибки... Это моя
> бедя, что я их не вижу. Внизу код, "в принципе, все делает",
>  но Label2 не перерисовывает!
> Подправте пожалуйста...
> Хочу сохранить для сябя Ваш вариант... С созданием класса
> TMyLabel, с трудом с трудом, но справился. А вот с вариантом
> перехвата WM_PAINT, туго... и тупо!
> Мне нужно чтобы Label1 рисовался при запуске программы (рисуется),
>  а Label2, рисовался и перерисовывался по нажатию Button1
> (рисуется но не перерисовывается).
>
> unit TLabel02_Unit1;
>
> interface
>
> uses
>  Windows, Messages, SysUtils, Variants, Classes, Graphics,
>  Controls, Forms,
>  Dialogs, StdCtrls;
>
> type
>  TForm1 = class(TForm)
>    Label1: TLabel;
>    Button1: TButton;
>    Label2: TLabel;
>    procedure Button1Click(Sender: TObject);
>  private
>    { Private declarations }
>  procedure WMPaint(var MsgPaint: TWMPaint); message WM_PAINT;
>
>  public
>    { Public declarations }
>  end;
>
> var
>  Form1: TForm1;
>
> implementation
> {$R *.dfm}
>
> procedure TForm1.WMPaint(var MsgPaint: TWMPaint);
> begin
> inherited;
> Label1.Width:=150;
> Label1.AutoSize:=False;
> Label1.Canvas.Brush.Color:=clWindow;
> Label1.Canvas.FillRect(clientrect);
> Label1.Canvas.Font.Color:=clLime;
> Label1.Canvas.TextOut(6,0,"01");
> Label1.Canvas.Font.Color:=clBlue;
> Label1.Canvas.TextOut(26,0,"01");
> end;
>
> procedure TForm1.Button1Click(Sender: TObject);
> begin
> Label2.Width:=150;
> Label2.AutoSize:=False;
> Label2.Canvas.Brush.Color:=clWindow;
> Label2.Canvas.FillRect(clientrect);
> Label2.Canvas.Font.Color:=clLime;
> Label2.Canvas.TextOut(6,0,"02");
> Label2.Canvas.Font.Color:=clBlue;
> Label2.Canvas.TextOut(26,0,"02");
> end;
>
> end.


Не расстраивайся, всё придёт, главное каждый день уделять внимание твоему хобби и, возможно, оно станет твоей профессией:-)
Но постарайся быть собранным - ты невнимателен.

В приведёном мной примере как бы симулировался клик по Button1.
Сравни твой код, который курсивом и тотже, но ...

unit TLabel02_Unit1;

interface

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

type
TForm1 = class(TForm)
  Label1: TLabel;
  Button1: TButton;
  Label2: TLabel;
  procedure Button1Click(Sender: TObject);
private
  { Private declarations }
procedure WMPaint(var MsgPaint: TWMPaint); message WM_PAINT;
public
  { Public declarations }
end;

var
Form1: TForm1;

implementation
{$R *.dfm}

procedure TForm1.WMPaint(var MsgPaint: TWMPaint);
begin
inherited;
Label1.Width:=150;
Label1.AutoSize:=False;
Label1.Canvas.Brush.Color:=clWindow;
Label1.Canvas.FillRect(clientrect);
Label1.Canvas.Font.Color:=clLime;
Label1.Canvas.TextOut(6,0,"01");
Label1.Canvas.Font.Color:=clBlue;
Label1.Canvas.TextOut(26,0,"01");
Button1Click(self);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Label2.Width:=150;
Label2.AutoSize:=False;
Label2.Canvas.Brush.Color:=clWindow;
Label2.Canvas.FillRect(clientrect);
Label2.Canvas.Font.Color:=clLime;
Label2.Canvas.TextOut(6,0,"02");
Label2.Canvas.Font.Color:=clBlue;
Label2.Canvas.TextOut(26,0,"02");
end;

end.



Если тебе интересно и не лень - то найдёшь здесь очень много интересного:
http://www.podgoretsky.com/cgi-bin/dlcounter/npscnt?file=http://podgoretsky.com/ftp/Docs/Delphi/D5/Delphi5vol1.pdf&file_id=Delphi5vol1
http://www.podgoretsky.com/cgi-bin/dlcounter/npscnt?file=http://podgoretsky.com/ftp/Docs/Delphi/D5/Delphi5vol2.pdf&file_id=Delphi5vol2

Это в частности, а вобще вот: http://www.podgoretsky.com/ddp.html
Да, да - это тот самый Анатолий Подгорецкий :-)


 
{RASkov} ©   (2007-08-19 23:41) [38]

> Но если использую один раз, при запуске программы Label1
> не рисуется. Я этот момент и не могу просечь... а бросать
> не хочется...

Тяжелый случай :)

Ты не у метки сообщение "ловишь", а у формы... не забывай это.... не оконным контролам ОС сообщений не шлет...
Это я так .... на заметку. :)

Вот сдался тебе этот Лэйбл :)

Раз уж прямо-таки хочется над ним(TLabel) поиздеваться, то "верный" вариант уже был См свой пост [24]
Именно так(в конкретном случае) и ловятся сообщения (WM_PAINT) в TGraphicControl"ах, путем перекрытия его(TGraphicControl) виртуального метода Paint. А не так, что бы сообщение на прорисовку пришло в один контрол, а в методе его обработки рисуем совсем в другом контроле....

> Как нужно, чтобы 1-й Label1 рисовался по запуску программы,
> а 2-й Label1 по нажатию кнопки?

Ну с первым понятно.... создал на OnCreateForm свою метку(См TMyLabel из [24]) и выставил ей неоходимые параметры там же на создании формы (Left, Top, Parent и т.д.), а второй?? Он должен буть так же создан на момент создания формы, т.е. вместе с первым или как?
Если потом, то и создавай его так же по нажатию кнопки.....

Вот так например:

unit Unit1;
interface
uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

type
 TMyLabel = class(TCustomLabel)
 protected
   procedure Paint; override;
 end;

 TForm1 = class(TForm)
   Button1: TButton;
   procedure FormCreate(Sender: TObject);
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   L1, L2: TMyLabel;
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

{ TMyLabel }
procedure TMyLabel.Paint;
begin
 with Canvas do begin
  Brush.Color:=clWindow;
  FillRect(ClientRect);
  Font.Color:=clLime;
  TextOut(6,0,"01");
  Font.Color:=clBlue;
  TextOut(26,0,"02");
 end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 L1:=TMyLabel.Create(self);
 L1.Left:=10; L1.Top:=10;
 L1.Parent:=Self; L1.Caption:="Этот текст никогда не увидим, но он задает ширину данной метки";
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 L2:=TMyLabel.Create(self);
 L2.Left:=10; L2.Top:=30;
 L2.Parent:=Self; L2.Caption:="Этот текст никогда не увидим, но он задает ширину данной метки";
 L2.Width:=100;   // Явно задаем ширину
end;

end.


> Вот так нужно, чтобы 1-й Label1 рисовался по запуску программы, а 2-й Label1 по нажатию кнопки...
НО ЭТО ИЗВРАТ над "бедной" меткой :) Впочем... если заглянешь в VCL и посмотришь на TCustomLabel, TPaintBox и наш TMyLabel то увидишь, что мы через ж.... сделали тот же TPaintBox вот примерный получился путь:
TGraphicControl > TLabel;
TGraphicControl > TPaintBox;
TGraphicControl > TLabel > TMyLabel(он же TPaintBox);
:о)
ЗЫ Я рыбы наловил, а здесь все тоже самое :)


 
JetAPI ©   (2007-08-19 23:46) [39]

Leonid Troyanovsky

> Не стоит сразу дуться, я, например, вовсе не противник WM_PAINT,
>
> и сохраняй, что пожелаешь.

!00% говорю Вам... даже и мысли не было обидеться на Вас...
Я даже счастливо разолубался над этим...
Label1Second.Invalidate
Хоть что-то отвлекло...

Я единственное не могу понять, как с помощью перехвата WM_PAINT, по нажатию на Button1, перересовать Label2?
Raskov пытался меня направить на путь, но я что-то не могу ухватиться.
Допускаю, что и с Label1 я наложал и сделал, скорее всего, не то, что нужно.
(Хотя Label1 при запуске рисуется и перерисовается.)
п.с.
Читаю сейчас Бобровского.


 
JetAPI ©   (2007-08-19 23:48) [40]

Ой!.. я пока писал...  Вижу ответы..


 
tmp   (2007-08-19 23:53) [41]


> {RASkov} ©   (19.08.07 23:41) [38]

Мне кажется для автора не суть, как решить некую проблему, а в подходах к различным методам этих решений.

Что касается меня - то, если я использую какой-либо компонент в еденичном экземпляре - в большинстве случаев не стану создавать наследника этого компонента и перекрывать методы отрисовки - просто перехвачу сообщение на отрисовку и добавлю необходимое. Другое дело, если некий компонент используется в этом и других проектах множество раз, то да - есть смысл создать наследника с нужными свойствами.


 
{RASkov} ©   (2007-08-20 00:02) [42]

> перекрывать методы отрисовки - просто перехвачу сообщение
> на отрисовку и добавлю необходимое.

Если человек(например JetAPI) на этом остановится, то он так и привыкнет всегда делать, не поняв всей сути происходящего, так как визуально это в единичном случае и не заметно будет, но это имхо... не верно.... нужно понять истину происходящего, а уж потом можно решать в каких конкретных случаях и как сделать.... я так же не против и "обманных" способов, но ... вижу ... человек хочет понять суть, а не обойти проблему.

> JetAPI
Всеж вернись на шаг назад, и повтори(закрепи) еще раз пройденный материал(это я в общем об твоем знании Делфи).... иначе дальше будет сложнее....


 
JetAPI ©   (2007-08-20 14:12) [43]

to tmp, Raskov
Извините пожалуйста, что не смог вам ответить вчера... срочно нужно было выключить компьюетер.
to tmp

> Не расстраивайся, всё придёт, главное каждый день уделять
> внимание твоему хобби и, возможно, оно станет твоей профессией:
> -)

Знаете... даже за душу тронуло. Мне приятно стало... Для человека, кто в самом начале-начале, это очень важно. Спасибо.

> В приведёном мной примере как бы симулировался клик по Button1.

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

> Если тебе интересно и не лень - то найдёшь здесь очень много
> интересного:

Да что Вы?!.. Я Бобровского отстранил уже (по нему учился)....
Книги скачал, и народоваться не могу! Глаза разбегаются, не знаю скорее с чего начать читать. Так что, все впрок пошло. СПАСИБО!

> Мне кажется для автора не суть, как решить некую проблему,
>  а в подходах к различным методам этих решений.

Да!.. Да!! Всё так и есть!.. Я о перехватах только от Вас услышал... здесь... впервые. Загорелся, и давай искать ответы... Но информации много, а с сутью мало (судя по Бобровскому).
Теперь Ваш вариант сохранил в отдельном файле, со всеми коментариями и пояснениями.

to Raskov

> Тяжелый случай :)

Расков, терпеливый Вы человек... Я то уж, как никто знаю, сколько Вы няньчаетесь со мной. Но честное словы, многое, что я уже поччерпнул в Делфи, то это благодоря Вам. Это начиная с модуля CommCtrl и заканчивая Handle (Дескриптор окна). Отдаю Вам должное... спасибо. Спасибо за терпение.

> Ты не у метки сообщение "ловишь", а у формы... не забывай
> это.... не оконным контролам ОС сообщений не шлет...
> Это я так .... на заметку. :)

Принял к сведенью.

> Вот сдался тебе этот Лэйбл :)

Нет... уже не нужен был... Еше по "бегущей строке" про TPointBox я принял к сведенью. Я за перехват уцепился... в будущем уже знать буду. И даже очень благодарен tmp,.. Для меня это находка была!!

> Впочем... если заглянешь в VCL и посмотришь на TCustomLabel,
>  TPaintBox и наш TMyLabel то увидишь, что мы через ж....
>  сделали тот же TPaintBox вот примерный получился путь:

Все... С TLabel поставил точку. Сейчас за TPaintBox берусь.... Но я уже оценил его... Еще по ранним Вашим постам понял, что оптимальный вариант для многого...

> но ... вижу ... человек хочет понять суть, а не обойти проблему.

Расков, спасибо. Терпеливый Вы человек!.. Чтобы я без Вас делал?.. Говорю Вам всё это искренне и от всего сердца!

Удачи вам! (это уже ко всем!).



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

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

Наверх





Память: 0.66 MB
Время: 0.04 c
15-1187359204
oxffff
2007-08-17 18:00
2007.09.16
Highlander впервые показан


2-1187619177
em240
2007-08-20 18:12
2007.09.16
координаты позиции курсора на форме


2-1187873730
Алла_И
2007-08-23 16:55
2007.09.16
Копирование через Pointer


8-1165527388
AndreyRu
2006-12-08 00:36
2007.09.16
Antialiasing Глифов!


2-1187803865
nord489
2007-08-22 21:31
2007.09.16
Переменные





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