Problem z petlą Delphi.

0

Problem polega na tym że, gdy mam
[code] for i:=0 to Listbox1.Count-1 do[/code]
Program nie chce dorzucić lini do listboxa gdyż wgl nie zaczyna pętli.
Z drugiej strony usuwając -1 z listbox1.count program wysypuje się po wcisnieciu buttona gdyż próboje dodac zapisać coś na wyższym indexie niż istnieje. Próbowałem także zrobić to w taki sposób że gdy listboxcount = 0 dodaje linie bez zadnych sprawdzen a potem leci po tej pętli for. Myślałem że załatwiłem sprawe a okazało się że po dodaniu 4-5 indexu
pętla szaleje nie sprawdza warunku dodaje po pare pustych indexow do każdego listboxa potem dopiero z editów i na koniec dodatkowo bład że taki już jest (mimo że on to powinien sprawdzić najpierw).

[code]procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
begin
if edit1.Text = '' then
showmessage('Wpisz nazwe itemu!')
else
for i:=0 to Listbox1.Count-1 do
begin
if Edit1.Text = listbox1.items.strings[i] then
begin
showmessage('Podany item istnieje!!!');
break;
end
else
begin
ListBox1.Items.Add(Edit1.Text);
ListBox2.Items.Add(Edit2.Text);
ListBox3.Items.Add(Edit3.Text);
Edit1.Clear;
Edit2.Clear;
Edit3.Clear;
break;

    end;
end;

end;
[/code]

0
if Listbox1.Items.IndexOf(Edit1.Text) then 
ShowMessage('Pozycja istnieje')
else
Listbox1.Items.Add(Edit1.Text);
0
bulus_nolog napisał(a):

for i:= 0 to Listbox1.Count - 1 do

Czy zamiast pytać na forum, nie lepiej byłoby zapytać kompilatora, co on na to?
Odpowiedź kompilatora: Undeclared identifier 'Count'.
I sprawa jest jasna, ListBox1 nie posiada właściwości, pola, metody, czy czego tam jeszcze, o nazwie "Count". Natomiast ListBox1 posiada właściwość (property) "Items" i tu dopiero można zastosować "Count". Kod powinien więc wyglądać tak:

for i:= 0 to Listbox1.Items.Count - 1 do

... ale jest prostszy sposób niż przeszukiwać w pętli cały ListBox aby znaleźć element o danej nazwie. Podał go Paweł Dmitruk, ale nie ustrzegł się błędu. Poprawiony kod (dostosuj do swoich potrzeb):

if Edit1.Text = ''
then ShowMessage('Wpisz nazwę itemu!')
else
  if Listbox1.Items.IndexOf(Edit1.Text) = -1
  then Listbox1.Items.Add(Edit1.Text);
0
simplex napisał(a):
bulus_nolog napisał(a):

for i:= 0 to Listbox1.Count - 1 do

Czy zamiast pytać na forum, nie lepiej byłoby zapytać kompilatora, co on na to?
Odpowiedź kompilatora: Undeclared identifier 'Count'.
I sprawa jest jasna, ListBox1 nie posiada właściwości, pola, metody, czy czego tam jeszcze, o nazwie "Count". Natomiast ListBox1 posiada właściwość (property) "Items" i tu dopiero można zastosować "Count". Kod powinien więc wyglądać tak:

for i:= 0 to Listbox1.Items.Count - 1 do

... ale jest prostszy sposób niż przeszukiwać w pętli cały ListBox aby znaleźć element o danej nazwie. Podał go Paweł Dmitruk, ale nie ustrzegł się błędu. Poprawiony kod (dostosuj do swoich potrzeb):

if Edit1.Text = ''
then ShowMessage('Wpisz nazwę itemu!')
else
  if Listbox1.Items.IndexOf(Edit1.Text) = -1
  then Listbox1.Items.Add(Edit1.Text);

