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

Вниз

Несколько вопросов по 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 вся ветка

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

Наверх




Память: 0.52 MB
Время: 0.061 c
11-1111250110
rofl
2005-03-19 19:35
2005.11.13
Adding OnClick-Event to PMenu


2-1130156929
Alex7
2005-10-24 16:28
2005.11.13
Изменение свойств фрейма


5-1110319178
Anwy
2005-03-09 00:59
2005.11.13
Компонент StringGrid


2-1130220428
картограф
2005-10-25 10:07
2005.11.13
положение в массиве


1-1130146907
MBoris
2005-10-24 13:41
2005.11.13
Как в одну ячейку StringGrid засунуть две строки?