Liczenie

0

Witam.

Mam do was pytanie jak napisać funkcje która by w ListView1 dodawała wszystkie liczby oraz która by zliczała czas w tylko jednej wybranej przez siebie kolumny np. ListView1 mam 6 kolumn a ja chce policzy liczby z 2 i czas z 5 wyniki by były podane na label1.Caption.

0

brać wciskać F1 i do brać sie roboty zaraz szukać i polski poprawna pisac, bo nie rozumieć ja :P

[dla pozostałych: użyj F1 i szukaj, albo pisz po polsku, tak, aby inni mogli zrozumieć]

0

ok nie mam sprawy namaluje to :)

I-----------------------------------------I
I kol1 I kol2 I kol3 I kol4 I kol5 I
I-----------------------------------------I
I A I 23 I 34 I 0023 I 44 I
I B I 12 I 31 I 0022 I 34 I
I C I 32 I 23 I 0033 I 21 I
I-----------------------------------------I

To jest przykład ListView1 chodzi mi o to by napisać funkcje która by zliczała podczas wczytania danych do ListView1 wszystkich liczb z kolumny 3 to jest by dodało 34,31,23 i funkcje która by obliczyła łączny czas z kolumny 4 to jest by dodała 0023 ; 0022 ; 0033 a potem by wyświetliła wynika na np.Label jak cos jest jeszcze nie tak to pisać czekam na pomoc.

0

teraz nie chce mi sie już myśleć, to napisze, że to kwestia 2 zmiennych podczas wczytywania....

pierwsza, dajmy, że bedzie to suma : integer;.... za kazdym razem jak dodajesz wartość do trzeciej kolumny, zwiększasz suma:=suma + StrToInt("wartosc") ;
co do czasów: podobnie.... trzeba by zmienną typu string, funkcje split (odzielającą cyfry od ":") ii zamieniać wszystko na sekundy... i sekundy do zmiennej integer.... jak już je zsumujemy to dzielimy liczbe sekund przez 60 (ciekawe po co :P - przez mod) i zapisujemy wynik do minut, a potem jeszcze raz (prez div) i wynik sekund. sprawdzmy czy minuty są mniejsze od 60, jeśli nie, to znów dzielimy na 60.....

jak nie rozumiesz, to wrzuć kod wczytywania, to może ktoś ci dopisze to w delphi co i gdzie... na razie mi sie nie chce.... :/

0

procedure TForm2.ReadDate;
var
ile:cardinal;
fsKart : TFileStream;
I : Integer;
ListItem : TListItem;
kol1,kol2,kol3,kol4,kol5:String;
begin
if not FileExists('wynik.wyn') then Exit;

fsKart := TFileStream.Create('wynik.wyn', fmOpenRead);

for I := 0 to fsKart.Size div SizeOf(TDataRec) -1 do
begin
ListItem := ListView1.Items.Add;
fsKart.Seek(i, SizeOf(TDataReC));

fsKart.Read(Data, SizeOf(TDataRec));

inc(runs);
ListItem.Caption := Data.kol1;
ListItem.SubItems.Add(Data.kol2);
ListItem.SubItems.Add(Data.kol3);
ListItem.SubItems.Add(Data.kol4);
ListItem.SubItems.Add(Data.kol5);
end;

fsKart.Free;
Ile := Ile + StrToInt(Data.kol3);
label4.Caption:=inttostr(ile);

end;

Tylko jak napisać by zliczało czas? a potem by podało wynik?

0

Nie wiem co Ty tam kombinujesz. Nie czytałem Twojego kodu (z braku czasu), więc nie wiem czy jest poprawny, ale jesli dobrze sumuje Ci się Ile to z czasem też nie będziesz miał problemów.

Zobacz w helpie, ze typ TDateTime to tak naprawdę jest Double, który wyswietla odpowiedni czas w milisekundach.

Zatem jesli Twój pierwszy czas to 0h 3m i 22s to jest to dokładnie równe 0,00233796296

Jak dodasz te wartosci to otrzymasz jakąś liczbę. Jeżeli przekroczy on 1 to znaczy, że przekroszyłeś 24h (czyli 1 dzień)

0
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)

1 użytkowników online, w tym zalogowanych: 0, gości: 1