Program TV w liście jednokierunkowej i wyświetlanie jej na formatce

0

Witam,
muszę napisać program, który z pliku tekstowego będzie wczytywał do listy jednokierunkowej program telewizyjny i wyświetlał go na formatce. Czy zrzucenie danych z pliku do memo to rozsądne rozwiązanie? Program musi mieć opcję sortowania wg wybranego kryterium, możliwość edycji wybranych pół i dodawanie nowych wierszy (7 tabel z poszczegółnymi dniami tygodnia, w każdej po 3 kolumny - godzina, nazwa programu i rodzaj programu). Myślałem jeszcze nad panelem, ale wtedy edycja i sortowanie byłyby problemem (chyba). Jest to mój pierwszy program obiektowy, wcześniej pisałem tylko aplikacje konsolowe, więc będę wdzięczny za wszelkie sugestie. Chodzi mi tylko o ogólny zarys, z jakich komponentów skorzystać żeby nie narobić za dużo baboli.
Pozdrawiam

0

Ostatnio jakąś moda nastała na te listy jednokierunkowe. Ja tego nigdy sam nie ogarniałem. Jeżeli chcesz napisać to obiektowo i możesz pisać pod VCL, a nie na przykład w czystym WinAPI. I nikt na Tobie nie wymusza żadnych rozwiązań. To dlaczego najprościej nie zrobić tego w oparciu o prosty typ obiektowy i wspomóc się po prostu TList. Obsługa sortowania jest, dodasz i usuniesz co chcesz, jak i znajdziesz. Tylko trzeba wszystko sobie przemysleć. Do wyświetlenia najlepiej rysowany po swojemu ListBox/ListView/TreeView albo cokolwiek byle by czytelne. Tak ja bym pokombinował. Zrobisz jak uważasz, bo pewnie ktoś jeszcze tutaj coś Tobie doradzi, może i lepszego.

0

Dzięki za odpowiedź. Niestety muszę posłużyć się listą jednokierunkową i tę listę też muszę sortować, wymagane na zaliczenie :)

0

To jaki masz problem z tą listą?

0

Z listą jednokierunkową nie mam problemu. Zrzuciłem wszystko do ListView tak jak poradził kolega wyżej. Czy mogę dodać jakoś zdarzenie onClick do poszczególnych itemów i subitemów? Znalazłem w internecie jedno rozwiązanie, ale wykorzystuje ono pozycję kursora myszki, można jakoś inaczej dobrać się do klikniętego itema?

0
OnChange
  if Node=nil then // brak zaznaczenia
  else if List1.Selected[Node] then // zaznaczono
  else // odznaczono
0

Powinieneś wykorzystać raczej zdarzenie OnColumnClick i sortować po kliknięciu na nagłówek kolumny. Tylko czy wystarczy że za pomocą OnCompare posortujesz Itemy w ListView czy musisz sortować listę jednokierunkową i taką posortowaną wczytywać do ListView ?

0

Sortowanie niestety po liście jednokierunkowej. Chyba już wszystko wiem, dzięki za pomoc ;)

0

Niestety z listą jednokierunkową pojawiły się problemy :D Jak zamienić dwa elementy listy miejscami?

 
prev:=root;
if (prev^.dzien<prev^.next^.dzien) then begin
 wsk:=prev;
 prev:=prev^.next;
 prev^.next:=wsk;
  end;

Ten kod niestety wiesza mi program. root to pierwszy element na liście, wsk to wskaźnik pomocniczy.

0

W przypadku jeżeli są sąsiednimi:

  1. Wytnij (kompletnie) pierwszy z nich.
  2. Wstaw go po tym drugim.
0

Nie wiem czy dobrze zrozumialem. Jeżeli mam wyciąć pierwszy z nich to muszę skorzystać z dispose(), a wtedy stracę cały rekord, prawda?

0

Nie, masz poprawnie usunąć rekord z listy a potem go poprawnie wstawić.
Nikt nie mówi o fizycznym zwolnieniu pamięci.

0

Jeżeli mam wyciąć pierwszy z nich to muszę skorzystać z dispose(), a wtedy stracę cały rekord, prawda?

Jak użyjesz Dispose to zwolnisz strukturę z pamięci i bezpowrotnie utracisz dane...

Nie wiem jak wygląda Twoja struktura (bo niestety nie pokazałeś kodu), ale w przypadku, gdy jedna struktura (jeden węzeł listy) zawiera dane np. w jednym - dwóch polach, to szybciej będzie po prostu zamienić wartości tych pól między sąsiednimi węzłami nie dotykając wskaźników, niż zamieniać cały węzeł razem z adresem wskaźnika na kolejny węzeł;

Tak przynajmniej ja bym kombinował - może inni będą mieli lepsze pomysły;


EDIT: Choć chyba najszybciej będzie po prostu zamienić w sąsiednich węzłach jedynie adres na kolejny węzeł - uniknie się zbędnego kopiowania danych...

0

Wymyslilem cos takiego, ale nie wiem dlaczego lista sortuje sie poprawnie dopiero po 3 wywolaniach tej funkcji:

 
aktualny:=Root;
poprzedni^.next:=Root;
for i := 1 to ilosc-1 do
begin
  while aktualny^.next<>nil do
  begin
    if ((aktualny^.dane)<(aktualny^.next^.dane)) then
    begin
      if aktualny=Root then
      begin
        temp:=aktualny^.next;
        aktualny^.next:=temp^.next;
        Root:=temp;
        temp^.next:=prev;
      end else 
      begin
        temp:=aktualny^.next;
        aktualny^.next:=temp^.next;
        poprzedni^.next:=temp;
        temp^.next:=aktualny;
      end;  
      aktualny:=aktualny^.next;
      poprzedni:=poprzedni^.next; 
    end;
  end;
end;
0

Poprawiony kod (wciaz nie dziala), niestety nie mam konta zeby edytowac tamten.

aktualny:=Root;
poprzedni^.next:=Root;
for i := 1 to ilosc-1 do
begin
  while aktualny^.next<>nil do
  begin
    if ((aktualny^.dane)<(aktualny^.next^.dane)) then
    begin
      if aktualny=Root then
      begin
        temp:=aktualny^.next;
        aktualny^.next:=temp^.next;
        Root:=temp;
        temp^.next:=aktualny;
      end else 
      begin
        temp:=aktualny^.next;
        aktualny^.next:=temp^.next;
        poprzedni^.next:=temp;
        temp^.next:=aktualny;
      end;  
      aktualny:=aktualny^.next;
      poprzedni:=poprzedni^.next; 
    end;
  end;
end;

dodanie znacznika <code class="delphi"> - fp

0

I co niby mamy tu wypatrzyć skoro nawet deklaracje nie raczyłeś podać.

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