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

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.027 c
2-1188430458
чувак
2007-08-30 03:34
2007.09.23
как показать baloon-tip ?!


15-1187724746
Rouse_
2007-08-21 23:32
2007.09.23
Возвращение к истокам


15-1187779055
AZIZE
2007-08-22 14:37
2007.09.23
Проблемка


1-1184240354
Layner
2007-07-12 15:39
2007.09.23
Как узнать свойства и методы объекта OLEVariant


2-1188277836
MultIfleX
2007-08-28 09:10
2007.09.23
Ini