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

Вниз

вызов одинаковых окон МДИ приложения   Найти похожие ветки 

 
Man ©   (2003-08-27 21:21) [0]

Привет Всем!Такой вопрос:есть МДИ приложение. При созданиии каждой формы,в методе FormCreate устанавливаю ширину,высоту,позицию формы. Первое окно данного класса открывается как надо,зато следующие экземпляры получаются каскадом. Как с этим бороться. Заранее всем большое спасибо!


 
Е-Моё имя ©   (2003-08-28 09:43) [1]

в OnShow попробуй


 
Man ©   (2003-08-28 10:48) [2]

не помогает


 
AndreySoft ©   (2003-08-28 10:54) [3]

Проблема в том что все не модальные окна имеют одинаковый приоритет и конфликтуют между собой.
У тебя есть 2 способа решить проблему:
1) не задавай координаты в FormCreate.
2) пользуйся Show и Hide для форм.


 
Е-Моё имя ©   (2003-08-28 10:57) [4]

Man © (28.08.03 10:48)
что не получается?

AndreySoft © (28.08.03 10:54)
>>конфликтуют между собой
правда? а как это выражается?


 
Man ©   (2003-08-28 11:07) [5]

>AndreySoft
Т.е. вы предлагаете использовать FormStyle=fsNormal и просто показывать окна немодально,методом Show.


 
Man ©   (2003-08-28 11:10) [6]

Это не совсем то.Может лучше задавать координаты на первое срабатывание OnActivate.


 
Е-Моё имя ©   (2003-08-28 11:10) [7]

а нормальные предложения тебе не подходят?


 
Е-Моё имя ©   (2003-08-28 11:17) [8]

размеры можно в OnCreate даже задавать, все работает
тока если сделать обработку WM_MDICREATE )))
в главной форме


 
Man ©   (2003-08-28 11:43) [9]

Ё-мое,не допонял я тебя:какую обработку месаги предлагаешь сделать?


 
Е-Моё имя ©   (2003-08-28 11:48) [10]

свою обработку
сделать оконную процедуру, и обрабатывать там это сообщение
обрабатывать=задавать нужную позицию создаваемого окна через параметры сообщения


 
Man ©   (2003-08-28 12:13) [11]

Оно не перехватывается,что не так?

TMain=class()
procedure WMMDIChildCreate (var Message : TMessage); message WM_MDICREATE;
end;
......
procedure TMainForm.WMMDIChildCreate(var Message: TMessage);
begin
ShowMessage("WM_MDICREATE");
end;


 
Е-Моё имя ©   (2003-08-28 12:15) [12]

сделать оконную процедуру


 
Man ©   (2003-08-28 12:32) [13]

Во-первых,чем неправильно так,
во-вторых,делал и ч/з оконную процедуру:

....
procedure WndProc(var Message:TMessage);override;
....
Procedure TMainForm.WndProc;
Begin
If Message.Msg = WM_MDICREATE Then
ShowMessage("WM_MDICREATE")
Else
inherited WndProc(Message)
end;

Что не так,поясни.


 
Е-Моё имя ©   (2003-08-28 12:38) [14]

GetWindowLong, SetWindowLong с GWL_WNDPROC для получения старой и задания новой процедуры
внутри новой процедуры проверяешь, если нужное сообщение, меняешь параметры и вызываешь старую процедуру


 
Man ©   (2003-08-28 13:33) [15]

WndProc-процедура окна предка.То что ты предлагаешь и что делал я - тоже самое.(Делал как ты описывал в конце - не ловится сообщение).


 
Е-Моё имя ©   (2003-08-28 14:04) [16]

значит то, что у меня работает, на самом деле не работает


 
ggsoft ©   (2003-08-28 14:52) [17]

Сообщение WM_MDIXXX поcылаются не MainForm.Handle а MainForm.ClientHandle поэтому и ловятся, т.е. делать SetWindowLong и GetWindowLong нужно на MainForm.ClientHandle, да и зачем это... лучше перекрой процедуру CreateParams(var Params: TCreateParams) в классе MDIChild и устанавливай там положение и размеры окна


 
Е-Моё имя ©   (2003-08-28 14:59) [18]

MainForm.ClientHandle
именно!!!!
прошу прощения, сразу не расставил все точки над подточиями


 
Man ©   (2003-09-01 12:20) [19]

Ещё момент:а если нужно дополнительно выставить размеры для компонентов на форме...


 
Е-Моё имя ©   (2003-09-01 12:27) [20]

а в чем сложность?


 
Man ©   (2003-09-01 16:42) [21]

Ну в том же: для формы я в CreateParams передам как надо,а как подлезть к компонентам н форме?


 
Игорь Шевченко ©   (2003-09-01 17:34) [22]

Лучше устанавливать размеры и положение MDIChild формы в ее переписанном конструкторе.


 
Man ©   (2003-09-02 13:15) [23]

Переписанном насколько?

