Konuyu Oyla:
  • Derecelendirme: 5/5 - 1 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Özel bir Tabcontrol
#1
Bu aralar geceleri kişisel mobil bir proje ile uğraşıyorum. Masaüstünde kendi çapımda bir altyapım var. Mobildede ufak tefek birşeyler yapmaya başladım. Birilerinin işini görür diyerekte forumda paylaşıyorum. Konumuz kendi ihtiyacım doğrultusunda hazırladığım dinamik bir tabcontrol.

grWj7Q.gif

Sample Link

procedure TFrmMain.ItemClick(Sender:TObject);
begin
 Button1.Text := TNrTabButton(Sender).Caption;
end;

procedure TFrmMain.Button1Click(Sender: TObject);
Var xTab : TNrTab;
begin
 xTab        := TNrTab.Create(Self);
 xTab.Parent := Self;
 xTab.Align  := TAlignLayout.Top;
 xTab.Height := 60;

 xTab.AddItem('SOHBETLER',ItemClick);
 xTab.AddItem('DURUM',ItemClick);
 xTab.AddItem('ARAMALAR',ItemClick);
 xTab.AddItem('İLETİŞİM',ItemClick);
end;

unit NrTab;
{-------------------------------
 2019 Salih BAĞCI NrTab.pas
--------------------------------}
interface
uses
 FMX.Ani, FMX.Types, System.Types, System.Classes, System.Rtti, FMX.Utils, FMX.Layouts, FMX.Objects, System.UITypes
 , FMX.Graphics, FMX.StdCtrls, FMX.Dialogs , SysUtils;

type
 TItemClick = procedure(Sender:TObject) of object; // Tab Click'te kullanılır

type
TPointAnimation = class(TCustomPropertyAnimation)
private
 FStartFloat: TPointF;
 FStartFromCurrent: Boolean;
 FStopFloat: TPointF;
protected
 procedure FirstFrame; override;
 procedure ProcessAnimation; override;
public
 constructor Create(AOwner: TComponent); override;
published
 property AnimationType default TAnimationType.In;
 property AutoReverse default False;
 property Delay;
 property Duration nodefault;
 property Enabled default False;
 property Interpolation default TInterpolationType.Linear;
 property Inverse default False;
 property Loop default False;
 property OnFinish;
 property OnProcess;
 property PropertyName;
 property StartFromCurrent: Boolean read FStartFromCurrent write FStartFromCurrent default False;
 property StartValue: TPointF read FStartFloat write FStartFloat stored True;
 property StopValue: TPointF read FStopFloat write FStopFloat stored True;
 property Trigger;
 property TriggerInverse;
end;

type
TNrTab = class(TRectangle)
strict private
 FBackGroundColor         : TAlphaColor;
 FSelectedBackGroundColor : TAlphaColor;
 FItemColor               : TAlphaColor;
 FItemNormalTextColor     : TAlphaColor;
 FItemSelectedTextColor   : TAlphaColor;
 FLineColor               : TAlphaColor;
 FItemWidth               : Single;
 FItemCount               : Integer;
 procedure setBackGroundColor(const Value: TAlphaColor);
 procedure setSelectedBackGroundColor(const Value: TAlphaColor);
 procedure setItemColor(const Value: TAlphaColor);
 procedure setItemNormalTextColor (const Value: TAlphaColor);
 procedure setItemSelectedTextColor(const Value: TAlphaColor);
 procedure setLineColor(const Value: TAlphaColor);
 procedure setItemWidth(const Value: Single);
private
 HorzScroll               : THorzScrollBox;
 PointAnimation           : TPointAnimation;
 RecLine                  : TRectangle;
protected
 //
public
 constructor Create(AOwner: TComponent);override;
 destructor  Destroy; override;
 procedure   AddItem(const ACaption:String;AButtonClick:TItemClick);
 procedure   ItemPred;
published
 property BackGroundColor: TAlphaColor read FBackGroundColor write setBackGroundColor;
 property SelectedBackGroundColor: TAlphaColor read FSelectedBackGroundColor write setSelectedBackGroundColor;
 property ItemColor: TAlphaColor read FItemColor write setItemColor;
 property ItemNormalTextColor: TAlphaColor read FItemNormalTextColor write setItemNormalTextColor;
 property ItemSelectedTextColor: TAlphaColor read FItemSelectedTextColor write setItemSelectedTextColor;
 property LineColor: TAlphaColor read FLineColor write setLineColor;
 property ItemWidth: Single read FItemWidth write setItemWidth;
 property ItemCount:integer read FItemCount default 0;
end;

type
TNrTabButton = class(TRectangle)
strict private
 FCaption: String;
 procedure setCaption(const Value: String);
protected
 //
