ورود

View Full Version : سوال: تبدیل یک رشته زمانی به ثانیه



khorsandreza
چهارشنبه 11 اردیبهشت 1392, 07:25 صبح
من یک مقدار رشته ای را دارم به این شکل (124:23) یعنی 124 دقیقه و بیست سه ثانیه زمان گذشته حال می خواهم این مقدار را را یه یک مقدار واحد عددی (فکر کنم همان ثانیه باید باشه) تبدیل کنم روتینی در دلفی برای اینکار هست چون این مقدار بصورت Time نیست یک رشته است

developing
چهارشنبه 11 اردیبهشت 1392, 12: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, 15: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, 20: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, 21: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, 02: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;

موفق باشید