ListView - wstawianie do komórek

0

Witam,

potrzebuję Waszej pomocy drodzy koledzy.
Mój problem polega na tym, że nie mogę posegregować danych w ListView tak jak bym sobie życzył - męczę się z tym od samego rana bez przerwy i już po prostu wysiadam...

Mam 2 ListViewy.

ListView 1 (Lista_Objektow):

data pracownik 1 pracownik 2 pracownik 3 pracownik 4 pracownik 5 pracownik 6 dodatkowe informacje

oraz ListView 2 (Lista_Pomocnicza) z danymi:

data pracownik godzin czas pracy dodatkowe info
2012-01-11 tomek 4 07:00 - 11:00 tomek: tapetowanie
2012-01-12 tomek 6 07:00 - 13:00 tomek: malowanie
2012-01-11 adam 4 07:00 - 11:00 adam: sprzatanie
2012-01-13 adam 2 07:00 - 9:00 adam: wywozenie gruzu

Chciałbym uzyskać taki oto efekt w ListView 1:

data pracownik 1 pracownik 2 pracownik 3 pracownik 4 pracownik 5 pracownik 6 dodatkowe informacje
2012-01-11 tomek (4 07:00 - 11:00) adam (4 07:00 - 11:00) - - - - tomek: tapetowanie; adam: sprzatanie
2012-01-12 tomek (6 07:00 - 13:00) - - - - - tomek: malowanie
2012-01-13 adam (2 07:00 - 09:00) - - - - - adam: wywozenie gruzu

Jak do tej pory udało mi się zrobić tylko wstawienie pierwszego pracownika wtedy, gdy w ListView nie ma jeszcze żadnej pozycji.

  // jedziemy po liscie pomocniczej w poszukiwaniu pracownikow
  for i := 0 to Lista_Pomocnicza.Items.Count -1 do
  // jesli na liscie objektow nie masz jeszcze zadnego pracownika to
  if Lista_Objektow.Items.Count = 0 then
  begin
    // przypisanie danych do zmiennych
    nazwa_pracownika := Lista_Pomocnicza.Items[i].SubItems[0];
    data_wykonania := Lista_Pomocnicza.Items[i].Caption;
    godzin := Lista_Pomocnicza.Items[i].SubItems[1];
    czas_pracy := Lista_Pomocnicza.Items[i].SubItems[2];

    // dodaj pierwszego znalezionego na liscie pomocniczej
    Item := Lista_Objektow.Items.Add;
    Item.Caption := FormatDateTime('yyyy-mm-dd', StrToDate(data_wykonania)) + ' ' + DayValues[DayOfWeek(StrToDate(data_wykonania))];

    Item.SubItems.Add(nazwa_pracownika + ' ' + godzin + ' Std. <br>(' + czas_pracy + ')');
    Item.SubItems.Add(''); // zostaw puste na pozniejsze uzupelnienie
    Item.SubItems.Add('');
    Item.SubItems.Add('');
    Item.SubItems.Add('');
    Item.SubItems.Add('');
    Item.SubItems.Add('');
  end else // w przypadku gdy lista objektow.items.count > 0
  begin
      nazwa_pracownika := Lista_Pomocnicza.Items[i].SubItems[0];
      data_wykonania := Lista_Pomocnicza.Items[i].Caption;
      godzin := Lista_Pomocnicza.Items[i].SubItems[1];
      czas_pracy := Lista_Pomocnicza.Items[i].SubItems[2];
      //showmessage(lista_pomocnicza.Items[i].SubItems[0]);


      for k := 0 to Lista_Objektow.Items.Count -1 do
      // Sprawdz czy daty sie powtarzaja
      // jesli istnieje podobne
      if (Lista_objektow.Items[k].Caption = FormatDateTime('yyyy-mm-dd', StrToDate(data_wykonania)) + ' ' + DayValues[DayOfWeek(StrToDate(Data_wykonania))]) then
      begin
        // dodaj pracownikow z takimi samymi datami pracy do jednego wiersza (z poprzednim)
        if Lista_objektow.Items[k].SubItems[0] = ''
        then Lista_objektow.Items[k].SubItems[0] := Nazwa_pracownika + ' ' + godzin + ' Std. <br>(' + Czas_Pracy + ')'
        else
        if Lista_objektow.Items[k].SubItems[1] = ''
        then Lista_objektow.Items[k].SubItems[1] := Nazwa_pracownika + ' ' + godzin + ' Std. <br>(' + Czas_Pracy + ')'
        else
        if Lista_objektow.Items[k].SubItems[2] = ''
        then Lista_objektow.Items[k].SubItems[2] := Nazwa_pracownika + ' ' + godzin + ' Std. <br>(' + Czas_Pracy + ')'
        else
        if Lista_objektow.Items[k].SubItems[3] = ''
        then Lista_objektow.Items[k].SubItems[3] := Nazwa_pracownika + ' ' + godzin + ' Std. <br>(' + Czas_Pracy + ')'
        else
        if Lista_objektow.Items[k].SubItems[4] = ''
        then Lista_objektow.Items[k].SubItems[4] := Nazwa_pracownika + ' ' + godzin + ' Std. <br>(' + Czas_Pracy + ')'
        else
        if Lista_objektow.Items[k].SubItems[5] = ''
        then Lista_objektow.Items[k].SubItems[5] := Nazwa_pracownika + ' ' + godzin + ' Std. <br>(' + Czas_Pracy + ')';
      end else
      begin

    //  end;
    end;
  end;

