Firemonkey (FMX) Nesne Boyutunu (Yükseklik, Genişlik) Yeniden Düzenlemek

Yazdığınız makaleleri ve üyelerimizin işine yarayacağını düşündüğünüz kodlarınızı gönderebilirsiniz. Bu foruma soru sormayın!
Cevapla
Kullanıcı avatarı
fesiharslan
Üye
Mesajlar: 584
Kayıt: 20 Eki 2006 10:37
Konum: Erzurum
İletişim:

Firemonkey (FMX) Nesne Boyutunu (Yükseklik, Genişlik) Yeniden Düzenlemek

Mesaj gönderen fesiharslan » 08 Mar 2016 02:32

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.

Kod: Tümünü seç

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.

Kod: Tümünü seç

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.

Kod: Tümünü seç

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 :D )
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.

Kod: Tümünü seç

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.
Resim

İyi Çalışmalar
Fesih ARSLAN

gaus
Üye
Mesajlar: 227
Kayıt: 14 May 2014 06:36
İletişim:

Re: Firemonkey (FMX) Nesne Boyutunu (Yükseklik, Genişlik) Yeniden Düzenlemek

Mesaj gönderen gaus » 08 Mar 2016 03:08

Çok teşekkürler eline koluna sağlık
:bravo: :bravo: :bravo: :bravo:

Kullanıcı avatarı
fesiharslan
Üye
Mesajlar: 584
Kayıt: 20 Eki 2006 10:37
Konum: Erzurum
İletişim:

Re: Firemonkey (FMX) Nesne Boyutunu (Yükseklik, Genişlik) Yeniden Düzenlemek

Mesaj gönderen fesiharslan » 08 Mar 2016 03:20

Rica ederi. Faydalı olması dileğiyle...

Cevapla