Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
6-48672
eK
2003-07-14 22:32
2003.09.15
Как мне переделать аутентификацию на веб-сервере


3-48416
shnidke
2003-08-25 22:32
2003.09.15
Вычисление суммы


4-48834
mm0
2003-07-14 07:42
2003.09.15
Вопрос про hDC


1-48610
MakNik
2003-09-03 13:42
2003.09.15
DBLookupComboBox1


14-48788
lokid7
2003-08-25 19:51
2003.09.15
Глючит мышка...





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский