Форум: "Компоненты";
Текущий архив: 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.061 c