Dakika, saniye ve salise...

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
sertkayasalih
Üye
Mesajlar: 178
Kayıt: 12 Haz 2003 12:47
Konum: Antalya
İletişim:

Dakika, saniye ve salise...

Mesaj gönderen sertkayasalih »

Merhaba;

Delphi'de yeni sayılırım.
Delphi6 ve WinXp Pro kullanıyorum.

- Projemde DirectX Bileşenleri kullanıyorum.

- Projemde kullanacağım mp3 formatındaki ses dosyasının süre uzunluğunu hesap edebilen kod fonksiyonlarını kullanıyorum.

- DirectShow ünitesindeki fonksiyon;

Kod: Tümünü seç

function GetDuration(out pDuration: int64): HRESULT; stdcall;
- Common ünitesindeki;

Kod: Tümünü seç

var
   Duration     : int64;
   DurationStr  : string = ' ';
- Ana ünitemin içinde olan kodlar;

Kod: Tümünü seç

function MSecToStr(_msec: Comp): string;
var 
  _timeStamp : TTimeStamp;
  _dateTime  : TDateTime;
begin
   _timeStamp := MSecsToTimeStamp(_msec);
   _timeStamp.Date := 1;
   _dateTime := TimeStampToDateTime(_timeStamp);
  Result := TimeToStr(_dateTime);
end;
- mp3 dosyasını yüklerken...

Kod: Tümünü seç

   ...
    // Get duration.
      Player.MediaSeeking.GetDuration(Duration);
      DurationStr := MSecToStr(Duration div 10000);
      lbUzunluk.Caption := DurationStr;
- Yukarıdaki kodlar mp3 ses dosyasının süre uzunluğunu ( Saat, dakika ve saniye - 00:00:00) olarak veriyor.

- Sitede ki Temel bölüme baktım örnekler : (Saat , dakika, saniye ve salise) olarak var.


- Yapmak istediğim mp3 ses dosyasının süre uzunluğunu ( Dakika, saniye ve salise - 00:00:000) olarak almak istiyorum.


- Bu işlemi yapabilmem için nasıl bir değişiklik yapmam gerekir :?:

Yardımcı olan herkese şimdiden teşekkürler.
Bilgi; iki tarafı keskin kılıca benzer.
İyi kullanılmazsa, ya karşıyı, ya da sahibini
keser.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Selam.

- FormatDateTime() fonksiyonunu incelerseniz cevabı bulacaksınız... :)
Resim
Resim ....Resim
Kullanıcı avatarı
sertkayasalih
Üye
Mesajlar: 178
Kayıt: 12 Haz 2003 12:47
Konum: Antalya
İletişim:

Mesaj gönderen sertkayasalih »

Merhaba mrmcop;


İlginiz için teşekkür ediyorum.

Kod: Tümünü seç

...
lbUzunluk.Caption := FormatDateTime('mm:ss:zzz', Time);
gibi kullandığımda dakika ve saniye değerleri doğru çıkmıyor :roll:

- Hatalı bir şey mi yapıyorum :?:
Bilgi; iki tarafı keskin kılıca benzer.
İyi kullanılmazsa, ya karşıyı, ya da sahibini
keser.
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2357
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Mesaj gönderen freeman35 »

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);

var
  Present: TDateTime;
  Year, Month, Day, Hour, Min, Sec, MSec: Word;
 begin
  Present:= Now;
  DecodeDate(Present, Year, Month, Day);
  Label1.Caption := 'Today is Day ' + IntToStr(Day) + ' of Month '
    + IntToStr(Month) + ' of Year ' + IntToStr(Year);
  DecodeTime(Present, Hour, Min, Sec, MSec);
  Label2.Caption := 'The time is Minute ' + IntToStr(Min) + ' of Hour '
    + IntToStr(Hour);
end;
Kolay Gele
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ı
sertkayasalih
Üye
Mesajlar: 178
Kayıt: 12 Haz 2003 12:47
Konum: Antalya
İletişim:

Mesaj gönderen sertkayasalih »

