İç içe döngüden sırasıyla çıkma

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
Dostk
Üye
Mesajlar: 144
Kayıt: 22 Ağu 2015 12:21

İç içe döngüden sırasıyla çıkma

Mesaj gönderen Dostk »

İyi günler,

media play (mp3) yapıyorum, fakat takıldığım nokta, bir döngü işlemini tamamlayınca o döngüden çıkıp bir sonrakinin devreye girmesini istiyorum fakat bunu başaramadım tecrübeli arkadaşların yardım ederse sevinirim...


Açıklama:
Listview de 100'lerce mp3 var sırasıyla şarkılar çalınacak, çalan parçadan sonra arada bir veya birden fazla mp3 klasörde yok ise olmayan mp3'ü atlayıp bir sonrakine geçiş yapılacak, bu konuyu nasıl çözebilirim?


Kod: Tümünü seç

function TForm1.Hesapla(Const StrAra: String): Integer; //
var
  X, Y, Z: Integer;
  Calan, Say, Atla: Integer;
begin
  try
    Calan := 0;
    Say := 0;
    Atla := 0;
    with MPListView do
    begin
      for X := 0 to Items.Count - 1 do
      begin
        if Pos(StrAra, Items.Item[X].SubItems[4]) > 0 then // Çalıyor
        begin
          Calan := Items[X].Index + 1;
          Exit(X);
        end;

        for Y := Calan to Items.Count - 1 do
        begin
          if Not FileExists(Items[Y].SubItems[5]) then // mp3 yoksa saymaya başla
          begin
            Atla := Items[Y].Index + 1;
          end
          else
          begin
            Exit(Y);
          end;
        end;

        for Z := Atla to Items.Count - 1 do
        begin

        end;
      end;
    end;
  finally
  end;
end;
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2357
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Re: İç içe döngüden sırasıyla çıkma

Mesaj gönderen freeman35 »

iç içe neyi döndürüyorsun ? "Açıklama:" diye yazdığın bölümde ne yapman gerekeni yazmışsın zaten.
Bunu herzaman söylüyorum, soru soruyorken cevabı yazıyorsunuz. Kendini bilgisayar yerine koy, be hiç bir şey bilmediğini, tek yeteneğin, sana söyleneni sadece söyleneni ve tek tek yapıp durduğunu düşün.
al şu 100 satır listeyi. -> tamam.....
İlk sıradan başla -> tamam
ilk sıradaki dosyaya bak var mı? -> tamam
varsa, git çal -> tamam.... yok ?????
yoksa bir sonraki satıra geç -> tamam
..............
bilgisayarın tek bildiği şey toplamadır, dört işlem dahi bilmeyen bir makinadır. Bunu unutmayın. Program dediğiniz şeyse yukarıda yazdığım gibi zkasız bi alete yapacaklarını sırasıyla söylemektir. "varsa, git çal -> tamam.... yok ?????" yoksa kafasına göre gidemez orda kalır, söylenmesi gerekir. her bir komut tek tek çalıştırılır ve durur, sonraki varsa sonraki işlenir.
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 !!!
Kullanıcı avatarı
Dostk
Üye
Mesajlar: 144
Kayıt: 22 Ağu 2015 12:21

Re: İç içe döngüden sırasıyla çıkma

Mesaj gönderen Dostk »

Varsa çalıyor yoksa sıkıntıda zaten burada başlıyor olmayan mp3 den bir sonraki kayıta atlatamadım...
Kullanıcı avatarı
Dostk
Üye
Mesajlar: 144
Kayıt: 22 Ağu 2015 12:21

Re: İç içe döngüden sırasıyla çıkma

Mesaj gönderen Dostk »

Bu arada bir şarkı yoksa sorunsuz atlama yapıyorum bir den fazla olunca atlama yaptıramıyorum...

Kod: Tümünü seç

 if Not FileExists(Items[I + 1].SubItems[5]) then 
  begin
 iki şarkı atla
  end
 else
begin
 bunu çal
 end;
 
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2357
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Re: İç içe döngüden sırasıyla çıkma

Mesaj gönderen freeman35 »

Kod: Tümünü seç

for I := 1 to Items.Count - 1 do   begin
 if FileExists(Items[I].SubItems[5]) then ?? neden önce olumsuz koşul? dosya varsa işlem yapacak.
  begin
 çaldırma işlemi // bu işlem sırasında beklemesi gerek yoksa dögü devam eder
  end
 else begin// bir şey yapmasına gerek var mı? dosya yok zaten döngü değeri artıp sonraki dosyaya geçecek
 end;
end;//for 
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 !!!
Kullanıcı avatarı
Dostk
Üye
Mesajlar: 144
Kayıt: 22 Ağu 2015 12:21

Re: İç içe döngüden sırasıyla çıkma

Mesaj gönderen Dostk »

end else begin konusunda haklısınız, bu dediğiniz şekilde onlarca kez denemiştim, fakat hesata olmayan durum ise arka arakaya 3 veya 5 kayıt yoksa bu kayıtları nasıl atlatacağım?
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: İç içe döngüden sırasıyla çıkma

Mesaj gönderen thelvaci »

Döngüden çıkmak için Break komutunu denediniz mi ?
Kullanıcı avatarı
Dostk
Üye
Mesajlar: 144
Kayıt: 22 Ağu 2015 12:21

Re: İç içe döngüden sırasıyla çıkma

