![]() |
|
Firemonkey (FMX) Nesne Boyutunu (Yükseklik, Genişlik) Yeniden Düzenlemek - Baskı Önizleme +- Delphi Can (https://www.delphican.com) +-- Forum: Delphi (https://www.delphican.com/forumdisplay.php?fid=3) +--- Forum: Eğitim (https://www.delphican.com/forumdisplay.php?fid=19) +---- Forum: Makale (https://www.delphican.com/forumdisplay.php?fid=20) +---- Konu Başlığı: Firemonkey (FMX) Nesne Boyutunu (Yükseklik, Genişlik) Yeniden Düzenlemek (/showthread.php?tid=23) |
Firemonkey (FMX) Nesne Boyutunu (Yükseklik, Genişlik) Yeniden Düzenlemek - Fesih ARSLAN - 24-07-2016 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 )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.
![]() İyi Çalışmalar Fesih ARSLAN |