Może jest jakiś prostszy sposób na zrobienie tego?

0

Pętlą?

0

Nie wiem czy zauważyłeś powyżej, ale próbowałem "pętlą" i wygląda na to, że nie mogę sobie poradzić. Jak powinna wyglądać, aby działała efektywnie...

0

Lista_Objektow

A co to objekty? To że to jest object nie znaczy że to się pisze po polsku objekt... OBIEKT.

Przecież TListView ma swoją metodę sortowania więc z czym masz problem?

0

<quote=123>

Lista_Objektow
A co to objekty? To że to jest object nie znaczy że to się pisze po polsku objekt... OBIEKT.

Objekty to są nazwy obiektów np: Nazwa ulicy przy której znajduje się jakiś budynek - to są obiekty.
Nie są to żadne tworzone objekty programowo.

-pB_No- napisał(a):

Przecież TListView ma swoją metodę sortowania więc z czym masz problem?

Nie chodzi mi o sortowanie, ale o "wkładanie" danych wg. dat. tak jak rozpisałem to w tabeli.

ListView nie rozmieści mi pracowników względem takich samych daty do poszczególnych kolumn...

0

Poradziłem sobie.. użyłem do tego pomocniczego combobox w którym przechowywałem daty wykonania prac pracownikow (bez duplikatow) po tym poszło jak złoto :P

0

Twój kod jest zbyt długi; Można go znacznie skrócić (do tej postaci):

for I := 0 to Lista_Pomocnicza.Items.Count -1 do
  begin
    data_wykonania   := Lista_Pomocnicza.Items[I].Caption;
    nazwa_pracownika := Lista_Pomocnicza.Items[I].SubItems[0];
    godzin           := Lista_Pomocnicza.Items[I].SubItems[1];
    czas_pracy       := Lista_Pomocnicza.Items[I].SubItems[2];

    case Lista_Objektow.Items.Count of
      0: begin
           Item := Lista_Objektow.Items.Add;
           Item.Caption := FormatDateTime('yyyy-mm-dd', StrToDate(data_wykonania)) + ' ' +
                                          DayValues[DayOfWeek(StrToDate(data_wykonania))];

           Item.SubItems.Add(nazwa_pracownika + ' ' + godzin +
                             ' Std. <br>(' + czas_pracy + ')');

           for I := 0 to 5 do
             Item.SubItems.Add('');
         end;
    else
      for J := 0 to Lista_Objektow.Items.Count -1 do
        for K := 0 to 5 do
          if Lista_objektow.Items[J].SubItems[K] = '' then
            Lista_objectow.Items[J].SubItems[K] := Nazwa_pracownika + ' ' + godzin +
                                                   ' Std. <br>(' + Czas_Pracy + ')';
    end;
  end;

Optymalizacja (linii kodu) - 52%;

Powinieneś poczytać wiele artykułów, bo piszesz mało wydajne i mało czytelne algorytmy...

Polecam jak dla Ciebie przeczytanie artykułów o: DRY i KISS, notacji węgierskiej, oraz zasad pisania kodu;

Nadając nazwy identyfikatorów stałych, zmiennych, typów oraz nazw procedur i funkcji należy pamiętać, że język Delphi to zlepek słów wywodzących się z języka angielskiego, więc wielkim błędem jest jego usilne spolszczanie;

