interface
uses Windows;
var
KeyChar : Char = PChar(':'); // znak wg. bedzie nastepywac rozdzielenie
type
TSplit = array of String; // nowy typ danych okreslajacy tablice stringow
procedure Split(Value : String; var Output : TSplit); // funkcja rozdzielajaca Split
....
procedure Split(Value : String; var Output : TSplit);
var
iCount : Integer;
procedure Explode;
var
Found : Integer;
begin
SetLength(Output, iCount+1);
Found := Pos(KeyChar, Value); // najpierw nastepuje odnalezienie szukanego znaku
{ pozniej za pomoca funkcji Copy nastepuje skopiowanie czesci danych do elementu
tablicy }
Output[iCount] := Copy(Value, 1, Found -1);
Delete(Value, 1, Found); // skopiowane juz dane zostaja ze stringa usuniete
Inc(iCount); // zwiększenie licznika
Found := Pos(KeyChar, Value); // ponowne odszukanie znaku KeyChar
if Found > 0 then Explode; // w razie znaleienia ponownie wywolaj te procedure
end;
begin
{
Funkcja Split powoduje rozdzielenie danych ze stringa na kilka(kilkanascie)
elementow i przypisanie jej do tablicy Output. Procedura ta wywoluje inna - Explode,
ktora to jest procedura rekurencyjna (o rekurencji mozesz poczytac m.in na stronie
www.4programmers.net/algo/ ) i to ona ma kluczowe zadanie rozdzielenie lancucha.
}
iCount := 0;
SetLength(Output, 1); // okreslenie liczby elementow tablicy dynamicznej
Insert(KeyChar, Value, Length(Value)+1); // dodanie na samym koncu lancucha ze stalej KeyChar
Explode; // wywolanie funkcji rekurencyjnej
end;
function DodajCzas (czas, dodaj : string;) : string;
var
stary, dodany : TSplit;
i: integer;
begin
Split(czas, stary); //rozbija aktualny czas na czynniki pierwsze
Split(dodaj, dodany); //rozbija dodawany czas na czynniki pierwsze : (osobno, sek, min, godz.)
for i := 0 to 2 do
begin
stary[i] := IntToStr( StrToInt(Stary[i]) + StrToInt(dodany[i]) );
end;
if StrToInt(stary[2]) >=60 then
begin
stary[1] := IntToStr( StrToInt(stary[1]) + (StrToInt(stary[2]) div 60));
stary[2] := IntToStr( StrToInt(stary[2]) mod 60);
end;
if StrToInt(stary[1]) >=60 then
begin
stary[0] := IntToStr( StrToInt(stary[0]) + (StrToInt(stary[1]) div 60));
stary[1] := IntToStr( StrToInt(stary[1]) mod 60);
end;
// jakiś warunek, gdy liczba godzin przekroczy 24 ??
Result:= stary[0] + ':' + stary[1] + ':' + stary[2];
end;
procedure TForm2.ReadDate;
var
....
kol1,kol2,kol3,kol4,kol5, czas:String;
begin
if not FileExists('wynik.wyn') then Exit;
...
inc(runs);
ListItem.Caption := Data.kol1;
ListItem.SubItems.Add(Data.kol2);
ListItem.SubItems.Add(Data.kol3);
Ile := Ile + StrToInt(Data.kol3);
ListItem.SubItems.Add(Data.kol4);
czas := DodajCzas(czas, Data.kol4);
ListItem.SubItems.Add(Data.kol5);
end;
fsKart.Free;
label4.Caption:=inttostr(ile);
label5.Caprion := czas;
end;
nie sprawdzałem, pisałem to tutaj, ale powinno być ok - najweyżej jakas literówka - ale masz trop jak to robić... Wiem, ze to rozwiązanie łopatologiczne i pewnie zżera kupe pamięci... ale nie pytał o optymalny kod :P
funkcja split jest zaczerpnięta z b4p, możesz ją skopiowaći wkleić w swoim programie (licencja GNU GPL), ale lepiej użyć gotowego unitu (jest gdzieś na stronie)