Panele göre Hizalama

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

Panele göre Hizalama

Mesaj gönderen Lord_Ares »

Merhaba, bir panelin üstüne image ile arka fon resmi ekliyorum. Panelin içine birde label bileşeni ekliyerek geçen süreyi gösteriyorum. Formun içindeki bu panel forma göre büyüp küçülebiliyor.(Anchors özelliği sayesinde)
Sorunum ise bu panelin içindeki Label panele göre eşlik etmiyor. Aşağıdaki resimde görüldüğü üzere formu daralttığım anda label küçülüp yok oluyor. Olması gereken, panel küçüldükçe Labelda küçülüp sola kaymalı.
Resim
aligel54
Üye
Mesajlar: 41
Kayıt: 20 Nis 2009 11:34

Re: Panele göre Hizalama

Mesaj gönderen aligel54 »

Label in Anchors özelliklerinden akRight ı True yap
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Panele göre Hizalama

Mesaj gönderen mrmarman »

aligel54 yazdı:Label in Anchors özelliklerinden akRight ı True yap
Küçülüyor dediğine göre bence zaten öyle yapılmış, akLeft olanı false etmek unutulmuş.
Resim
Resim ....Resim
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

Re: Panele göre Hizalama

Mesaj gönderen Lord_Ares »

Aslında anchors özelliklerini sırasıyla saatlerce denedim, sonuç olumsuz. Labelin sol kenarı sabit kalıp, sağ kenarından sola doğru küçülüyor. Yani hareket eden kısım her zaman formu daralttığınız nokta oluyor . Her iki köşeden küçülerek gitmiyor. Anchors özelliklerini sırayla denemediğimdeki görüntü aşağıdaki gibi ,anlaşılır olması açısından panel kullandım. Resim
Kullanıcı avatarı
xozcanx
Üye
Mesajlar: 362
Kayıt: 05 Oca 2012 12:55

Re: Panele göre Hizalama

Mesaj gönderen xozcanx »

Hocam Formun ClientHeigh ve ClientWith değerleri için min ve max değeri ataması yaptınız mı?
Eğer bu atamaları yaptıysanız çözüm biraz pratik olabilir.
Değer aralıklarına göre süreyi gösteren labeli konumlandırabilir.
Nasibinde varsa, alırsın karıncadan bile ders, Nasibinde yoksa, bütün cihan önüne serilse, sana ters..
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

Re: Panele göre Hizalama

Mesaj gönderen Lord_Ares »

Yok hayır yapmadım, o aklıma geldi ama bunun için kullanacağım panelin , ana panele soldan uzaklığını (marjin değerini) her seferinde bulup ana panelde % oranında ne kadar yer kapladığını hesaplatmam lazım ki ekran çözünürlüğü değiştiğinde bu oranlara göre konumlandırıp büyüteyim veya küçülteyim. Oda epey meşakatli bir iş gibi göründü gözüme :D Aslında şöyle bir açıklamada bulunayım ki belki özüm için farklı fikirler ve yardımlar gelebilsin.

Resimde görüldüğü üzere, müzik kutu programı yapmaya çalışıyorum.
1) Resimdeki mavi kutu şeklindeki alanda , kayan yazı ile şarkı adını ve süresini göstermeye çalışmak. Bunun için bir Ana panel ekledim ve image nesnesi ile hazırladığım jpeg dosyasını arka plan olarak verdim. Bu anapanelin içine Resimdeki mavi alana denk gelecek şekilde label veya panel kulanarak kayan yazıyı hizalamaya çalışıyorum.
Program tam ekranda çalışacak onun harici bir program olmayacak.

Çözüm olarak aklıma gelen iki şey var
1) Programı sabit bir çözünürlükte sunmak (örneğin 800*600 gibi veya daha yüksek Kötü yanı daha tam ekran çalışacağı için yüksek çözünürlükteki bilgisayarda kötü gözükecek olması )
2)Her çözünürlüğe göre dizayn yapıp bunu bir dosyada tutmak ve oradan okuyarak konumlandırıp büyütmek.

Aslında panel, label gibi bileşenlerin özelliklerinde marjin diye birşey var ama nedense bir ektinisini göremedim. Sanırım ben başaramadım.
Umarım çözüm bulurum :))
3ddark
Üye
Mesajlar: 89
Kayıt: 14 Eyl 2010 10:55
Konum: İstanbul

Re: Panele göre Hizalama

Mesaj gönderen 3ddark »

Sizin için bir örnek hazırladım umarım yardımcı olur. Aslında yapmak istediğiniz çok basit.
Delphi 7 de bunlar için resize kodu yazmanız gerekiyor. Tam işkence işlevsel kodlarla ayrı uğraşıyorsunuz form hizalama boyut değişimi ile ayrı uğraşıyorsunuz.

Padding Margin ve align özellikleri tamamen işini görüyor. Kolay gelsin. XE7 ile hazırladım bilginize.
Dosya ekleri
test resize.zip
(4.59 KiB) 104 kere indirildi
PostgreSQL - Delphi - Linux :!:
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

Re: Panele göre Hizalama

Mesaj gönderen Lord_Ares »

