Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.003 c
1-28494
Man In Red
2001-12-22 21:08
2002.01.10
Извините, но приходится еще раз задать этот вопрос, не получается все никак по нормальному сделать! Помогите пожалуйста!


1-28510
USAtyj
2001-12-21 12:56
2002.01.10
AV при вызове HeapAlloc


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


3-28408
urii
2001-12-07 17:26
2002.01.10
перенос


4-28564
YUS
2001-11-09 08:04
2002.01.10
Создание Dll.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский