mantikli bir döngü yapisi

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Kullanıcı avatarı
Murat DİCLE
Kıdemli Üye
Mesajlar: 702
Kayıt: 19 Nis 2006 04:12
Konum: İstanbul
İletişim:

Mesaj gönderen Murat DİCLE »

:eyo: :eyo: :eyo: :eyo: :eyo: :eyo: :eyo:

ne güzel, ne güzel yaşamak ne güzel..
ikra
Üye
Mesajlar: 901
Kayıt: 28 Nis 2005 01:26
Konum: Simdilik Topragin Üstü

Mesaj gönderen ikra »

hocam kod icin cok tesekkür ederim. mükemmel calisiyor.
ben cxTextEdit kullaniyorum.
TEdit ile denedim hepsini buluyor.
fakat TcxTextEdit dedigimde bulamiyor.

cxtextedit1.classname dedigimde TcxTextEdit gösteriyor. fakat koddaki A.ClassName ile bakarsam TcxCustomInnerTextEdit diye gösteriyor.
simdi ben TcxCustomInnerTextEdit(A).Name dedigimde isim bos görünüyor. TcxTextEdit(A).Name dedigimde keza yine ayni.

panel vs hepsinin isimlerini gösteriyor fakat edit lerin isimlerini göremiyorum. hatayi nerede yapiyorum acep?
kıdemsiz üye
Kullanıcı avatarı
Murat DİCLE
Kıdemli Üye
Mesajlar: 702
Kayıt: 19 Nis 2006 04:12
Konum: İstanbul
İletişim:

Mesaj gönderen Murat DİCLE »

Merhaba,

Öncelikle söylemeyi unuttum, verdiğim örnek ile dilerseniz Çok dilli uygulamalar yapmanız mümkün, Yani Label, Button Caption'larını değiştirebilirisniz. Ve çok kolayca dil desteği verebilirsiniz...

Şimdi benim kendi DİL komponentimde kullandığım fonksiyonun bir kısmını veriyorum. Ayrıca vaktim olunca bu komponentin tamamını sizlere vereceğim. Bunu ayrı bir konu olarak işleriz..

Bu aynı zamanda komponent türünü bilmeden o komponet içinde aradığınız özellik var mı yok diye bakar..

Not: Eğer çok dilli uygulamalar yapmak istiyorsanız mutlaka TntWare Delphi Unicode Controls yükleyin.

Kod: Tümünü seç

procedure TMusonyaCYL.DoAppllyLanguage;
      procedure AraBul(C : TComponent);
      var i  : integer;
          PI : PPropInfo ;
          S  : String;
      aFont  : TFont;
      begin
         for i := 0 to C.ComponentCount - 1 do
            begin
               if C.Components[i].ComponentCount > 0 then AraBul(C.Components[i]);
               try
                  if CDS.Locate('LangCode;ObjectName', VarArrayOf([UpperCase(LangPrefix), UpperCase(C.Components[i].Name)]), []) then
                     begin
                        S := WideStringToString(CDS['Text'], CDS['CodePage']);
                        if Pos('TTNT', UpperCase(C.Components[i].ClassType.ClassName)) = 1 then
                           begin
                              PI := GetPropInfo(C.Components[i].ClassInfo, 'Caption');
                              if Assigned(PI) then SetWideStrProp(C.Components[i], PI, CDS['Text']);
                              PI := GetPropInfo(C.Components[i].ClassInfo, 'BiDiMode');
                              if Assigned(PI) then SetOrdProp(C.Components[i], PI, CDS['BiDiMode']);
                              Continue;
                           end;
                        aFont := TFont(GetOrdProp(C.Components[i], 'Font'));
                        if assigned(aFont) then aFont.Charset := GetCharSet(CDS['CodePage']);
                        PI := GetPropInfo(C.Components[i].ClassInfo, 'Caption');
                        if Assigned(PI) then SetStrProp(C.Components[i], PI, S);
                        PI := GetPropInfo(C.Components[i].ClassInfo, 'BiDiMode');
                        if Assigned(PI) then SetOrdProp(C.Components[i], PI, CDS['BiDiMode']);
                        //if TControl(C.Components[i]).Visible then TControl(C.Components[i]).Repaint;
                     end;
               except
               end;
            end;
      end;