3ddark örnek için çok teşekkür ederim. Fakat sizin örneğinizde panel üstüne bir editi align client yapmışsınız. Bendeki sorun panelin sağında bulunan label nesnesinin paneldeki resme göre boyutlanması. Ekli dosyada xe6 ile hazırlanmış formun örneğini gönderiyorum. İnceleme şansınız olursa, formun sağ kenarından tutarak formu sağa doğru genişletin veya sola doğru küçültün. Bu işlemi yaptığınızda Label nesnesinin resimdeki mavi alanla bir değişmediğini göreceksiniz.
İlginiz için çok teşekkürler
deneme.rar
(235.12 KiB) 79 kere indirildi
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Panele göre Hizalama

Mesaj gönderen mrmarman »

Başka bir bakış açısı kazandırmak isterim.
(1) öncelikle nominal değerlerden bilmemiz gerekenleri sabit olarak kayıt altına alırsak, değişiklik anında nasıl davranacağımızı formülize edebiliriz.

(2) Animated GIF sunumunda IMAGE'in stretch özelliğinin TRUE durumuna göre Panel'in yeniden konumlandırılmasına yönelik edildiğini görüyorum.

(3) Formun boyutu değiştikçe, forma ALIGN edilmiş bir IMAGE nesnesinin içindeki konumlardan standart bir hareket beklemek doğru olmaz. Bunun için panelin boyunun hem genişlemesi/daralması hem de sağa sola kayması lazım gelir.

(4) ÖZETLE Anchor olarak formun sol tarafı bize yaramaz, değişken noktalı bir ANCHOR ve değişken büyüme eğilimi gerekiyor.

(5) Yaptığımız işlem basit, önce iki tane örnek rakamı elle okumamız lazım dedim. Image genişliği 500 iken paneli mouse ile büyütüp küçültüp uygun yere ve boyuta getirip değeri not ettim. Sonra da Image genişliğini tam 100 birim arttırıp 600 yapıp yeniden panelin yeni Image üzerindeki konumunu elle ayarlayıp yeni yerleri not ettim. Bu artık benim referans formül parametrelerim.

Kod: Tümünü seç

procedure PanelYeriKoru(Image:TImage; Panel:TPanel);
Const
 // Nominal Değerleri biliyor olalım.
 // Yeni Değerleri buna göre oranlayalım...
  PanelLeft  = 222;
  PanelWidth = 190;
  ImageWidth = 500;
Var
  Oran : Real;
begin
  Panel.Anchors := [];
  // Image Width 500 için Panel Left 222
  // Image Width 600 için Panel Left 266 oranını koruyacağız... Yani +100 için +44
  Oran := ( (Image.Width - ImageWidth) * 44 / 100 );
  Panel.Left  := Trunc( PanelLeft + Oran );

  // Image Width 500 için Panel Width 190
  // Image Width 600 için Panel Width 246 oranını koruyacağız... Yani +100 için +56
  Oran := ( (Image.Width - ImageWidth) * 56 / 100 );
  Panel.Width  := Trunc( PanelWidth + Oran );
end;
Kullanımı :

Kod: Tümünü seç

procedure TForm1.FormResize(Sender: TObject);
begin
  PanelYeriKoru( Image1, Panel1 );
end;
Sonuç bu projede...ektedir.

Resim
Dosya ekleri
Image_Strecth_Panel_Anchor.rar
Image Strecth durumuna göre Panel yer değiştirme örneği.
(189.53 KiB) 83 kere indirildi
Resim
Resim ....Resim
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

Re: Panele göre Hizalama

Mesaj gönderen Lord_Ares »

Mrman hocam, nefis bir yaklaşımla çözüme ulaşıp yeni birşey daha öğrettiğin için teşekkür ederim. Ellerine emeğine sağlık
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

Re: Panele göre Hizalama

Mesaj gönderen Lord_Ares »

Merhaba arkadaşlar, sayın Mrmarman hocam hizalama konusunda çok güzel bir fikir ve örnek verdi kendisine teşekkür ediyorum. Merak ettiğim prosedür de hizalamak için verdiğimiz bileşen isimleri kısmı. Bunu bir ve panelde kulanırken sorun yok, fakat bir label ve panelde kullanmak istediğimizde şu kısmı Image:TImage; her seferinde değiştirmem gerekiyor. Aynı prosüdürü farklı bileşenler için kullanmak istediğimde bu prosedürden bir kaç tane çoğaltıp kullanmam gerekiyor. Acaba bunu Kullanılacak_Bilesen:'Buraya hangi bileşini yazarsak o olsun';şeklinde kullanabilirmiyim nasıl yapmalıyım.
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: Panele göre Hizalama

Mesaj gönderen thelvaci »

TImage, TGraphicControl'den; TGraphicControl'de TControl'den türemiştir. Bahsettiğiniz procedure içinde gördüğüm kadarı ile TImage olarak geçirilen sınıfın sadece Width özelliğine müracaat edilmiş; dolayısı ile ilgili procedure'nin ilk parametresini TImage yerine TControl olarak değiştirirseniz; TControl sınıfından türemiş tüm nesneleri geçebilirsiniz procedure'nize.
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

Re: Panele göre Hizalama

Mesaj gönderen Lord_Ares »

Bilgi için teşekkürler. Dediğiniz yoldan çıkarak kullanacağım bileşenler neden türemişse ona bakarak deneyeceğim.. Bu arada tüm arkadaşların kandilini kutlarım hayırlı kandiller..
Cevapla