Zachęcam do poczytania ww lektur, oraz o "myśleniu" podczas tworzenia kodu :)

0

Wielkie dzięki!!
Dużo mi pomogłeś, wezmę sobie te rady do serca.

A tak na marginesie, to próbując Twojego kodu, nie do końca to działa...
Tworzy mi kopie tego samego pracownika (tyle razy ile wystepuje w tabeli Pomocniczej to dodaje go do List Objektow w prawo, oraz nie wyświetla innych pracownikow).

Tak wygląda teraz kod działający:

  for i := 0 to Lista_Pomocnicza.Items.Count -1 do
  begin
    data_wykonania     :=    Lista_Pomocnicza.Items[i].Caption;
    nazwa_pracownika   :=    Lista_Pomocnicza.Items[i].SubItems[0];
    godzin             :=    Lista_Pomocnicza.Items[i].SubItems[1];
    czas_pracy         :=    Lista_Pomocnicza.Items[i].SubItems[2];

    case Lista_Objektow.Items.Count of
      0: begin
           Item := Lista_Objektow.Items.Add;
           Item.Caption := FormatDateTime('yyyy-mm-dd', StrToDate(data_wykonania)) + ' ' +
                                          DayValues[DayOfWeek(StrToDate(data_wykonania))];

           Item.SubItems.Add(nazwa_pracownika + ' ' + godzin + ' Std. <br>(' + czas_pracy + ')');

           for J := 0 to 5 do
             Item.SubItems.Add('');

         end;
    else
      for J := 0 to Lista_Objektow.Items.Count -1 do
        { WSTAWIAJAC W TO MIEJSCE PETLE FOR K := 0 TO 5 do - kopiuje mi pracownikow w prawo 
           w jednym wierszu zamiast ich odpowienio rozdzielic wg. dat. 
           musialem zostawic jak jest.
           oczywiscie subitems pozamienialem na K i zostawielm tylko jedna linije, reszte wywalilem.
        }
        if (Lista_objektow.Items[j].Caption = FormatDateTime('yyyy-mm-dd', StrToDate(data_wykonania)) + ' ' +
                                                             DayValues[DayOfWeek(StrToDate(Data_wykonania))]) then
        if Lista_objektow.Items[j].SubItems[0] = ''
        then Lista_objektow.Items[j].SubItems[0] := Nazwa_pracownika + ' ' + godzin +
                                                                     ' Std. <br>(' + Czas_Pracy + ')'
        else
        if Lista_objektow.Items[j].SubItems[1] = ''
        then Lista_objektow.Items[j].SubItems[1] := Nazwa_pracownika + ' ' + godzin +
                                                                     ' Std. <br>(' + Czas_Pracy + ')'
        else
        if Lista_objektow.Items[j].SubItems[2] = ''
        then Lista_objektow.Items[j].SubItems[2] := Nazwa_pracownika + ' ' + godzin +
                                                                     ' Std. <br>(' + Czas_Pracy + ')'
        else
        if Lista_objektow.Items[j].SubItems[3] = ''
        then Lista_objektow.Items[j].SubItems[3] := Nazwa_pracownika + ' ' + godzin +
                                                                     ' Std. <br>(' + Czas_Pracy + ')'
        else
        if Lista_objektow.Items[j].SubItems[4] = ''
        then Lista_objektow.Items[j].SubItems[4] := Nazwa_pracownika + ' ' + godzin +
                                                                     ' Std. <br>(' + Czas_Pracy + ')'
        else
        if Lista_objektow.Items[j].SubItems[5] = ''
        then Lista_objektow.Items[j].SubItems[5] := Nazwa_pracownika + ' ' + godzin +
                                                                     ' Std. <br>(' + Czas_Pracy + ')';

      // bez tego comoboxa wyswietlal by mi duplikaty pracownikow na liscie
      // szczerze nie mam pojecia jakim cudem z nim dziala... ;o
      if combo_pomoc.ItemIndex = combo_pomoc.Items.IndexOf(data_wykonania) then
      begin
        combo_pomoc.Items.Add(data_wykonania);
        combo_pomoc.ItemIndex := combo_pomoc.Items.Count;

        Item := Lista_Objektow.Items.Add;
        Item.Caption := FormatDateTime('yyyy-mm-dd', StrToDate(data_wykonania)) + ' ' +
                                       DayValues[DayOfWeek(StrToDate(data_wykonania))];

        Item.SubItems.Add(nazwa_pracownika + ' ' + godzin + ' Std. <br>(' + czas_pracy + ')');

        for J := 0 to 5 do
          Item.SubItems.Add('');
      end;
    end;
  end;

