TValueListEditor & 'Access violation ...'

0

Mam na formularzu TValueListaEditor i TButton
Po naciśnieciu przycisku lista ma być uzupełniona kluczami i wartościami, jednak program wywala mi 'Access violation...'.

W czym jest problem?

Poniżej prezentuję przykładowy kod:

unit Unit1;

interface

uses
  Controls, Classes, Forms, StdCtrls, ValEdit, Grids;

type
  TForm1 = class(TForm)
    T: TValueListEditor;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  I: Integer;
begin
  for I := 1 to 5 do
  begin
    (**********************************************
     Wszytkie poniższe 4 linie wywołują 'Access violation ...'
     Z góry zaznaczam, że trzy ostatnie miały modyfikować 
         już istniejące wiersze
    **********************************************)
    // T.InsertRow('Key'+String(I),String(I),True);
    // T.Values[T.Keys[I]] := String(I);
    //T.Strings.Values[T.Keys[I]] := String(I);
    T.Strings.Values[T.Keys[I]] := String(I);
  end;

end;

end.
0

Odwołujesz się do nie istniejących wartości.

0
Berus123 napisał(a)

Odwołujesz się do nie istniejących wartości.

Lista zawiera 10 wierszy, więc co tu jest nie tak?
A co z T.InsertRow('Key'+String(I),String(I),True);
Tu mam ten sam błąd.
Mało tego... występuje nawet przy:
T.Strings.Add('test=1');

???

0

jakby Ci to powiedzieć ... u mnie działa normalnie D7 Ent

0
Misiekd napisał(a)

jakby Ci to powiedzieć ... u mnie działa normalnie D7 Ent

OK.
Pomyliłem się (pisałem w pośpiechu).

Ten działa
T.Strings.Add('test=1');

Nie działał natomiast
T.Strings.Add('test='+String(I));
A nie działał dlatego, że jakiś babol z rzutowaniem jest. Gdy rzutowanie zamienię na funkcję konwertującą to jest OK
T.Strings.Add('test='+IntToStr(I));

Dlaczego???

0
doctorek napisał(a)

Nie działał natomiast
T.Strings.Add('test='+String(I));
A nie działał dlatego, że jakiś babol z rzutowaniem jest. Gdy rzutowanie zamienię na funkcję konwertującą to jest OK
T.Strings.Add('test='+IntToStr(I));

Dlaczego???

bo to nie C, tu trzeba jawnie konwertować

0
Misiekd napisał(a)

bo to nie C, tu trzeba jawnie konwertować

Nie za bardzo rozumiem, jaka jest przyczyna tego przymusu!
Czym charakteryzuje się rzutowanie, że nie można go użyć w powyższym przypadku?

'Access violation ...' jest spowodowany operacją na nieużywanej w aplikacji komórce pamięci.
To mi sugeruje, jakby rzutowanie wykorzytywało tylko wskaźnik do zmiennej i konwertowało go 'w locie', czyli np. dla poniższego przykładu:

I := 5;
test := 'TEST' + IntToStr(I);     // {1}
test := 'TEST' + String(I);        // {2}

w {1} test zawiera rzeczywistą wartość 'TEST5', a {2} nie.
Mam nadzieję, że moje rozumowanie jest błędne, bo to by oznaczało błędne wykorzystanie wskaźników przez środowisko Borlanda, ale żadna inna przyczyna nie przychodzi mi do głowy.

Pozdrawiam

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