Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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


Страницы:   1 2 3

JetAPI ©   (2007-08-17 21:48:00) 

Здравствуйте всем.
Помогите пожалуйста понять: почему, при запуске программы, в 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.

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


JetAPI   (2007-08-20 14:12:00) [1]

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

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

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

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

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

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

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

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

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

to Raskov

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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


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


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

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

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


JetAPI   (2007-08-19 23:48:00) [4]

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


JetAPI   (2007-08-19 23:46:00) [5]

Leonid Troyanovsky

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

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

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


{RASkov}   (2007-08-19 23:41:00) [6]

> Но если использую один раз, при запуске программы 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);
:о)
ЗЫ Я рыбы наловил, а здесь все тоже самое :)


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


> 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
Да, да - это тот самый Анатолий Подгорецкий :-)


Leonid Troyanovsky   (2007-08-19 22:51:00) [8]


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

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

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

--
Regards, LVT.


JetAPI   (2007-08-19 22:39:00) [9]

Leonid Troyanovsky

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

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


Leonid Troyanovsky   (2007-08-19 19:16:00) [10]


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

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

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

--
Regards, LVT.


JetAPI   (2007-08-19 18:53:00) [11]

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


Leonid Troyanovsky   (2007-08-19 18:41:00) [12]


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

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


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

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

--
Regards, LVT.


JetAPI   (2007-08-19 17:44:00) [13]

Raskov

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

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

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


JetAPI   (2007-08-19 17:27:00) [14]

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.


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

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


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


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

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

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


tmp   (2007-08-18 18:21:00) [16]

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


{RASkov}   (2007-08-18 18:13:00) [17]

> [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;

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


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

> 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]? Я же тебе написал где у тебя ошибка.... причем глупая :)


tmp   (2007-08-18 18:01:00) [19]


> {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;


JetAPI   (2007-08-18 17:39:00) [20]

Фу-уууу!.. Я тако-ой  урок получил!.. что просто вообще-е!..
Все сделал... Все получается... Все работает....
Главное понял!
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буду юзать... Не могу никак откомпилировать.


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо