Panel ve çözünürlük

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

Panel ve çözünürlük

Mesaj gönderen Lord_Ares »

Merhaba, bir konuda fikrinizi almak istiyorum.
Aşağıdaki resimde görüldüğü gibi Ana ve client isminde panel kullanarak oluşturduğum iki panom var.

AMAC : Dışarıdan girilen rakam hangisinde varsa o kutunun rengi değişsin.

Sorunlar:
1) Bu formu 1024 çözünürlükte tasarladım. Fakat uygulama televizyona bağlanmış bilgisayarlardada çalışacak. Televizyon çözünürlüklerini tahmin edemediğim için Formun ve formdaki panellerin ekran büyüklüğüne göre orantılı olarak büyümesi gerekiyor. Bu konuda scalebye olarak bir kaç konu okudum fakat neye göre nasıl kullanılacağını anlayamadım. Bu konuda ne yapabilirim.

2) Dışarıdan elle herhangi bir rakam girildiğinde aşağıdaki panellerin hangisinde varsa o panellerin rengini değiştirmek istiyorum. Buna ilk aklıma gelen bir prosedür ile bütün panellerin captionları gezip eşleşenlerin rengini değiştirmek. 135 adet panelim var bu şekilde yapmam doğru olurmu farklı bir fikriniz varmı?

Not: Ben panel kullanarak oluşturdum fakat aşağıdaki şekli sağlayacak ve yukarıda bahsettiğim sorunları aşmakta daha kolay olacak farklı fikirleriniz var ise o şekildede oluşturabilirim. Örnek: Panel değil de shape kullanarak oluştur gibi... Siz olsanız nasıl yapardınız ?

Benimle deneyim ve bilgilerinizi paylaşırsanız sevinirim.
Resim
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2356
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Re: Panel ve çözünürlük

Mesaj gönderen freeman35 »

button olabilir speedbutton olabilir, String grid olabilir. hangisi kolayına geliyorsa. Button,panel vs gibi her bir görsele bir component oluşturuyorsan, ve kullanıcı sadece sayı olark algılayacaksa, Xxx.Name:= 'x_' +Sayi.ToString; gibi bir formül le direk erişmek daha mantıklı. FindComponent da bulur ama koda bakarsanız, oda for-next döngüsü kullanır.
Scale işide yanılmıyorsam forumda görüşüldü. ekran size da değişiklik için anchor kullanmak gerek, ama scale işi için ya 3party bileşen yada kod yazmak gerek.
ZAGOR TENAY TÜRK'tür... TÜRK kalacak...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5

Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
ertank
Kıdemli Üye
Mesajlar: 1651
Kayıt: 12 Eyl 2015 12:45

Re: Panel ve çözünürlük

Mesaj gönderen ertank »

Lord_Ares yazdı: 22 Eyl 2017 04:26 Merhaba, bir konuda fikrinizi almak istiyorum.
Aşağıdaki resimde görüldüğü gibi Ana ve client isminde panel kullanarak oluşturduğum iki panom var.

AMAC : Dışarıdan girilen rakam hangisinde varsa o kutunun rengi değişsin.

Sorunlar:
1) Bu formu 1024 çözünürlükte tasarladım. Fakat uygulama televizyona bağlanmış bilgisayarlardada çalışacak. Televizyon çözünürlüklerini tahmin edemediğim için Formun ve formdaki panellerin ekran büyüklüğüne göre orantılı olarak büyümesi gerekiyor. Bu konuda scalebye olarak bir kaç konu okudum fakat neye göre nasıl kullanılacağını anlayamadım. Bu konuda ne yapabilirim.

2) Dışarıdan elle herhangi bir rakam girildiğinde aşağıdaki panellerin hangisinde varsa o panellerin rengini değiştirmek istiyorum. Buna ilk aklıma gelen bir prosedür ile bütün panellerin captionları gezip eşleşenlerin rengini değiştirmek. 135 adet panelim var bu şekilde yapmam doğru olurmu farklı bir fikriniz varmı?

Not: Ben panel kullanarak oluşturdum fakat aşağıdaki şekli sağlayacak ve yukarıda bahsettiğim sorunları aşmakta daha kolay olacak farklı fikirleriniz var ise o şekildede oluşturabilirim. Örnek: Panel değil de shape kullanarak oluştur gibi... Siz olsanız nasıl yapardınız ?

Benimle deneyim ve bilgilerinizi paylaşırsanız sevinirim.
Resim
Merhaba, kullandığınız Delphi sürümü nedir?
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

Re: Panel ve çözünürlük

Mesaj gönderen Lord_Ares »

Freeman35 , bilgi için çok teşekkür ediyorum. Evet dediğiniz gibi bir panel üstüne 9 adet panel oluşturup captionlarında sayı gösteriyorum. Üzerine oluşturduğum bu 9 adet panelin namelerini üzerinde yazan (Caption daki) rakam ile aynı verip findcomponent ile aratmayı düşündüm. Fakat aynı isme sahip birden fazla panel bu işimi bozdu.. Sanırım her ana panele belirteç bir isim verip denemeliyim ama ozamanda belirteç isimden rakamı ayırıp sayı doğru diye kontrol etmem gerekicek.

Ertank, Delphi Xe10 berlin versiyonunu kullanıyorum.
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2356
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Re: Panel ve çözünürlük

Mesaj gönderen freeman35 »

TList kullanabiilirsin, ozaman isim kontrolüne ihtiyacın kalmaz, direk TList in index i ile erişebilirsin, hatta diğer başka bilgilerde tutacaksan bunları bir class a çevirip, Index e ulaşarak herşeye ulaşmış olursun.
ZAGOR TENAY TÜRK'tür... TÜRK kalacak...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5

Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

Re: Panel ve çözünürlük

Mesaj gönderen Lord_Ares »

1215 adet panel kullanacağımı düşündükçe fikirleriniz dahada çok cazipleşiyor :)) Component haline çevirsem acaba değişen birşey olurmu diye düşünmeye başladım.
ertank
Kıdemli Üye
Mesajlar: 1651
Kayıt: 12 Eyl 2015 12:45

Re: Panel ve çözünürlük

Mesaj gönderen ertank »

Merhaba,

Son sürümlerden Delphi kullanmanıza istinaden TButtonGroup bileşenini kullanmanız mümkün olabilir. Bu bileşen her bir buton için obje oluşturmaz grafik çizer dolayısıyla sistem kaynaklarını çok tüketmez. Ancak renklendirme, kelime bölme vb. özellikleri yoktur. 1 numaralı sorunuza cevaben bu bileşeni kullanmanız mümkün olabilir.

Bununla birlikte kaç adet buton göstereceğini ve her bir buton başlığını belirtmeniz mümkün. Buton genişlik ve yüksekliğini de belirtebilirsiniz. Butonlar üzerinde glyph (küçük resim) göstermeniz de mümkün. Bunu yapmak için TButtonGroup.Image özelliğini kullanmanız gerekli.

Bileşen kendi sınırları içinde kalan alana butonları sığdırır ve gerekir ise ekranda kaydırmak için scrollbar çıkarır. Bu anlamda 2 numaralı sorunuza cevaben bileşenin bu özelliğini kullanmanız mümkün olabilir.

Her bir TButtonGroup.Item nesnesinin aşağıdaki kullanılabilir özellikleri mevcuttur.
TButtonGroup.Items[0].Action
TButtonGroup.Items[0].Caption
TButtonGroup.Items[0].Hint

Bunlardan Hint kısmını kendi iç eşleştirmelerinizde kullanmanız mümkün olabilir.

1 numaralı sorunuza istinaden eğer XE5 içinde var ise High DPI özelliklerini kullanmanız mümkün olabilir. ScaleBy, MulDiv, Screen.PixelsPerInch gibi fonksiyon ve değişkenler kullandığınız versiyonda mevcut ise bu fonksiyonlar üzerine biraz inceleme yapmanızı önerebilirim. Ancak bu fonksiyonlar DPI üzerine düzenleme yaparlar. Pixel sözünürlüğü ile ilgili değillerdir.
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

Re: Panel ve çözünürlük

Mesaj gönderen Lord_Ares »

Bilgi için teşekkürler incelediğimde dediğiniz gibi bir çok özelliği malesef ki yok. Cevabınızda gözüme takılan birşey de
" her bir buton için obje oluşturmaz grafik çizer dolayısıyla sistem kaynaklarını çok tüketmez. "
Acaba aynı sınıftan kendi bileşenimizi oluşturup eksik olan özellikleri eklesek olurmuydu.. Veya bu ihtiyacıma uygun bileşeni hangi sınıftan türetmeliyim. Panel kullanarak bu haliyle yaparsam 1215 adet panel kullanmış olacağım bunları hizalamak, her çözünürlüğüe göre büyütüp küçültmek gözümü epey korkuttu. Ne yapacağımı bilemiyorum öylece sıkıştım kaldım...
ertank
Kıdemli Üye
Mesajlar: 1651
Kayıt: 12 Eyl 2015 12:45

Re: Panel ve çözünürlük

Mesaj gönderen ertank »

Renk için Images özelliğini kullanabilirsiniz. Hint özelliğine de renk ile ilgili gerekli bilgiyi kaydedebilirsiniz.

Ya da TList içinde indeks bilgilerini eşleyerek gerekli olan diğer bilgileri tutabilirsiniz.

Amaca uygun kullanabileceğinizi düşünüyorum.
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

Re: Panel ve çözünürlük

Mesaj gönderen Lord_Ares »

Teşekkürler. Yönetimi çok sorunlu oldu o yüzden panel ile deniyorum. Umarım hayal kırklığı yaratmaz
onur2x
Üye
Mesajlar: 19
Kayıt: 29 Şub 2016 12:20

Re: Panel ve çözünürlük

Mesaj gönderen onur2x »

bence image koymalısın 2 tane biri normal biride değişecek renk 2 tane resim oluşturup imagelere atamalaısın image1 adını normalresim, image 2 adını degisenresim olarak değiştir. ve çizdiğin resimleri imagelere ata.




procedure Tanaform.BASLIKYAZ(UZERINDE, basili: boolean; resim: TImage; baslik: string);
var
RE: TRECT;
stl: TTextStyle;
begin
RE := resim.ClientRect;
if basili then
RE := Rect(RE.Left + 2, RE.Top + 2, RE.Right + 2, RE.Bottom + 2);
if UZERINDE then
RE := Rect(RE.Left + 1, RE.Top + 1, RE.Right + 1, RE.Bottom + 1);

resim.Canvas.Font.Quality := fqCleartype;
resim.Canvas.Font.Name := 'CALIBRI';
resim.Canvas.Font.Size := 9;
resim.Canvas.Font.Style := [fsBold];
resim.Canvas.Font.Color := clblack; // yazı rengi sen değişkenlede yapabilirsin
resim.Canvas.Brush.Style := bsClear;
stl.Alignment := taCenter;
stl.Wordbreak := True;
stl.Layout := tlCenter;
stl.SingleLine := False;
resim.Canvas.TextRect(RE, 0, 0, baslik, stl);
end;


procedure Tanaform.Imageresimkoy(resim:Timage;hangiresim:string);
begin
if hangiresim='normal' then
resim.picture:= normalresim.picture // assing de yapabilirsin // bitmap da atayabilirsin önemli olan mantığı anlaman
else if hangiresim='degisen' then
resim.picture:= degisenresim.picture;
baslikyaz(false,false,resim,resim.hint); //başka başlık yazdırsın diye başlığı burda hint olarak yazdırdık istersen baslıkyaz prosedurunden de yazdırrısın
end;



panelleri oluşturduğun prosedure sanırım create de oluşturuyorsun şunları yaz
var
i,leftt,topp:integer;
hst:Timage;

begin
leftt:=10;
topp:=10;

for i=1 to 1216 do //1215 tane panelim var demiştin
begin


case i of // yan yana 30 tane imageden sonra alt satıra geçsin sen sığdığı kadar yaparsın
1:leftt:=10;
31: begin topp:=topp+55; leftt:=10; end; // 55 i yüksekliği 50 verdiğim için yazdım sen yüksekliğe göre ayarlarsın
61:begin topp:=topp+55; leftt:=10; end;
91:begin topp:=topp+55; leftt:=10; end; // çoğaltmalısın bunu elindeki image kadar
else
leftt:=leftt+125; // uzunluğu da 120 verdiğim için 125 verdim 5 piksel ara olsun diye
end;

hst:=TImage.Create(self);
hst.Parent:=panelkenarli2;
hst.Name:='resim'+inttostr(i);
hst.hint:=inttostr(i); // burada image üzerinde görülecek olan sayı yı yazdırırsın
hst.Tag:=i; // bizim için krter olacaktır
hst.Width:=120; // boyutları salladım
hst.Height:=50; // yüksekliği salladım
hst.Left:=leftt;
hst.Top:=topp;
hst.Transparent:=True;
hst.Stretch:=true;
Imageresimkoy(hst,'normal');
end;
end;

/// tüm resimleri ve captionlarını oluşturduk şimdi hangi resmi aradığımızı bulalım bunu diğer programdan aldığın veriyi kontrol ettiğin yere yazmalısın
for i := 0 to anaform.ComponentCount - 1 do //anaformdaki component sayısı
begin
if (anaform.Components is Timage) and ( anaform.Components.name<>'normalresim') and ( anaform.Components.name<>'degisenresim')
then // eğer component Timage ise ve önceden resim yükledğimiz imageler değilse
begin
if gelen string yada integer = anaform.Components.tag yada hint then
begin
Imageresimkoy(Timage(anaform.Components),'degisen'); // gerekli imageye resim ata
end;
end;
end;


deneyip çalıştırma fırsatım olmadı hata olan yer olursa müsait bir zamanda düzenlerim . Ama en azından sana bir fikir vermiştir. kolay gelsin birde i harfim zor basıyor kodlarda eksik çıkabilir i harfine dikkat edersin :)
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

Re: Panel ve çözünürlük

Mesaj gönderen Lord_Ares »

Çok teşekküreler emeğine sağlık :)
Cevapla