[Delphi] DBGrid - problem

0

Uzywam DBGird + baza MySQL (myDac), Delphi7.
Wszystko jest dobrze: tworze polaczenie, program laczy sie z baza, wyswietla rekordy.

Ale kiedy próbuje usunac jakis rekord, pojawia sie problem.
Robie to tak:

{ kod zawarty w handlerze OnKeyDown( VK_DELETE ) }
If ( DBGrid1.SelectedRows.Count = 0 ) Then
    Exit;

If ( MessageBox( WindowHandle, 'Napewno chcesz usunac zaznaczony rekord?', 'Pytanie', MB_YESNO ) = IDYES ) Then
Begin
      With DBGrid1.DataSource.DataSet Do
    Begin
        For i := 0 To DBGrid1.SelectedRows.Count - 1 Do
        Begin
          GotoBookmark( Pointer( DBGrid1.SelectedRows.Items[ i ] ) );
          MyQuery1.SQL.Strings[i] := 'DELETE FROM tabela1 WHERE id = ' + Fields[ 0 ].AsString + ' LIMIT 1;';
        End;
    End;

    try
        MyQuery1.Execute;
    except
        on E: EMySqlException do
        begin
            error := true;
        end;
    end;
End;

Problem polega na tym, iz pojawia sie komunikat mowiący o tym ze: nie ma elementu o indeksie "i" w DBGrid1.SelectedRows.Items. Ale kiedy debuguje wyraznie widac ze DBGrid1.SelectedRows.Count jest rowne ilosci zaznaczonych wierszy. Wiec tablica items powinna zawierac prawidlowe elementy.

Gdzie popelnilem blad?
Jesli ktos zna jakis inny sposob na pobranie indeksow zaznaczonych wierszy, bardzo chcial bym to zobaczyc.

Jest jeszcze jeden problem, jesli np umyslnie popelnie blad w skladni SQLa. To metoda Execute wyrzuci wyjatek, ktory zreszta probuje lapac. Problem polega na tym ze IDE za kazdym razem przerywa mi prace przy napotkaniu tego wyjatku mimo ze go obsluguje.

Bede wdzieczny za każda podpowiedz
(one_eddie at tenbit.pl)

0
one_eddie napisał(a)

Jest jeszcze jeden problem, jesli np umyslnie popelnie blad w skladni SQLa. To metoda Execute wyrzuci wyjatek, ktory zreszta probuje lapac. Problem polega na tym ze IDE za kazdym razem przerywa mi prace przy napotkaniu tego wyjatku mimo ze go obsluguje.

Program się tak czy siak kończy, ale tylko gdy uruchamiasz go z poziomu kompilatora - gdy uruchomisz bezpośrednio exe obsługa wyjątków normalnie zadziała. Można też odznaczyć którąś opcje w kompilatorze, lecz niestety nie pamiętam dokładnie która to jest, ale wtedy prawdopodobnie niemożliwe jest krokowe debugowanie (o ile oczywiście mnie pamięć nie myli)
Delphi niestety nie posiadam i nie mam możliwości sprawdzić.

0

Prawdopodobnie masz racje. Ostatnio tez to zauwazylem ale nie bylem pewien. Nie mam srodowiska bez Delphi. Wiec nie mialem gdzie sprawdzic.

Jednak z tych 2 problemow, ten na ktory odpowiedziales jest dla mnie mniej wazny, poniewaz aplikacja dziala z nim czy bez niego.

0

może podaj pełną treść komunikatu bo coś mi mówi, że błąd masz gdzie indziej

0
one_eddie napisał(a)

Jest jeszcze jeden problem, jesli np umyslnie popelnie blad w skladni SQLa. To metoda Execute wyrzuci wyjatek, ktory zreszta probuje lapac. Problem polega na tym ze IDE za kazdym razem przerywa mi prace przy napotkaniu tego wyjatku mimo ze go obsluguje.

Aby się tego "pozbyć" musisz odznaczyć w opcjach debuggera (dokładnie w zakładce "Language Exceptions") checkbox'a "Stop on Delphi exceptions". Powinno zadziałać.

0

Hmmm.... Zaznaczanie/Odznaczanie opcji debugera/kompilatora aby ukryc blad to nie wydaje mi sie dobrym rozwiazaniem. Bledy trzeba usuwac, a nie maskowac. Podaj na forum dokladny komunikat bledu, moze ktos cos bbedzie wiedzial.

//EDIT

Tak patrze na ten Twoj kod... Zmien linie:

For i := 0 To DBGrid1.SelectedRows.Count - 1 Do

na

For i := DBGrid1.SelectedRows.Count - 1 downto 0

I napisz czy to cos dalo

0

one_eddie:

takie pytanie offtop troche ;) kupiles sobie mydac`a ? ;)

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