Gerçekten karmaşık bir döngü, nasıl basitleştiririm??

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
naturelmania
Üye
Mesajlar: 66
Kayıt: 27 Nis 2006 09:29

Gerçekten karmaşık bir döngü, nasıl basitleştiririm??

Mesaj gönderen naturelmania »

Merhaba arkadaşlar. Bir konuda uzun zamandır uğraşıyorum ve bir döngünün içinden bir türlü çıkamadım. Forumda daha önce sormuş olduğum soru neticesinde bir döngü kurdum fakat zamanla bu döngüyü geliştirmeye ve eklemelerde bulunmaya çalıştım. Bu sefer döngüyü istediğim gibi değiştiremedim ve artık hem takibi zorlaştı (imkansızlaştı desek daha doğru olur) hem de program çalışmıyor :(
Döngüde yaptırmak istediğimi kodlarla özetleyeyim

Kod: Tümünü seç


if (Fotometre5.Form6.CheckBox1.Checked = True) and (fotosira=1) then //ilk önce sırayla yaptırmak istediğim için ilk kutu seçiliyse fotosira 1 oluyor ve bu döngüden başlıyor
    begin
    count:= count+1;
        if count = (StrToInt(Form6.Combobox21.Text)*x1[1])+1 then
        begin
           count:=0;
          if Form6.CheckBox2.Checked Then //Belli bir sıra belirlemek için bunları koydum. Her seferinde bir sonrakine gidiyor böylece
            begin
              fotosira:=2;
              exit;
            end;
          if Form6.CheckBox3.Checked Then
            begin
              fotosira:=3;
              exit;
            end;

         if (Fotometre5.Form6.U1.Checked = True) and (siradaki[1]=1) then
        begin
           //burada yaptırmak istediklerimi yapıyorum
           
          if Fotometre5.Form6.B1.Checked Then // çıkmadan önce döngüyü diğer aralığa yönlendiriyorum böylece bi sonraki döngüde bu begin end aralığını değil biraz daha aşağıdaki aralığı yapıyor.
          begin
          siradaki[1]:=2;
          exit;
          end;

        end;
İlk zamanlar yaptırmak istediğim 4 farklı görev için bir butona bağlı bir döngüydü. Bunu da timer yardımıyla sağladım, Mesela bu butona basınca A B C D arasında Teker teker önce A,sonra B, sonra C, sonra D, sonra tekrar A tekrar B diye giden bir döngüydü.
Şimdi döngü Çok farklılaştı, Bu A B C D işlerini 1, 2 ,3 ,4 için yaptırdığımızı düşünelim. Önce 1'in A'sı, 1'in B'si, 1'in C'si, 1'in D'si, sonra 2'nin A'sı, 2'nin B'si... diye devam ediyor. Ben bu döngüyü üşenmeden 20 sayı için yaptım :roll: kodlar 6000 satır tutuyor döngü yüzünden :cry:
En küçük bişey değiştirdiğimde kodlar allak bullak oluyor. Programın takibi zorlaştı. En kötüsü de Bazı yerlerde programı durdurmam veya A işi için bekletmem gerektiğinde döngü Timer içinde olduğu için döngü durmuyor da :D

Yukarıdaki kod programdaki kod olduğu için biraz karışık olmuş olabilir.
Basit hali şöyle

Kod: Tümünü seç

Timer Döngüsü
Begin
if A=selected and sira=1 then
 begin
  Yapılacaklar
 
       if B=selected
          begin
           sira:=2;
           exit;
          end;
       if C=selected
          begin
           sira:=3;
           exit;
           end;
       if D=selected
          begin
           sira:=4;
           exit;
          end;
 end;
 
ve sonraki döngü if B=Selected and sira=2 then
Arkadaşlar siz bu satırları okurken ben bu kodlar üzerinde halen uğraşmakta olacağım. Vereceğiniz en küçük ipucu veya kaynak gerçekten büyük bir içtenlikle ve mutlulukla karşılanacaktır. Şimdiden düşünüp kafa yoran arkadaşlardan Allah razı olsun. Herkese kolay gelsin...
var
sen : sevgili;
ben : aşık;
sevgi: aşk;
if ben aşık sana = True then
execute sevgi between(sen,ben);
:)))))
ikutluay
Üye
Mesajlar: 2341
Kayıt: 03 Tem 2007 10:13

Mesaj gönderen ikutluay »

içiçe döngüleri ve IN yapısını inceleyin derim. bahsettiğiniz yapı çok karışık.
Kişi odur ki, koyar dünyada bir eser. Eseri olmayanın yerinde yeller eser./Muhammed Hadimi
http://www.ibrahimkutluay.net
http://www.ibrahimkutluay.net/blog
Kullanıcı avatarı
Battosai
Üye
Mesajlar: 1316
Kayıt: 01 Eki 2007 12:02
Konum: Ankara

Mesaj gönderen Battosai »

