|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Трабла Tpanel+TPaintBox+TEdit
Суть такая на пэинтбоксе изображение объектов с подписями, при нажатии на подпись на её месте появляется Эдит, пользователь вводит текст клацает по пэинтбоксу в другом месте и подпись меняется на то что он ввёл, а эдит исчезает.
Данный пример работает без проблем если пэинтбокс лежит на форме. если же он лежит на панели, то, после исчезновения эдита, изображение перерисовывается полностью но на месте эдита остается белый прямоугольник onPaint в данном случае использовать нельзя Из-за чего это, и как тут быть? Код:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type TForm1 = class(TForm) Button1: TButton; Panel1: TPanel; PaintBox1: TPaintBox; Edit1: TEdit; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); procedure PaintBox1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); private procedure drawfon; { Private declarations } public { Public declarations } end; var Form1: TForm1; fRect:Trect; str:string; implementation uses Types; {$R *.dfm} procedure TForm1.drawfon; begin with PaintBox1 do begin Canvas.Brush.Color:=clgreen; Canvas.pen.Color:=clgreen; Canvas.Rectangle(0,0,Width,Height); Canvas.pen.Color:=clRed; Canvas.Rectangle(frect); canvas.TextOut(frect.Left+2,frect.Top+2,str); end; end; procedure TForm1.FormCreate(Sender: TObject); begin frect.Left:=200; frect.top:=200; frect.right:=250; frect.bottom:=220; str:='Текст'; end; procedure TForm1.Button1Click(Sender: TObject); begin drawfon; end; procedure TForm1.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if Edit1.Visible then begin str:=Edit1.Text; Edit1.Visible:=false; drawfon; end else if (x>frect.Left)and(x<fRect.Right)and(y>frect.Top)and(y<fRect.Bottom)then begin Edit1.Left:=fRect.Left; Edit1.top:=fRect.top; Edit1.width:=fRect.Right-fRect.Left; Edit1.Height:=fRect.Bottom-fRect.Top; Edit1.Visible:=true; Edit1.SetFocus; end; end; end. |
#2
|
|||
|
|||
Если добавить вот так, то работает и на панели
Код:
... Edit1.Visible:=false; Panel1.Refresh; drawfon; ... Тебе видней, но хочу предупредить, если сдвинуть форму за пределы экрана и вернуть обратно, то что нарисовано в drawfon уже не восстановится. Нужно рисовать в OnPaint |
#3
|
|||
|
|||
спасибо, помогло
|