Edycja danego elementu w liście jednokierunkowej

0

Operuję na stringgridzie i mam problem z edycją danego elementu, element ma być edytowany wtedy gdy dane z 3 editow ktore są na w ifie bedą takie same jak w 3 pierwszych pozycjach w danym elemencie listy. Program kompiluję się ale nie działa. Jakieś wskazówki? Poniżej wstawiam kod. Dodam jeszcze ze nie czyszczą się także edity....

procedure TForm2.Button5Click(Sender: TObject);
   var
   p: PElement;
   t: integer;
    begin
    t:=0;
      while p <> nil do
      begin
        if (p^.marka=edit28.Text) and (p^.typ=edit29.Text) and (p^.cena=edit30.Text) then
        begin
        p^.marka := Edit16.text;
        p^.typ := Edit17.text;
        p^.cena := Edit18.text;
        p^.maxv := Edit19.text;
        p^.cyl := Edit20.text;
        p^.km := Edit21.text;
        p^.zuzyciepaliwa := Edit22.text;
        p^.tto100 := Edit23.text;
        p^.ABS := Edit24.text;
        p^.wspomkier := Edit25.text;
        p^.poduszkipow := Edit26.text;
        p^.pojsilnika := Edit27.text;
        begin
             with stringgrid1 do
            begin
              cells[1,t+1]:=p^.marka;
              cells[2,t+1]:=p^.typ;
              cells[3,t+1]:=p^.cena;
              cells[4,t+1]:=p^.maxv;
              cells[5,t+1]:=p^.cyl;
              cells[6,t+1]:=p^.km;
              cells[7,t+1]:=p^.zuzyciepaliwa;
              cells[8,t+1]:=p^.tto100;
              cells[9,t+1]:=p^.ABS;
              cells[10,t+1]:=p^.wspomkier;
              cells[11,t+1]:=p^.poduszkipow;
              cells[12,t+1]:=p^.pojsilnika;
            end;
               begin
     edit16.Clear;
     edit17.Clear;
     edit18.Clear;
     edit19.Clear;
     edit20.Clear;
     edit21.Clear;
     edit22.Clear;
     edit23.Clear;
     edit24.Clear;
     edit25.Clear;
     edit26.Clear;
     edit27.Clear;
   end;
        end;
        end
        else
        p := p^.next;
        inc(t);
      end;
      end;

Z góry dziękuję za pomoc.

0

tak to powinno wyglądać

procedure TForm2.Button5Click(Sender: TObject);
var
  p: PElement;
  t: integer;
begin
  t := 0;
  while p <> nil do
  begin
    if (p^.marka = edit28.Text) and (p^.typ = edit29.Text) and (p^.cena = edit30.Text) then
    begin
      p^.marka := Edit16.Text;
      p^.typ := Edit17.Text;
      p^.cena := Edit18.Text;
      p^.maxv := Edit19.Text;
      p^.cyl := Edit20.Text;
      p^.km := Edit21.Text;
      p^.zuzyciepaliwa := Edit22.Text;
      p^.tto100 := Edit23.Text;
      p^.ABS := Edit24.Text;
      p^.wspomkier := Edit25.Text;
      p^.poduszkipow := Edit26.Text;
      p^.pojsilnika := Edit27.Text;
      begin
        with stringgrid1 do
        begin
          cells[1, t + 1] := p^.marka;
          cells[2, t + 1] := p^.typ;
          cells[3, t + 1] := p^.cena;
          cells[4, t + 1] := p^.maxv;
          cells[5, t + 1] := p^.cyl;
          cells[6, t + 1] := p^.km;
          cells[7, t + 1] := p^.zuzyciepaliwa;
          cells[8, t + 1] := p^.tto100;
          cells[9, t + 1] := p^.ABS;
          cells[10, t + 1] := p^.wspomkier;
          cells[11, t + 1] := p^.poduszkipow;
          cells[12, t + 1] := p^.pojsilnika;
        end;
        begin
          Edit16.Clear;
          Edit17.Clear;
          Edit18.Clear;
          Edit19.Clear;
          Edit20.Clear;
          Edit21.Clear;
          Edit22.Clear;
          Edit23.Clear;
          Edit24.Clear;
          Edit25.Clear;
          Edit26.Clear;
          Edit27.Clear;
        end;
      end;
    end
    else
      p := p^.next;
    inc(t);
  end;
end;
1

co znaczy 'nie działa' ??
odpal program krokowo , może już na wstępie masz

p=nil
0

nie działa, znaczy to ze jesli nacisne na button to nic sie nie dzieje, ale jak mówiłem zauważyłem ze nawet nie czyszczą się edity, myślę, że jest to problem z przejsciem listy do kolejnego elelmentu lub też jest jakiś błąd w moich warunkach w ifie, elementy listy jednokierunkowej w rekordzie mam zdefiniowane jako stringi to samo zwracają edity... sam już nie mam pomysłów... jakaś podpowiedź gdzie jeszcze szukac błędu?

0

odpal program krokowo i prześledź co się dzieje w procedurze
program zapewne działa tak jak go napisałeś , tyko że inaczej niż sobie założyłeś
może nie podpiąłeś procedury pod obsługę zdarzenia 'button.onclick'

1

@Olejs - opakuj tę listę w jakąś sensowną klasę, bo używanie takich konstrukcji w aplikacji okienkowej (i w sumie każdej innej) jest bardzo, bardzo złe, nieczytelne, problematyczne i błędogenne... Jeżeli nie wiesz jak zrobić sobie klasę listy jednokierunkowej - polecam przeczytać sobie ten artykuł;

Jak zrobisz sobie taką listę, to nie będziesz miał problemów z jej obsługą w programie.

1
Olejs napisał(a):
procedure TForm2.Button5Click(Sender: TObject);
   p: PElement; // tu masz zmienną o nazwie `p` która po naciśnięciu przycisku pojawia się i przyjmuje wartość `nil`
...
   while p <> nil do // p ma wartość nil więc nigdy nie wejdzie do pętli.
   begin
...

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