Форум: "Начинающим";
Текущий архив: 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]Ой!.. я пока писал... Вижу ответы..
Страницы: 1 2 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.09.16;
Скачать: [xml.tar.bz2];
Память: 0.64 MB
Время: 0.044 c