Problem z petlą Delphi.

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]

edytowany 1x, ostatnio: olesio
PD
  • Rejestracja:ponad 22 lata
  • Ostatnio:około 5 godzin
0
Kopiuj
if Listbox1.Items.IndexOf(Edit1.Text) then 
ShowMessage('Pozycja istnieje')
else
Listbox1.Items.Add(Edit1.Text);

pozdrawiam
paweld
SI
  • Rejestracja:prawie 15 lat
  • Ostatnio:prawie 11 lat
  • Postów:184
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:

Kopiuj
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):

Kopiuj
if Edit1.Text = ''
then ShowMessage('Wpisz nazwę itemu!')
else
  if Listbox1.Items.IndexOf(Edit1.Text) = -1
  then Listbox1.Items.Add(Edit1.Text);
PD
fakt, zapomniałem dodać warunku :-)
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:

Kopiuj
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):

Kopiuj
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.

Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Wrocław
  • Postów:13042
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:

Kopiuj
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.

edytowany 2x, ostatnio: Patryk27
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:

Kopiuj
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).

Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Wrocław
  • Postów:13042
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)...


edytowany 1x, ostatnio: Patryk27
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.

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)