Mesaj gönderen Dostk »

Break, exit ve exit(i) gibi komutunu denedim...

Yapmam gereken 1. for döngüsü çalan parçayı bulacak bulduktan sonra döngüden çıkacak ve 2. döngü çalan şarkıdan sonra olmayan mp3 leri atlayıp var olan mp3 listeye alacak, buradaki sıkıntı ise olmayan mp3 sayısı 1 den fazla olduğunda sorun yaşıyorum...

Kod: Tümünü seç

function TForm1.Hesapla(Const StrAra: String): Integer; //
var
  X, Y, Z: Integer;
  Calan, Say, Atla: Integer;
begin
  try
    Calan := 0;
    Say := 0;
    Atla := 0;
    with MPListView do
    begin
      for X := 0 to Items.Count - 1 do
      begin
        if Pos(StrAra, Items.Item[X].SubItems[4]) > 0 then // Çalıyor
        begin
          Calan := Items[X].Index + 1;
          Exit(X);
        end;

        for Y := Calan to Items.Count - 1 do
        begin
          if Not FileExists(Items[Y].SubItems[5]) then // mp3 yoksa saymaya başla
          begin
            Atla := Items[Y].Index + 1;
          end
          else
          begin
            Exit(Y);
          end;
        end;

        for Z := Atla to Items.Count - 1 do
        begin

        end;
      end;
    end;
  finally
  end;
end;
Kullanıcı avatarı
ovural
Üye
Mesajlar: 167
Kayıt: 22 Eki 2003 10:20
İletişim:

Re: İç içe döngüden sırasıyla çıkma

Mesaj gönderen ovural »

freeman35 inde dediği gibi aslında senin şu anki kurduğun döngü yapısı hatalı ..

2 alternatif var ikiside işini görür

Kod: Tümünü seç

for x:=0 to Items.Count - 1 do
begin
	if FileExists(Items[Y].SubItems[5]) Then
	begin // burada dosya varsa zaten işlem olacak dosya yoksa döngü bir sonraki bir sonraki bir sonraki diye var olan dosyayı bulana kadar 
	// döngüye devam edecek .. 
	end;
end;
yada diğer yiğin yoğurt yeme kodu

Kod: Tümünü seç

for x:=0 to Items.Count - 1 do
begin
	if Not FileExists(Items[Y].SubItems[5]) Then // başına Not ekleyerek
		Continue;		// burada da dosya yoksa aşağı devam etmeyip döngünün başına odaklanacak .. 
		
		
	// .. Senin Kodların
end;

tabi burada yiğitlerin yoğurt yeme kodları artırılabilir .. while do , repeat until gibi döngülerde kullanılabilir :)
Kim ilim öğrenir sonra da onu gizlerse âhirette onun ağzına ateşten bir gem vurulur. (Hadis-i Şerif)
Kullanıcı avatarı
Dostk
Üye
Mesajlar: 144
Kayıt: 22 Ağu 2015 12:21

Re: İç içe döngüden sırasıyla çıkma

Mesaj gönderen Dostk »

Tecrübelerini paylaşan herkese çok teşekkür ederim, amacım kimsenin tecrübesini yargılamak değil bunu başta belirteyim yanlış anlaşılıp da polemiğe girmek istemiyorum...

Ben onlarca test yaptım olmadı, mp3 yapan arkadaşlar sanırım klasik bir mp3 yaptıklarından benim ne denek istediğim ya anlamadı yada ben anlatamadım.

Bir şarkı çalıyor ise o çalan şarkıdan sonraki şarkıyı normal şartlarda (Items[X + 1].SubItems) ile bilgileri alırız ama sıradaki şarkı klasörde yoksa end else begin den sonra (Items[X + 2].SubItems[1];) diyerek de alırız fakat arka, arkaya 5 şarkı yoksa (X + ????? ) nasıl değerini artırabiliriz?????

Saygılarımla...

Kod: Tümünü seç

    with MPListView do
    begin
      for X := 0 to Items.Count - 1 do
      begin
        if Pos(StrAra, Items.Item[X].SubItems[4]) > 0 then // Çalıyor
        begin
          if FileExists(Items[X + 1].SubItems[5]) then // mp3 varsa çal
          begin
          ADRES := Items[X + 1].SubItems[1];     mp3 bilgilerini alıyoruz..................
          end
          else
          begin
        ADRES := Items[X + 2].SubItems[1];     mp3 yok..................
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2357
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Re: İç içe döngüden sırasıyla çıkma

Mesaj gönderen freeman35 »

sen tlistview in incele, o class bir araştır, eksiğin orda. sonrada kurgun sıkıntılı
Items[] satırları temsil eder. sonrası o satıra ait kolonları diyebilirsin.
X senin döngün zaten, X +1 deyipte döngünün dışına erişmeye çalışmanın anlamı ne ?
1- for X := 0 to Items.Count - 1 do satırları okumaya başkamışsın
if Pos(StrAra, Items.Item[X].SubItems[4]) > 0 then // Çalıyor -->burda dağılıyorsun 4. kolondaki ne bilgisi ise, StrAra içinde varsa demekki dosya var, e çalıyorsa ne olacak ? bekliyecek mi durdurup sonrakine mi geçecek ?

İlk yazdığım mesaj anlayıp uygulamanı tavsiye ederim.
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 !!!
Cevapla