begin
   .
   .
   .
      if Assigned(Owner) And (Owner.HasParent) And (Owner.Owner is TForm) then
         AraBul(Owner.Owner)
      else
         if Assigned(Owner) And (Owner is TComponent) then
            AraBul(Owner);
   .
   .
   .
end;
PI : PPropInfo; ve PI := GetPropInfo(C.Components.ClassInfo, 'Caption'); kullanımına bakınız. Bileşen içinde CAPTION varmı onu sorguluyor. eğer varsa PI geriye dönüyor. Yoksa PI = nil olmaktadır.

Eğer CAPTION var ise

if Assigned(PI) then SetStrProp(C.Components, PI, S);

ile o bileşenin CAPTION'una istediğimiz değeri yazıyoruz. Ben CDS (clientDataSet)'den aldığım veriyi yazıyorum.


Kolay gelsin...
Kullanıcı avatarı
Murat DİCLE
Kıdemli Üye
Mesajlar: 702
Kayıt: 19 Nis 2006 04:12
Konum: İstanbul
İletişim:

Mesaj gönderen Murat DİCLE »

Ayrıca söylemek istedim, cx, dx yani DevExpres ile kendinizi köreltmeyin lütfen, sakın olaki DevExpress bileşenin görselliğine kapılmayın. Yazılımı çok ağırlaştırıyor, içeriden milyonlarca içerden döndürüyor. Bi debug falan yapsanız 5 saatte işin içinden çıkılmıyor.

Tabi cxGrid'i kullanmak bazen kaçınılmaz oluyor.
ikra
Üye
Mesajlar: 901
Kayıt: 28 Nis 2005 01:26
Konum: Simdilik Topragin Üstü

Mesaj gönderen ikra »

hocam kullanim kolayligi kadar görsellikte cok önemli oluyor. o bakimdan cx in görselligini kullaniyorum. yoksa raize ye falan mi dönsek.


bu arada hepsini buluyor hocam. bir önceki kod isimi fazlasiyla görüyor. tek eksigi buldugu bilesenin ismini alamiyor olmam. ben buldugum her cxtextedit in ismi ile islem yaptiriyorum.

TcxTextEdit(A).Text = 'aaaa' dedigimde degistiriyor fakat TcxTextEdit(A).Name dedigimde isim bos dönüyor.

iki gün bir kod da takilir mi insan :oops:
kıdemsiz üye
Hakan Can
Üye
Mesajlar: 634
Kayıt: 04 Mar 2005 04:27
Konum: Ankara

Mesaj gönderen Hakan Can »

Form'un componentcount'u form içindeki bütün componentleri içerir. Recursive procedure kullanmanın gereği ve anlamı yoktur.

Basit bir döngü ile bu istediğiniz gerçekleşir.

İyi çalışmalar.
ikra
Üye
Mesajlar: 901
Kayıt: 28 Nis 2005 01:26
Konum: Simdilik Topragin Üstü

Mesaj gönderen ikra »

yok hocam normal componentcount ile denedim panel icindekileri bulmuyor. yalnizca parent i direk form olanlari listeliyor.
Kullanıcı avatarı
Murat DİCLE
Kıdemli Üye
Mesajlar: 702
Kayıt: 19 Nis 2006 04:12
Konum: İstanbul
İletişim:

Mesaj gönderen Murat DİCLE »

Keşke hayat Hakan Can'ın dediği kadar kolay olsa ;) ama maalesef öyle olmuyor işte.

