Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Bileşen Özelliklerini Değiştirme
#1
Merhaba Arkadaşlar,

Bir projede BusinnesSkinForm Kullanıyorum. Kullananlar bilirler ki her BsskinForm elemanlarını forma koyunca özelliklerinden "SkinData" özelliğine "TbsSkinData" bileşenini göstermek gerekiyor. Yoksa tema çıkmıyor.

Ben bunu toplu olarak yapmak istiyorum. Aşağıdaki gibi bir kod yazdım ama başarılı olamadım. Kodu Create olayına bağladım. Nerede Hata Yaptığımıda anlamadım.

TbsSkinData bileşenim TemaData dır.

uses TypInfo;


procedure TAnaForm.SkinAtama;
var
  ElemanSayisi: Integer;
  ElemanObject: TObject;
  ElemanControl: TControl;
  Elemaninfo: PPropInfo;
begin
  for ElemanSayisi := 0 to ComponentCount - 1 do
  begin
    ElemanObject := AnaForm.Components[ElemanSayisi] as TObject;

    if ElemanObject is TControl then
    begin
      ElemanControl := (AnaForm.Components[ElemanSayisi] as TControl);
      Elemaninfo := GetPropInfo(ElemanControl.ClassInfo, 'SkinData');
      if Assigned(Elemaninfo) then
        SetStrProp(ElemanObject, 'SkinData', 'TemaData');
    end;
    ElemanControl.Refresh;
  end;

end;
Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.

Sadece Hobiciyim..
WWW
Cevapla
#2
BusinnesSkin kullanmıyorum. Dolayısıyla test etme şansım yok:
BusinnesSkin bileşenlerinin SkinData özelliği barındıran en üst sınıf ismini biliyorsanız işinizi daha kolay yapabilirsiniz. 
Mesela; bileşenleriniz TbsSkinObject adında bir sınıftan türemiş diyelim(Bu sınıfın SkinData özelliği olmalı). O zaman siz yukarıdaki döngü içinde şöyle birşey kullanabilirsiniz:
   if ElemanObject is TbsSkinObject then
     TbsSkinObject(ElemanObject).SkinData := TemaData;
There's no place like 127.0.0.1
WWW
Cevapla
#3
@SimaWB

hocam cevap icin teşekkürler. Henüz deneme ve bakma fırsatım olmadı. Eger böyle bir sınıfı bulamaz isem nasıl bir yol izlemem gerekiyor? Otomatik sınıfı buldurup yaptırmam mümkün mü ? İlk baktığımdan her eleman icin farklı sınıflar vardı. Mesela tbsedit, tbsbutton, tbsribbon vsvs.. bunları tek tek yazınca oluyor ama amelelik.. ortak bir sınıf icin gözden  geçireceğim.
WWW
Cevapla
#4
@SimaWB 

halletim Hocam. Bsskin classlarını incelerken TbsSkinControl clasından türetildiklerini gördüm. kodu aşağıdaki gibi düzenleyince istediğim oldu. elemanların "skindata" özelliklerini kodla aktarabiliyor. Yol gösterdiğiniz için teşekkürler.

implementation

uses TypInfo;

procedure TAnaForm.SkinAtama(SkinData:TbsSkinData);
var
 ElemanSayisi: Integer;
 ElemanObject: TObject;
 ElemanControl: TControl;
 Elemaninfo: PPropInfo;
begin
 for ElemanSayisi := 0 to ComponentCount - 1 do
 begin
   ElemanObject := AnaForm.Components[ElemanSayisi] as TObject;
   if ElemanObject is TControl then
    begin
     ElemanControl := (AnaForm.Components[ElemanSayisi] as TControl);
     Elemaninfo := GetPropInfo(ElemanControl.ClassInfo, 'SkinData');
     if Assigned(Elemaninfo) then
        TbsSkinControl(ElemanObject).SkinData := SkinData;
    end;
 end;
end;

{$R *.dfm}

procedure TAnaForm.FormCreate(Sender: TObject);
begin
 SkinAtama(TemaData);
end;
Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.

Sadece Hobiciyim..
WWW
Cevapla
#5
Ama benim dediğim gibi olmamış ki Big Grin
Benim tavsiyemde TypInfo'ya gerek yok.
Şu kadar basit:

procedure TAnaForm.SkinAtama(SkinData:TbsSkinData);
var
 I: Integer;
 Temp: TComponent;
