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

Вниз

Form2.Parent:= Form1   Найти похожие ветки 

 
A.L.   (2002-02-14 14:05) [0]

У обоих форм FormStyle:= fsNormal
при этом заголовок Form2 всегда остается серым
как исправить?


 
i8085 ©   (2002-02-15 03:40) [1]

Так ить активной может быть только одна форма...


 
A.L.   (2002-02-15 05:48) [2]

да, это до меня уже дошло...
но как же мне сделать следующее:
В приложении есть несколько рабочих областей. В каждой области свое меню, свои тулбары, свои дочерние окна.
Я делаю так: на главной форме TabSet и несколько окон с Parent:= MainForm, в которых уже есть свои меню, тулбары ...
У окон BorderStyle:= bsNone, поэтому в общем наплевать, что окно не активизируется, но при этом и Child окна нормально не работают (Access violation сплошной) :(


 
Loxly ©   (2002-02-15 06:41) [3]

A для чего устанавливать свойство Parent у формы?
Я никогда так не делал и не слышал о таком.


 
A.L.   (2002-02-15 09:01) [4]

Loxly
После Form2.Parent:= Form1
форма Form2 располагается в пределах формы Form1
(почти как дочерняя)


 
Юрий Зотов (M) ©   (2002-02-15 09:30) [5]

> но при этом и Child окна нормально не работают (Access violation сплошной)

Возможно, причина вовсе не в том, что Вы предполагаете. Приведите фрагмент кода, дающий Access violation, тогда, вероятно, можно будет сказать конкретнее.


 
A.L.   (2002-02-15 10:35) [6]

Юрий Зотов
В проекте открывается несколько форм:

Application.CreateForm(TfmMain, fmMain); //Главная форма
Application.CreateForm(TfmTab, fmTab1);
fmTab1.Parent:= fmMain;
...
Application.CreateForm(TfmTab, fmTabN);
fmTabN.Parent:= fmMain;


у форм fmTab1..fmTabN:
FormStyle:= fsMDIForm;

В этих окнах пытаюсь создавать MDIChild окна,

fmChild:= TTTabChildForm.Create(Application, fmTabForm);

наследники класса:

unit uChForm;

interface

uses
Windows, Classes, Controls, Forms, Messages, Consts;

type
TTabChildForm = class(TForm)
private
{ Private declarations }
FParentForm: TForm;
protected
FClientHandle: HWND;
procedure CreateWindowHandle(const Params: TCreateParams); override;
procedure DestroyWindowHandle; override;
public
{ Public declarations }
constructor Create(AOwner: TComponent; AParent: TForm); reintroduce; overload;
end;

implementation

procedure TTabChildForm.CreateWindowHandle(const Params: TCreateParams);
var
CreateStruct: TMDICreateStruct;
begin
if (FormStyle = fsMDIChild) and not (csDesigning in ComponentState) then
begin
if (FParentForm = nil) or (FParentForm.ClientHandle = 0) then
raise EInvalidOperation.Create(SNoMDIForm);
with CreateStruct do
begin
szClass:= Params.WinClassName;
szTitle:= Params.Caption;
hOwner:= HInstance;
X:= Params.X;
Y:= Params.Y;
cX:= Params.Width;
cY:= Params.Height;
style:= Params.Style;
lParam:= Longint(Params.Param);
end;
WindowHandle:= SendMessage(FParentForm.ClientHandle,
WM_MDICREATE, 0, Longint(@CreateStruct));
Include(FFormState, fsCreatedMDIChild);
end else
begin
inherited CreateWindowHandle(Params);
Exclude(FFormState, fsCreatedMDIChild);
end;
end;

procedure TTabChildForm.DestroyWindowHandle;
begin
if fsCreatedMDIChild in FFormState then
SendMessage(FParentForm.ClientHandle, WM_MDIDESTROY, Handle, 0)
else
inherited DestroyWindowHandle;
FClientHandle:= 0;
end;

constructor TTabChildForm.Create(AOwner: TComponent; AParent: TForm);
begin
FParentForm:= AParent;
inherited Create(AOwner);
end;

end.

создаваться то они создаются, но, например, при максимизации дочернего окна и еще где не поподя лезет "Access violation"


 
-=CrazyFish=- ©   (2002-02-15 11:30) [7]

У формы, содержащей дочерние MDI-окна, должено быть установлено свойство
FormsStyle:=fsMDIForm. Такая форма должна быть в приложении одна и являться главной. При попытке использовать в одном приложении несколько главных MDI-форм ошибок не избежать.
Удачи.


 
A.L.   (2002-02-16 22:24) [8]

-=CrazyFish=-
Это не так


 
A.L.   (2002-02-18 12:02) [9]

а в ответ тишина...
:(


 
Юрий Зотов ©   (2002-02-18 12:44) [10]

Сдается мне, что -=CrazyFish=- все же прав. Но попробуйте следующее - в классе дочерних окон напишите обработчик WM_SYSCOMMAND c SC_MAXIMIZE, поставьте в нем BreakPoint, пройдите отладчиком и выясните ТОЧНО, где возникает Access Violation.


 
A.L.   (2002-02-18 16:54) [11]

Все прекрасно работает, если не пытаться засунуть MDIForm формы в пределы главного окна программы (т.е. убрать строки типа fmTab1.Parent:= fmMain)
MDIChild окна создаются в разных MDIForm окнах, закрываются и вообщем все пучком.
Но мне то надо не совсем так.


 
Юрий Зотов ©   (2002-02-18 17:03) [12]

Вынужден повториться - выясните ТОЧНО, где возникает Access Violation. Иначе разговор беспредметен.


 
A.L.   (2002-02-19 11:39) [13]

Access Violation где-то в недрах user32.dll не могу я его отследить.
Видимо такой подход не прокатит.
Но как же мне реализовать задуманный интерфейс:
В приложении есть несколько рабочих областей. В каждой области свое меню, свои тулбары, свои дочерние окна. Внизу TabSet, который позволяет переключаться между областями.
Help!


 
A.L.   (2002-02-20 09:27) [14]

up


 
A.L.   (2002-02-21 08:34) [15]

help!


 
panov ©   (2002-02-21 09:00) [16]

Если так хочется сделать с MDI, то можно, как вариант, попробовать управлять из TabSet разными процессами, в каждом из которых открывается своя рабочая область...


 
A.L.   (2002-02-21 09:45) [17]

panov
А что значит открыть в процессе свою рабочую область?
Каким образом? Можно чуть подробнее идею?


 
panov ©   (2002-02-21 10:55) [18]

У тебя есть основная программа с TabSet. При необходимости создать дополнительную рабочую область(как у тебя звучит), запускаешь программу, где у тебя используется технология MDI,
т.е. запускаешь столько экземпляров своего приложения, сколько тебе нужно и работаешь с ними, пересылая сообщения между приложениями.


 
A.L.   (2002-02-21 11:23) [19]

panov
Но при этом получится, что каждая рабочая область в отдельном окне.
Так я могу и в одной проге сделать.
Мне охота в чтоб области находились в едином окне, а внизу окна TabSet (типа как в Excel-е переключение между листами)


 
A.L.   (2002-02-22 08:12) [20]

up


 
A.L.   (2002-02-26 08:59) [21]

что, идей нет?


 
handra ©   (2002-02-26 10:05) [22]

constructor TTabChildForm.Create(AOwner: TComponent; AParent: TForm);
begin
FParentForm:= AParent;
inherited Create(AOwner);
end;

А почему бы две строчки между begin и end не поменять местами?



 
A.L.   (2002-02-26 10:14) [23]

handra
Тогда получим исключение.
см. строку
if (FParentForm = nil) or (FParentForm.ClientHandle = 0) then
модуля uChForm


 
A.L.   (2002-02-28 10:43) [24]

up



Страницы: 1 вся ветка

Текущий архив: 2002.03.14;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.013 c
3-42919
Hermit
2002-02-14 10:12
2002.03.14
Увеличение скорости обработки данных о клиентах.


1-43066
Seven
2002-02-26 12:56
2002.03.14
RX компоненты


7-43200
olkononov1
2001-12-11 17:06
2002.03.14
Размер шрифта зависит от ОС


14-43167
Igor_thief
2002-01-30 17:38
2002.03.14
Если не слом, то почитаете.


1-43084
Voldemar
2002-02-27 02:45
2002.03.14
TImage обалдел или я?