Konuyu Oyla:
  • Derecelendirme: 5/5 - 2 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Özel bir TVertScrollBox
#1
Merhaba ;
Mobil uygulamalarımda dinamik nesne oluşumlarında sürekli ihtiyaç duyduğum için ufak çaplı özel bir VertScrollBox yazdım.İki özelliği bulunmakta.

1-) Siz içerisine dinamik oluşturduğunuz nesleri ekledikçe flowpanel gibi ekleyerek gider. Farkı scroll otomatik çıkar. Margin değerleri verebilirsiniz. Kolon sayısını siz belirlersiniz.

2-) Responsive, Kolon değerini ve margin değerlerini vermezsiniz. İçerisine nesne ekledikçe nesnelerin boyunu otomatik ayarlar. Bunu yapmamın nedeni scrollsuz tam sığdırma yapar.

Not ; Gelliştirilebilir, çok vaktim olmadığı için üstüne koymuyorum. İlgilen arkadaşlar geliştirmeye devam edebilir. Bizde faydalanmış oluruz. 

Sample Proje Link

16DQ8b.png

grV37Q.png

unit NrVertScrollBox;

interface
 uses System.SysUtils, System.Types, System.UITypes, FMX.Controls, System.Classes, FMX.Layouts, Math;

 type
 TNrVertScrollBox = class(TVertScrollBox)
 private
   ObjectWidth  : Single;
   ObjectHeight : Single;
   FColumnCount: Integer;
   FRightMargin: Integer;
   FBottomMargin: Integer;
   FResponsive: Boolean;
   FSumWidth: Single;
   FSumHeight: Single;
   FItemCount: integer;
   procedure SetColumnCount(const Value: Integer);
   procedure SetRightMargin(const Value: Integer);
   procedure SetBottomMargin(const Value: Integer);
   procedure SetResponsive(const Value: Boolean);
   procedure ResWH;
   procedure SetSumHeight(const Value: Single);
   procedure SetSumWidth(const Value: Single);
   procedure SetItemCount(const Value: integer);
   { private declarations }
 protected
   { protected declarations }
 public
   constructor Create(AOwner: TComponent;AColumnCount,ARightMargin,ABottomMargin:Integer;AResponsive:Boolean);
   destructor  Destroy; override;
   procedure ItemsAdd(Control:TControl);
 published
   property ItemCount:integer read FItemCount write SetItemCount;
   property SumWidth:Single read FSumWidth write SetSumWidth;
   property SumHeight:Single read FSumHeight write SetSumHeight;
   property ColumnCount: Integer read FColumnCount write SetColumnCount;
   property RightMargin: Integer read FRightMargin write SetRightMargin;
   property BottomMargin: Integer read FBottomMargin write SetBottomMargin;
   property Responsive: Boolean read FResponsive write SetResponsive;
 end;

implementation

{ TNrVertScrollBox }

constructor TNrVertScrollBox.Create(AOwner: TComponent;AColumnCount,ARightMargin,ABottomMargin:Integer;AResponsive:Boolean);
begin
 inherited Create(AOwner);
 ColumnCount  := AColumnCount;
 RightMargin  := ARightMargin;
 BottomMargin := ABottomMargin;
 Responsive   := AResponsive;
 SumWidth     := 0; SumHeight    := 0; ItemCount    := 0; ObjectWidth  := 0; ObjectHeight := 0;
end;

destructor TNrVertScrollBox.Destroy;
begin
 //
 inherited;
end;

procedure TNrVertScrollBox.ResWH;
function X:Integer;
begin
  case ItemCount of
   0..1   : Result := 1;  2..4   : Result := 2;  5..12  : Result := 3;
   13..20 : Result := 4;  21..28 : Result := 5;  29..36 : Result := 6;
   37..44 : Result := 7;  45..52 : Result := 8;  53..60 : Result := 9;
   61..68 : Result := 10; 69..76 : Result := 11; 77..84 : Result := 12;
   85..94 : Result := 13; else     Result := 14;
  end;
end;
begin
ColumnCount  :=  X;
ObjectWidth  := (Width-1)  / ColumnCount;
ObjectHeight := (Height-1) / Ceil((ItemCount/ColumnCount));
end;

