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

Вниз

Вот привожу код и пусть кто мне сможет сказать что нем   Найти похожие ветки 

 
Программер_   (2004-09-18 15:47) [0]

что-нить не так!


PROCEDURE  RebuildWindowRgn(Sender:TPageControl);

VAR FullRgn, Rgn,CurrentRgn: Hrgn;
   LeftCl,TopCl,ClientX, ClientY, I,P,CWidth,CHeight: Integer;
BEGIN
 WITH Sender DO
   BEGIN
     //определяем координаты закладок
     CWidth := TabRect(PageCount-1).Right;
     CHeight := TabRect(0).bottom-TabRect(0).top+3;
     // определяем относительные координаты клиенской части
     ClientX := (Width - ClientWidth) DIV 2;
     ClientY := Height - ClientHeight - ClientX;
     // создаем регион для всей формы
     FullRgn := CreateRectRgn(0, 0, Width, Height);
     // создаем регион для клиентской части формы
     // и вычитаем его из FullRgn
     Rgn := CreateRectRgn(ClientX, ClientY, ClientX + ClientWidth, ClientY +
            ClientHeight);
     CombineRgn(FullRgn, FullRgn, Rgn, rgn_Diff);
     //Создаем реион закладок и добавляем его к FullRgn
     Rgn := CreateRectRgn(0,0,CWidth,CHeight);
     CombineRgn(FullRgn, FullRgn, Rgn, rgn_Or);
     //Создаем регион между закладками и TabSheet и добавляем его к FullRgn
     Rgn := CreateRectRgn(0,Cheight,Width,CHeight-1);
     CombineRgn(FullRgn, FullRgn, Rgn, rgn_Or);
     // теперь добавляем к FullRgn регионы каждого контрольного элемента
   END;
 WITH Sender.ActivePage DO
   BEGIN
     FOR I:= 0 TO ControlCount -1 DO
       WITH Controls[I] DO
         BEGIN
           TopCl := Top+Sender.ActivePage.Top;
           LeftCl := Left+Sender.ActivePage.Left;
           Rgn := CreateRectRgn(ClientX + LeftCl, ClientY + TopCl, ClientX + LeftCl +
                  Width, ClientY + TopCl + Height);
           CombineRgn(FullRgn, FullRgn, Rgn, rgn_Or);
         END;
   END;
 SetWindowRgn(Sender.Handle,FullRgn,true);
END;


 
DiamondShark ©   (2004-09-18 15:51) [1]


> ClientY := Height - ClientHeight - ClientX;

Эт чяво?


 
Чайник   (2004-09-18 18:28) [2]

Каждый раз при вызове процедуры типа Create...Rgn под него выделяется память и его Handle помещается в стек. В приведенной процедуре я увидел пять вызовов Create. Так что удивляться, что после нескольких десятков вызовов данной процедуры стек переполняется???
   После того, как использовал регион, убивай его:
   DeleteObject(Rgn);


 
Чайник   (2004-09-18 18:32) [3]

В данной программе, как мне кажется, Rgn надо убивать каждый раз после вызова CombineRgn, а регион FullRgn - после SetWindowRgn.


 
Igorek ©   (2004-09-18 19:06) [4]


> Программер_   (18.09.04 15:47)  
> что-нить не так!

Ага. Все.


 
Программер_   (2004-09-19 14:27) [5]

Фух огромное спасибо исправился...
все или может еще что-нить не то?

PROCEDURE  RebuildWindowRgn(Sender:TPageControl);

VAR FullRgn, Rgn,CurrentRgn: Hrgn;
   LeftCl,TopCl,ClientX, ClientY, I,P,CWidth,CHeight: Integer;
BEGIN
 WITH Sender DO
   BEGIN
     //определяем координаты закладок
     CWidth := TabRect(PageCount-1).Right;
     CHeight := TabRect(0).bottom-TabRect(0).top+3;
     // определяем относительные координаты клиенской части
     ClientX := (Width - ClientWidth) DIV 2;
     ClientY := Height - ClientHeight - ClientX;
     // создаем регион для всей формы
     FullRgn := CreateRectRgn(0, 0, Width, Height);
     // создаем регион для клиентской части формы
     // и вычитаем его из FullRgn
     Rgn := CreateRectRgn(ClientX, ClientY, ClientX + ClientWidth, ClientY +
            ClientHeight);
     CombineRgn(FullRgn, FullRgn, Rgn, rgn_Diff);
     DeleteObject(Rgn);
     //Создаем реион закладок и добавляем его к FullRgn
     Rgn := CreateRectRgn(0,0,CWidth,CHeight);
     CombineRgn(FullRgn, FullRgn, Rgn, rgn_Or);
     DeleteObject(Rgn);
     //Создаем регион между закладками и TabSheet и добавляем его к FullRgn
     Rgn := CreateRectRgn(0,Cheight,Width,CHeight-1);
     CombineRgn(FullRgn, FullRgn, Rgn, rgn_Or);
     DeleteObject(Rgn);
     // теперь добавляем к FullRgn регионы каждого контрольного элемента
   END;
 WITH Sender.ActivePage DO
   BEGIN
     FOR I:= 0 TO ControlCount -1 DO
       WITH Controls[I] DO
         BEGIN
           TopCl := Top+Sender.ActivePage.Top;
           LeftCl := Left+Sender.ActivePage.Left;
           Rgn := CreateRectRgn(ClientX + LeftCl, ClientY + TopCl, ClientX + LeftCl +
                  Width, ClientY + TopCl + Height);
           CombineRgn(FullRgn, FullRgn, Rgn, rgn_Or);
           DeleteObject(Rgn);
         END;
   END;
 SetWindowRgn(Sender.Handle,FullRgn,true);
 DeleteObject(FullRgn);
END;



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

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

Наверх




Память: 0.49 MB
Время: 0.04 c
3-1094800875
skr
2004-09-10 11:21
2004.10.10
Создать программно алиас в BDE


14-1095664307
Рамиль
2004-09-20 11:11
2004.10.10
Ищу работу в Москве (ERP).


4-1093924089
Бушин Сергей
2004-08-31 07:48
2004.10.10
Hook для файловой системы


1-1096024129
DimonNew
2004-09-24 15:08
2004.10.10
Clipboard+Word


4-1091205205
ASd
2004-07-30 20:33
2004.10.10
состояние лотка у CD