Mi kompilował listbox1.count i nie plakał o nic. Jestem nowy (programuje od 2 dni i nie wyłapuje takich rzeczy tak łatwo). Ale szybko się ucze (jakis taki w miare prosty język). Nie spodziewałem się że items.indexof przeszukuję cała liste (chociaż teraz już to powoli łapie).
Potrzebował bym jeszcze pomocy w 1 rzeczy. Natomiast chodzi o to że posiadam np 3 listboxy (ale w przyszłosci bedzie więcej ich jeszcze do tego dojda jakies memo albo coś. Chodzi o to żeby wszystkie listboxy itp zapisać do 1 pliku (na razie żeby to działało zapisują się każdy listbox do innego pliku.)

0

Mi kompilował listbox1.count i nie plakał o nic.

Też tak piszę. Zależy od kompilatora i wersji. Po prostu koledzy mają bodaj starsze delphi.

Ale szybko się ucze (jakis taki w miare prosty język). Nie spodziewałem się że items.indexof przeszukuję cała liste (chociaż teraz już to powoli łapie).

LCL/VCL jest pełne wysokopoziomowych rzeczy.
Nie mów że język prosty dopóki się nie nauczysz do końca. Pętla for to nie szczyt osiągnięć.

A twój kod miał taki problem że jeżeli item nie istniał do go dodawał za każdym razem w pętli.

Potrzebował bym jeszcze pomocy w 1 rzeczy. Natomiast chodzi o to że posiadam np 3 listboxy (ale w przyszłosci bedzie więcej ich jeszcze do tego dojda jakies memo albo coś. Chodzi o to żeby wszystkie listboxy itp zapisać do 1 pliku (na razie żeby to działało zapisują się każdy listbox do innego pliku.)

To musisz napisać własną metodę do zapisu, która stworzy plik, zapisze pętlami teksty i zamknie go. W googlach masa poradników.

0

Chodzi o to żeby wszystkie listboxy itp zapisać do 1 pliku (na razie żeby to działało zapisują się każdy listbox do innego pliku.)

Otwórz jeden plik (AssignFile+jakiś poradnik o plikach, jeżeli jeszcze nie przeczytałeś), a potem coś w stylu:

Var S: String;
    TF: TextFile;
Begin
 {...}
 For S in ListBox1.Items Do
  Writeln(TF, S);
 For S in ListBox2.Items Do
  Writeln(Tf, S);

Powinno przejść w nowszych Delphi oraz Lazarusie (nie jestem pewien czy TStringList to obsługuje, ale chyba tak; jeżeli nie - For ZmiennaTypuInt := 0 To ListBox1.Count-1 Do Writeln(TF, ListBox1.items[ZmiennaTypuInt])).


Ogólnie chodzi o to, abyś ręcznie otworzył plik i pozapisywał to wszystko.
0
Patryk27 napisał(a):

Chodzi o to żeby wszystkie listboxy itp zapisać do 1 pliku (na razie żeby to działało zapisują się każdy listbox do innego pliku.)

Otwórz jeden plik (AssignFile+jakiś poradnik o plikach, jeżeli jeszcze nie przeczytałeś), a potem coś w stylu:

Var S: String;
    TF: TextFile;
Begin
 {...}
 For S in ListBox1.Items Do
  Writeln(TF, S);
 For S in ListBox2.Items Do
  Writeln(Tf, S);

Powinno przejść w nowszych Delphi oraz Lazarusie (nie jestem pewien czy TStringList to obsługuje, ale chyba tak; jeżeli nie - For ZmiennaTypuInt := 0 To ListBox1.Count-1 Do Writeln(TF, ListBox1.items[ZmiennaTypuInt])).


Ogólnie chodzi o to, abyś ręcznie otworzył plik i pozapisywał to wszystko.

var
ZmiennaTypuInt: integer;
TF: TextFile;
Begin
AssignFile(TF, 'plik.txt');
ReWrite(TF);
For ZmiennaTypuInt := 0 To ListBox1.Count-1 Do
writeln(TF, ListBox1.items[ZmiennaTypuInt]);
For ZmiennaTypuInt := 0 To ListBox2.Count-1 Do
writeln(TF, ListBox2.items[ZmiennaTypuInt]);
For ZmiennaTypuInt := 0 To ListBox3.Count-1 Do
writeln(TF, ListBox3.items[ZmiennaTypuInt]);
closeFile(TF);
end;

Taka składnia chodzi jak najbardziej. Tylko teraz pytanie skąd program ma wiedzieć co należy do czego skoro po prostu wpisał przykładowo 6 linijek (chociaż myśle czy nie da sie zrobic w tym przypadku tak że ilość linijek /3 i wczytywać tą ilość linijek do każdej tabeli). Ale są pewnie optymalniejsze sposoby na to (chodzi o odczytywanie z tego własnie pliku).

0

Faktycznie, kod nie zapisuje co należy do czego; w takim razie najłatwiej będzie skorzystać z plików INI.
Btw, zamiast ZmiennaTypuInt lepiej jest zrobić sobie zmienną np.i (lub jakąkolwiek o krótszej nazwie)...

0

var
ZmiennaTypuInt: integer;
TF: TextFile;
Begin
AssignFile(TF, 'plik.txt');
ReWrite(TF);
For ZmiennaTypuInt := 0 To ListBox1.Count-1 Do
writeln(TF, ListBox1.items[ZmiennaTypuInt]);
For ZmiennaTypuInt := 0 To ListBox2.Count-1 Do
writeln(TF, ListBox2.items[ZmiennaTypuInt]);
For ZmiennaTypuInt := 0 To ListBox3.Count-1 Do
writeln(TF, ListBox3.items[ZmiennaTypuInt]);
closeFile(TF);
end;

Żeby tagi wstawić za głupi jesteś? Poprzednim razem chociaż próbowałeś ich użyć. Jakbyś się nie uczył na błędach... ja widzę raczej regresję.

chociaż myśle czy nie da sie zrobic w tym przypadku tak że ilość linijek /3 i wczytywać tą ilość linijek do każdej tabeli

Jeżeli jest ich zawsze tyle samo to da się i nie jest to znowu najgorsze rozwiązanie, ale wymaga dwóch przejść przez plik. Możesz na początku zapisać ilość linii etc. albo użyć czegoś gotowego np. modułu do plików INI jak to mówił @Patryk27 .
I ogarnij się czy używasz ogonków czy nie. Bo o ile oba są tolerowane to nie naprzemiennie. Skoro masz OS który to wspiera i chcesz tak pisać to tak PISZ.

Btw, zamiast ZmiennaTypuInt lepiej jest zrobić sobie zmienną np.i (lub jakąkolwiek o krótszej nazwie)...

Tak to jest jak się używa Ctrl+C, Ctrl+V na kursie.

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