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

Вниз

TrackBar с присоединенным полем Edit   Найти похожие ветки 

 
Slava80   (2006-09-14 17:42) [0]

Задача: напиcать единый компонент состоящий из TrackBar и Edit. При перемещении ползунка в Edit отображается свойство TrackBar.Position. При вводе числа в Edit и нажатии Enter или уходе из Edit - попытка задать TrackBar.Position из текста, иначе (невозможность преобразовать текст в число) - восстановление старого значения.

Что уже есть: глядя как устроена TLabeledEdit написал компоненту основанную на TTrackBar содержащую Label и Edit по краям. Теперь осталось научить ее выполнять действия описанные в задаче. У меня не получается. Помогите пожалуйста, кто знает.

Привожу интерфейс класса:

 TMyTrackBar = class(TTrackBar)
 private
   FEditLabel: TBoundLabel;
   FLabelPosition: TLabelPosition;
   FLabelSpacing: Integer;
   FEditEdit: TEdit;
   FEditPosition: TLabelPosition;
   procedure SetLabelPosition(const Value: TLabelPosition);
   procedure SetLabelSpacing(const Value: Integer);
   procedure SetEditPosition(const Value: TLabelPosition);
   { Private declarations }
 protected
  procedure SetParent(AParent: TWinControl); override;
  procedure Notification(AComponent: TComponent; Operation: TOperation); override;
  procedure SetName(const Value: TComponentName); override;
   { Protected declarations }
 public
   { Public declarations }
   constructor Create(AOwner: TComponent); override;
   procedure SetupInternalLabel;
   procedure SetupInternalEdit;
   procedure SetBounds(ALeft: Integer; ATop: Integer; AWidth: Integer; AHeight: Integer); override;
 published
   { Published declarations }
   property EditLabel: TBoundLabel read FEditLabel;
   property EditEdit: TEdit read FEditEdit;
   property LabelPosition: TLabelPosition read FLabelPosition write SetLabelPosition;
   property LabelSpacing: Integer read FLabelSpacing write SetLabelSpacing;
   property EditPosition: TLabelPosition read FEditPosition write SetEditPosition;
 end;


 
DimaBr   (2006-09-15 08:44) [1]

Проще унаследоваться от TNumericEdit  и создавать рядом TrackBar.
А в вашем случае

private
 procedure DoEditKeyPress(Sender: TObject; var Key: Char);

constructor TMyTrackBar.Create();
begin
  fEditEdit := TEdit.Create(self);
  fEditEdit.OnKeyPress := DoEditKeyPress;
 .......
end;

procedure TMyTrackBar.DoEditKeyPress(Sender: TObject; var Key: Char);
var X,Code: integer;
begin
 Val(fEditEdit.Text,X,Code);
 if Code = 0
   then Position := X
   else Key := #0;
end;


 
DimaBr   (2006-09-15 08:45) [2]

Ой, зарапортовался, TNumericEdit = TMaskEdit


 
Slava80   (2006-10-17 23:33) [3]

Спасибо. Все-таки создал компонент на основе TTrackBar и обвешал его дополнительными компонентами. Среди них ввел еще два Label"а для циферок со значениями Min и Max, которые бы отображались под шкалой слева и справа соответственно. Но проблема в том, что эти два Label"а могуть скрыться полностью или частично под самим TrackBar"ом, когда пытаешься подвинуть их поближе к рискам. Если риски снизу, то еще можно указать высоту TrackBar"а такой, что цифры прилегают вплотную, но если риски сверху, то там еще добавляется отступ который не дает подойти вплотную к шкале. Решил попробовать нарисовать эти цифры прямо на компоненте, но уперся в отсутствие свойтсва Canvas у TTrackBar. Пробовал варианты с созданием TControlCanvas, но не могу найти метод у TTrackBar, который нужно перекрыть, чтобы вызвать inherited-отрисовку и потом дорисовать своё. Может быть это делается проще? Подскажите пожалуйста и если можно попобробнее.


 
DimaBr   (2006-10-20 10:47) [4]

Посмотрите как устроен TCustomControl и сделайте тоже у себя и будет у вас канва.


 
Slava80   (2006-10-20 21:02) [5]

Ага, я уже даже нашел хороший пример:
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1095

Реализовал и пришел к выводу: "нафига козе баян" :) Дело в том, что теперь появилась другая проблема: нельзя рисовать за пределами канвы. А у меня как раз получается что циферки должны немного наползать на область TrackBar"а. А канва как понял задается так (в конструкторе Create):
 FCanvas := TControlCanvas.Create;
 TControlCanvas(FCanvas).Control := Self;
где Self - собственно мой компонент.

Может быть можно "расширить канву"? Или тогда нарушится отрисовка TrackBar"а? Или я задаю глупые вопросы? :)

Кстати, если кто захочет использовать пример приведенный выше (про кнопку), то обратите внимание: в процедуре PaintWindow, первой строчкой должна быть "inherited;" - если вы хотите, чтобы компонент, который вы мучаете, отрисовался так, как ему положено выглядеть. И только потом приступайте к своей дорисовке.



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

Форум: "Компоненты";
Текущий архив: 2007.09.23;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.067 c
15-1187947154
sample01
2007-08-24 13:19
2007.09.23
Explorer


2-1188302008
Евгений Р.
2007-08-28 15:53
2007.09.23
KeyDown у tPanel


4-1174663451
Углук
2007-03-23 18:24
2007.09.23
Как не давать запуститься некоторой программе?


4-1173803554
DevilDevil
2007-03-13 19:32
2007.09.23
Состояние скроллирования. Помогите пожалуйста.


6-1170097905
nes_
2007-01-29 22:11
2007.09.23
idhttp.post + мульпартформдата





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