Dodawanie w zalezności od wybranego RadioButona

0

Cześć. Potrzebna pomoc.
Mam krótki programik.
Po kliku w Button dodajemy w zależności od wybranego RadioButtona do Lisboxa Item ** Imię lub Nazwisko **lub Imię i nazwisko Listbox ma się aktualizować zmianą RadioButona Wszystko jak poniżej Działa ale jak to prościej(może poprawniej) zapisać .

procedure TForm1.Button1Click(Sender: TObject);
begin
Dodaj;
end;

procedure TForm1.Dodaj ;
begin
  if RadioButtonImie.Checked then
  begin
  listBox1.Items.Clear();
  Listbox1.Items.Add('Jan');
  end;
  if  RadioButtonNazwisko.Checked then
  begin
  listBox1.Items.Clear();
  Listbox1.Items.Add('Kowalski');
  end;
  if  RadioButtonImieINazwisko.Checked then
  begin
  listBox1.Items.Clear();
  Listbox1.Items.Add('Jan');
  Listbox1.Items.Add('Kowalski');
   end;
end; 

procedure TForm1.RadioButton1Click(Sender: TObject);
begin
Dodaj;
end;

procedure TForm1.RadioButton2Click(Sender: TObject);
begin
Dodaj;
end;

procedure TForm1.RadioButton3Click(Sender: TObject);
begin
Dodaj;
end;

0

Nie używaj radio buttonów, tylko RadioGroup.

A potem:

listBox.Clear;
case radioGroup.ItemIndex of
  0: listBox.Lines.Add('Jan');
  1: listBox.Lines.Add('Kowalski');
  2:
    begin
       listBox.Lines.Add('Jan');
       listBox.Lines.Add('Kowalski');
    end;
end;

Procedurę Dodaj wywołujesz wtedy w OnClick radioGroup.

No i po co masz ListBox.Clear w każdym warunku? Skoro masz w każdym warunku, to znaczy, że bezwarunkowo ten Clear ma się wykonać. Więc może być tylko raz przed wszystkimi Twoimi ifami.

Poza tym, gdy masz warunki, które wzajemnie się wykluczają - jak w Twoim przypadku, jeśli będzie spełniony warunek pierwszy, to NIGDY nie będą spełnione pozostałe warunki - to stosuj if else:

if radioButton1.Checked then
begin

end else
  if radioButton2.Checked..

itd.

0

Dzięki za treściwą odpowiedź ale mam jeszcze jedno pytanie. Teraz odnośnie CheckListBox. Mam w nim Pracownik1 i **Pracownik2 **moją procedurke dodaj podpiałem pod OnClickCheck w CheckListBox
To działa, prawie Jak tylko zrobić by procedurka Dodaj Dodawała i usuwała dane z ListBoxa w zależności który pracownik jest zaznaczony i usuwała z niego odchaczanego

procedure TForm1.Dodaj ;
var
i :string;
begin
 i := CheckListBox1.Items[CheckListBox1.ItemIndex];
  case radioGroup1.ItemIndex of

  0: Listbox1.Items.Add ...
  1: Listbox1.Items.Add ...
  2: 
      begin
      Listbox1.Items.Add ...
      Listbox1.Items.Add ...
      end;
 end;
end;

procedure TForm1.ComboBox1Change(Sender: TObject);
begin
  ListBox1.Items.Clear() ;
  dodaj;
end;

zrobiłem coś takiego poniżej ale dalej coś nie tak. Zaznaczając uprzednio pracownik(n) w ListCheckBox jego dane dodają się poprawnie do Listbox, gdy zaznaczam drugiego tj. np.: pracownik2 dodają się dane ale uprzedniego się wymazują a wybranego teraz są podwójnie . Jak to powinno wyglądać poprawnie?

 procedure TForm1.Dodaj ;
var
   I : integer;
   j:string;
begin
    j := CheckListBox1.Items[CheckListBox1.ItemIndex];
    ListBox1.Items.Clear;

    for I := 0 to CheckListBox1.Items.Count -1 do
    if CheckListBox1.Checked[i] then
     case radioGroup1.ItemIndex of
     0: Listbox1.Items.Add(XMLDocument1.DocumentElement.ChildNodes[j].ChildValues['imie']);
     1: Listbox1.Items.Add(XMLDocument1.DocumentElement.ChildNodes[j].ChildValues['nazwisko']);
     2:
      begin
      Listbox1.Items.Add(XMLDocument1.DocumentElement.ChildNodes[j].ChildValues['imie']);
      Listbox1.Items.Add(XMLDocument1.DocumentElement.ChildNodes[j].ChildValues['nazwisko']);
      end;
     end;
