Progresspar 100% tamalama

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
brs
Üye
Mesajlar: 626
Kayıt: 04 Eki 2012 03:52

Progresspar 100% tamalama

Mesaj gönderen brs »

Selam,

Progresspar1 position 100% olunca form1 gizleniyor ve form2 show oluyor, buraya kadar sorun yok fakat görselde progressbar tam anlamıyla tamamlanmadığı için göze hoş gelmiyor bu durumu nasıl çözebilirim...

Kod: Tümünü seç

procedure TForm1.TimerBarTimer(Sender: TObject);
begin
  ProgressBar1.Position := ProgressBar1.Position + 1;
  if ProgressBar1.Position = 100 then
  begin
    Form1.Hide;
    Form2.Show;
    TimerBar.Enabled := False;
  end;
end;
Resim
İşi bilen yardım eder, az bilen akıl verir, bilmeyen eleştirir, yapamayan ise çamur atar...
Hashirama
Üye
Mesajlar: 81
Kayıt: 26 Kas 2013 03:42

Re: Progresspar 100% tamalama

Mesaj gönderen Hashirama »

Progresbar ın max ve min değerlerini ayarladınız mı ?

Kod: Tümünü seç

ProgressBar1.Min:=0;
ProgressBar1.Max:=100;
Kullanıcı avatarı
brs
Üye
Mesajlar: 626
Kayıt: 04 Eki 2012 03:52

Re: Progresspar 100% tamalama

Mesaj gönderen brs »

Evet max ve min değerlerini ayarladım...
İşi bilen yardım eder, az bilen akıl verir, bilmeyen eleştirir, yapamayan ise çamur atar...
Hashirama
Üye
Mesajlar: 81
Kayıt: 26 Kas 2013 03:42

Re: Progresspar 100% tamalama

Mesaj gönderen Hashirama »

İlginç bir şekilde Timer ın içinden çıkmadıkça progressbar tam dolmuyor, onun için bir timer daha koyup timer1.enabled=false olduğunda form1 igizle form2 yi aç diyebiliriz.Program bu şekilde istenildiği gibi çalışıyor ama daha iyi bir çözüm vardır diye düşünüyorum.

Kod: Tümünü seç

procedure TForm1.Timer1Timer(Sender: TObject);
begin
ProgressBar1.Position := ProgressBar1.Position + 1;

 form1.Caption:=inttostr(ProgressBar1.Position) ;

  if ProgressBar1.Position = ProgressBar1.Max then
     Timer1.Enabled := False;

end;

procedure TForm1.Timer2Timer(Sender: TObject);
begin
 if Timer1.Enabled=false then
     begin
        form1.Hide;
         form2.Show;
         timer2.Enabled:=false;
     end;
end;
En son Hashirama tarafından 12 Şub 2015 11:46 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Kullanıcı avatarı
unicorn64
Üye
Mesajlar: 919
Kayıt: 04 Nis 2006 08:56
Konum: yine yeniden Ankara ^_^

Re: Progresspar 100% tamalama

Mesaj gönderen unicorn64 »

progressbarın position değerini set ettikten sonra Application.ProcessMessages; ekleyip dener misiniz
bazen yükselmek için önce dibi görmek gerekir...

forumda soru sormadan önce bakılmalı bence
daha fazlası için...

yürümeyi öğrenmeden koşmaya çalışanlar için, tökezleyip düşmek kaçınılmazdır...

Resim
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2381
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Re: Progresspar 100% tamalama

Mesaj gönderen freeman35 »

Timer2Timer hala thread içerisinde, o yüzden koşulun sağlandıysa timer ı durdur ve başka bir procedure tetikleterek show vs işlemlerini yaptır. Ayrıca ProgressBar1.Repaint yada .invalidate boyama işlemini tekrar yaptırtacaktır.
if ProgressBar1.Position = 100 then begin cik_disari; gibi
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 !!!
xxxjedixxx
Üye
Mesajlar: 216
Kayıt: 10 Ara 2013 03:50

Re: Progresspar 100% tamalama

Mesaj gönderen xxxjedixxx »

Sorunu tam anlamak için Delphi7'de kendim denedim. Herhangi bir tazeleme sorunu olmadan gayet güzel bir şekilde tam zamanında ekranda gösterdi. Hatta sizde neden bu şekilde olduğuna anlam vermedim ve Delphi'yi kapattım. Sonra bu sorunun XPMainfest ile alakalı olacağı aklıma geldi ve üşenmeden tekrar kod yazdım ve sizin bahsettiğiniz sorun gerçekleşti. Normalde Delphi7'de formunuza progressbar koyduğunuzda eski stil kesikli bar şeklinde geliyor. Bunun smooth özelliğini true yaptığınızda da düz mavi şerit haline geliyor. Fakat projenizde XPManifest'i etkinleştirince artık smooth özeliğine bakmaksızın sizin resimde gösterdiğiniz gibi daha güzel bir görsellikte geliyor.

Şimdi bu sorunu update ile veya application.processmessage ile çözemezsiniz. Çünkü, siz progressbar.posistion'ı artırdığınızda XPManifest temasından dolayı nesne pozisyonunu yaklaşık 300-500ms sonra olması gereken konuma getiriyor. Delphi XE7'de de denedim sonuç aynı. Zaten standart olarak manifest etkin olduğu için eski stil progressbar zaten kullanılamıyor.

Çözüm şu şekilde mümkün oluyor. Sizin projenize ek yapıyorum.

Kod: Tümünü seç

procedure Pause(const pDelay: LongWord);
var StartTC: DWORD;
    CurrentTC: Int64;
begin
  StartTC := GetTickCount;
  repeat
    Sleep(1);
    Application.ProcessMessages;
    CurrentTC := GetTickCount;
    if CurrentTC < StartTC then CurrentTC := CurrentTC + High(DWORD);
  until CurrentTC - StartTC >= pDelay;
end;

procedure TForm1.TimerBarTimer(Sender: TObject);
begin
  ProgressBar1.Position := ProgressBar1.Position + 1;
  if ProgressBar1.Position = 100 then
  begin
    TimerBar.Enabled := False; // önce timer'ı durdurmalısınız.
    Pause(750); // Bu süreyi deneyin. 500 üzeri sonuç olumlu çıkıyor.
    Form1.Hide;
    Form2.Show;
  end;
end;
Kullanıcı avatarı
brs
Üye
Mesajlar: 626
Kayıt: 04 Eki 2012 03:52

Re: Progresspar 100% tamalama

Mesaj gönderen brs »

Emeği geçe herkese teşekkür ederim... xxxjedixxx dediğiniz uygulamayı yaptım görselliği tamamlıyor 100% kısmı erken bitiyor oda olsun artık:)
İşi bilen yardım eder, az bilen akıl verir, bilmeyen eleştirir, yapamayan ise çamur atar...
Cevapla