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

Вниз

Несколько вопросов по KOL   Найти похожие ветки 

 
dimaxx ©   (2005-03-14 21:57) [0]

Сабж. Чтобы не плодить несколько тем, спрашиваю в одной:

1) Для чего нужен DoubleBuffered? От него происходит ощутимая прибавка к размеру экзешника. Результат я вижу, а что этот код делает?

2) Как задать ширину главного меню при ручной отрисовке (OwnerDraw). Высоту я задам (MeasureItem) и ширину рассчитаю, а как задать эту ширину. Или при отрисовке строки текста она сама изменится?

3) Как в toolbar можно задать, чтобы кнопка (кнопки) стали фиксироваться в нажатом положении?


 
thaddy   (2005-03-14 23:47) [1]

1) To prevent flicker under circumstances
2) You have to set the textsize yourself. Owner draw means you have to do everything!
3) Yes, property TBButtonChecked[]


 
ECM ©   (2005-03-15 09:02) [2]

2) Ширина меню задается в MeasureItem (старшие 16-бит результата).
Например:

function TMainForm.MenuMeasureItem(S: String; Sender: PObj;
 Idx: Integer): Integer;
var
 Sz: TSize;
 OldFnt: HFONT;
 DC: HDC;
begin
 DC := GetDC(Form.Handle);
 OldFnt := SelectObject(DC,GetStockObject(DEFAULT_GUI_FONT));
 GetTextExtentPoint32(DC,@S[1],Length(S),Sz);
 SelectObject(DC,OldFnt);
 ReleaseDC(Form.Handle,DC);
 Result := 20 + ((Sz.cx+20) shl 16); //Высота 20 и +20 в ширину для отображения картинки из ImageList
end;

function TMainForm.MainMenu1MeasureItem(Sender: PObj;
 Idx: Integer): Integer;
var
 S: String;
begin
 S := MainMenu1.ItemText[Idx];
 Result := MenuMeasureItem(S,Sender,Idx);
end;


 
dimaxx ©   (2005-03-17 23:04) [3]

C этим понятно. Теперь другой вопрос: как установить программно позиции полос прокрутки в компоненте ScrollBox? Код

var A,B: integer;
...
GetScrollRange(Box.Handle,SB_HORZ,A,B);
SetScrollPos(Box.Handle,SB_HORZ,(B-A) div 2,True);


не работает. Вернее, значения Min и Max получаю, но установить не удается. Подскажите, как быть?


 
ECM ©   (2005-03-18 08:09) [4]

KOL.PAS:

   // ScrollBar
   property SBMin: Longint read fSBMinMax.X write SetSBMin;
   property SBMax: Longint read fSBMinMax.Y write SetSBMax;
   property SBMinMax: TPoint read fSBMinMax write SetSBMinMax;
   property SBPosition: Integer read fSBPosition write SetSBPosition;
   property SBPageSize: Integer read fSBPageSize write SetSBPageSize;

   property OnSBBeforeScroll: TOnSBBeforeScroll read FOnSBBeforeScroll write FOnSBBeforeScroll;
   property OnSBScroll: TOnSBScroll read FOnSBScroll write FOnSBScroll;

   function SBSetScrollInfo(const SI: TScrollInfo): Integer;
   function SBGetScrollInfo(var SI: TScrollInfo): Boolean;
   function GetSBMinMax: TPoint;
   function GetSBPageSize: Integer;
   function GetSBPosition: Integer;
   //----------------------------------------------------------------------


Это встроено в KOL...:)

Попробуй так:

Box.SBPosition := (Box.SBMax - Box.SBMin) div 2;

И посмотри как эти функции реализованы - это полезно...


 
ECM ©   (2005-03-18 08:24) [5]

Стоп...
>ECM ©   (18.03.05 08:09) [4]
Перепутал с ScrollBar - еще не проснулся :)


 
ECM ©   (2005-03-18 08:51) [6]

var
 si: tagScrollInfo;
...
 si.cbSize := SizeOf(si);
 si.fMask := SIF_ALL;
 GetScrollInfo(ScrollBox1.Handle,SB_HORZ,si);

 si.nPos :=  200; //New Position!!!

 si.fMask := SIF_POS;
 SetScrollInfo(ScrollBox1.Handle,SB_HORZ,si,TRUE);
 ScrollBox1.Perform(WM_HSCROLL,SB_ENDSCROLL,ScrollBox1.Handle);


 
SPeller ©   (2005-03-18 10:12) [7]

Удалено модератором


 
ECM ©   (2005-03-18 18:25) [8]

>SPeller ©   (18.03.05 10:12) [7]
>Удалено модератором


Наверное было нецензурно... :)


 
dimaxx ©   (2005-03-18 22:28) [9]

2 ECM: Сенькс! Код работает, но не срабатывает при OnCreate. Зато срабатывает при OnShow. Что и требовалось.

Далее мне нужно в ScrollBox поместить панель с изменяемыми размерами, которая больше scrollbox и при открытии окна устанавливать scroll"ы так, чтобы центр панели был виден в центре scrollbox. Причем независимо от размеров самого scrollbox и панели.

Поэтому на основе вышеуказанного кода строка

si.nPos := (si.nMax-si.nMin) div 2;

не катит, ибо полоса перемещается в правый конец, а не в центр.


 
SPeller ©   (2005-03-19 02:55) [10]

ECM ©   (18.03.05 18:25) [8]
Наверное было нецензурно

Нет, промазал, не туда запостил.


 
dimaxx ©   (2005-03-19 12:52) [11]

2 SPeller: Прицел сбился...

Близко по теме получается строка

si.nPos := si.nPage div 3;