0

No przecież program działa tak, jak jest napisany. Na początku czyścisz itemy w listBoxie, więc czego się spodziewasz? ItemIndex (z pierwszej linijki) zwraca Ci indeks zaznaczonego (w sensie podświetlonego) itema w CheckListBox. Więc pewnie tu jest też coś nie tak.

0

Tez podobnie myślę ale muszę pobrać nazwę tego itema do ChildNodes[j]. Więc jak to zrobić by był wilk syty i owca cała

0

Nie używaj ItemIndex, bo on Ci zwraca indeks podświetlonego Itema. Sprawdź, jakie itemy masz zaznaczone. Albo CheckListBox ma chyba takie zdarzenie jak OnCheck. To jest wywoływane, gdy klikniesz na ptaszka. I możesz sprawdzić, czy ten element jest zaptaszkowany, czy nie. Jesli jest zaptaszkowany, to znaczy, że właśnie go zaznaczyłeś. Jeśli nie, to właśnie go odznaczyłeś. I metoda Dodaj powinna być z odpowiednim parametrem. Wtedy Dodaj jest wywoływane z tego zdarzenia (OnCheck) z odpowiednim parametrem. I po problemie.

0

Dodałem to pod OnClickCheck nawet pousuwałem większość do testów ale dalej to ustrojstwo nie trybi jak powinno. Po kliku raz dodaje pojedynczo raz podwójnie gdy mamy odhaczonego jednego ptaszka i jak to ustrojstwo odhaczając usunąć z Listboxa. Nie wiem :( porażka. Pewnie ja czegoś nie rozumiem bo to nie może być aż tak nie możliwe

procedure TForm1.CheckListBox1ClickCheck(Sender: TObject);var
var
  i:integer ;
begin
  for I := 0 to CheckListBox1.Items.Count -1 do
 if CheckListBox1.Checked[i] then
  case radioGroup1.ItemIndex of

  0: Listbox1.Items.Add('imie');
  1: Listbox1.Items.Add('nazwisko');
  2: begin
    Listbox1.Items.Add('imie');
    Listbox1.Items.Add('nazwisko');
    end;
 end;
end;
0

Kod wygląda w miarę dobrze, choć może wyglądać lepiej. I też nie wiem czy pytacz zdaje sobie sprawę z tego, że w przypadku, gdy zaznaczony jest ostatni radio-przycisk, do ListBox dodane zostaną dwie linijki dla jednej pozycji, dlatego że metoda Items.Add wołana jest dwa razy. Być może to jest powodem rzekomego dublowania danych. Co do reszty to już napisał poprzednik o bezmyślnym używaniu ItemIndex, więc nie ma co powtarzać.

Moja propozycja:

procedure TMainForm.CheckListBoxClickCheck(Sender: TObject);
var
  ItemIdx: Integer;
begin
  ListBox.Items.BeginUpdate();
  ListBox.Items.Clear();
  try
    for ItemIdx := 0 to CheckListBox.Items.Count - 1 do
      if CheckListBox.Checked[ItemIdx] then
        with XMLDocument.DocumentElement.ChildNodes[ItemIdx] do
        case RadioGroup.ItemIndex of
          0: ListBox.Items.Add(ChildValues['imie']);
          1: ListBox.Items.Add(ChildValues['nazwisko']);
          2: ListBox.Items.Add(ChildValues['imie'] + ' ' + ChildValues['nazwisko']);
        end;
  finally
    ListBox.Items.EndUpdate();
  end;
end;
0

To jest to !!! Gdybam miał tylko cycki :)
Właśnie to było powodem moich męczarni.
Dziękuje Wam obu, w życiu bym tego tak nie złożył.
Proszę dodajcie to gdzieś niech ten krótki kod nie umrze bo mimo wszystko on jest taki prosty
**furious programming ** zawsze w formie - DZIĘKUJĘ

0

zmieniłem drzewko xml bardzo Was proszę o wyrozumiałość i jak chcecie pomóżcie bez odsyłania do kursów mam braki ale dużo robie tez sam czasem bez głowy ale wybaczcie wiek ma swoje prawa, tutaj prosty problem przerasta do rangii apogeum a ogromny to pestka.
wcześniej mój xml wyglądał tak:

<?xml version="1.0" standalone="yes" ?>
  <Pracownicy>
    <Pracownik>Jan Kowalski <Pracownik>
      <imie>Jan</imie>
      <nazwisko>Kowalski</nazwisko>
    </Pracownik1>
    <Pracownik2>
      <imie>Katarzyna</imie>
      <nazwisko>kowalska</nazwisko>
    </Pracownik2>
  </Pracownicy>

