Форум: "Основная";
Текущий архив: 2003.09.15;
Скачать: [xml.tar.bz2];
Внизвызов одинаковых окон МДИ приложения Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.011 c