Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вопрос про MDI [D7, WinXP]


Михаил Багров ©   (2004-08-07 11:10:00) 

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


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


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


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

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


nikkie   (2004-08-09 14:10:00) [2]

>Кстати, я не вижу, зачем вообще избавляться от 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 13:42:00) [3]

nikkie ©   (09.08.04 13:28)


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


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


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


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

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


nikkie   (2004-08-09 13:28:00) [4]

>Игорь Шевченко
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1091864404&n=3
:)) скажи, у тебя есть персональная антипатия к М.Багрову? если нет, то почему ты только через двое суток отвечаешь на такой простой вопрос?? ;)

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


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

{ Избавление от 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.


Наверх

Титульная страница Поиск, карта сайта Написать письмо