Форум: "Компоненты";
Текущий архив: 2006.07.23;
Скачать: [xml.tar.bz2];
Вниз
Скролл у наследника TCustomControl Найти похожие ветки
← →
FrykT © (2005-12-17 04:35) [0]Здравствуйте!
Пытаюсь написать компонент, наслденика TCustomControl. Отрисовка ручная, на канве. Попытался приделать скролл.
1. делал наследника TWinControl, на наго помещал мой компонет (см. выше) и TScrollBar (Объявленный вне классов, просто выше)
2. в компоненте делал Align alRight у Скролла.
3. Пытался сделать стандартно как-то, но показалось глупо (не нашел признаков Скролла у предков, разве что сообщения скролла для TWinControl).
Собсно вопрос, как прицепить скролл, и правильно ли я делал вышеописанное.
← →
Наиль © (2005-12-20 18:08) [1]Для начала, я думаю, стоит посмотреть на реализацию TScrollingWinControl (предок для TCustomForm).
← →
FrykT © (2005-12-22 20:02) [2]Спасиб за ответ, я посмотрю
← →
FrykT © (2005-12-24 19:32) [3]Блин, не получается этот скролл приделать. Вот если сделать наследника TCustomControl, и послать сообщение для отображения скролла, то появляется, но изменять что-то не получилось (SetScrollinfo). Посмотрел этот TScrollingWinControl, скроллы не смог разрулить, не отображаются никак. Помогите.
← →
jack128 © (2005-12-25 12:43) [4]Ну примерно вот так у меня было. +/- незначительные глюки, но в целом идея должна быть понятна..
const
ScrollStep = 20;
ScrollSize = 4000;
procedure TTransportSchemeDesigner.SetScrollBars(
const Value: TScrollStyle);
begin
if FScrollBars = Value then Exit;
FScrollBars := Value;
RecreateWnd;
end;
procedure TTransportSchemeDesigner.UpdateScrollBars;
var ScrollInfo : TScrollInfo;
begin
if (ScrollBars = ssNone) or not HandleAllocated then Exit;
ScrollInfo.cbSize := SizeOf(TScrollInfo);
ScrollInfo.fMask := SIF_POS or SIF_RANGE or SIF_PAGE or SIF_DISABLENOSCROLL;
ScrollInfo.nMin := 0;
ScrollInfo.nMax := ScrollSize div ScrollStep;
if ScrollBars in [ssBoth, ssHorizontal] then
begin
ScrollInfo.nPage := ClientWidth div ScrollStep;
ScrollInfo.nPos := SchemeOrigin.X div ScrollStep;
SetScrollInfo(Handle, SB_HORZ, ScrollInfo, True {или False});
end;
if ScrollBars in [ssBoth, ssVertical] then
begin
ScrollInfo.nPage := ClientHeight div ScrollStep;
ScrollInfo.nPos := SchemeOrigin.Y div ScrollStep;
SetScrollInfo(Handle, SB_VERT, ScrollInfo, True {или False});
end;
end;
procedure TTransportSchemeDesigner.CreateWnd;
begin
inherited;
UpdateScrollBars
end;
procedure TTransportSchemeDesigner.WMHScroll(var Msg: TWMHScroll);
begin
case Msg.ScrollCode of
SB_LINELEFT: SchemeOrigin := Point(SchemeOrigin.X - ScrollStep, SchemeOrigin.Y);
SB_LINERIGHT: SchemeOrigin := Point(SchemeOrigin.X + ScrollStep, SchemeOrigin.Y);
SB_PAGELEFT: SchemeOrigin := Point(SchemeOrigin.X - ClientWidth, SchemeOrigin.Y);
SB_PAGERIGHT: Point(SchemeOrigin.X + ClientWidth, SchemeOrigin.Y);
SB_THUMBTRACK, SB_THUMBPOSITION:
SchemeOrigin := Point(Msg.Pos * ScrollStep, SchemeOrigin.Y);
SB_TOP: SchemeOrigin := Point(0, SchemeOrigin.Y);
SB_BOTTOM: SchemeOrigin := Point(ScrollSize, SchemeOrigin.Y);
end;
end;
procedure TTransportSchemeDesigner.WMVScroll(var Msg: TWMVScroll);
begin
case Msg.ScrollCode of
SB_LINEUP : SchemeOrigin := Point(SchemeOrigin.X, SchemeOrigin.Y - ScrollStep);
SB_LINEDOWN : SchemeOrigin := Point(SchemeOrigin.X, SchemeOrigin.Y + ScrollStep);
SB_PAGEUP : SchemeOrigin := Point(SchemeOrigin.X, SchemeOrigin.Y - ClientHeight);
SB_PAGEDOWN : SchemeOrigin := Point(SchemeOrigin.X, SchemeOrigin.Y + ClientHeight);
SB_THUMBPOSITION, SB_THUMBTRACK:
SchemeOrigin := Point(SchemeOrigin.X, Msg.Pos * ScrollStep);
SB_TOP : SchemeOrigin := Point(SchemeOrigin.X, 0);
SB_BOTTOM : SchemeOrigin := Point(SchemeOrigin.X, ScrollSize);
end;
end;
procedure TTransportSchemeDesigner.SetSchemeOrigin(Value: TPoint);
var
Delta: TPoint;
i: Integer;
begin
if Value.X < 0 then Value.X := 0;
if Value.Y < 0 then Value.Y := 0;
if CompareMem(@FSchemeOrigin, @Value, SizeOf(Value)) then Exit;
Delta.X := Value.X - FSchemeOrigin.X;
Delta.Y := Value.Y - FSchemeOrigin.Y;
FSchemeOrigin := Value;
for i := 0 to ControlCount - 1 do
with Controls[i] do
SetBounds(Left - Delta.X, Top - Delta.Y, Width, Height);
UpdateScrollBars;
end;
← →
FrykT © (2005-12-25 20:46) [5]jack128, а наследовал от КустомКонтрол?
← →
jack128 © (2005-12-25 21:28) [6]FrykT © (25.12.05 20:46) [5]
В данном конкретном случае - да, но мог бы и от TWinControl"a - это ничего бы не поменяло..
← →
FrykT © (2005-12-26 02:26) [7]Спасибо большое за пример, ошибку понял, я не указывал ScrollInfo.fMask. Теперь всё в порядке
← →
Rouse_ © (2005-12-30 14:20) [8]Мммм, здается мне что раздувание кода из за реализации только скрола не самая удачная идея. Гораздо проще создать сам скрол и назначить ему предка. Обрабатывать уже его методы. А то какойто очередной велосипед получается...
← →
FrykT © (2005-12-31 16:47) [9]2 Rouse_
Я уже всё перепробывал)) Создавал отдельно экземляр TScrollBar внутри класса, и делал ему Align := alRight. Область прорисовки назначал AdjustClientRect (или както так). При частой перерисовке, скролл мерцает очень сильно.
Страницы: 1 вся ветка
Форум: "Компоненты";
Текущий архив: 2006.07.23;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.013 c