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

Вниз

TrackBar   Найти похожие ветки 

 
TUser ©   (2004-03-05 09:25) [0]

Кто-нибудь может посоветовать компонент TTrackBar, но чтобы там можно было добавлять произвольное количество бегунков на одну дорожку. Конкретно меня интересует вариант с 2мя бегунками, но если будет больше - то хорошо.


 
Никто   (2004-03-05 09:44) [1]

Вопрос не совсем понятен, поэтому могу лишь предложить использовать два TrackBar"а - один под другим. Если необходимо, чтобы один бегунок входил в зону другого - обрабатывать OnChange. Но не думаю, что это то, что Вам это нужно.


 
TUser ©   (2004-03-05 10:00) [2]

Нет. Видели в Photoshop"е - там в Image->adj->Levels (Alt-L) и два и три бегунка есть на одной линии. Вот нужно что-то типа этого, а в остальном по оформлению сходной с TJvTrackBar.


 
Семен Сорокин ©   (2004-03-05 10:06) [3]

реализовывал когда-то вертикальный, посмотри, может пригодится:

unit ChrtBrdr;

interface

uses
 SysUtils, Classes, Controls, Graphics, Windows, Messages;

type
 TSplValues = 1..1000;

 TSplDown = (sdNone, sdTop, sdBottom);

 TChartBorder = class;

 TSplUpDownEvent = procedure (Sender: TChartBorder; AIsTop: boolean; AYShift: integer; AValue: TSplValues) of object;

 TChartBorder = class(TGraphicControl)
 private
   FTopBorder: integer;
   FBottomBorder: integer;
   FSplTop: TSplValues;
   FSplBottom: TSplValues;
   FTopRgn: HRGN;
   FBottomRgn: HRGN;
   FButtonColor: TColor;
   FSplDown: TSplDown;
   FOnSplUp: TSplUpDownEvent;
   FOnSplDown: TSplUpDownEvent;
   FOnSplMove: TSplUpDownEvent;
   procedure FreeRegions;
   procedure SetSplBottom(const Value: TSplValues);
   procedure SetSplTop(const Value: TSplValues);
   procedure SetButtonColor(const Value: TColor);
   procedure WMLButtonDown(var Message: TWMLButtonDown); message WM_LBUTTONDOWN;
   procedure WMLButtonUp(var Message: TWMLButtonUp); message WM_LBUTTONUP;
   procedure WMMouseMove(var Message: TWMMouseMove); message WM_MOUSEMOVE;
   function CalcPixelsBySpl(AValue: TSplValues): integer;
   procedure SetBottomBorder(const Value: integer);
   procedure SetTopBorder(const Value: integer);
   function GetSplHeight: integer;
 protected
   procedure DoSplMove; virtual;
   procedure DoSplDown; virtual;
   procedure DoSplUp; virtual;
   procedure Paint; override;
 public
   constructor Create(AOwner: TComponent); override;
   destructor Destroy; override;
   property SplHeight: integer read GetSplHeight;
   function SplTopInPixels: integer;
   function SplBottomInPixels: integer;
 published
   property SplTop: TSplValues read FSplTop write SetSplTop;
   property SplBottom: TSplValues read FSplBottom write SetSplBottom;
   property ButtonColor: TColor read FButtonColor write SetButtonColor;
   property TopBorder: integer read FTopBorder write SetTopBorder;
   property BottomBorder: integer read FBottomBorder write SetBottomBorder;
   property OnSplUp: TSplUpDownEvent read FOnSplUp write FOnSplUp;
   property OnSplDown: TSplUpDownEvent read FOnSplDown write FOnSplDown;
   property OnSplMove: TSplUpDownEvent read FOnSplMove write FOnSplMove;
   property ParentShowHint;
   property ShowHint;
   property Visible;
 end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents("Samples", [TChartBorder]);
end;

{Èíâåðòèðóåò öâåò}
function InvertColor(col: tColor): tColor;
begin
Result := RGB(255 - GetRValue(ColorToRGB(col)),
              255 - GetGValue(ColorToRGB(col)),
              255 - GetBValue(ColorToRGB(col)))
end;

{ --------------------------------- TChartBorder ----------------------------- }

function TChartBorder.CalcPixelsBySpl(AValue: TSplValues): integer;
begin
Result := FTopBorder+SplHeight-Round(SplHeight*AValue/1000);
end;

constructor TChartBorder.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
ControlStyle := [csClickEvents, csCaptureMouse];
Align := alLeft;
FSplTop := 1000;
FSplBottom := 1;
FButtonColor := clBlue;
FTopRgn := 0;
FBottomRgn := 0;
FTopBorder := 0;
FBottomBorder := 100;
FSplDown := sdNone
end;

destructor TChartBorder.Destroy;
begin
FreeRegions;
inherited Destroy
end;

procedure TChartBorder.DoSplDown;
begin
if Assigned(FOnSplDown) then
 if FSplDown = sdTop then
  FOnSplDown(self, true, SplTopInPixels, FSplTop)
 else
  FOnSplDown(self, false, SplBottomInPixels, FSplBottom)
end;

procedure TChartBorder.DoSplMove;
begin
if Assigned(FOnSplMove) then
 if FSplDown = sdTop then
  FOnSplMove(self, true, SplTopInPixels, FSplTop)
 else
  FOnSplMove(self, false, SplBottomInPixels, FSplBottom)
