Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Компоненты";
Текущий архив: 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
3-1148030775
Некто
2006-05-19 13:26
2006.07.23
Составноей ЕК (первичный) и автоинкрементый СК (связи)


1-1150178314
kyn66
2006-06-13 09:58
2006.07.23
Определить кординату на панели.


15-1150967605
grisme
2006-06-22 13:13
2006.07.23
Ряд Макларена


1-1149771296
Urvin
2006-06-08 16:54
2006.07.23
принтер - точное позиционирование


15-1151054575
be_love
2006-06-23 13:22
2006.07.23
текст разделить на слова





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