[delphi] szukanie wd. kategorii (listbox)

0

Witam,
Mam dość spory problem i jednocześnie wyzwanie dla ambitnych i geniuszy...

Piszę program 'katalog filmowy' i mam trochę listboxów odpowiadających za poszczególne kategorie(tytuł,gatunek itd.).
Dla każdego filmu dodanego do katalogu tworzy siesekcja w INI która wygląda tak:

[tytułfilmu]
tytul=
gat1=
gat2=
gat3=
... itd.
gat1/2/3 to gatunki...

a chcę zrobić coś takiego, że jak dwa razy klikam na element lisboxa z gatunkami to w nowym lisboxie pojawiają mi siętytuły filmów z danego gatunku.

napisałem takie cos i nie działa:

procedure lista_gatClick(sender: Tobject)
var
   str1,str2,str3,it :string;
   i: Integer //licznik

begin
if lista_gat.itemindex<>-1 then
begin
   lista.visible:=true; // nowa lista na której mają sie pokazwać tytuły
INI: Tinifile.create('nazwa.ini');  
try
  for i:=0 to lista_tyt.itemindex do
    begin
      str1:=INI.readstring(lista_tyt.items[i],'gat1',''); // przez lista_tyt.items[i] odwołuję sie do danej sekcji
... to samo dla gat 2 i gat 3...
it:= INI.readstring(lista_tyt.items[i],'tytul',''); // podobnie jak wyżej

if str1:=lista_gat.items[lista_gat.itemindex] then
lista.items.add(it);
   end;
   finally
   INI.free;
end;
end;
end;
 

kilka wyjaśnień:
lista_tyt to lisbox z tytułami (wszystkimi) poprzez które odwołuje sie do sekcji w pliku ini
lista_gat to lisbox z gatunkami
lista to pusty lisbox w którym mają sie pojawiać poszukiwane tytułu
str1/2/3 to zmienne do których wczytuje wartość z kluczy gat1/2/3
it to zmienna do której wczytuje wartośc klucza 'tytul' i który ma sie pojawiać w pustym listboxie

Wiem że to może być dość skomplikowana sprawa zwłaszcza że nie wiem czy dobrze to wyjaśniłem... mam nadzieę że tak i bardzo proszę o pomoc... i prosze by to nie były jakieś wskazówki tylko proszę o fragment kodu...
Z góry dziękuję za wszelką formę pomocy

0

A nie lepiej jakąś sensowną bazę zrobić?
Ewentualnie zastosuj sobie obiekty do Listboxów.

0

Baze danych ? raczej nie bo

  1. mam już prawie cały prog. skończony i tylko to jedno mi brakuje a nie chce niszczyć wszystkiego nad czym siedziałem
  2. nie mam zielonego pojęcia o SQL

wiem że każdy mi tu poleci bazę danych, no ale jednak proszę o pomoc do problemu jaki opisałem...

0

No a jak program będzie wiedział że np. Sami swoi to komedia a nie horror?
Trzeba jakieś ID zrobić dla każdego tytułu, zapisywać go, a potem po tym ID filtrować do nowego lboxa.

Do bazy nie trzeba koniecznie SQL-a.

Takie programy robi się jako bazy danych. Zacznij się tego uczyć, wtedy wszystko załatwiasz jednym wierszem kodu. ;]

0

jak program wie że sami swoi to komedia ? poprzez fakt że dla sami swoi tworzy sie sekcja w INI i tam jest klucz gat1=komedia
sekcje tworze zupełnie gdzie indziej wiec to nie ma znaczenia dla tej sprawy...

0

Ja tam na bazach danych się mało znam, ale można użyć SQLite,
a jeżeli nie chcesz żadnej bazdy danych typowej to możesz sobie
zapisywać dane do pliku typowanego, ma to jednak pewną wadę,
że po dodaniu jakiś nowych pól danych do zapisu format pliku Ci
się zmienia, od biedy może być ini, ale już lepiej to xml. Jeśli na
plik typowany się zdecydujesz, to możesz zapisywać długośc pól
typu string (wszystkich i robić to na początku), a przy odczycie
ustawiać długosć przez SetLength. Do zapisu możesz użyc albo
TMemoryStream albo TFileStream. Chociaż wizualne i nie tylko
komponenty przechowujące jakiekolwiek dane tekstowe, moga
również przechowywać obiekty i tak jak RedbaK Tobie radzil, z
nich polecam Tobie skorzystac. Poniżej prosty przykład. Radzę
zamiast podwojnego klikania na ListBox dać pojedyncze. A dla
przechowywania gatunków utworzyć sobie listę wczytywaną, z
pliku ini czy xml, jak Tobie wygodniej. To poniższe to jest mój
na szybko pisany przykład, ale powinieneś zrozumieć ideę. A i
w przypadku gdy jeden film ma należeć do kilku gatunków, to
też jest do ogarnięcia, tylko należy przechować gatunki choćby
w dynamicznej tablicy albo obiekcie TList i dodawać integer'y.
Chociaż do przechowywania danych o filmach najlepsza będzie
jakaś baza danych - łatwiej zrobić zapytania, wysziwkanie itd.

