Форум: "Основная";
Текущий архив: 2002.01.10;
Скачать: [xml.tar.bz2];
ВнизПроблема с окнами MDIChild Найти похожие ветки
← →
dimonf (2001-12-20 20:46) [0]Пытаюсь рисовать на Canvas, вроде бы устраивает но почему то
при открытий нового MDI окна на старом окне исчезает Canvas и при изменений окна 1 изменяеться Canvas окна 2.
Подскажите плиз в чем проблемма?
Вот мой код:
type
TPreview = class(TPanel)
private
property Canvas;
protected
procedure Paint; override;
public
constructor Create(AOwner:TComponent); override;
end;
type
TMyChild = class(TForm)
fsChild: TfsManager;
ScrollBox1: TScrollBox;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormCreate(Sender: TObject);
procedure FormResize(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
procedure Draw(Value:Integer); forward;
var MyPrev : TPreview;
MyChild : TMyChild;
implementation
{$R *.DFM}
uses Unit1;
procedure TMyChild.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
end;
procedure TMyChild.FormCreate(Sender: TObject);
begin
rev.tag:=Main.MyCount;
MyPrev:=TPreview.Create(Self);
MyPrev.Width:=460;
MyPrev.Height:=500;
end;
{ TPreview }
constructor TPreview.Create(AOwner: TComponent);
begin
Inherited Create(AOwner);
Parent := AOwner as TWinControl;
BevelInner := bvNone;
BevelOuter := bvNone;
Color := clWhite;
BorderStyle := bsNone;
end;
procedure TPreview.Paint;
begin
Draw(1);
end;
procedure Draw(Value : Integer);
var R : TRect;
begin
case Value of
1 :
begin
with MyPrev do begin
Canvas.Pen.Width := 1;
Canvas.Brush.Style := bsSolid;
Canvas.Font.Color := clBlack;
Canvas.Font.Size := 10;
Canvas.Font.Style := [fsBold];
Canvas.TextOut(0,30,"
← →
dimonf (2001-12-20 22:17) [1]Нет мыслей??? А то уже запарился :(((
← →
PVR (2001-12-21 00:17) [2]Попробуй добавить код в ONDeactovate,ONActivate хотя пробовать не стану ухожу извини...
← →
Ю Ю (2001-12-21 11:30) [3]var MyPrev - одна на весь Unit
MyPrev:=TPreview.Create(Self) - и содержит указание на последний созданный
procedure Draw(Value : Integer) работает только с ним
Почему бы текст из Draw не перенести непосредственно в метод класса TPreview.Paint ?
← →
gek (2001-12-21 12:36) [4]Да согласен с Ю Ю надо код перенести в paint тогда все в норме будет
← →
dimonf (2001-12-21 12:59) [5]Ребята не получаеться, как советует Ю Ю :(((
← →
Alx2 (2001-12-21 13:19) [6]Думаю, объявление
MyPrev : TPreview;
должно находиться в описании TMyChild а не быть глобальным.
← →
Alx2 (2001-12-21 13:21) [7]Соответственно, метод Draw тоже бы в TMyChild.
← →
Alx2 (2001-12-21 13:24) [8]Или нет? Лучше метод Draw в TPreview. Но тогда, очевидно, не использовать имя MyPrev
← →
dimonf (2001-12-21 15:21) [9]Всеравно не работает :(((
Все остается так как и было. Эфект тот же.
Вот я переделал как писал Alx2.
type
TPreview = class(TPanel)
private
property Canvas;
protected
procedure Paint; override;
procedure Draw(Value:Integer);
public
constructor Create(AOwner:TComponent); override;
end;
TMyChild = class(TForm)
fsChild: TfsManager;
ScrollBox1: TScrollBox;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormCreate(Sender: TObject);
procedure FormResize(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var MyPrev : TPreview;
implementation
{$R *.DFM}
Может где ошибка или у меня руки кривые. :)
← →
Alx2 (2001-12-21 15:35) [10]Это выкинь:
var MyPrev : TPreview;
А напиши
TMyChild = class(TForm)
fsChild: TfsManager;
ScrollBox1: TScrollBox;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormCreate(Sender: TObject);
procedure FormResize(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
MyPrev : TPreview;
end;
Ну и поправить инициализацию myPrev в formCreate (или где она там?), чтобы все корректно было.
← →
Alx2 (2001-12-21 15:39) [11]Сорри, судя по коду, инициализация MyPrev - ok.
Но MyPrev убивать надо при FormDestroy, например.
← →
Ю Ю (2001-12-22 07:47) [12]>Ребята не получаеться, как советует Ю Ю :(((
Я советовал следуюшее (и это работает):-)
// создание Child-формы в главной
procedure TForm1.New1Click(Sender: TObject);
var MyChild: TMyChild;
begin
MyChild:=TMyChild.Create(self);
MyChild.DrawType:=MDIChildCount mod 2;
//DrawType - это частный случай неких Public-свойств TMyChild;
MyChild.Show;
end;
type
TPreview = class(TPanel)
protected
procedure Paint; override;
public
constructor Create(AOwner:TComponent); override;
end;
TMyChild = class(TForm)
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormCreate(Sender: TObject);
procedure FormResize(Sender: TObject);
private
{ Private declarations }
MyPrev:TPreview;
FDrawType:integer;
procedure SetDeawType(const Value: integer);
public
{ Public declarations }
Property DrawType:integer read FDrawType write SetDeawType;
end;
procedure TMyChild.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
end;
procedure TMyChild.FormCreate(Sender: TObject);
begin
MyPrev:=TPreview.Create(Self);
MyPrev.Width:=460;
MyPrev.Height:=500;
end;
constructor TPreview.Create(AOwner: TComponent);
begin
Inherited Create(AOwner);
Parent := AOwner as TWinControl;
BevelInner := bvNone;
BevelOuter := bvNone;
Color := clWhite;
BorderStyle := bsNone;
end;
procedure TPreview.Paint;
var R : TRect;
begin
// Твоя Draw совсем не нужна. Если надо рисовать по-разному,
// то лучше ввести и изменять какое-либо свойство, здесь это DrawType
Case TMyChild(Owner).DrawType
of 1: begin
Canvas.Pen.Width := 1;
Canvas.Brush.Style := bsSolid;
Canvas.Font.Color := clBlack;
Canvas.Font.Size := 10;
Canvas.Font.Style := [fsBold];
Canvas.TextOut(0,30,"Oaeouea cia?aiey ia iiiaio niyoey aaiiuo n oaiein?ao?eea");
R := Rect(40, 80, 250, 107);
Canvas.Rectangle(R.Left-2, R.Top-2, R.Right+2, R.Bottom+2);
R := Rect(40, 85, 250, 196);
DrawText(Canvas.Handle, PChar("Yia?aey Aeae:"), -1, R, dt_WordBreak or dt_Center);
R := Rect(250, 80, 420, 107);
Canvas.Rectangle(R.Left-2, R.Top-2, R.Right+2, R.Bottom+2);
R := Rect(250, 85, 420, 196);
DrawText(Canvas.Handle, PChar("603.48"), -1, R, dt_WordBreak or dt_Center);
end;
else begin
end;
end;
end;
procedure TMyChild.FormResize(Sender: TObject);
begin
MyPrev.Left:=(Width-MyPrev.Width) div 2-15;
end;
procedure TMyChild.SetDrawType(const Value: integer);
begin
if FDrawType=Value then Exit;
FDrawType := Value;
Repaint;
end;
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.01.10;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.004 c