Usuwanie ze stringgrida po wybranym konkretnym wierszu.

0

Witam,jak mogę usunąć wybrany wiersz ze stringrida ale po wybranym ID,a nie po wybranym wierszu.

Bo wiem,że instrukcja do usuwania po wybranym wierszu jest jaka:

StringGrid1.DeleteRow(jaki);

gdzie zmienna ** "jaki"** to jest wiersz jaki chce usunac.

A gdy chce wybrać,że np ma być usunięty wiersz o id = 1?

title

0

Tak się nie da.
Musisz wyszukać numer wiersza a potem usunąć sposobem jaki podałeś

0

Ok,zrobiłem tak jak powiedziałeś :


  for z:=0 to (length(tab)) do
   begin

   if tab[z].id=strtoint(jaki) then
   begin
   StringGrid1.DeleteRow(z);
   end ;

   end; 

I rzeczywiście działa,ale do pewnego momentu,raz normalnie usunie wybrany wiersz raz wywali program i nie wiem dlaczego?

0

ale Ty zamiast szukać w stringridze przeszukujesz jakąś tablicę tab

for I := 0 to StringGrid1.RowCount - 1 do
  if StringGrid1.Cells[0,i]=jakiesId then
    begin
      StringGrid1.deleterow(i);
      break;
    end;
end;
0

Tak dokładnie,ponieważ mam wymóg,że stringrid ma tylko wyświetlać tablice,do której wpisywane są dane.

1

a co z tablicą, z niej też usuwasz dane ?
Musisz zrozumieć że jeśli usuniesz ze stringrida wiersz to indeksy wierszy w stringridzie rozjadą się indeksami elementów w tablicy.
Albo będziesz usuwał równocześnie i ze stringrida i tablicy, albo usuwaj tylko z tablicy a następnie od zera wypełnij wszystkie pola strinngrida w oparciu o zmienioną treść tabeli. Pierwszy wariant jest lepszy, ale jeśli tabela nie będzie duża to od biedy możesz zastosować drugie rozwiązanie.

0

No tak nie wpadłem na to,że jeszcze muszę usuwać przecież z tablicy...Dzięki.
A jak mogę tego najlepiej dokonać jeżeli typ zmienny tablicy id to integer.

0

Albo tablica dynamiczna i funkcja setlength, albo tablica o stałym rozmiarze i trzymaj w pomocniczej zmiennej liczbę aktywnych elementów tablicy.
Ww obu przypadkach musisz przesunąć (przepisać) w dół wszystkie elementy powyżej usuniętego elementu

2

@Bulailokiec: nie używaj tablicy – skorzystaj z listy generycznej i usuwaj niepotrzebne wiersze jedną instrukcją.

A jeśli chodzi o wyszukanie numeru wiersza, który zawiera wymagane ID, to możesz skorzystać z funkcjonalności TStrings, dostępnej we właściwości Cols:

var
  LRowIdx: Integer;
begin
  LRowIdx := StringGrid.Cols[{nr kolumny}].IndexOf({identyfikator});

  if LRowIdx >= StringGrid.FixedRows then
    StringGrid.DeleteRow(LRowIdx);
0

Zmieniłem jednak tablicę na stringa aby było trochę łatwiej i mam taki kod:

   for z:=1 to (length(tab)) do
   begin
   if tab[z].id=jaki then
   begin

   StringGrid1.DeleteRow(z);
   tab[z].id:='';

   end ;


   end; 

Lecz niestety dalej co jakiś czas wywala program :(
Nie wiem dlaczego?
Nie wystarczy tab[z].id:=''; ?

0

Nie wystarczy.
Po pierwsze liczba wierszy w stringridzie zmniejsza się o jeden a rozmiar tablicy pozostaje bez zmian.
Po drugie elementy tablicy wyższe i równe elementowi dla którego ustawiasz tab[z].id:=''; rozjeżdżają się z tym co masz w stringgridzie
a podstawienie tab[z].id:=''; nie usuwa elementu z tablicy !!!!
Dobrym rozwiązaniem było by użycie listy, o czym już wspomniał @furious programming bo element z listy usuwasz jedną instrukcją. Pozostaje problem powiązania listy/tablicy z kontrolką wizualizującą (stringgrid)

A Twój program wywala się ponieważ próbując usunąć wiersz, wykraczasz poza rozmiar listy stringgrid.rows. Wciąż nie rozumiesz że jeśli chcesz identyfikować wiersz do usunięcia na podstawie tego co masz w tablicy, to jeśli usuwasz wiersz ze striggrida równocześnie musisz usunąć element z tablicy.
StringGrid i tablica MUSZĄ być spójne !!!!!

0

z obrazka który załączyłeś ID jest w pierwszej kolumnie, a ta ma indeks zero

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