A tak wygląda procedura generująca rachunek:

procedure TForm_Main.Wyswietl_Dane_Obiektow;
var
  Item              :        TListItem;
  Duplikator        :        TStringList;
  i, j, k           :        integer;
  suma_godzin       :        double;


  nazwa_pracownika,
  data_wykonania,
  godzin,
  czas_pracy    : string;
begin
  Lista_Objektow.Clear; // Wyczysc liste obiektow
  Lista_Gesamt.Clear;   // Wyczysc liste gesamt
  Lista_Pomocnicza.Clear; // Wyczysc liste pomocniczna

  {
    Poniżej znajduje się kod odpowiadający za
    wyplenianie tabeli rachunkow
  }
  //Tworzy polecenie SELECT z wybranym filtrowaniem (obiekt/data od/do)
  Zapytanie_obiekty := 'data_wykonania BETWEEN ' + QuotedStr(DateToStr(Data_Od.Date)) + ' AND ' + QuotedStr(DateToStr(Data_Do.Date));

  // Wybiera pracownikow z data wykonania pracy z uwzglednieniem filtra
  zapytanieSelect('SELECT data_wykonania, pracownik, godzin, czas_pracy, dodatkowe_info ' +
                  'FROM Rutecki.bills ' +
                  'WHERE obiekt=' + QuotedStr(combo_objekt.Text) + ' ' +
                  'AND ' + Zapytanie_obiekty + '', DataModule1.ADOQuery_Edit);

  // Petla dodaje do listy wszystkich wyszukanych pracownikow
  while not DataModule1.ADOQuery_Edit.Eof do
  begin // petla
    Item := Lista_Pomocnicza.Items.Add;
    Item.Caption := DataModule1.ADOQuery_Edit.FieldValues['data_wykonania'];
    Item.SubItems.Add(DataModule1.ADOQuery_Edit.FieldValues['pracownik']);
    Item.SubItems.Add(DataModule1.ADOQuery_Edit.FieldValues['godzin']);
    Item.SubItems.Add(DataModule1.ADOQuery_Edit.FieldValues['czas_pracy']);
    Item.SubItems.Add(DataModule1.ADOQuery_Edit.FieldValues['dodatkowe_info']);

    DataModule1.ADOQuery_Edit.Next(); // przerzucamy rekord, w końcu pętla
  end;
  DataModule1.ADOQuery_Edit.Close(); // zamykamy połączenie.


  combo_pomoc.Clear;  // wyczysc combo

  for i := 0 to Lista_Pomocnicza.Items.Count -1 do
  begin
    data_wykonania     :=    Lista_Pomocnicza.Items[i].Caption;
    nazwa_pracownika   :=    Lista_Pomocnicza.Items[i].SubItems[0];
    godzin             :=    Lista_Pomocnicza.Items[i].SubItems[1];
    czas_pracy         :=    Lista_Pomocnicza.Items[i].SubItems[2];

    case Lista_Objektow.Items.Count of
      0: begin
           Item := Lista_Objektow.Items.Add;
           Item.Caption := FormatDateTime('yyyy-mm-dd', StrToDate(data_wykonania)) + ' ' +
                                          DayValues[DayOfWeek(StrToDate(data_wykonania))];

           Item.SubItems.Add(nazwa_pracownika + ' ' + godzin + ' Std. <br>(' + czas_pracy + ')');

           for J := 0 to 5 do
             Item.SubItems.Add('');

         end;
    else
      for J := 0 to Lista_Objektow.Items.Count -1 do
        if (Lista_objektow.Items[j].Caption = FormatDateTime('yyyy-mm-dd', StrToDate(data_wykonania)) + ' ' +
                                                             DayValues[DayOfWeek(StrToDate(Data_wykonania))]) then
        if Lista_objektow.Items[j].SubItems[0] = ''
        then Lista_objektow.Items[j].SubItems[0] := Nazwa_pracownika + ' ' + godzin +
                                                    ' Std. <br>(' + Czas_Pracy + ')'
        else
        if Lista_objektow.Items[j].SubItems[1] = ''
        then Lista_objektow.Items[j].SubItems[1] := Nazwa_pracownika + ' ' + godzin +
                                                    ' Std. <br>(' + Czas_Pracy + ')'
        else
        if Lista_objektow.Items[j].SubItems[2] = ''
        then Lista_objektow.Items[j].SubItems[2] := Nazwa_pracownika + ' ' + godzin +
                                                    ' Std. <br>(' + Czas_Pracy + ')'
        else
        if Lista_objektow.Items[j].SubItems[3] = ''
        then Lista_objektow.Items[j].SubItems[3] := Nazwa_pracownika + ' ' + godzin +
                                                    ' Std. <br>(' + Czas_Pracy + ')'
        else
        if Lista_objektow.Items[j].SubItems[4] = ''
        then Lista_objektow.Items[j].SubItems[4] := Nazwa_pracownika + ' ' + godzin +
                                                    ' Std. <br>(' + Czas_Pracy + ')'
        else
        if Lista_objektow.Items[j].SubItems[5] = ''
        then Lista_objektow.Items[j].SubItems[5] := Nazwa_pracownika + ' ' + godzin +
                                                    ' Std. <br>(' + Czas_Pracy + ')';

      if combo_pomoc.ItemIndex = combo_pomoc.Items.IndexOf(data_wykonania) then
      begin
        combo_pomoc.Items.Add(data_wykonania);
        combo_pomoc.ItemIndex := combo_pomoc.Items.Count;

        Item := Lista_Objektow.Items.Add;
        Item.Caption := FormatDateTime('yyyy-mm-dd', StrToDate(data_wykonania)) + ' ' +
                                       DayValues[DayOfWeek(StrToDate(data_wykonania))];

        Item.SubItems.Add(nazwa_pracownika + ' ' + godzin + ' Std. <br>(' + czas_pracy + ')');

        for J := 0 to 5 do
          Item.SubItems.Add('');
      end;
    end;
  end;


  {
    Poniżej znajduje się kod odpowiadający za
    wyplenianie tabeli Gesamt (podsumowanie godzin pracownikow w osobnej tabelce)
  }

  Duplikator := TStringList.Create;
  Duplikator.Sorted := True;
  Duplikator.Duplicates := dupIgnore;

  // Tworzy liste pracownikow bez duplikatow
  for i := 0 to Lista_Pomocnicza.Items.Count -1 do
  Duplikator.Add(Lista_Pomocnicza.Items[i].SubItems[0]);

  // Dodaje do listy Gesamt pracownikow
  for i := 0 to Duplikator.Count -1 do
  begin
    Item := Lista_Gesamt.Items.Add;
    Item.Caption := Duplikator.Strings[i];
    Item.SubItems.Add('');
  end;


  //********************************
  // Sumowanie godzin każdego pracownika
  //********************************
  for i := 0 to Lista_Gesamt.Items.Count -1 do
  begin
    suma_godzin := 0; // wyzerowanie sumy

    for j := 0 to Lista_Pomocnicza.Items.Count -1 do
      if Lista_Gesamt.Items[i].Caption = Lista_pomocnicza.Items[j].SubItems[0] then
      begin
        suma_godzin := suma_godzin + StrToFloat(Lista_Pomocnicza.Items[j].SubItems[1]);
        Lista_Gesamt.Items[i].SubItems[0] := FloatToStr(Suma_Godzin);
      end;
  end;

  //********************************
  // Sumowanie godzin wszystkich
  // pracownikow razem
  //********************************
  suma_godzin := 0; // wyzerowanie sumy
  for i := 0 to Lista_Gesamt.Items.Count -1 do
    suma_godzin := suma_godzin + StrToFloat(Lista_Gesamt.Items[i].SubItems[0]);

  label_gesamt.Caption := 'Gesamt....................' + FloatToStr(suma_godzin) + ' Std';

  Duplikator.Free; // zwolnij

  //********************************
  // dopisywanie dodatkowych informacji
  //********************************
  for I := 0 to Lista_objektow.Items.Count -1 do
    for J := 0 to Lista_objektow.Items[i].SubItems.Count -1 do
      if not (Lista_objektow.Items[i].SubItems[j] = '')
      and not (Lista_objektow.Items[I].SubItems.Count = 5) then
        for K := 0 to Lista_Pomocnicza.Items.Count -1 do
          if (pos(lista_Pomocnicza.Items[k].Caption, Lista_objektow.Items[i].Caption) > 0)
          and (pos(lista_Pomocnicza.Items[k].SubItems[0], Lista_objektow.Items[i].SubItems[j]) > 0) then
            if not (pos(lista_Pomocnicza.Items[k].SubItems[0], Lista_objektow.Items[i].SubItems[6]) > 0) then
              if Lista_Pomocnicza.Items[k].SubItems[3] <> '' then
                Lista_objektow.Items[i].SubItems[6] := '<left>' + Lista_objektow.Items[i].SubItems[6] +
                                                       Lista_Pomocnicza.Items[k].SubItems[0] + ': ' + Lista_Pomocnicza.Items[k].SubItems[3] + ' </left>';

  if RysujTabele(Lista_objektow, Lista_gesamt, suma_godzin, combo_objekt.Text, ExtractFileDir(Application.ExeName) + '\rachunek.html', true) then
  begin
    Web.Navigate(ExtractFileDir(Application.ExeName) + '\rachunek.html');
    //ShellExecute(Handle,'open', PChar(ExtractFileDir(Application.ExeName) + '\rachunek.html'), nil, nil, SW_NORMAL);
  end else Application.MessageBox('Błąd podczas generowania rachunku.', 'Generowanie rachunku', MB_ICONWARNING);
