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

Вниз

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

 
Программер_   (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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.034 c
14-1094701395
Sirus
2004-09-09 07:43
2004.10.10
Что такое контрольная сумма файлов???


8-1090328168
asat
2004-07-20 16:56
2004.10.10
TOpenPictureDialog


9-1086801828
Igoryok
2004-06-09 21:23
2004.10.10
Продолжение про Delphi X и концепцию дальнейшего развития


8-1089292943
ser_ega
2004-07-08 17:22
2004.10.10
Image


1-1096200942
Гость
2004-09-26 16:15
2004.10.10
TstatusBar. Изменение цвета.





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