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




Вниз

Вопрос о MDI окнах 


dimonf   (2001-12-23 13:29) [0]

Народ, распахиваю два окна. В каждом окне на Canvos рисую разную информацию. Но после того как я возражаюсь к первому окну MDI у меня почемуто выводится Canvas второго окна MDI.

В чем проблема? Где я опять напортачил? :)))



cdaDmitriy   (2001-12-23 13:37) [1]

Source Please



dimonf   (2001-12-24 08:53) [2]

Нет мыслей?



cdaDmitriy   (2001-12-24 09:26) [3]

какие мысли если не известно что ты делаешь ....



vl_chel   (2001-12-24 10:26) [4]

как ты рисуешь?
проверь обработчик OnPaint проблема именно там
наверное забыл об полиморфизме



Clever man   (2001-12-24 10:35) [5]

А может работаешь с разными указателями на один и тот-же объект Canvas?



dimonf   (2001-12-24 11:07) [6]

Народ, мне нужно разобраться как критить MDI окно. Указывать индификатор на окно "жоско".
Типа: Child:=TMDIChild.CreateMDI(self,Idx), где Idx - индекс окна.
Диапозон идексов от 1 до 3.
У меня получилось:
type
TMDIChild=Class;

TPreview = class(TPanel)
private
property Canvas;
protected
MyMDI:TMDIChild;
procedure Paint; override;
procedure Draw(Value:Integer);
public
constructor Create(AOwner:TComponent); override;
function ConvData(Str: String; Index: Integer): String;
end;

