Konuyu Paylaş : facebook gplus twitter

Konuyu Oyla:
  • Derecelendirme: 5/5 - 1 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Firemonkey (FMX) Nesne Boyutunu (Yükseklik, Genişlik) Yeniden Düzenlemek
#1
Merhaba;
Multi-Device Application (FMX) proje tipinde kullanılan UI (Kullanıcı arayüz nesneleri)
temelde bir varsayılan stile sahiptir. Yani her nesne platforma özgü doğal boyutunda (FixedSize) görünecek şekilde
ayrı ayrı tanımlanmıştır. 

FMX nesne stilleri, FMX.Controls.TStyledControl sınıfı içerisinde yer alırlar. FMX platformlarının varsayılan nesne boyutlarında bir değişiklik yapmak için sınıfın temel özelliklerinden AdjustFixedSize virtual metodunu ezmek gerekiyor. Bu metot içerisinde hedef platforma göre her nesnenin varsayılan boyutu TAdjustType enum tipi ile sabitlenmektedir. Bu tip None, FixedSize, FixedWidth, FixedHeight olmak üzere 4 farklı değere sahiptir.

Örneğin Android hedef platformu için TEdit nesnesinin  TAdjustType.FixedHeight değeri 32 olarak atanmıştır. Dolayısıyla Android hedef 
platformu için geliştirilen bir uygulamada kullandığınız TEdit nesnesi 32 piksel boyutunu aşmayacaktır. Buna bağlı olarak 
edit font boyutu (Font.Size) belirlenen Edit yüksekliğinden fazla olması durumunda, Edit nesnesinin metinsel değeri
tam olarak görüntülenmeyecek, yalnızca edit boyutunda görünecektir.

Bu makale kapsamında TEdit nesnesinin AdjustFixedSize prosedürünü ezerek, istenilen boyuta getirilebilen bir Edit nesnesi
oluşturacağız.


1- Yeni bir Multi-Device Application Delphi projesi başlatalım.
2- FMX.Edit referansında yer alan TEdit nesnesini aşağıdaki gibi yeniden tanımlayalım.

type
  TEdit = class(FMX.Edit.TEdit)
  protected
    procedure AdjustFixedSize(const Ref: TControl); override;
  end;

3- AdjustFixedSize procedure'üne imleci konumlayalım ve Ctrl+Shift+C tuş takımlarına basalım veya procedure üzerinde sağ tuş ile
"Complete Class at Cursor" menüsünü seçelim. Bu durumda procedure'ün implementation kod kısmı otomatik olarak oluşturulacaktır.
Yeni oluşan procedure yapısı aşağıdaki gibi olacaktır.

procedure TEdit.AdjustFixedSize(const Ref: TControl);
begin
  inherited;

end;

Yukarıda yer alan inherited direktifi ile temel sınıfın AdjustFixedSize işlemlerini devralmaktadır. Inherited direktifi temel sınıfta
platform kontrollerini gerçekleştirip işlem yapmaktadır. Burada amacımız platforma özgü direktifleri devre dışı barakmak ise inherited
kod satırını da silmemiz gerekiyor. Sakıncası ne olabilir derseniz, Edit nesnesi temel sınıfta öncelikle varsayılan boyuta getirilecek,
daha sonra bizim yöntemimiz devreye girecek ve varsayılan boyutları yok sayacaktır. 
Kısacası Edit nesnesinin boyutu 2 defa değiştirilecektir.

4- Bu durumun önüne geçmek ve boyutlandırma işleminin yalnızca bir defa çalışmasını sağlamak için inherited direktifini silelim.  

Oluşturulan metodun kod kısmında, platforma özgü kısıtlamayı devre dışı bırakmak için Edit'in TAdjustType enum tipine None değerini atayacağız. Bunun için SetAdjustType procedure'ünü kullanacağız.

5- TEdit nesnesinin varsayılan boyut tipini değiştirecek yeni metodu aşağıdaki gibi yeniden düzenleyelim.

procedure TEdit.AdjustFixedSize(const Ref: TControl);
begin
  SetAdjustType(TAdjustType.None);
end;

Artık boyutlandırılabilir yeni Edit nesnemizi test edecek bir örnek yapalım

Bunun için forma 2 adet TEdit nesnesi yerleştirelim ve Object Inspector penceresinden özelliklerini aşağıdaki gibi ayarlayalım.
Edit1
Size.Height=65
Text=Merhaba
TextSettings.Font.Size=50
TextSettings.Font.Style.fsBold=True
Width=250

Edit2
Text=Merhaba
TextSettings.Font.Size=50
TextSettings.Font.Style.fsBold=True
Width=250

Bu haliyle kod çalışacaktır. Hâlihazırda masaüstü uygulamalarında nesne boyutu ile ilgili bir kısıtlama olmadığı için (en azından şimdilik Big Grin )
Son bir işlem olarak; tanımladığımız tip ve procedure'ün yalnızca mobil platformlar için geçerli olmasını sağlayacak direktifleri yazalım.

Projenin tamamlanmış halini paylaşıyorum.

unit uBoyut;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes,
  System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
  FMX.Controls.Presentation, FMX.Edit;

{$IF DEFINED(iOS) or DEFINED(ANDROID)}
type
  TEdit = class(FMX.Edit.TEdit)
  protected
    procedure AdjustFixedSize(const Ref: TControl); override;
  end;
{$ENDIF}

type
  TForm2 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

{$R *.fmx}
{ TEdit }

{$IF DEFINED(iOS) or DEFINED(ANDROID)}
procedure TEdit.AdjustFixedSize(const Ref: TControl);
begin
  SetAdjustType(TAdjustType.None);
end;
{$ENDIF}

end.

10oh6k0.jpg

İyi Çalışmalar
Fesih ARSLAN
While true do; Hayat döngüsü, kısır değildir! Yapılan bir yanlış, o döngünün dışına çıkmanızı sağlayacaktır.
WWW
Cevapla

Konuyu Paylaş : facebook gplus twitter



Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  FireMonkey Resimlerde Pan ve Zoom İşlemleri Fesih ARSLAN 11 1.364 16-04-2018, Saat: 12:04
Son Yorum: pro_imaj
  Delphi Firemonkey Local İp Adresi Öğrenme esrehmaan 12 1.798 15-02-2018, Saat: 15:15
Son Yorum: elixir84
  Delphi Firemonkey Android İzin Kontrolü esrehmaan 2 856 23-12-2016, Saat: 22:22
Son Yorum: esrehmaan
  Firemonkey Label'a Arkaplan Rengi Vermek Fesih ARSLAN 1 1.630 15-08-2016, Saat: 23:50
Son Yorum: 10.Köy



Konuyu Okuyanlar: 1 Ziyaretçi