Форум: "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