Merhaba freeman35;

İlginize teşekkür ediyorum.

Verdiğiniz kod örneğini, (mp3 yüklerken) kod penceresindekinin yerine uyguladığımda çıkan süre rakamları hep '0' çıkıyor :(
Bilgi; iki tarafı keskin kılıca benzer.
İyi kullanılmazsa, ya karşıyı, ya da sahibini
keser.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Selam...

- Senin için bir funtion hazırladım. Button procedure'undan daha üstte bir yere aşağıdaki kodu ekle...

Kod: Tümünü seç

Function Zaman(Saat:TTime):String;
Var
  Sa, Dak, Sn, mSn : Word;
begin
  DecodeTime(Saat, Sa, Dak, Sn, mSn);
  Result := Format('%.3d:%.2d:%.2d', [(Sa*60)+Dak, Sn, mSn]);
end;
- Denemek için de aşağıdaki gibi buton procedure uygula...

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
begin
  Label1.Caption := Zaman( StrToTime('00:00:10,21') );
  Label2.Caption := Zaman( Time );
end;
- MP3 süresini saat olmaksızın göstereceğini düşündüğümden saat'i 60 ile çarpıp dakikaya ekledim... Dilersen bu işlemi kolaylıkla çıkartırsın...
Resim
Resim ....Resim
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2357
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Mesaj gönderen freeman35 »

Gönderdiğim örneği direk Delphi help ten almıştım. Eğer hepsi sıfır geliyorsa ozaman senin kodta bir hata var, sanırım bu hatada sıralama hatası yani mp3 ten tarih bilgisini almadan yada TimeStamp i TDateTime a çevirmeden önce yapıyorsun. Tavsiyem break Point koyarak bir incele kodunu
Kolay gele
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ı
sertkayasalih
Üye
Mesajlar: 178
Kayıt: 12 Haz 2003 12:47
Konum: Antalya
İletişim:

Mesaj gönderen sertkayasalih »

Merhaba mrmcop, freeman35;

Tekrar ilginiz için teşekkür ediyorum, sizlere zahmet veriyorum :oops:

- mrmcop, özellikle şahsım için uğraştığınız için çok minnettarım. Son Function örneğinizi zaman dilimiyle uyguladığımızda sorun yok. Ancak kendi projemde uygulamaya çalıştığımda neticeyi '000:00:00' olarak alıyorum.
Kullanma şeklim aynı belirtiğiniz gibi;

Kod: Tümünü seç

lbUzunluk.Caption := Zaman(Duration div 10000);
Herhalde atladığım bir şey var :!:

- freeman35, aşağıdaki kodda TimeStamp'ı TDateTime'e çevirmeyle ilgili function var. Fakat belirttiğim gibi 'saat:dakika:saniye - 00:00:00' olarak veriyor. Bu Functionda nasıl bir değişiklik yapılırda 'dakika:saniye:salise - 00:00:000' olarak çalışmasını sağlayabilirim. Bunu nasıl yapabileceğimi bilemiyorum.

Kod: Tümünü seç

function MSecToStr(_msec: Comp): string; 
var 
  _timeStamp : TTimeStamp; 
  _dateTime  : TDateTime; 
begin 
   _timeStamp := MSecsToTimeStamp(_msec); 
   _timeStamp.Date := 1; 
   _dateTime := TimeStampToDateTime(_timeStamp); 
  Result := TimeToStr(_dateTime); 
end;
Yardımcı yaklaşımlarınız için çok teşekkür ederim.
Bilgi; iki tarafı keskin kılıca benzer.
İyi kullanılmazsa, ya karşıyı, ya da sahibini
keser.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Selam...

- Cevap için biraz geciktim, şehir dışındaydım... 8)

- Duration değerin milisaniye cinsinden olduğunu değerlendirdiğini görüyorum bundan emin misin ? MP3 için gördüğüm uygulamalarda Saniye olduğunu görüyorum ama kullandığın bileşen/fonksiyon vs. tanımında bunun MiliSaniye olduğunu bildiriyorsa sorun yok, aşağıdaki anlattıklarımı uygula...