Bu arada NAME'e ulaşmak için son gönderdiğim kodlara bakarsan her bileşenin property'sine ulaşman mümkün oluyor. Açıkçası en doğrusu bu oluyor. son gönderdiğim kodlar ile ilk gönderdiğim kodlar aynı işlevi yapıyor ama ikincisinde bileşen tipine göre değil, bileşeni çinde aradığım propery varsa işlem yaptırtıyorum. Sen ilk önce NAME progperi bak istediğin bileşen o ise, onun property'lerini okutarak istediğin veriyi set eebilirsin.


Program işi öyledir, ne iki günü ne beş günü haftalarca minicik bir bug için uğraştığımı biliyorum.

Daha dün, yazdığım programda PostMessage daki parametleri test verdiğimden dolayı hata alıyordum, debug debug olmuyor. Sonunda buldum ama. Giden 5 saate oldu. Dikkatsizlik konusu çok önemli. İşten bir kere koptun mu bırakan klavyeyi bir 15 - 20 dk mola vercen. yoksa tıkandıkça tıkanıyor insan..


kolay gelsin..
aLonE CoDeR
Kıdemli Üye
Mesajlar: 1223
Kayıt: 26 Nis 2005 04:08

Mesaj gönderen aLonE CoDeR »

@Hakan Can'ın dediği gibi çalışır componentcount olayı.Parenti ne olursa olsun parent belirtilmediği sürece form üstündeki tüm bileşenleri baz alır :idea:
Hakan Can
Üye
Mesajlar: 634
Kayıt: 04 Mar 2005 04:27
Konum: Ankara

Mesaj gönderen Hakan Can »

Yeni bir proje açın.

Formun üstüne 3-5 component (TLabel, TPanel, TButton vs.) yerleştirin.
TPanel'lerden birinin içine 3-5 component yerleştirin.

Buttonlardan birinin onclick eventine:

ShowMessage(IntToStr(ComponentCount));

yazıp dediğinizin doğru olup olmadığını yani formun componentcount'unun içinde TPanel içindeki componentlerin dahil olup olmadığını basit bir şekilde teyit edin.

Bu dediklerimi ben yaptım. Gerçi önceden de defaaten yapmıştım.

Siz de bir yapın sonra devam edelim.

İyi çalışmalar.
Hakan Can
Üye
Mesajlar: 634
Kayıt: 04 Mar 2005 04:27
Konum: Ankara

Mesaj gönderen Hakan Can »

Aynı anda cevap yazmışız.

Zaten TPanel'in ComponentCount diye bir olayı yok. Yani 0 döndürüyor. ComponentCount TForm ve TDataModule vb.ler için var. Diğerleri (TPanel vs.) için ControlCount ve Controls özelliklerini kullanıyoruz.

İyi çalışmalar.
Kullanıcı avatarı
tuanna
Üye
Mesajlar: 582
Kayıt: 06 Ara 2004 05:01
Konum: Ankara
İletişim:

Mesaj gönderen tuanna »

sanırım compoennt countla yaptığın örneğin kodlarını yazman gerekecek...

bence compoennt count tamam bütün nesneleri kontrol edebilir...ama özelliklerini değiştiremiyoruz...sanırım( :D )
Siz hayal edin...Biz yapalım TuannaSoft...
Kullanıcı avatarı
Murat DİCLE
Kıdemli Üye
Mesajlar: 702
Kayıt: 19 Nis 2006 04:12
Konum: İstanbul
İletişim:

Mesaj gönderen Murat DİCLE »

Bak şimdi bizlerde ilk başlarda böyle düşünüyor ve böyle yapıyorduk, ne zaman ki modüler programlama geçtik ne zaman ki MDI formları kullanmaya başladık o zaman sorunlar da çıkmöaya başladı.

Mesela Bir BPL yüklüyorsun ve BPL ana forma yerleşiyor, görüntü olarak ana forma yerleşmiş olsada ana formun component listesinde olmuyor.