end;

procedure TChartBorder.DoSplUp;
begin
if Assigned(FOnSplUp) then
 if FSplDown = sdTop then
  FOnSplUp(self, true, SplTopInPixels, FSplTop)
 else
  FOnSplUp(self, false, SplBottomInPixels, FSplBottom)
end;



 
Семен Сорокин ©   (2004-03-05 10:06) [4]

procedure TChartBorder.FreeRegions;
begin
if FTopRgn <> 0 then
 DeleteObject(FTopRgn);
if FBottomRgn <> 0 then
 DeleteObject(FBottomRgn);
FTopRgn := 0;
FBottomRgn := 0
end;

function TChartBorder.GetSplHeight: integer;
begin
Result := FBottomBorder - FTopBorder
end;

procedure TChartBorder.Paint;

function DrawTriangle(AY: integer): HRGN;
var
  _p: array [0..2] of TPoint;
begin
 _p[0] := Point(Width-1, AY);
 _p[1] := Point(Width-6, AY+4);
 _p[2] := Point(Width-6, AY-4);
 Result := CreatePolygonRgn(_p, 3, ALTERNATE);
 Canvas.Polygon(_p)
end;

begin
FreeRegions;
with Canvas do begin
 Pen.Color := clBlack;
 Pen.Style := psSolid;
 Brush.Style := bsClear;
 MoveTo(Width-7, 0);
 LineTo(Width-1, 0);
 LineTo(Width-1, Height-1);
 LineTo(Width-7, Height-1);
 Canvas.Brush.Style := bsSolid;
 if FSplDown = sdTop then
  Canvas.Brush.Color := InvertColor(FButtonColor)
 else
  Canvas.Brush.Color := FButtonColor;
 FTopRgn := DrawTriangle(CalcPixelsBySpl(FSplTop));
 if FSplDown = sdBottom then
  Canvas.Brush.Color := InvertColor(FButtonColor)
 else
  Canvas.Brush.Color := FButtonColor;
 FBottomRgn := DrawTriangle(CalcPixelsBySpl(FSplBottom))
end
end;

procedure TChartBorder.SetBottomBorder(const Value: integer);
begin
if (FBottomBorder <> Value) and (Value > FTopBorder) and (Value <= Height) then begin
 FBottomBorder := Value;
 Invalidate
end
end;

procedure TChartBorder.SetButtonColor(const Value: TColor);
begin
if FButtonColor <> Value then begin
 FButtonColor := Value;
 Invalidate
end
end;

procedure TChartBorder.SetSplBottom(const Value: TSplValues);
begin
if (FSplBottom <> Value) and (FSplTop > Value) then begin
 FSplBottom := Value;
 Invalidate
end
end;

procedure TChartBorder.SetSplTop(const Value: TSplValues);
begin
if (FSplTop <> Value) and (FSplBottom < Value) then begin
 FSplTop := Value;
 Invalidate
end
end;

procedure TChartBorder.SetTopBorder(const Value: integer);
begin
if (FTopBorder <> Value) and (Value >= 0) and (Value < FBottomBorder) then begin
 FTopBorder := Value;
 Invalidate
end
end;

function TChartBorder.SplBottomInPixels: integer;
begin
Result := CalcPixelsBySpl(FSplBottom)
end;

function TChartBorder.SplTopInPixels: integer;
begin
Result := CalcPixelsBySpl(FSplTop)
end;

procedure TChartBorder.WMLButtonDown(var Message: TWMLButtonDown);
begin
inherited;
if PtInRegion(FTopRgn, Message.XPos, Message.YPos) then
 FSplDown := sdTop
else if PtInRegion(FBottomRgn, Message.XPos, Message.YPos) then
 FSplDown := sdBottom
else
 FSplDown := sdNone;
if FSplDown <> sdNone then begin
 DoSplDown;
 Invalidate
end
end;

procedure TChartBorder.WMLButtonUp(var Message: TWMLButtonUp);
begin
inherited;
if FSplDown <> sdNone then
 DoSplUp;
FSplDown := sdNone;
Invalidate
end;

procedure TChartBorder.WMMouseMove(var Message: TWMMouseMove);
var
 _spl: integer;
begin
inherited;
if FSplDown <> sdNone then begin
 _spl := 1000-Round(1000*(Message.YPos-FTopBorder)/SplHeight);
 if _spl < 1 then
  _spl := 1
 else if _spl > 1000 then
  _spl := 1000;
 if FSplDown = sdTop then
  SplTop := _spl
 else
  SplBottom := _spl;
 DoSplMove
end
end;

end.


 
TUser ©   (2004-03-05 12:18) [5]

Да. эТо примерно то, чтоя искал. Спасибо, дальше уже сам переделяю на нужный дизайн.



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

Текущий архив: 2004.03.28;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.023 c
1-1078647906
GrayFace
2004-03-07 11:25
2004.03.28
Объект (и компонент) в компоненте не редактирует Object Inspector


14-1077690128
Kerk
2004-02-25 09:22
2004.03.28
Злой автобус


1-1078656265
Constant
2004-03-07 13:44
2004.03.28
Запись в Excel


14-1077905750
Troy
2004-02-27 21:15
2004.03.28
простой строчный калькулятор без val()


1-1078414183
SkullNet
2004-03-04 18:29
2004.03.28
Перемещение текста по форме...