teraz przerobiłem tak ze zaszerogowałem pracowników na działy

<?xml version="1.0" encoding="UTF-8" ?>
<pracownicy data="2009-11-27">
  <pracownik_produkcji> 
     <pracownik1>
       <imie>Jan</imie>
        <nazwisko>Kowalski</nazwisko>
     </pracownik1>
     <pracownik2>
       <imie>Janusz</imie> 
       <nazwisko>Iksiński</nazwisko>   
     </pracownik2>
  </pracownik_produkcji>
  <pracownik_kadr>   
     <pracownik3>
      <imie>Katarzyna</imie>
      <nazwisko>Kowalska</nazwisko>
     </pracownik3>
     <pracownik4>
      <imie>Anna</imie>
      <nazwisko>Maciejewska</nazwisko>
     </pracownik4>
  </pracownik_kadr>
</pracownicy>

Jak teraz to zrobić gdy w xml mamy drzewko? Może je źle złożyłem(to wyżej) ? W CheckListbox mamy mieć działy- Pracownicy produkcj,i Pracownicy kadr. I to się wyświetlić w CheckListBox i to się wyświetla. Co teraz by wszyscy pracownicy wybranego działu (odhaczonego działu) się wyświetlali a informacje które się pojawią o pracownikach dalej zależały od wyboru RadioGroup Wiem ze proszę o bardzo dużo

0

Przede wszystkim **Wesołych Świąt **i oby tu nigdy nie pojawił się taki małolat jak ja :) sto pytań do i czasami bez mózgu ale mam tylko Was wybaczcie, Nie mam mózgu kodera jak furious programming i nigdy nie będę miał. Ja nie wiem czy kiedyś Wam do pięt dorosnę, może co najwyżej do paznokcia, Chce tylko rozwiązać problem. Jak z czytać te [CIACH!] dane jak mamy drzewko(pod folder), Nie potrzebuje wizualnie drzewka bo tu bankowo nie ogarnę TreeView z obsług CheckBoxa,. Az na takie wody się nie rzucę, byście mnie żywcem z tond wynieśli. Proszę tylko jak na moim przykładzie dobrać się do danych xml. gdy mamy budowę drzewkową jak poniżej.
Jeszcze raz całość

Plik xml wygląda teraz tak

<?xml version="1.0" encoding="UTF-8" ?>
<pracownicy data="2009-11-27">
  <pracownik_produkcji> 
     <pracownik1>
       <imie>Jan</imie>
        <nazwisko>Kowalski</nazwisko>
     </pracownik1>
     <pracownik2>
       <imie>Janusz</imie> 
       <nazwisko>Iksiński</nazwisko>   
     </pracownik2>
  </pracownik_produkcji>
  <pracownik_kadr>   
     <pracownik3>
      <imie>Katarzyna</imie>
      <nazwisko>Kowalska</nazwisko>
     </pracownik3>
     <pracownik4>
      <imie>Anna</imie>
      <nazwisko>Maciejewska</nazwisko>
     </pracownik4>
  </pracownik_kadr>
</pracownicy>

a reszta tak.

procedure TForm1.Button1Click(Sender: TObject);
var
 i:integer;
begin
 if OpenDialog1.Execute() then
  begin
  XMLDocument1.LoadFromFile(OpenDialog1.FileName);
  XMLDocument1.Active:=True;
  Memo1.Lines.Clear;
  CheckListBox1.Items.Clear();
 for i := 0 to XMLDocument1.DocumentElement.ChildNodes.Count - 1 do
    CheckListBox1.Items.Add(XMLDocument1.DocumentElement.ChildNodes[i].LocalName);
  end;
 end;


procedure TForm1.Dodaj ;
var
  ItemIdx: Integer;
begin
  ListBox1.Items.BeginUpdate();
  ListBox1.Items.Clear();
  try
    for ItemIdx := 0 to CheckListBox1.Items.Count - 1 do
      if CheckListBox1.Checked[ItemIdx] then
        with XMLDocument1.DocumentElement.ChildNodes[ItemIdx] do
        case RadioGroup1.ItemIndex of
          0: ListBox1.Items.Add(ChildValues['imie']);
          1: ListBox1.Items.Add(ChildValues['nazwisko']);
          2: ListBox1.Items.Add(ChildValues['imie'] + ' ' + ChildValues['nazwisko']);
        end;
  finally
    ListBox1.Items.EndUpdate();
  end;
end;

procedure TForm1.RadioGroup1Click(Sender: TObject);
begin
 Dodaj;
end;

procedure TForm1.CheckListBox1ClickCheck(Sender: TObject);
begin
 Dodaj;
end;

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