end;
0

{ WSTAWIAJAC W TO MIEJSCE PETLE FOR K := 0 TO 5 do - kopiuje mi
pracownikow w prawo w jednym wierszu zamiast ich odpowienio rozdzielic wg. dat.
musialem zostawic jak jest. oczywiscie subitems pozamienialem na K i zostawielm
tylko jedna linije, reszte wywalilem.}

Być może coś źle napisałem w moim kodzie, bo pisałem na sucho;

Zastanów się nad tym kodem:

if (Lista_objektow.Items[j].Caption = FormatDateTime('yyyy-mm-dd',
                                      StrToDate(data_wykonania)) + ' ' +
                                      DayValues[DayOfWeek(StrToDate(Data_wykonania))]) then
if Lista_objektow.Items[j].SubItems[0] = '' then
  Lista_objektow.Items[j].SubItems[0] := Nazwa_pracownika + ' ' + godzin +
                                         ' Std. <br>(' + Czas_Pracy + ')'
else
  if Lista_objektow.Items[j].SubItems[1] = '' then
    Lista_objektow.Items[j].SubItems[1] := Nazwa_pracownika + ' ' + godzin +
                                           ' Std. <br>(' + Czas_Pracy + ')'
  else
    if Lista_objektow.Items[j].SubItems[2] = '' then
      Lista_objektow.Items[j].SubItems[2] := Nazwa_pracownika + ' ' + godzin +
                                             ' Std. <br>(' + Czas_Pracy + ')'
    else
      if Lista_objektow.Items[j].SubItems[3] = '' then
        Lista_objektow.Items[j].SubItems[3] := Nazwa_pracownika + ' ' + godzin +
                                               ' Std. <br>(' + Czas_Pracy + ')'
      else
        if Lista_objektow.Items[j].SubItems[4] = '' then
          Lista_objektow.Items[j].SubItems[4] := Nazwa_pracownika + ' ' + godzin +
                                                 ' Std. <br>(' + Czas_Pracy + ')'
        else
          if Lista_objektow.Items[j].SubItems[5] = '' then
            Lista_objektow.Items[j].SubItems[5] := Nazwa_pracownika + ' ' + godzin +
                                                   ' Std. <br>(' + Czas_Pracy + ')';