Constructor TMyMDIForm.Create(AOwner:TComponent);
begin
inherited Create(AOwner);
SetMyFormParams;
end;

Так не работает.


 
Игорь Шевченко ©   (2003-09-02 13:35) [24]



procedure SetMDIChildBestFitPosition (AForm : TCustomForm);
var
m_offSet : longint;
ClientArea : TRect;
I : Integer;
begin
m_offSet := GetSystemMetrics(SM_CYCAPTION);
GetWindowRect (Application.MainForm.ClientHandle, ClientArea);
I := Application.MainForm.MDIChildCount;
while I > 9 do
dec(I,10);
with AForm do begin
left:= I*m_offSet;
top := I*m_offSet;
width := ClientArea.right - ClientArea.left - left - m_offSet;
height:= ClientArea.bottom - ClientArea.top - top - m_offSet;
end;
end;

constructor TfAbstractMDIFrom.Create(AOwner: TComponent);
begin
inherited;
SetMDIChildBestFitPosition(Self);
end;



Работает :)


 
Man ©   (2003-09-02 15:01) [25]

Игорь Шевченко!
1-я форма данного класса отрабатывает как хотелось бы,а последующие винда раскидывает в разные стороны...


 
Игорь Шевченко ©   (2003-09-02 15:55) [26]

Man © (02.09.03 15:01)

Код в студию


 
Man ©   (2003-09-03 11:51) [27]

Пожалуйста:

constructor TBaseForm.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
LoadSettings;
end;

procedure TBaseForm.LoadSettings;{virtual}
var i:integer;a:array of integer;ControlItem:TControl;
Begin
If LoadFormSettings Then Begin
SetLength(a,2);
For i:=1 To ComponentCount-1 Do
If (Components[i] is TMyPanel)And
LocateItemInBase(Components[i].Name,a)Then
With TControl(Components[i]) Do Begin
Width:=a[0];
Height:=a[1];
End;
End
Else If (Components[i] is TMyCheckBox)And
LocateItemInBase(Components[i].Name,a)Then
................
End;
End;
..........
end;

Вот такой где-то смысл. Соотв. с ф-ми наследников, переписывается метод LoadSettings,SetSettings.


 
Игорь Шевченко ©   (2003-09-03 13:26) [28]

А я не увидел, где устанавливаются позиция и размер самого окна BaseForm


 
Игорь Шевченко ©   (2003-09-03 13:48) [29]

Написал пример - все работает, как надо:

unit Child;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

type
TfChild = class(TForm)
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormCreate(Sender: TObject);
end;

var
fChild: TfChild;

implementation

var
InstanceCount : Integer = 0;
const
PosSize : array[1..4] of array [1..4] of Integer =
((50, 100, 150, 150), (0, 0, 200, 200),
(70, 70, 200, 150), (0, 50, 150, 200));

{$R *.DFM}

procedure TfChild.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
end;

procedure TfChild.FormCreate(Sender: TObject);
begin
Inc(InstanceCount);
if InstanceCount <= 4 then begin
Left := PosSize[InstanceCount][1];
Top := PosSize[InstanceCount][2];
Width := PosSize[InstanceCount][3];
Height := PosSize[InstanceCount][4];
end;
end;

end.

и в главной форме:

procedure TfMain.New1Click(Sender: TObject);
begin
with TfChild.Create(Application) do
Show();
end;



 
Man ©   (2003-09-03 15:06) [30]

Sorry,позиция окна устанавливается в ф-и LoadFormSettings.
Попробуй с циклом по компонентам. В простом МДИ не могу заставить глюка появляться .


 
Игорь Шевченко ©   (2003-09-03 15:44) [31]

Man © (03.09.03 15:06)

Я подозреваю, что ошибка в твоем коде и к MDI не относится. Если работает пример с установкой позиции и размеров окна для нескольких экземпляров одного класса формы, то проблема видимо в другом месте. Отладчик тебя спасет.


 
Man ©   (2003-09-04 11:42) [32]

Увы,всё работает,но для 1-го экземпляра окна. Последующие выводяться также как и без процедуры установки параметров.


 
Игорь Шевченко ©   (2003-09-04 12:17) [33]

Man © (04.09.03 11:42)

Отладчик тебя спасет.

Или приводи ПОЛНЫЙ код, где устанавливается позиция MDIChild-формы. Мои телепатические способности подошли к концу, пример работает как часы.



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

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

Наверх




Память: 0.54 MB
Время: 0.03 c
14-48711
Rouse_
2003-08-28 03:34
2003.09.15
Ох уж эти модели...


14-48737
Карлсон
2003-08-27 10:32
2003.09.15
я вернулся!


3-48465
napil
2003-08-22 12:09
2003.09.15
1С файлы dbf


1-48555
Relaxxx
2003-09-01 16:29
2003.09.15
Поиск по строкам у комбоБокс


1-48545
ZoKr
2003-09-02 05:32
2003.09.15
Excel Copy