TMDIChild = class(TForm)
fsChild: TfsManager;
TabSet1: TTabSet;
ScrollBox1: TScrollBox;
Panel1: TPanel;
constructor CreateMDI(Sender: TObject; Idx:integer);
procedure FormCreate(Sender: TObject);
procedure FormResize(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormDestroy(Sender: TObject);
private
protected
Idx:integer;
public
MyPrev : TPreview;
end;

constructor TMDIChild.CreateMDI(Sender: TObject; AIdx:integer);
begin
Create(Sender);
Idx:=AIdx;
end;

constructor TPreview.Create(AOwner: TComponent);
begin
Inherited Create(AOwner);
MyMDI:=AOwner;
Parent := AOwner as TWinControl;
BevelInner := bvNone;
BevelOuter := bvNone;
Color := clWhite;
BorderStyle := bsNone;
end;

procedure TPreview.Paint;
begin
Draw(MyMDI.Idx);
end;

Но почемуто данный кон нех...на не работает :(((
Может я чего не понемаю. Или ручки кривые???



cdaDmitriy   (2001-12-24 11:30) [7]

-- dimonf
1. Народ, мне нужно разобраться как критить MDI окно ---???

2. Draw(MyMDI.Idx); -- ???

3.
constructor TMDIChild.CreateMDI(Sender: TObject; AIdx:integer);
begin
Create(Sender); // -- ??? Inherited Create(AOwner);
Idx:=AIdx;
end;

4.
MyPrev : TPreview; // ---??? Create Where

5. TPreview - Where он находится Left .....




cdaDmitriy   (2001-12-24 11:33) [8]

constructor TMDIChild.CreateMDI(Sender: TObject; AIdx:integer);
begin
Create(Sender); // -- ??? MyPrev:=TPreview.Create(AOwner);
Idx:=AIdx;
end;



dimonf   (2001-12-24 11:58) [9]

MyPrev:=TPreview.Create(AOwner); - такая строчка почемуто не прокатывает.
ругаеться типа: Undeclared indentifier "AOwner"

А по поводу строчки TPreview - Where он находится Left .....
Я вообще не понял :(





cdaDmitriy   (2001-12-24 12:40) [10]

извини MyPrev:=TPreview.Create(Sender); // -- ??

constructor TMDIChild.CreateMDI(Sender: TObject; AIdx:integer);
begin
MyPrev:=TPreview.Create(Sender);
With MyPrev Do begin
left:=...; Top:=...;
Height:=...; Width:=...;
// и другие параметры
End;
Idx:=AIdx;
end;

и где реализация

TPreview.Draw(MyMDI.Idx);



dimonf   (2001-12-24 13:28) [11]

Это MainForm:
-------------------------------------------------------------------
...
private
procedure CreateMDIChild(const Name: string; Idx:Integer);
...
procedure TMainForm.CreateMDIChild(const Name: string; Idx:Integer);
var
Child: TMDIChild;
begin
Child:=TMDIChild.CreateMDI(Self, Idx);
// Child.Caption := Name;
// Child.Show;
// Child := TMDIChild.Create(Application);
// Child.Caption := Name;
end;

Вызываю :
CreateMDIChild("Текущие значения",1);

-------------------------------------------------------------------

Это Childwin:

-------------------------------------------------------------------
type
TMyPozice = (pzLeft, pzRight, pzCenter);
TMyRect = record
Left, Top, Right, Bottom: Integer;
end;

type
TMDIChild=Class;

TPreview = class(TPanel)
private
property Canvas;
protected
MyMDI:TMDIChild;
procedure Paint; override;
procedure Draw(Value:Integer);
public
constructor Create(AOwner:TComponent); override;
function ConvData(Str: String; Index: Integer): String;
end;

TMDIChild = class(TForm)
fsChild: TfsManager;
TabSet1: TTabSet;
ScrollBox1: TScrollBox;
Panel1: TPanel;
constructor CreateMDI(Sender: TObject; AIdx:integer);
procedure FormCreate(Sender: TObject);
procedure FormResize(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormDestroy(Sender: TObject);
private
protected
Idx:integer;
public
MyPrev : TPreview;
end;
...
procedure TMDIChild.FormClose(Sender: TObject; var Action: TCloseAction);
Var iChild:integer;
MainForm:TForm;
begin
MainForm:=TForm(TForm(Sender).Owner);
for iChild:=0 to MainForm.MDIChildCount-1
do MainForm.MDIChildren[iChild].WindowState:=wsNormal;
// MyPrev.Free;
Action := caFree;
end;

procedure TMDIChild.FormCreate(Sender: TObject);
begin
SetWindowLong(ClientHandle, GWL_EXSTYLE,
GetWindowLong(ClientHandle,
GWL_EXSTYLE) or WS_EX_CLIENTEDGE);
SetWindowPos(ClientHandle, 0, 0, 0, 0, 0,
swp_DrawFrame or swp_NoMove or swp_NoSize
or swp_NoZOrder);
end;

constructor TPreview.Create(AOwner: TComponent);
begin
Inherited Create(AOwner);
MyMDI:=TMDIChild.Create(AOwner);
// Parent := AOwner as TWinControl; // Почемуто ругаеться в этом месте :((
BevelInner := bvNone;
BevelOuter := bvNone;
Color := clWhite;
BorderStyle := bsNone;
end;

procedure TPreview.Paint;
begin
Draw(MyMDI.Idx);
end;

procedure TPreview.Draw(Value : Integer);
var MyRect : TMyRect;
Count : Integer;

procedure MyStyle;
begin
with Canvas do begin
Pen.Width := 1;
Brush.Style := bsSolid;
Font.Color := clBlack;
Font.Size := 10;
Font.Style := [fsBold];
end;
end;

procedure Table(Rects : TMyRect; Top, Field : Integer);
var Count : Integer;
begin
For Count:=1 to Field do
begin
Canvas.Rectangle(Rects.Left-2, Rects.Top-2, Rects.Right+2, Rects.Bottom+2);
Rects.Top:=Rects.Top+Top;
Rects.Bottom:=Rects.Bottom+Top;
end;
end;

procedure Print(Rects : TMyRect; Pozice : TMyPozice; Value: String);
begin
case Pozice of
pzCenter : Canvas.TextOut(Ceil((Rects.Right-Canvas.TextWidth(Value))/2+18),Rects.Top+5,Value);
pzLeft : Canvas.TextOut(Rects.Left+5,Rects.Top+5,Value);
end;
end;
begin
case Value of
1 :
begin
Width:=460;
Height:=350;
MyStyle;
MyRect.Left:=40 ; MyRect.Top:=80; MyRect.Right:=247; MyRect.Bottom:=107;
Count:=7;
Table(MyRect,30,Count);
end;

MyRect.Left:=247; MyRect.Top:=80; MyRect.Right:=454; MyRect.Bottom:=107;
Count:=7;
Table(MyRect,30,Count);
end;
end;
2 :
begin
Width:=460;
Count:=MainForm.MyData.Count-3;
Height:=Count*25;
MyStyle;
MyRect.Left:=40 ; MyRect.Top:=1; MyRect.Right:=247; MyRect.Bottom:=107;
Table(MyRect,25,Count);
end;
end;
end;

procedure TMDIChild.FormResize(Sender: TObject);
begin
// MyPrev.Left:=Ceil((ScrollBox1.Width-MyWidth)/2-15);
end;

procedure TMDIChild.FormDestroy(Sender: TObject);
begin
MyPrev.Free;
end;

constructor TMDIChild.CreateMDI(Sender: TObject; AIdx: integer);
begin
// MyPrev:=TPreview.Create(Self);
// MyPrev.parent:=ScrollBox1;
MyPrev:=TPreview.Create(self); // Работает только Self. Если пишу
With MyPrev Do begin // Sender то ругаеться
left:=0; Top:=0;
Height:=500; Width:=500;
Parent:=ScrollBox1;
End;
Idx:=AIdx;
end;

end.

Точно я где-то напортачил :((( А понять где могу.



cdaDmitriy   (2001-12-24 14:26) [12]

if Parent:=ScrollBox1;
Then MyPrev:=TPreview.Create(ScrollBox1);


If MyPrev:=TPreview.Create(self);
Then Parent:=Self;

constructor TPreview.Create(AOwner: TComponent);
begin
Inherited Create(AOwner); // ---??? я думаю что нужно
MyMDI:=TMDIChild.Create(AOwner); // ---??? 1 из них
BevelInner := bvNone;

// or func not good кто кого создает ?
// constructor TMDIChild.CreateMDI(Sender: TObject; AIdx:

integer);

BevelOuter := bvNone;
Color := clWhite;
BorderStyle := bsNone;
end;



NUU   (2001-12-25 14:01) [13]

Я так понимаю что если написать так:
constructor TMDIChild.CreateMDI(Sender: TComponent; AIdx: integer);
то потом можно будет Sender передать в качестве OWNERa:
MyPrev:=TPreview.Create(sender); // Работает только Self. Если пишу




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




Наверх





Память: 0.75 MB
Время: 0.043 c
3-42394           Dim                   2001-12-10 09:20  2002.01.14  
Аналог в InterBase функции SUBSTRING MSSQL 6.5


1-42499           tovSuhov              2001-12-24 08:37  2002.01.14  
Выравнивание текста в ячейках StringGrid`a...


7-42579           NazguL                2001-04-14 15:52  2002.01.14  
Как с помощбю WinAPI упровлять громкостью звука


4-42596           eSc!                  2001-10-29 23:19  2002.01.14  
LockWorkstation();


1-42510           Саня                  2001-12-21 10:30  2002.01.14  
О шрифте на кнопках...