procedure TNrVertScrollBox.ItemsAdd(Control: TControl);
Var Ind : Integer;
begin
 if not Responsive then
 begin
   if ObjectWidth = 0 then
   begin
     ObjectWidth      := (Width-(Pred(ColumnCount)*RightMargin))/ColumnCount;
     ObjectHeight     := ObjectWidth;
   end;
   BeginUpdate;
   Control.BeginUpdate;
   Control.Width      := ObjectWidth;
   Control.Height     := ObjectHeight;
   Control.Parent     := Self;
   Control.Position.X := SumWidth;
   Control.Position.Y := SumHeight;
   if (Succ(ItemCount)) mod ColumnCount <> 0 then
     SumWidth  := SumWidth + ObjectWidth + RightMargin
   else
   begin
     SumWidth  := 0;
     SumHeight := SumHeight + ObjectHeight + BottomMargin;
   end;
   InsertComponent(Control);
   ItemCount := Succ(ItemCount);
   Control.EndUpdate;
   EndUpdate;
 end
 else
 begin
   ItemCount := Succ(ItemCount);
   ResWH;
   BeginUpdate;
   Control.Parent := Self;
   InsertComponent(Control);
   SumWidth  := 0; SumHeight := 0; ItemCount := 0;
   for Ind := 0 to Pred(ComponentCount) do
   begin
     if Components[Ind].ClassType = Control.ClassType then
     begin
       with TControl(Components[Ind]) do
       begin
         BeginUpdate;
         Width       := ObjectWidth;
         Height      := ObjectHeight;
         Position.X  := SumWidth;
         Position.Y  := SumHeight;
         if (Succ(ItemCount)) mod ColumnCount <> 0 then
           SumWidth  := SumWidth + ObjectWidth
         else
         begin
           SumWidth  := 0;
           SumHeight := SumHeight + ObjectHeight
         end;
         EndUpdate;
       end;
       ItemCount := Succ(ItemCount);
     end;
   end;
   EndUpdate;
 end;
end;

procedure TNrVertScrollBox.SetBottomMargin(const Value: Integer);
begin
 FBottomMargin := Value;
end;

procedure TNrVertScrollBox.SetColumnCount(const Value: Integer);
begin
 FColumnCount := Value;
end;

procedure TNrVertScrollBox.SetItemCount(const Value: integer);
begin
 FItemCount := Value;
end;

procedure TNrVertScrollBox.SetResponsive(const Value: Boolean);
begin
 FResponsive := Value;
end;

procedure TNrVertScrollBox.SetRightMargin(const Value: Integer);
begin
 FRightMargin := Value;
end;

procedure TNrVertScrollBox.SetSumHeight(const Value: Single);
begin
 FSumHeight := Value;
end;

procedure TNrVertScrollBox.SetSumWidth(const Value: Single);
begin
 FSumWidth := Value;
end;

end.
Yalnızım ama bir kente yürüyen ordu gibiyim, edebiyattan kaçınmalıyım..
Cevapla
#2
Teşekkürler elinize sağlık
Cevapla
#3
Teşekkürler.
Cevapla
#4
Elinize sağlık güzel olmuş. Fakat scroll çubuğu sağda en son eklenen nesnenin üzerine denk geliyor. Bunu şöyle düzelttim. Rightmargine +30 ekledim.
ObjectWidth      := (Width-(Pred(ColumnCount)*RightMargin+30))/ColumnCount;



nQNOyl.png
Cevapla
#5
Scroll Windows için böyle gözükebilir, mobil için derlediginizde tam çıkacaktır
Yalnızım ama bir kente yürüyen ordu gibiyim, edebiyattan kaçınmalıyım..
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 2.067 19-01-2023, Saat: 16:52
Son Yorum: SercanTEK
  TVertScrollBox cihankoca 3 1.181 13-04-2021, Saat: 17:50
Son Yorum: cihankoca
Star TFlowLayout ile TVertScrollbox Kullanımı Abdullah ILGAZ 3 3.088 15-02-2021, Saat: 19:21
Son Yorum: yanniosman
  TVertScrollBox Touch Scroll Durdurmak hayalyilmaz43 4 2.194 10-08-2020, Saat: 15:35
Son Yorum: hayalyilmaz43
  Özel bir StringGrid narkotik 0 1.372 08-09-2019, Saat: 01:30
Son Yorum: narkotik



Konuyu Okuyanlar: 1 Ziyaretçi