Bo ja tu widzę w kółko powtarzanie jednej czynności; Indeks SunItems zmienia się jedynie, reszta pozostaje bez zmian; Więc taką drabinkę można zastąpić pętlą for .. to .. do, w której licznik będzie stanowił indeks:

if (Lista_objektów.Items[J].Caption = FormatDateTime('yyyy-mm-dd',
                                      StrToDate(data_wykonania)) + ' ' +
                                      DayValues[DayOfWeek(StrToDate(Data_wykonania))]) then
  for K := 0 to 5 do
    if Lista_objectow.Items[J].SubItems[K] = '' then
      Lista_objectow.Items[J].SubItems[K] := Nazwa_pracownika + ' ' + godzin +
                                             ' Std. <br>(' + Czas_Pracy + ')';

Zwróć uwagę w swoim algorytmie na to, jest jest stałe i niezmienne, na to co piszesz wilokrotnie (zasada DRY), a na to, co zmienia się regularnie;

Stała jest lista, licznik właściwości Items oraz łańcuch, jaki zostaje przypisany właściwości SubItems; Zmienny jest tylko indeks właściwości SubItems, który rośnie za każdym razem o 1, więc można go zastąpić pętlą;

Być może wcześniej popełniłem gdzieś błąd, ale ten kod powinien działać poprawnie; Stąd cała pętla może wyglądać tak:

