Wątek przeniesiony 2016-11-11 14:11 z Delphi i Pascal przez furious programming.

Generowanie kilku imion i dodanie ich do ListBox - co robię źle?

0

Witam.

Piszę ten temat, gdyż nie mogę poradzić Sobie z kodem. Oto on:

procedure TForm1.Button5Click(Sender: TObject);
var
  i:integer;
  s1:string;
  s2:string;
begin
  s1:= 'Maciek'
  s2:= 'Paulina'
  
  for i:= 0 to listbox1.items.count -1 do
  begin
    if pos(listbox1.items[i],s1) <> 0 then
    begin
      showmessage('elo ' + s1);
    end
    else
    begin
      application.Title:='raz';
      showmessage('spadaj ' +s1);
      Application.Terminate;

      if pos(listbox1.items[i],s2) <> 0 then
      begin
        showmessage('elo' +s2);
      end
      else
      begin
        application.Title:='dwa';
        showmessage('spadaj ' +s2);
      end;
    end;
  end;
end;

end.

Chodzi o to że na FormCreate zrobiłem takie coś by mi generowało kilka imion i dodało je do listboxa. Na buttonie chcę by jeżeli choć jedno imię z tych zapisanych jako string się pojawiło to ma się coś dziać. Na chwilę obecną dałem "showmessage". No spoko, działa. Niestety, ale wygląda to tak: "elo Maciek", a zaraz pojawia się message z napisem "spadaj Maciek". Chcę by "spadaj Maciek" sie pojawiało tylko gdy tego imienia nie ma na listboxie.
Proszę o pomoc. Jestem początkującym programmerem - dopiero się uczę :) Z tego właśnie względu robię pierdoły tego typu.

Dzięki.

1

Korzystaj z wbudowanej właściwości IndexOf ma ona dodatkowo tą zaletę że nie odróżnia wielkości liter czyli znajdzie zarówno MACIEK, Maciek jak i maciek (oczywiście to tylko kilka możliwych przykładów, bo równie dobbrze mogło by być mACIEK).

  if ListBox1.Items.IndexOf('maciek') >- 1 then
    //znalzeziono
  else
   //nie znaleziono
0

Dzięki, ogarnąłem :D
Działa jak należy.

Pytanie tylko mam jeszcze.
Dałoby radę zrobić tak by może zamiast listboxa, żeby te imiona czytało z notatnika?
Na chwilę obecną jestem wstanie zrobić tak, by imiona z notatnika szły do listboxa, a później buttonem je sprawdzam.
Wolałbym jednak by one były sprawdzane bezpośrednio z notatnika :)

Var
  TF : TextFile;
  s : String;
  i : integer;

Begin
  AssignFile(TF, 'Check.txt');
  Reset(TF);
  While Not Eof(TF) Do
  Begin
    Readln(TF, S);
    listbox1.items.add(S);
  End;
  CloseFile(TF);
end; 
0

Dałoby radę zrobić tak by może zamiast listboxa, żeby te imiona czytało z notatnika?

Z notatnika czy z pliku tekstowego? Dane trzymane są w plikach, a nie w programach; No chyba że masz na myśli kod, który znajdzie otwarte okno programu np. notepad.exe, znajdzie uchwyt jego pola tekstowego i pobierze sobie jego całą zawartość;

Jeśli chodzi o ten kod:

Var
  TF : TextFile;
  s : String;
  i : integer;
 
Begin
  AssignFile(TF, 'Check.txt');
  Reset(TF);
  While Not Eof(TF) Do
  Begin
    Readln(TF, S);
    listbox1.items.add(S);
  End;
  CloseFile(TF);
end;

To raczej oczywistym jest, że to Twoje sprawdzanie musisz wykonać w miejscu linii listbox1.items.add(S);.

0

Okej. Tak, chodziło mi o notatnik (plik *txt).

Mógłby mi ktoś pomóc z kodowanie/dekowaniem tekstu?

 

procedure TForm1.Button3Click(Sender: TObject);
var
  i, z : integer;
  tekst : string;
begin
  tekst := Memo1.Lines.Text;
  z := 0;
  for i:=1 To Length(Memo1.Lines.Text) -1 Do
  begin
    z := z + 1;
    tekst[i] := Char(Ord(tekst[i])-2 + z);
    if z < 4 then
    z := 0
  end;
  Memo2.Lines.Text := tekst;
end;

procedure TForm1.Button4Click(Sender: TObject);
var
  i, z : integer;
  tekst : string;
begin
  tekst := Memo2.Lines.Text;
  z := 0;
  for i:=1 To Length(Memo2.Lines.Text) -1 Do
  begin
    z := z + 1;
    tekst[i] := Char(Ord(tekst[i])+2 - z);
    if z < 4 then
    z := 0
  end;
  Memo1.Lines.Text := tekst;
end;

Problem jest taki, że gdy koduję z np. edit1.text to nie ma problemu. Jednak gdy staram się kodować więcej stringów na raz to pojawia się problem taki, że na końcu każdego pojawia się jakiś głupi znaczek.

Chodzi mi o to:
user image

0
Ord(tekst[i])

to może nie działać prawidłowo na stringu kodowanym w Unicode

0

Jak w takim razie odkodować coś co jest w memo, lub listboxie poprawnie?

0

Bo pewnie Ci się wpieprza znak nowego wiersza a po drugie (już bez wpływu na to) if z < 4 then nie uważasz że ten warunek zawsze będzie spełniony? Nike powinno być czasem if z > 4 then?
@grzegorz_so to Delphi 7 (widzę po ikonie ze screena) to jakie unicode ;)

0

użyj funkcji obsługujących Unicod jak np "midstr"

0

Masz "kodowanie" a dekodowanie zrób sobie sam (na tej podstawie nie wiele trzeba zmienić):

procedure TForm1.Button1Click(Sender: TObject);
var
  i, j, z: Integer;
  tekst: string;
begin
  Memo2.Lines.Clear;
  for i:= 0 to Memo1.Lines.Count -1 do
  begin
    tekst:= Memo1.Lines.Strings[i];
    z:= 0;
    for j:=1 to Length(tekst) do
    begin
      Inc(z);
      tekst[j]:= Char(Ord(tekst[j]) -2 + z);
      if z > 4 then
        z:= 0
    end;
    Memo2.Lines.Add(tekst);
  end;
end;

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