public
 constructor Create(AOwner: TComponent);override;
 destructor  Destroy; override;
 procedure   Click; override;
published
 property Caption: String read FCaption write setCaption;
end;

implementation

{ TPointAnimation }

constructor TPointAnimation.Create(AOwner: TComponent);
begin
 inherited;
 Duration    := 0.2;
 FStartFloat := PointF(0, 0);
 FStopFloat  := PointF(0, 0);
end;

procedure TPointAnimation.FirstFrame;
var
 T : TRttiType;
 P : TRttiProperty;
begin
 if StartFromCurrent then
 begin
   T := SharedContext.GetType(FInstance.ClassInfo);
   if T <> nil then
   begin
     P := T.GetProperty(FPath);
     if (P <> nil) and (P.PropertyType.TypeKind = tkRecord) then
       StartValue := P.GetValue(FInstance).AsType<TPointF>;
   end;
 end;
end;

procedure TPointAnimation.ProcessAnimation;
var
 newPoint : TPointF;
 T        : TRttiType;
 P        : TRttiProperty;
begin
 if FInstance <> nil then
 begin
   T := SharedContext.GetType(FInstance.ClassInfo);
   if T <> nil then
   begin
     P := T.GetProperty(FPath);
     if(P <> nil) and (P.PropertyType.TypeKind = tkRecord)then
     begin
       newPoint := PointF(InterpolateSingle(FStartFloat.X, FStopFloat.X, NormalizedTime),InterpolateSingle(FStartFloat.Y, FStopFloat.Y, NormalizedTime));
       P.SetValue(FInstance, TValue.From<TPointF>(newPoint));
     end;
   end;
 end;
end;

{ TNrTabItem }

procedure TNrTab.AddItem(const ACaption: String;AButtonClick:TItemClick);
Var xButton : TNrTabButton;
   xText   : TText;
begin
 Self.BeginUpdate;
 HorzScroll.BeginUpdate;
 FItemCount                     := Succ(FItemCount);
 xButton                        := TNrTabButton.Create(Self);
 xText                          := TText.Create(Self);
 with xButton do
 begin
   BeginUpdate;
   Parent                       := HorzScroll;
   Caption                      := ACaption;
   HitTest                      := True;
   Align                        := TAlignLayout.Left;
   Width                        := ItemWidth;
   Fill.Color                   := ItemColor;
   Stroke.Kind                  := TBrushKind.None;
   OnClick                      := AButtonClick;
   EndUpdate;
 end;
 with xText do
 begin
   BeginUpdate;
   Parent                       := xButton;
   HitTest                      := False;
   Align                        := TAlignLayout.Client;
   TextSettings.FontColor       := FItemNormalTextColor;
   Font.Size                    := FItemWidth / 7;
   Font.Style                   := [TFontStyle.fsBold];
   Text                         := ACaption;
   EndUpdate;
 end;
 HorzScroll.EndUpdate;
 Self.EndUpdate;
 If FItemCount = 1 then xButton.Click;
end;

constructor TNrTab.Create(AOwner: TComponent);
begin
 inherited;
 setBackGroundColor(TAlphaColor($FF00695B));
 setSelectedBackGroundColor(TAlphaColor($FF00695B));
 setItemColor(TAlphaColor($FF00695B));
 setItemNormalTextColor(TAlphaColor($FFB0B0B0));
 setLineColor(TAlphaColorRec.White);
 setItemSelectedTextColor(TAlphaColorRec.White);
 setItemWidth(100);
 Stroke.Kind               := TBrushKind.None;
 //HorzScroll Ekle
 HorzScroll                := THorzScrollBox.Create(Self);
 HorzScroll.Parent         := Self;
 HorzScroll.Align          := TAlignLayout.Client;
 HorzScroll.ShowScrollBars := False;
 //PointAnimation Ekle
 PointAnimation            := TPointAnimation.Create(AOwner);
 with PointAnimation do
 begin
   PropertyName            := 'ViewportPosition';
   StartFromCurrent        := True;
   Duration                := 0.3;
   HorzScroll.AddObject(PointAnimation);
 end;
end;

destructor TNrTab.Destroy;
begin
 PointAnimation.Enabled := False;
 PointAnimation.Free;
 if RecLine <> nil then
   RecLine.Free;
 HorzScroll.Free;
 inherited;
end;

procedure TNrTab.ItemPred;
begin
 FItemCount := Pred(ItemCount);
end;

procedure TNrTab.setBackGroundColor(const Value: TAlphaColor);
begin
 Fill.Color       := Value;
 FBackGroundColor := Value;
end;

procedure TNrTab.setItemColor(const Value: TAlphaColor);
begin
 FItemColor := Value;
end;

procedure TNrTab.setItemNormalTextColor(const Value: TAlphaColor);
begin
 FItemNormalTextColor := Value;
