Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 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;





Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.01.10;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.75 MB
Время: 0.022 c
3-28433           kd                    2001-12-10 08:03  2002.01.10  
SQL


7-28548           VS                    2001-09-27 07:12  2002.01.10  
Как записать несколько картинок в один .dat файл


1-28456           Serg5                 2001-12-21 19:36  2002.01.10  
Знатоки, подскажите. плиз, как запретить ввод любых значений в StringGrid, кроме первой колонки. Т.е. остальные попросту у меня предназначенны для отображения результата.


3-28423           Boss2                 2001-12-08 20:20  2002.01.10  
TreeView/БД


6-28521           Serguar               2001-10-10 12:42  2002.01.10  
Вопрос по TUDPServer/TUDPClient из Indy