Zaten bu kadar uzun bir komut bloğu çok sağlıklı olmaz...Kod yazmaya başlamadan önce özellikle karmaşık bloklar için iyi bir algoritma hazırla ucunu bi kaçırdın mı toparlayamazsın sonra
Kullanıcı avatarı
tanerileri
Üye
Mesajlar: 55
Kayıt: 06 Tem 2007 11:30

yanlış mesaj i silemedim. pardon.

Mesaj gönderen tanerileri »

_
_
_
En son tanerileri tarafından 05 Ara 2007 02:54 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Kullanıcı avatarı
tanerileri
Üye
Mesajlar: 55
Kayıt: 06 Tem 2007 11:30

birkaç öneri.

Mesaj gönderen tanerileri »

Açıkcası kodun ne işe yaradığını anlayamadığım için (programın bütününü bilmediğimden ötürü) anlayabildiğim kadarı için önerilerde bulunmak isterim.

1 - Marco Cantu muydu tam emin değilim , bir kitapda şöyle okumuştum , bir delphi procedure ü 10 satırı geçmemeli. ne kadar haklı bilmiyorum ama kesinlikle 6000 satırda olmamalı kanımca . Bu sebeple

Checboxlara ve ilgili diğer bileşenlere sıralı isimler verip , bileşenlere çalışma zamanı erişmeyi denemenizi öneririm. böylece ilgili mantığı çok daha az kodla bütün bileşenler için yazmış olabilirsin.

Biliyorum tam olarak anlatamadım , bir programımda şu şekilde kullanmıştım dilerim faydası olur , kod şu şekilde.

Kod: Tümünü seç

procedure TForm_isitici2.Sh_SFR10MouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var Klas: string;
  Sender1: TComponent;
begin
  Klas := (Sender as TComponent).Name;
  Sender1 := ClassBul(Sender);

  oncekishape.brush.color := clYellow;
  OncekiShape := Sender1 as Tshape;

  (Sender1 as Tshape).Brush.Color := ClBlack;
  Suz((Sender1 as TComponent).Name);

end;

function TForm_isitici2.ClassBul(Sender: TObject): Tcomponent;
var Klas: string;
begin
  if Sender is TLabel then // Label - Shape sini bul
  begin
    Klas := (Sender as TComponent).Name;
    Delete(klas, 1, 2);
    klas := 'Sh' + klas;
    Result := findComponent(Klas) as TComponent;
  end
  else // Zaten shape
    Result := Sender as TComponent;
end;
yani her bileşen için kod ile erişmedim , bileşenleri değişken gibi kullandım. tabi isimlerinide sıralı verdim.

kolay gelsin.
naturelmania
Üye
Mesajlar: 66
Kayıt: 27 Nis 2006 09:29

Mesaj gönderen naturelmania »

Arkadaşlar cevaplarınız için çok teşekkür ederim. Benim için şu ana kadar tam çözüm olmadı ama başka birşeyler düşünmemi sağladı. Eğer düzeltirsem burada kodu göstereceğim. Hepinizden Allah razı olsun :)
Hala üzerine uğraşıyorum, fikri olan arkadaşlar yine fikirlerini söyleyebilirler :)
var
sen : sevgili;
ben : aşık;
sevgi: aşk;
if ben aşık sana = True then
execute sevgi between(sen,ben);
:)))))
ikutluay
Üye
Mesajlar: 2341
Kayıt: 03 Tem 2007 10:13

Mesaj gönderen ikutluay »

delphiden önce pascalla uğraşmıştım acemilik yıllarımda. demirbaş programı yazdım. orda bir liste istediler. bende henüz acemiliğin başındayım. (13 yıl önceydi ama hala acemi sayıyrum kendimi)

liste şu a,b,c gibi harflere göre sıralı bir liste. bende şunu yaptım. bir procedure yazdım. dosyayı açıp a ile başlayan kayıtları listelettim.

sonra onu kopyalayıp b, c, ,d gibi sırayla devam ettim. en son bir procedure daha yazıp bunları sıra ile çağırdım. tabi listenin birde büyük versiyon yada küçük kağıt sürümü vardı. kod 6400 satırı geçmişti. tek unite sığmayınca (segment too large gibi bir hata vardı o zaman 64 kb sorunu. ah ah windows 32 bit ne rahatlık getirmiş be) bende kodu 2 unite bolup ancak oyle halletmiştim.

iş bitmişti ama kodu optimize etmek istedim. çünkü mantık bu iş daha kısa olur diyordu. o zaman imdiki gibi internet filan nerde kendin ara bul...

ilk adım büyük küçük versiyonlardı. bir boolean değişken ile condensed kodu gönderince, yaklaşık kodun yarısı gitmişti... ama sıralı liste hala çok uzundu.

bir dizi tanımlayıp harfleri buna atadım. sonra bir döngü içinde dosyayı açıp kapayarak dizinin elmanlarına göre sıra ile listelettim.

bir dğeişken daha tanımlayıp çıktıyı dosyaya atabilmeyide sağladım. hedefte dinamikti.