end;

procedure TNrTab.setItemSelectedTextColor(const Value: TAlphaColor);
begin
 FItemSelectedTextColor := Value;
end;

procedure TNrTab.setItemWidth(const Value: Single);
begin
 FItemWidth := Value;
end;

procedure TNrTab.setLineColor(const Value: TAlphaColor);
begin
  FLineColor := Value;
end;

procedure TNrTab.setSelectedBackGroundColor(const Value: TAlphaColor);
begin
 FSelectedBackGroundColor := Value;
end;

{ TNrTabItemText }

procedure TNrTabButton.Click;
Var xOwner       : TNrTab;
   xOwnerButton : TNrTabButton;
   Ind,Ind2     : Integer;
begin
 xOwner := TNrTab(Owner);
 for Ind := 0 to Pred(xOwner.ComponentCount) do
 begin
   if (xOwner.Components[Ind] <> Self) and (xOwner.Components[Ind] is TNrTabButton) then
   begin
     xOwnerButton := TNrTabButton(xOwner.Components[Ind]);
     xOwnerButton.BeginUpdate;
     for Ind2 := 0 to Pred(xOwnerButton.ControlsCount) do
     begin
       if xOwnerButton.Controls[Ind2] is TText then
       begin
         TText(xOwnerButton.Controls[Ind2]).BeginUpdate;
         TText(xOwnerButton.Controls[Ind2]).TextSettings.FontColor := xOwner.ItemNormalTextColor;
         TText(xOwnerButton.Controls[Ind2]).EndUpdate;
       end;
     end;
     xOwnerButton.Fill.Color := xOwner.ItemColor;
     xOwnerButton.EndUpdate;
   end;
 end;
 Self.BeginUpdate;
 Self.Fill.Color := xOwner.SelectedBackGroundColor;
 for Ind2 := 0 to Pred(Self.ControlsCount) do
 begin
   if Self.Controls[Ind2] is TText then
   begin
     TText(Self.Controls[Ind2]).BeginUpdate;
     TText(Self.Controls[Ind2]).TextSettings.FontColor := xOwner.ItemSelectedTextColor;
     TText(Self.Controls[Ind2]).EndUpdate;
   end;
 end;
 Self.EndUpdate;
 if xOwner.RecLine = nil then
 begin
   xOwner.RecLine := TRectangle.Create(xOwner);
   with xOwner.RecLine do
   begin
     Parent      := xOwner.HorzScroll;
     Align       := TAlignLayout.None;
     Height      := 3;
     Width       := xOwner.ItemWidth;
     Position.Y  := xOwner.Height - Height;
     Fill.Color  := xOwner.LineColor;
     Stroke.Kind := TBrushKind.None;
     HitTest     := False;
   end;
 end;
 if GetParentComponent.ClassType = THorzScrollBox then
 begin
   xOwner.RecLine.BringToFront;
   xOwner.RecLine.AnimateFloat('Position.X',Position.X, 0.3, TAnimationType.InOut, TInterpolationType.Cubic);
   xOwner.RecLine.AnimateFloat('Width',Width, 0.3, TAnimationType.InOut, TInterpolationType.Cubic);
 end;
 xOwner.PointAnimation.StartValue := xOwner.RecLine.Position.Point;
 xOwner.PointAnimation.StopValue  := Self.Position.Point + TPointF.Create(-100, 0);
 xOwner.PointAnimation.Start;
 inherited;
end;

constructor TNrTabButton.Create(AOwner: TComponent);
begin
 inherited;
end;

destructor TNrTabButton.Destroy;
begin
 TNrTab(Owner).ItemPred;
 inherited;
end;

procedure TNrTabButton.setCaption(const Value: String);
begin
 FCaption := Value;
end;

end.
Yalnızım ama bir kente yürüyen ordu gibiyim, edebiyattan kaçınmalıyım..
Cevapla
#2
Teşekkürler @narkotik
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Firmaya özel geliştirilen yazılımın dağıtılması. tuna 11 3.398 19-01-2023, Saat: 16:52
Son Yorum: SercanTEK
  TabControl Tab visible ayarı ? sokratayb 5 1.958 25-08-2021, Saat: 11:31
Son Yorum: sokratayb
  TabControl delete adres hatası Kerembacioglu 5 4.197 09-03-2020, Saat: 23:27
Son Yorum: kodamelesi
  TabControl - Geçiş efektinde kasma sorunu ? Mr.Developer 3 3.838 23-10-2019, Saat: 16:01
Son Yorum: nakisen
  Özel bir StringGrid narkotik 0 1.831 08-09-2019, Saat: 01:30
Son Yorum: narkotik



Konuyu Okuyanlar: 1 Ziyaretçi