Zewnętrzne dane do listboxa lub memo

0

Cześć

Potrzebuje na zaliczenie przedmiotu - zrobić w programie spis samochodów z podziałem na marki, modele i rodzaje silnikowe.
Próbuje to zrobić na listboxie i na razie dodaje do indeksu na sucho wszystkie marki ( chociaż wolałbym ładowane z jakiegoś pliku tekstowego )
ale już widzę, że będzie mały problem.

Program wygląda tak jak w załączniku:

Kłopot zaczyna się już od początku:

 procedure TForm1.ListBox1Click(Sender: TObject);
begin
 if listbox1.ItemIndex = 1 then
 listbox2.Items.Add('AUDI A1');
 listbox2.Items.Add('AUDI A2');
 listbox2.Items.Add('AUDI A3');
 listbox2.Items.Add('AUDI A4');
 listbox2.Items.Add('AUDI A5');

W zasadzie ta metoda odpada, bo po kliknięciu w dowolny wpis z listbox1 - dodadzą się te same wpisy w listbox2.

No i podobna sprawa między listbox2 a listbox3:

if listboxX.ItemIndex = 1 then I tu już niezależnie czy to będzie Alfa, Audi czy jakieś inne - zawsze doda te same elementy.

Jak można to obejść ? Zastosować jakieś ID ?

0

Zasadniczo ten temat nadaje się do działu newbie ale spróbuję ci coś podpowiedzieć. Jeśli koniecznie potrzebujesz to zrobić na listbox to spoko (choć lepiej by się do tego nadał treeview) ale wracając do listboxa. Klasa TListBox posiada bardzo fajną właściwość SELECTED, która po przekazaniu indeksu wskazuje, czy dany rekord jest zaznaczony

if ListBox1.Selected[1] then
  <ZAŁADUJ AUDI>
else if ListBox1.Selected[2] then
  <ZAŁADUJ ALFE> 

Oczywiście jest to bardzo proste rozwiązanie bo można to zrobić na 100 różnych sposobów. Zasadniczo możesz użyć funkcji

case

do sprawdzenia, który jest zaznaczony.
Jeśli lista aut/marek itd będzie stała to proponuję array lub TStringList (można go od razu załadować do TListBox jedną metodą). Jeśli czegoś nie zrozumiałeś to pisz.

2

To co podałeś tylko sformatowane w sposób czytelny dla ciebie:

procedure TForm1.ListBox1Click(Sender: TObject);
begin
 if listbox1.ItemIndex = 1 then
 begin
   listbox2.Items.Add('AUDI A1');
 end;
 listbox2.Items.Add('AUDI A2');
 listbox2.Items.Add('AUDI A3');
 listbox2.Items.Add('AUDI A4');
 listbox2.Items.Add('AUDI A5');
end;
ListBox2.Items.LoadFromFile(`AUDI.txt`);
ListBox2.Items.Text:='AUDI A1'#10'AUDI A2'#10'AUDI A3'#10'AUDI A4'#10'AUDI A5';
var fd:TIniFile;

  fd:=TIniFile.Create('plik.ini');
  fd.ReadSections(ListBox1.Items);
  ListBox1.ItemIndex:=0;
  fd.ReadSectionValues(ListBox1.Items[ListBox1.ItemIndex],ListBox2.Items);
0
_13th_Dragon napisał(a):
ListBox2.Items.LoadFromFile(`AUDI.txt`);

To zrozumiałe, przerobiłem to już, żeby pobierał również z pliku do listbox1.

_13th_Dragon napisał(a):
ListBox2.Items.Text:='AUDI A1'#10'AUDI A2'#10'AUDI A3'#10'AUDI A4'#10'AUDI A5';

A to co za zabieg ? Wpisywanie do listboxa kolejno modele po "enterze" ? Tylko w jakim celu jak to będzie w pliku tekstowym ?

_13th_Dragon napisał(a):
var fd:TIniFile;

  fd:=TIniFile.Create('plik.ini');
  fd.ReadSections(ListBox1.Items);
  ListBox1.ItemIndex:=0;
  fd.ReadSectionValues(ListBox1.Items[ListBox1.ItemIndex],ListBox2.Items);

Uuu... A w tym pliku ini co ma się znaleźć ? Dobrze rozumiem, że to ma indywidualnie zaznaczać konkretny wpis w listboxie ?

0
[AUDI]
AUDI A2
AUDI A3
AUDI A4
AUDI A5

[RENAULT]
MEGANE

Więc masz jeden plik, przy starcie dajesz to co podałem wyżej zaś po zmianie zaznaczonego w ListBox1 dajesz ostatni wiersz:

fd.ReadSectionValues(ListBox1.Items[ListBox1.ItemIndex],ListBox2.Items);

W wyniku czego masz załatwioną całość kilkoma wierszami.

0

Coś skaszaniłem...

procedure TForm1.TabSheet2Show(Sender: TObject);
begin
  ListBox1.Items.LoadFromFile('dane/marki.txt');
end;

I tu jest OK, lista sie nie zmienia, można ją załadować do listbox1 i temat listbox1 może być zamknięty...

procedure TForm1.ListBox1Click(Sender: TObject);
var fd:TIniFile;
begin
fd:=TIniFile.Create('plik.ini');
fd.ReadSections(ListBox1.Items);
ListBox1.ItemIndex:=0;
fd.ReadSectionValues(ListBox1.Items[ListBox1.ItemIndex],ListBox2.Items);
end;

To, co podałeś ma sens tylko nie umiem go jakoś zastosować...

0

Bo bez ścieżki konstruktor chce czytać z katalogu Windowsa. Dodaj tam ExtractFilePath(Application.ExeName); i powinno być ok.

0
// w części private klasy
fd:TIniFile;

// w OnCreate lub konstruktorze klasy
fd:=TIniFile.Create('plik.ini');
fd.ReadSections(ListBox1.Items);
ListBox1.ItemIndex:=0;
fd.ReadSectionValues(ListBox1.Items[ListBox1.ItemIndex],ListBox2.Items);

// w OnDestroy lub destruktorze klasy
fd.Free;

// w ListBox1Click
fd.ReadSectionValues(ListBox1.Items[ListBox1.ItemIndex],ListBox2.Items);

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