sonuç 6400 satırın yerine yaklaşık 25 satırlık bir kodum vardı ama hem aynı listeyi hemde daha geniş olarak alabilirken hem condensed hem normal hem yazıcı hem ekran hemde text dosyaya atabiliyordum.

sonuç olarak bu dizi ile döngü işi sizin konuyada uyarlanabilir gibi geliyor.
Kişi odur ki, koyar dünyada bir eser. Eseri olmayanın yerinde yeller eser./Muhammed Hadimi
http://www.ibrahimkutluay.net
http://www.ibrahimkutluay.net/blog
naturelmania
Üye
Mesajlar: 66
Kayıt: 27 Nis 2006 09:29

Mesaj gönderen naturelmania »

Arkadaşlar bu işi şöyle bir döngüye bağlıyorum inşallah :D

Daha önce söylediğim gibi 1,2,3,4... gibi işler için A,B,C,D işlerini standart olarak yapıyoruz yani hepsinde ABCD mutlaka var. Ben de bir A,B,C,D yi tek döngü altında topladım araya bekleme koydum. İlk verdiğim örnekteki gibi timer kullanmadan tek bir buton tıklamasıyla şu şekilde yürütülüyor.

Kod: Tümünü seç

Procedure TForm1.buttonclick(Sender: TObject);
begin
      if (A1.Checked) and (sira=1) then
         begin
              //Yapılacaklar ıvır zıvır :P
              bekle(1000); //forumdan bir bekleme fonksiyonu buldum bunu kullanıyorum.

       if (A1.CHecked)and(B1.Checked) then sira:=2;
       if (A1.CHecked)and(C1.Checked) then sira:=3;
       if (A1.CHecked)and(D1.Checked) then sira:=4;
       if (A1.Checked)and(B1.Checked)and(C1.Checked) then sira:=2;
       if (A1.Checked)and(B1.Checked)and(D1.Checked) then sira:=2;
       if (A1.Checked)and(C1.Checked)and(D1.Checked) then sira:=3;
       if (A1.Checked)and(B1.Checked)and(C1.Checked)and(D1.Checked) then sira:=2;
            end;

Bundan sonra if ile B için başlıyor.
Böylece 1 sefer döngüyü tamamlıyorum. Düşündüğüm şeyi ise henüz yapamadım ya da mümkün olup olmadığını bilmiyorum???
Arkadaşlar örneğin A için begin end aralığında aynı işi yaptırıyorum fakat içeriğinde basit değişiklikler oluyor. Benim istediğim Aynı şeyi A1 değil bu sefer A2 için yapmak. Yani bir nevi array belirlemek gibi oraya A[x] yazarsam olmuyor çünkü bunlar komponent. Komponentin ismini array olarak belirleyemiyor muyuz??? x'e değer vererek her seferinde 1 arttırırsam A1 için A2 için A3 için yapabilirim yani
Acaba böyle birşey mümkün mü komponentler için?
var
sen : sevgili;
ben : aşık;
sevgi: aşk;
if ben aşık sana = True then
execute sevgi between(sen,ben);
:)))))
ulu coder
Üye
Mesajlar: 838
Kayıt: 01 Nis 2006 06:46
Konum: Ankara

Mesaj gönderen ulu coder »

Kod: Tümünü seç

var
  tmpCheckBox: TCheckBox;
  i: Integer;
begin
  for i := 1 to 4 do
  begin
    tmpCheckBox := TCheckBox(FindComponent('A' + inttostr(i)));

    //tmpCheckBox A1 olur, kodlar işler; A2 olur, çalışır, A3 olur, A4 olur...
  end;//for

  tmpCheckBox := nil;
end;
Ama ne yapmaya çalıştığınızı tam anlayamadım. 1-2-3-4 nedir, A-B-C-D nedir? Bekleme koymanızın nedeni nedir...
naturelmania
Üye
Mesajlar: 66
Kayıt: 27 Nis 2006 09:29

Mesaj gönderen naturelmania »

@ulucoder arkadaşım Allah razı olsun tam da aradığım özellik bu fakat ben bunu başka bir procedure'un içine aldığımda çalışmadı? Yani FindComponent kısmı bu procedure'un içinde çalışmıyo, ama başka bi procedur un içine koyduğumda findcomponent çalışıyor. Acaba nereyi eksik biliyorum? Yaptığım şey şu idi. Her döngü için ayrı ayrı yazmayayım dedim ve tek bir procedure altında bütün sıralı kullanacağım komponentleri birleştireyim ve sonra sıradaki yazdığımda bu procedure işlesin ve bu componentleri 1 arttırsın dedim.

Kod: Tümünü seç

procedure döngü(sonraki:string);
var
dsırası:integer;
i:integer;
begin
   FiltreUbox:= TCheckBox(FindComponent('U' + inttostr(i)));

end;
Acaba nerede hata yapıyorum???
var
sen : sevgili;
ben : aşık;
sevgi: aşk;
if ben aşık sana = True then
execute sevgi between(sen,ben);
:)))))
Cevapla