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

Вниз

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

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

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


 
Игорь Шевченко ©   (2004-08-09 10:58) [1]

{ Избавление от ScrollBar"ов в MDI-форме. (С) Peter Below (TeamB)              }

type
 TfMain = class(TForm)
   procedure FormCreate(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 fMain: TfMain;

implementation

{$R *.DFM}

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

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:
   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;
 Result := CallWindowProc( f, wnd, msg, wparam, lparam );
end;

procedure TfMain.FormCreate(Sender: TObject);
begin
 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;

end;

end.



 
nikkie ©   (2004-08-09 13:28) [2]

>Игорь Шевченко
http://delphimaster.net/view/15-1091864404/
:)) скажи, у тебя есть персональная антипатия к М.Багрову? если нет, то почему ты только через двое суток отвечаешь на такой простой вопрос?? ;)

вообще не нравится мне этот код Below"a - зачем сохранять указатель на старую WndProc в USERDATA? тоже самое проще и надежнее сделать с глобальной переменной или членом класса.


 
Игорь Шевченко ©   (2004-08-09 13:42) [3]

nikkie ©   (09.08.04 13:28)


> :)) скажи, у тебя есть персональная антипатия к М.Багрову?
> если нет, то почему ты только через двое суток отвечаешь
> на такой простой вопрос?? ;)


Наверное, потому что два дня меня просто не было. Просмотрев конференцию, не увидел ответа, решил ответить.


> вообще не нравится мне этот код Below"a - зачем сохранять
> указатель на старую WndProc в USERDATA? тоже самое проще
> и надежнее сделать с глобальной переменной или членом класса.


А чем лучше и надежнее ?

Кстати, я не вижу, зачем вообще избавляться от Scrollbar"ов в главной форме, но это уже выходит за рамки.


 
nikkie ©   (2004-08-09 14:10) [4]

>Кстати, я не вижу, зачем вообще избавляться от Scrollbar"ов в главной форме, но это уже выходит за рамки.
ну я даже не про скроллбары говорю, а про технику сабклассирования.

>А чем лучше и надежнее ?
а я не говорил лучше. я говорил - проще. :)

надежнее - потому как наши переменные никто ненамеренно испортить не сможет. а USERDATA - кто угодно. поэтому и написано: {cannot subclass client window, userdata already in use}. хотя я с трудом представляю как такая ситуация может возникнуть. разве что новая версия VCL будет как-то использовать USERDATA...

вот пример на "чисто ООП" - проверки USERDATA нет, потому и проще. можно сделать FDefClientProc и ClientWndProc глобальными и убрать MakeObjectInstance. в любом случае проще, имхо.

   FDefClientProc: TFarProc;
   procedure ClientWndProc(var Message: TMessage);

procedure TfrmMain.ClientWndProc(var Message: TMessage);
begin
 ...
 Result := CallWindowProc(FDefClientProc, ClientHandle, Msg, wParam, lParam);
end;

procedure TfrmMain.CreateWnd;
begin
 inherited CreateWnd;
 FDefClientProc := Pointer(GetWindowLong(ClientHandle, GWL_WNDPROC));
 SetWindowLong(ClientHandle, GWL_WNDPROC,
   Longint(MakeObjectInstance(ClientWndProc)));
end;


 
Игорь Шевченко ©   (2004-08-09 14:18) [5]


> надежнее - потому как наши переменные никто ненамеренно
> испортить не сможет. а USERDATA - кто угодно. поэтому и
> написано: {cannot subclass client window, userdata already
> in use}. хотя я с трудом представляю как такая ситуация
> может возникнуть. разве что новая версия VCL будет как-то
> использовать USERDATA...


Вот и я с трудом представляю.

В принципе, можно поспорить с тем, что твой способ оборачивается необходимостью заводить лишнюю переменную, но это уже, по-моему, ловля блох будет :)



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

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

Наверх




Память: 0.48 MB
Время: 0.056 c
4-1091435368
Antonmm
2004-08-02 12:29
2004.09.19
Связь с другими программами


3-1092875123
Corvin
2004-08-19 04:25
2004.09.19
Как поменять месяц в дате средствами sql


3-1093087406
matt
2004-08-21 15:23
2004.09.19
передача указателя


14-1093882368
undert
2004-08-30 20:12
2004.09.19
Подскажите пожалуйста


14-1094123408
Аппроксимация
2004-09-02 15:10
2004.09.19
Подскажите, как расчитать аппроксимацию?