Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.01.10;
Скачать: CL | DM;

Вниз

Проблема с окнами 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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.007 c
6-28522
Serguar
2001-10-09 11:01
2002.01.10
Как отследить событие <reset> компьютера на котором висит подконнекченый к серверу клиент


3-28403
Скалли
2001-12-07 10:23
2002.01.10
Редактирование поля типа Date (дата+время)


7-28545
kostya
2001-09-27 17:37
2002.01.10
Как реиницилизировать модем при использовании Varian Async.


4-28556
cher_gvf
2001-11-09 17:43
2002.01.10
Где почитать о потоках и процессах?


6-28513
dimen
2001-10-15 02:19
2002.01.10
исходник копмпоненты http или как организовать его...