View Full Version : سوال: تبدیل یک رشته زمانی به ثانیه
  
khorsandreza
چهارشنبه 11 اردیبهشت 1392, 08:25 صبح
من یک مقدار رشته ای را دارم به این شکل (124:23) یعنی 124 دقیقه و بیست سه ثانیه زمان گذشته حال می خواهم این مقدار را را یه یک مقدار واحد عددی (فکر کنم همان ثانیه باید باشه) تبدیل کنم روتینی در دلفی برای اینکار هست چون این مقدار بصورت Time نیست یک رشته است
developing
چهارشنبه 11 اردیبهشت 1392, 13:38 عصر
با سلام
روش های زیادی می تونی برای این کار استفاده کنی یکی از روش ها می تونه به شکل زیر باشه:
var
  st: tstrings;
begin
  st := tstringlist.Create;
  try
    st.Delimiter := ':';
    st.DelimitedText := edit1.Text;
    Edit2.Text := IntToStr((StrToInt(st[0]) * 60) + StrToInt(st[1]) );
  finally
    st.Free;
  end;
khorsandreza
چهارشنبه 11 اردیبهشت 1392, 16:11 عصر
با سلام
روش های زیادی می تونی برای این کار استفاده کنی یکی از روش ها می تونه به شکل زیر باشه:
var
  st: tstrings;
begin
  st := tstringlist.Create;
  try
    st.Delimiter := ':';
    st.DelimitedText := edit1.Text;
    Edit2.Text := IntToStr((StrToInt(st[0]) * 60) + StrToInt(st[1]) );
  finally
    st.Free;
  end;
 
با سلام مجدد
از آنجائی که این پروسه هر یک ثانیه اتفاق می افته بعد از 5 یا 6 دقیقه کار برنامه بسته میش من این پروسه داخل یک تایمر قرار دادم  به شکل زیر
Try
  st := tstringlist.Create;
  try
    st.Delimiter := ':';
    st.DelimitedText := wmp.controls.currentPositionString;
    xBox.Value := (StrToInt(st[0]) * 60)+StrToInt(st[1]) ;
    MainQ.Locate('FS',xBox.Value,[]);
    IF(xBox.Value>=MainQFS.Value) and (xBox.Value <=MainQFE.Value) Then
    RzDBLabel1.Visible := True
    Else RzDBLabel1.Visible := False
  finally
    st.Free;
  end;
Except
End;
در واقع هر یک ثانیه یک بار این پروسه باید اجرا بشه کار بدین صورت است که من برنامه دارم که زیرنویس های فیلم را داخل دیتا بیس ذخیره مکنم و بر اساس زمان پیشرفت نمایش فیلم نسبت به موقعیت زیرنویش را نمایش میدهم 
سطر 7  زمان را در فیلد FS جستجو می کند تا زمانی که شرایط زمانی جاکم است زیرنویس نمایش داده میشود
developing
چهارشنبه 11 اردیبهشت 1392, 21:27 عصر
با سلام
متغیرت رو به صورت سراسری تعریف کن یعنی:
var
  Form1: TForm1;
  st: tstrings;
بعد خط های زیر رو در زمان ساخت فرمت اضافه کن(OnFormCreate):
procedure TForm1.FormCreate(Sender: TObject);
begin
  st := tstringlist.Create;
  st.Delimiter := ':';
end;
در آخر هم خط های زیر رو در تایمر استفاده کن:
  st.DelimitedText := wmp.controls.currentPositionString;
xBox.Value := (StrToInt(st[0]) * 60)+StrToInt(st[1]) ;
البته باید خط زیر رو هم در رویداد OnDestroy فرم بنویسی:
procedure TForm1.FormDestroy(Sender: TObject);
begin
  st.Free;
end;
Felony
چهارشنبه 11 اردیبهشت 1392, 22:53 عصر
برای جدا کردن یک رشته و یک تبدیل ساده نیازی به ساخت یک نمونه از TStringList و ... نیست ، میشه کدهای خیلی ساده و تمیز تری نوشت :
function StringTimeToSecond(const Time: string): Integer;
var
  SpilitedTime: TArray<string>;
begin
  SpilitedTime:= Time.Split([':']);
  case High(SpilitedTime) of
    0: Exit(StrToInt(SpilitedTime[0]));
    1: Exit(StrToInt(SpilitedTime[0]) * 60 + StrToInt(SpilitedTime[1]));
  end;
end;
در نسخه های قدیمی تر ( باید کتابخانه های Types و StrUtils رو اضافه کنید ) :
function StringTimeToSecond(const Time: string): Integer;
var
  SpilitedTime: TStringDynArray;
begin
  SpilitedTime:= SplitString(Time, ':');
  case High(SpilitedTime) of
    0: Exit(StrToInt(SpilitedTime[0]));
    1: Exit(StrToInt(SpilitedTime[0]) * 60 + StrToInt(SpilitedTime[1]));
  end;
end;
در نسخه های قبل از 2009 هم میشه به جای اون SplitString از توابع Copy و Pos استفاده کرد .
MohsenB
پنج شنبه 12 اردیبهشت 1392, 03:16 صبح
سلام
یکم بازی ریاضی :
function GoSec(iTime :string):Integer;
var vS   :Real;
begin
  vS:= StrToFloat(StringReplace(iTime, ':', '.', [rfReplaceAll]));
  Result:= Floor(vS)*60 + Floor((vS-Floor(vS))*100);
end;
یه جواب ساده :
function GoSec2(iTime :string):Integer;
begin
  Result:= Pos(':', iTime);
  Result:= StrToIntDef(Copy(iTime, 1, Result-1), 0)*60 + StrToIntDef(Copy(iTime, Result+1 , Length(iTime)-Result), 0)
end;
موفق باشید
 
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.