тогда полоса устанавливается немного не у центра. Но это же попадать пальцем в небо... А если размеры изменить, тогда придется вычислять делитель. Млин, тоже не катит...


 
ECM ©   (2005-03-19 16:45) [12]

2dimaxx
похоже в коде ScrollBox есть небольшой глюк в вычислениях
nPos & nPage, если сделать так:

 
 si.nPage := 1;  
 si.nPos :=  (si.nMax - si.nMin) div 2;

 si.fMask := SIF_ALL;

 SetScrollInfo(ScrollBox1.Handle,SB_HORZ,si,TRUE);

 ScrollBox1.Perform(WM_HSCROLL,SB_ENDSCROLL,ScrollBox1.Handle);


то позиционируется верно, но после сдвижки - когда включается
код из KOL.pas все возвращается в "неправильное" состояние...
Надо будет поизучать...


 
ECM ©   (2005-03-19 16:50) [13]

А если так...
 si.nPos :=  (si.nMax - si.nMin - si.nPage) div 2;

 si.fMask := SIF_POS;

 SetScrollInfo(ScrollBox1.Handle,SB_HORZ,si,TRUE);

 ScrollBox1.Perform(WM_HSCROLL,SB_ENDSCROLL,ScrollBox1.Handle);


то вроде все в порядке... :)
Позиционируется точно посредине.


 
ECM ©   (2005-03-19 17:15) [14]

В данном случае nPos по смыслу - координата левого края видимой области, а не центра. Поэтому необходимо учитывать размер
видимой части ScrollBox


 
dimaxx ©   (2005-03-19 19:13) [15]

2 ECM: Биг сенькс! Попробую твой код для разных размеров.

В догонку еще вопросик. Раньше я писал так:

var C: TComponent;
begin
 for I:=0 to pred(ComponentCount) do
   begin
     C:=Components[I];
     if (C.ClassName="TMenuItem") and ((C as TMenuItem).Caption<>"-") then (C as TMenuItem).Caption:=...;
   end;


Вот сижу и думаю, а как все это в KOL написать. Дальше первой строки "C:=Form.Children[I];" не уехал. Как в PControl я узнаю, кто он? Пункт меню это, кнопка тулбара, метка, кнопка, чекбокс и т.п.?


 
ECM ©   (2005-03-19 19:31) [16]

http://kolnmck.ru/faq.htm
...
Вопрос : Я вот хочу RTTI пользовать, пишу (MySuper as(is) TSmth) - а меня компилятор ругает - почему?
В KOL нет RTTI, поскольку используется "старая" ООП-модуль (не class, а object). В итоге вместо
MySuper as TSmth пишем PSmth(MySuper), а вместо MySuper is TSmth пишем TSmth.AncestorOfObject(MySuper)


 
dimaxx ©   (2005-03-19 23:07) [17]

Закинул на форму кнопку, метку, чекбокс, радиобокс, групбокс.

Хочу отловить все кнопки и сменить у них заголовки. Пишу:

var
 I: integer;
 C: PControl;
...
for I:=0 to pred(Form.ChildCount) do
 begin
   C:=Form.Children[I];
   if TKOLButton.AncestorOfObject(C) then TKOLButton(C).Caption:="123456";
 end;


Получаю ошибку "Object or class required". Попробовал так:

if Button1.AncestorOfObject(C) then TKOLButton(C).Caption:="123456";

Работает, но поскольку у всех этих контролов родитель один - PControl, то заголовки меняются у всех. А мне нужно только у кнопки, например. Как быть?


 
dimaxx ©   (2005-03-19 23:09) [18]

Да, забыл сказать. Ставлю USE_NAMES в conditional поле и компилятор ругается на свойство Name. Глюк адназначна!


 
ECM ©   (2005-03-19 23:13) [19]

Можно попробовать таки использовать ClassName...:)
Правда оно припрятано внутри KOL.pas и кажется не работает для
граф. контролов (только windowed=true).  

type
 PControlAccess = ^TControlAccess;
 TControlAccess = object(TControl)
 end;

var
 C: PControl;
 S: String;
...
 C:=Form.Children[I];
 S := PControlAccess(C).get_ClassName;


 
ECM ©   (2005-03-19 23:41) [20]

dimaxx ©   (19.03.05 23:09) [18]
Да, забыл сказать. Ставлю USE_NAMES в conditional поле и компилятор ругается на свойство Name


Project->Build и будет тебе счастье...:)

З.Ы. дело в том что при этом необходимо перекомпилить kol.pas,
а делфи не понимает, что это надо делать при изменении Conditional defines.


 
dimaxx ©   (2005-03-20 00:27) [21]

C тулбаром борюсь уже давно. Мне нужно, чтобы кнопки создавались размером 24х24. Ставлю в инспекторе TBButtonWidth (f также Min и Max) равным 24. Создаю кнопки, вешаю иконки (16х16) и кнопки все становятся 27х22! А менять программно можно только ширину! Да и нафиг этот геморр - у всех кнопок менять в runtime. У меня их штук 40. Кладову в темку отписал...



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

Форум: "KOL";
Текущий архив: 2005.11.13;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.036 c
14-1129720995
Digitman
2005-10-19 15:23
2005.11.13
doc/xls/rtf <-> xml/xsl


9-1119948586
Зм1й
2005-06-28 12:49
2005.11.13
Загрузка модели


3-1128366408
suharew
2005-10-03 23:06
2005.11.13
SQL Запрос


14-1129897610
X9
2005-10-21 16:26
2005.11.13
Глючит комп


2-1129411172
X-Fi
2005-10-16 01:19
2005.11.13
Как вывести текст на Canvas в столбик с выравниванием по ширине ?





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