Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2004.08.29;
Скачать: [xml.tar.bz2];

Вниз

Вопрос про MDI   Найти похожие ветки 

 
Михаил Багров   (2004-08-07 11:40) [0]

Речь идет о много документальном интерфейсе. Типа:(Корел; 1С).
Нужно сделать что бы при выходе чилд-формы за пределы главного окна не появлялись скролбары на панели форм, главного окна? Autoscroll = false для главного окна не дает нужного эффекта.


 
Михаил Багров   (2004-08-07 13:06) [1]

Хоть подскажите где найти на эту тему инфу. Решение должно быть простым, я это чувствую.


 
Piter ©   (2004-08-07 15:18) [2]

Михаил Багров   (07.08.04 11:40)
Нужно сделать что бы при выходе чилд-формы за пределы главного окна не появлялись скролбары на панели форм, главного окна?


а что должно появляться?


 
Peter Below   (2004-08-07 19:39) [3]

Since the scrollbars do not belong to the MDI frame window itself, they belong to the client window, which is not a Delphi form. Which means one has to attack the problem on the API level. Since this question has come up so frequently in recent days i have modified a sample based on the stock MDI project to include this feature. The salient parts are quoted below.
Open the main forms unit in the IDE. If you don"t have a handler for the OnCreate event, add one.In the handler you do this:

If ClientHandle <> 0 Then Begin
   If GetWindowLong( ClientHandle, GWL_USERDATA ) <> 0 Then
     Exit; // cannot subclass client window, userdata already in use
  SetWindowLong( ClientHandle, GWL_USERDATA,
                  SetWindowLong( ClientHandle, GWL_WNDPROC,
                                 integer( @ClientWindowProc)));
 End;

Add a new standalone function to the unit, it has to go above the FormCreate method since it is referenced in the statement above.
Function ClientWindowProc( wnd: HWND; msg: Cardinal; wparam,
                          lparam: Integer ): Integer; stdcall;
Var
 f: Pointer;
Begin
 f:= Pointer( GetWindowLong( wnd, GWL_USERDATA ));
 Case msg of
   WM_NCCALCSIZE: Begin
       If ( GetWindowLong( wnd, GWL_STYLE ) and
            (WS_HSCROLL or WS_VSCROLL)) <> 0
       Then
         SetWindowLong( wnd, GWL_STYLE,
                        GetWindowLong( wnd, GWL_STYLE )
                        and not (WS_HSCROLL or WS_VSCROLL));
     End;

 End;

 Result := CallWindowProc( f, wnd, msg, wparam, lparam );

End;

I clipped this code from a larger project, so lets hope i did not create errors in the process. What this code does is to subclass the client window the API way. It stores the old window function into the GWL_USERDATA field of the window structure since it is needed in the replacement window function, all messages need to be passed on to the old window function. There is only one message of interest in this case (the use of a Case results from the larger project, which handles more than this message): WM_NCCALCSIZE. The window gets this message when Windows tries to hide or show the scrollbars, among other cases. And it arrives *before* there is any painting of the scrollbar. So we can check if the window is going to sprout scrollbars and simply remove the scrollbar styles again.

For the purists: there is no need to undo the subclassing before the form is destroyed since the client window is destroyed before the form object.


 
Михаил Багров   (2004-08-07 20:02) [4]

{   Термин MDI (Multiple Document Interface) дословно означает многодокументный интерфейс и описывает приложения, способные загрузить и использовать одновременно несколько документов или объектов. Примером такого приложения может служить диспетчер файлов (File Manager).
   Обычно MDI-приложения состоят минимум из двух форм — родительской и дочерней. Свойство родительской формы FormStyle установлено равным fsMDIForm. Для дочерней формы установите стиль fsMDIChild.
  Родительская форма служит контейнером, содержащим дочерние формы, которые заключены в клиентскую область и могут перемещаться, изменять размеры, минимизироваться или максимизироваться. В вашем приложении могут быть дочерние формы разных типов, например одна — для обработки изображений, а другая — для работы с текстом.}

Так вот при перемещении дочерней формы за пределы клиенской области родительской формы, у клиенской области появляются скролбары. Нужно их убить. А как?


 
Михаил Багров   (2004-08-07 22:16) [5]

А где еще спросить моно???


 
Михаил Багров   (2004-08-07 22:47) [6]

Проблема решена. Помог Peter Below  (07.08.04 19:39) [3] за что ему огромное спасибо.

А вот интересно, почему на такой, казалось бы, легкий вопрос пришлось ждать ответа целые сутки. Это личная неприязнь ко мне (я здесь впервой) или...? Сомневаюсь, что здешний контингент не знает, как справится с данной проблемой, как же тогда писать клиенты БД? И конечно я понимаю, что здесь никто ничего мне не должен, на обратном не настаиваю.


 
nikkie ©   (2004-08-08 01:35) [7]

>Peter Below
вау, какие люди :))
только где же подпись TeamB?? ;)

>Михаил Багров
я шизею. народу делать больше нечего, как сидеть в субботу на форуме и ждать вопроса от М.Багрова, чтобы как подорванным броситься искать ответ в гугле. в котором отыскать его можно было бы за 15 минут. а потом извиняться, что ответили не сразу, а только спустя 8 часов. а когда еще через 3 часа М.Багров сообразит, что ответ-таки дан был, он конечно будет совершенно прав, возмутившись, что "пришлось ждать ответа целые сутки".


 
DrWeb   (2004-08-08 01:50) [8]

nikkie ©  (08.08.04 01:35) [7]
>чтобы как подорванным броситься искать ответ в гугле/
Если по подобному вопросу подрываться в гугле, то лучше вообще не браться за кодинг. Я конечно не адвокат дьявола, но что бы значила эта надпись « И конечно я понимаю, что здесь никто ничего мне не должен, на обратном не настаиваю.»


 
DrWeb   (2004-08-08 01:54) [9]

nikkie ©  (08.08.04 01:35) [7]
Сам то сможешь описать функционал, заложенный в посте Peter Below  (07.08.04 19:39) [3]???


 
DrWeb   (2004-08-08 02:17) [10]

То-то же...


 
nikkie ©   (2004-08-08 02:31) [11]

>Сам то сможешь описать функционал, заложенный в посте Peter Below  (07.08.04 19:39) [3]???
не понял вопрос. Вам надо перевести предпоследний абзац поста на русский?

>Если по подобному вопросу подрываться в гугле, то лучше вообще не браться за кодинг.
следует ли это понимать как: если ты не знаешь ответа на любой вопрос, то лучше вообще не браться за программирование?

хотя, в самом деле. зачем этот гугл нужен. идем на сайт к Подгорецкому
http://www.podgoretsky.com/pascal.html
и качаем "9367 статей от Peter Below". и вуаля - персональный Peter Below на нашем компьютере, готов ответить на любой вопрос.



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

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

Наверх





Память: 0.48 MB
Время: 0.042 c
14-1092235635
ghg
2004-08-11 18:47
2004.08.29
вопрос по C++


3-1091626456
Виктор
2004-08-04 17:34
2004.08.29
В IBExpert не могу отобрать права на все таблицы


1-1092210799
ruslan
2004-08-11 11:53
2004.08.29
Timage


3-1091612672
veb
2004-08-04 13:44
2004.08.29
Ошибка: Size of optimizer block exceeded


14-1091819687
ИМХО
2004-08-06 23:14
2004.08.29
"Курить иль не курить - вот в чем вопрос"





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