//...
type
  TFilmDane = class(TObject)
    Tytul : string;
    Gatunek : Word;
  end;

var
  Form1 : TForm1;
  FilmDane : TFilmDane;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender : TObject);
begin
  Application.Title := Caption;
  with GatunkiLB.Items do
  begin
    Clear;
    Add('<WSZYSTKIE>'); // Gatunek = 0
    Add('Komedia'); // Garunek = 1;
    Add('Science fiction'); // Gatunek = 2
    Add('Western'); // Gatunek = 3
  end;
  FilmySL := TStringList.Create;
  with FilmySL do
  begin
    FilmDane := TFilmDane.Create;
    FilmDane.Tytul := 'Olesio Polea Synapse na przekór Hejterom';
    FilmDane.Gatunek := 1;
    FilmySL.AddObject(FilmDane.Tytul, FilmDane);
    FilmDane := TFilmDane.Create;
    FilmDane.Tytul := 'Niejaki rydzek12 poznaje obiekty w Delphi';
    FilmDane.Gatunek := 2;
    FilmySL.AddObject(FilmDane.Tytul, FilmDane);
    FilmDane := TFilmDane.Create;
    FilmDane.Tytul := 'RedbaK w kowbojskiej krainie';
    FilmDane.Gatunek := 3;
    FilmySL.AddObject(FilmDane.Tytul, FilmDane);
  end;
  GatunkiLB.ItemIndex := 0;
  GatunkiLB.OnClick(GatunkiLB);
end;

procedure TForm1.GatunkiLBClick(Sender : TObject);
var
  I : integer;
  LB, DestLB : TListBox;
begin
  LB := TListBox(Sender);
  DestLB := FilmyLB;
  DestLB.Clear;
  if LB.ItemIndex > -1 then
  begin
    if LB.ItemIndex = 0 then
    begin
      DestLB.Items.Assign(FilmySL);
    end
    else
    begin
      for I := 0 to FilmySL.Count - 1 do
      begin
        FilmDane := TFilmDane(FilmySL.Objects[I]);
        if FIlmDane.Gatunek = LB.ItemIndex then
        begin
          DestLB.Items.AddObject(FilmDane.Tytul, FilmDane);
        end;
      end;
    end;
  end;
end;
0

Tak czy siak autorowi tematu życzę ukończenia softu, a potem zahaczenia podstaw tworzenia baz danych. :)
Artykuły na 4p i google.
Ja już chyba bez nich żyć nie mogę. :) Przy 2 kompach w domu i 2 różnych sieciach można się nieźle nauczyć lokalnie i zewnętrznie. :)

0

Twój kod nie bardzo chce działać :/
Masz może pomysł na to jak przerobić sprytnie mój kod by działał ?
Nie jestem geniuszem jeśli idzie o programowanie (zwłaszcza delphi/pascal) ale chciałbym móc coś rozumiec z kodu

0

@rydzek12: mój kod na pewno działa. Mimo, że był pisany na szybko, to jak zwykle
bywa przy wklejaniu kodu przeze mnie - został wcześniej pod Delphi już sprawdzony.
Dostosuj go sobie teraz do swoich potrzeb. Nie każę Tobie robić identycznie i jedynie
podałem taki przykład abyś zrozumiał ideę, jak poslugiwać się obiektami w Delphi :)
Jedynie czego zapomniałem dodać to w sekcji public deklaracja FilmySL : TStringList;
Napisz konkretnie jaki masz błąd u co nie działa, bo tak nie jestem w stanie pomóc.

0

Ok. Nie będe sie kłócił bo na pewno jesteś lepszym programistą ode mnie ...
ale w końcu sobie poradziłem :)(moim sposobem):)
ale dzięki za poswięcony czas:)

0

Olesio dał Ci wszystko jak na tacy. Bardzo ładnie.

Ale jak sobie poradziłes sam, to tylko wpływa to na Twoją satysfę.

Mój 6-letni syn Hakan potrafi zrobić bazę w sieci lokalnej. Nie bądź gorszy od niego. :)

A SQL ma w palcu.

Pozdrawiamy. :)

0

Pewnie dlatego, bo ma dobrego nauczyciela. Zdolnego ojca programistę ;)

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