- Zaman sınırın nedir... Eğer TTime sınırındaysa yani 23 saat 59 dakika ve 59 saniye ise aşağıda bir fonksiyon daha yazdım... Milisaniyeyi saat cinsinden dönüştürüyor...

Kod: Tümünü seç

Function mSnToSaat( MiliSaniye : LongInt ): TTime;
Var
  Sa, Dk, Sn, mSn : LongInt;
Begin
    mSn := MiliSaniye Mod 1000;
    Sn  := MiliSaniye Div 1000;
    Dk  := Sn Div 60;
    Sa  := Dk Div 60;

    Sn :=  Sn - ( Dk * 60 );
    Dk :=  Dk - ( Sa * 60 );
    Result := EncodeTime(Sa, Dk, Sn, msn);
end;
- Zaman fonksiyonunu da 000 cinsinden olması canını sıkıyorsa 00 şeklinde dönüştürülmüş hali aşağıdaki gibi...

Kod: Tümünü seç

Function Zaman(Saat:TTime):String;
Var
  Sa, Dak, Sn, mSn : Word;
begin
  DecodeTime(Saat, Sa, Dak, Sn, mSn);
  Result := Format('%.2d:%.2d,%.2d', [(Sa*60)+Dak, Sn, mSn]);
end;
- Her iki fonksiyonun kullanımı ise aşağıdaki gibi...

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
begin
  Label1.Caption := Zaman( StrToTime('00:00:10,21') );
  Label2.Caption := Zaman(mSntoSaat(86399999));
end;
Resim
Resim ....Resim
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2357
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Mesaj gönderen freeman35 »

Kod: Tümünü seç

function MSecToStr(_msec: Comp): string;
var
  _timeStamp : TTimeStamp;
  _dateTime  : TDateTime;
  Hour, Min, Sec, MSec : Word;
begin
   _timeStamp := MSecsToTimeStamp(_msec);
   _timeStamp.Date := 1;
   _dateTime := TimeStampToDateTime(_timeStamp);
  Result := TimeToStr(_dateTime);

  DecodeTime(_dateTime, Hour, Min, Sec, MSec);
  result := '(The time is Minute ' + IntToStr(Min) +
            ')     (of Hour '+ IntToStr(Hour) +
            ')     (of Second '+ IntToStr(Sec)+
            ')     (of M.Second '+ IntToStr(Msec)+')';

end;
Kolay Gele
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ı
sertkayasalih
Üye
Mesajlar: 178
Kayıt: 12 Haz 2003 12:47
Konum: Antalya
İletişim:

Mesaj gönderen sertkayasalih »

Merhaba mrmcop, freeman35;

Tekrar yanıtınız için teşekkür ederim :)

- freeman35 sizin yazdığınız örneği uyguladım problem çözüldü :)

Bilgilenme ve bilgilendirme için yardımlarını esirgemeyen herkese ülkem ve insanlık adına sonsuz teşekkürler. İnşallah bizlerede bu şeref bir gün nasip olur.
Bilgi; iki tarafı keskin kılıca benzer.
İyi kullanılmazsa, ya karşıyı, ya da sahibini
keser.
mcihad
Üye
Mesajlar: 283
Kayıt: 18 Tem 2003 03:28
Konum: Sivas

getSystemTime

Mesaj gönderen mcihad »

GetSystemTime WinAPI KOmutunu kullanarak almayı deni
Bize iyilik yaraşır.
Kullanıcı avatarı
sertkayasalih
Üye
Mesajlar: 178
Kayıt: 12 Haz 2003 12:47
Konum: Antalya
İletişim:

Mesaj gönderen sertkayasalih »

Merhaba mcihad;

İlgin için teşekkür ederim.
Problemimi çözdüm. Çok sağolun.
Bilgi; iki tarafı keskin kılıca benzer.
İyi kullanılmazsa, ya karşıyı, ya da sahibini
keser.
Cevapla