begin
 for I := 0 to ComponentCount - 1 do
 begin
   Temp := Components[I];
   if Temp is TbsSkinControl then
     TbsSkinControl(Temp).SkinData := SkinData;
 end;
end;
There's no place like 127.0.0.1
WWW
Cevapla
#6
(25-10-2018, Saat: 13:49)SimaWB Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.Ama benim dediğim gibi olmamış ki Big Grin
Benim tavsiyemde TypInfo'ya gerek yok.
Şu kadar basit:

procedure TAnaForm.SkinAtama(SkinData:TbsSkinData);
var
 I: Integer;
 Temp: TComponent;
begin
 for I := 0 to ComponentCount - 1 do
 begin
   Temp := Components[I];
   if Temp is TbsSkinControl then
     TbsSkinControl(Temp).SkinData := SkinData;
 end;
end;

Haklısınız boşuna kodu uzatmışım. Tavsiyeniz için teşekkürler. Smile

Son Hali Aşağıdaki gibi. Kullanacağım elemanların bazılarının class ları farklı. gerekirse ekliyorum.

procedure TAnaForm.SkinAtama(SkinData:TbsSkinData);
var
I: Integer;
begin
for I := 0 to ComponentCount - 1 do
begin
  if Components[I] is TbsSkinControl then
    TbsSkinControl(Components[I]).SkinData := SkinData;

  if Components[I] is TbsSkinOpenDialog then
    TbsSkinOpenDialog(Components[I]).SkinData := SkinData;

  if Components[I] is TbsBusinessSkinForm then
    TbsBusinessSkinForm(Components[I]).SkinData := SkinData;

end;
end;
Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.

Sadece Hobiciyim..
WWW
Cevapla
#7
Başıma geldi söylemek istedim, Mümkün olduğunca kullanmamanı tavsiye ederim. Sebebi , delphi7 kullandığım dönemlerde bu bileşen setini bende kullanmıştım. Gün geldiki Xe sürümleri cidden daha çekici ve kullanışlı gelmeye başlayınca, geçişi yaptım. Senmisin geçiş yapan , o bileşen setini xe sürümüne kurmadan eski çalışmalarda düzeltmek tam bir eziyet.  Onlarca formu ve bileşeni temel bileşenleri ile yer değiştirmek programı sıfırdan yazmaktan daha zor geldi Smile)  Bu da aklınızın bir köşesinde olsun istedim. ( çorludan iyi geceler Smile
Cevapla
#8
(26-10-2018, Saat: 01:04)Ok Lord_Ares Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.Başıma geldi söylemek istedim, Mümkün olduğunca kullanmamanı tavsiye ederim. Sebebi , delphi7 kullandığım dönemlerde bu bileşen setini bende kullanmıştım. Gün geldiki Xe sürümleri cidden daha çekici ve kullanışlı gelmeye başlayınca, geçişi yaptım. Senmisin geçiş yapan , o bileşen setini xe sürümüne kurmadan eski çalışmalarda düzeltmek tam bir eziyet.  Onlarca formu ve bileşeni temel bileşenleri ile yer değiştirmek programı sıfırdan yazmaktan daha zor geldi Smile)  Bu da aklınızın bir köşesinde olsun istedim. ( çorludan iyi geceler Smile

Tavsiyeniz icin teşekkürler. Genelde kullandığım bir şey değil ama basit bir uygulama icin kullanacağım. Delphi 10.2 Tokyo kullanıyorum. Hatta acık kaynak bile paylaşabilirim. TEKİRDAĞ süleymanpaşa dan hayırlı Cuma’lar..
Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.

Sadece Hobiciyim..
WWW
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  cxscheduler bileşen kullanımı KUNTAY 2 161 04-10-2019, Saat: 08:36
Son Yorum: elixir84
  Çalışma Anında Çoklu Bileşen Türetme pro_imaj 10 535 19-09-2019, Saat: 16:16
Son Yorum: pro_imaj
  Kelime Değiştirme quiet1day 46 4.282 09-09-2019, Saat: 16:17
Son Yorum: DelphiCan
  Overbyte SSLSmtpCli Open SSL path değiştirme ahmet_sinav 5 765 12-10-2018, Saat: 10:23
Son Yorum: ahmet_sinav
  Dil Değiştirme gonulali 2 610 05-06-2018, Saat: 12:05
Son Yorum: gonulali



Konuyu Okuyanlar: 1 Ziyaretçi