Şimdi burda aklaşu gelir, o zaman Application içindedir. Evet gerçektende ARABUL ile aramak için AraBul(Application) demek en doğrusu olacaktı.

Şimdi senin dediğin yöntem ile yap bakalım bir MDI form bakalım onlara erişebilecek misin.?

Ha dümdüz form yaparsın içine koyarsın bişiler o zaman hepsine erişirsin.

Burda önemli olan nokta şu, bir bileşen ister form ister button bunların OWNER'ı ana form değilse, dediğin yöntem ile erişmekte mümkün değil

Diyelim ki, 3 tane formun var. Hepsini autocreate olarak oluşturdun. Ve diyorsun ki, tüm formların içindeki EDIT'lerin içine HELLO yazalım.

Şimdi sen form1.componentcout de bakalım ne çıkacak karşına.

Olmadı mı? o zaman Application.ComponentCount de bakalım karşına ne çıkacak.

İkiside işini görmeyecektir. Ne yapacağız bu durumda, verdiğim örnektedi ARABUL işlevi gibi yapacağız. Daldırgacımızı çalıştıracaz.

Benim verdiğim örnekte ben daldırgacı başlatırken AraBul(Self) demişim ama doğrusu AraBul(Application) olacaktı. Bendekiler öyle.

Tabi bir başka yöntem ise, Screen.FormCount ve Screen.Forms ile yapmak olabilir. Ama yinede daldırgacı çalıştırmak gerekiyor.

eminim ki ilk etapta ikra akadaşımız normal şekilde Form1.ComponentCount ile aramıştır, ve bulamamış ki işini görememmiş ki, bunların Sub kontrollerine nasıl girecez demiş. Yani orada bişi öğrenmiş, ben uygulamamdaki herşeye bu şekilde erişemiyorum. Yoksa durduk yere karma karışık bir yönteme neden ihtiyaç olsun ki.

Kolay gelsin...
aLonE CoDeR
Kıdemli Üye
Mesajlar: 1223
Kayıt: 26 Nis 2005 04:08

Mesaj gönderen aLonE CoDeR »

MDI form olunca da değişmez.ComponentCount class belirtilmezse ait olduğu class içindeki nesne listesini baz alır.Zaten Delphi bu listeyi kullanarak dfm dosyalarını yönetir.Modüler programlama ve forma atılan BPL olayını anlamadım detayı nedir?Yani modüler programlamada componentcountun işlevi mi değişir ya da mdi form mu kullanılır net bişey çıkaramadım ben :roll:
Kullanıcı avatarı
Murat DİCLE
Kıdemli Üye
Mesajlar: 702
Kayıt: 19 Nis 2006 04:12
Konum: İstanbul
İletişim:

Mesaj gönderen Murat DİCLE »

Emin olmak için şimdi denedim, sonuç dediğim gibi çıktı, MDI formlara erişemiyorsun.

Yani Form1 ana form olsun, Form2 ve Form3 MDI olsun,

for i := 0 to Form1.ComponentCount - 1 do .. .. ..
şeklinde Form2 ve Form3'e erişilmiyor...

Ama Form2 ve Form3'u create ederken.

Application.CreateForm(TForm2, Form2); şeklinde değilde

Form2 := TForm2.Create(Form1) dersen erişmen mümkün olur..

Bu işte PARENT'lik önemli değil OWNER'lık önemli bişi.

Kod: Tümünü seç

With TForm2.create(Application) do
   begin
      Parent := Form1;
      Show;
   end;
yazarsak yine erişmek mümkün olmaz.

Kod: Tümünü seç

With TForm2.create(Form1) do Show;
yazarsak erişim mümkün olur..

Kod: Tümünü seç

With TForm2.create(Form1) do
   begin
      Parent := Form1;
      Show;
   end;
yazarsak hem erişim mümkün olur hemde Form2 eğer MDI değilse bile Form1'in içine gömeriz.. Dock olayı yani..
Cevapla