powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как убрать скроллы у MDI-формы
4 сообщений из 4, страница 1 из 1
Как убрать скроллы у MDI-формы
    #32088889
MaratIsk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При перемещении дочерних форм у MDI появляются скроллы. Как от них избавиться? Изменение свойств AUTOSCROLL, VISIBLE у скроллов не помогает.
...
Рейтинг: 0 / 0
Как убрать скроллы у MDI-формы
    #32090153
Фотография KirillovA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По дефолту - никак ....
скролы по автомату появляются кады твои контролы выезжают за форму... поиграй с мессагами к форме PostMessage/SendMessage - далее ковыряй mcdn...
...
Рейтинг: 0 / 0
Как убрать скроллы у MDI-формы
    #32090158
Фотография hDrummer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот что пишет на эту тему Peter Below [TeamB]:

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:

Код: plaintext
1.
2.
3.
4.
5.
6.
  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.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
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.

Peter Below (TeamB)
...
Рейтинг: 0 / 0
Как убрать скроллы у MDI-формы
    #32090656
Фотография KirillovA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Получение ссылки на экземпляр класса
...мне также понадобилось в подпрограмме получить ссылку на дочернее MDI-окно без сообщения подпрограмме с каким конкретно классом MDI необходимо работать. Что я сделал: я передавал в виде параметров тип дочернего MDI-окна и ссылку как нетипизированную переменную и затем обрабатывал это в подпрограмме.

Вот пример. Эта подпрограмма работает с дочерним окном, которое может иметь только один экземпляр. Если оно не открыто, подпрограмма создаст его, если оно открыто, оно переместит его на передний план.

--------------------------------------------------------------------------------
procedure FormLoader (FormClassType: TFormClass; var FormName);
begin
if TForm(FormName) = nil then begin
Application.CreateForm (FormClassType, FormName);
end else begin
TForm(FormName).BringToFront;
TForm(FormName).WindowState := wsNormal;
end;
end;

Вот как это вызывать:

--------------------------------------------------------------------------------
procedure TfrmTest.sbOpenClick(Sender: TObject);
begin
FormLoader (TfrmTest, frmTest);
end;

дальшн через wm_xxx делаешь все что надо....
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как убрать скроллы у MDI-формы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]