for i := 0 to Lista_Pomocnicza.Items.Count -1 do
  begin
    data_wykonania     :=    Lista_Pomocnicza.Items[i].Caption;
    nazwa_pracownika   :=    Lista_Pomocnicza.Items[i].SubItems[0];
    godzin             :=    Lista_Pomocnicza.Items[i].SubItems[1];
    czas_pracy         :=    Lista_Pomocnicza.Items[i].SubItems[2];
 
    case Lista_Objektow.Items.Count of
      0: begin
           Item := Lista_Objektow.Items.Add;
           Item.Caption := FormatDateTime('yyyy-mm-dd', StrToDate(data_wykonania)) + ' ' +
                                          DayValues[DayOfWeek(StrToDate(data_wykonania))];
 
           Item.SubItems.Add(nazwa_pracownika + ' ' + godzin + ' Std. <br>(' +
                             czas_pracy + ')');

           for J := 0 to 5 do
             Item.SubItems.Add('');
         end;
    else
      for J := 0 to Lista_Objektow.Items.Count -1 do
        if (Lista_objektów.Items[J].Caption = FormatDateTime('yyyy-mm-dd',
                                      StrToDate(data_wykonania)) + ' ' +
                                      DayValues[DayOfWeek(StrToDate(Data_wykonania))]) then
          for K := 0 to 5 do
            if Lista_objectow.Items[J].SubItems[K] = '' then
              Lista_objectow.Items[J].SubItems[K] := Nazwa_pracownika + ' ' + godzin +
                                                     ' Std. <br>(' + Czas_Pracy + ')';

      if combo_pomoc.ItemIndex = combo_pomoc.Items.IndexOf(data_wykonania) then
        begin
          combo_pomoc.Items.Add(data_wykonania);
          combo_pomoc.ItemIndex := combo_pomoc.Items.Count;

          Item := Lista_Objektow.Items.Add;
          Item.Caption := FormatDateTime('yyyy-mm-dd', StrToDate(data_wykonania)) + ' ' +
                                       DayValues[DayOfWeek(StrToDate(data_wykonania))];

          Item.SubItems.Add(nazwa_pracownika + ' ' + godzin + ' Std. <br>(' +
                            czas_pracy + ')');

          for J := 0 to 5 do
            Item.SubItems.Add('');
        end;
    end;
  end;
0

for K := 0 to 5 do
if Lista_objectow.Items[J].SubItems[K] = '' then
Lista_objectow.Items[J].SubItems[K] := Nazwa_pracownika + ' ' + godzin +
' Std.
(' + Czas_Pracy + ')';

Próbowałem, w dalszym ciągu wstawia pracowników w prawo (tyle razy ile się powtarzają w tabeli pomocniczej).
Dziwne, przecież pętla K robi to samo tyle, że automatycznie. Nie rozumiem dlaczego... jeszcze pokombinuje...

0
User322 napisał(a)

Dziwne, przecież pętla K robi to samo tyle, że automatycznie.

No więc właśnie; Robi dokładnie to samo, tyle że w pętli; Gdybym musisał zrobić takie coś na pewno oparł bym to na pęlti, bo nie dość, że jest krótszy zapis, to na dodatek po to istnieją pętle, by wykorzystywać je właśnie w takich sytuacjach;

Musisz pokombinować, bo taki zapis jest w 100% poprawny; Jeśli dalej nie będzie działać uruchom debuger i obserwuj wartości kilku znaczących zmiennych; Wpadniesz na pewno na trop dzięki niemu;

@ dwa posty wcześniej nie zapisałem tego warunku:

if (Lista_objektów.Items[J].Caption = FormatDateTime('yyyy-mm-dd',
                                      StrToDate(data_wykonania)) + ' ' +
                                      DayValues[DayOfWeek(StrToDate(Data_wykonania))]) then

Stąd mój pierwszy kod na pewno nie działał prawidłowo; Drugi zawiera już ten warunek, więc powinien działać; Musisz przeanalizować debugerem kod jeśli nie widzisz błędu; Znajdziesz, nie martw się;

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