Dynamiczne tworzenie TImage

0

Witam.
Mam w bazie danych listę plików, które chciałbym wyświetlić w odpowiedniej ilości TImage. Nie wiem ile tych obrazków będzie. Dla jednego pacjenta może być ich 3, a dla innego 7. Stworzyłem sobie taką procedurę:

 
procedure TForm1.ZaladujZdjecia(Sender: TObject);
var iloscZdjec, i : Integer;
    zdjecia : array of TImage;
    jpg : TJPEGImage;
begin
  DataModule2.ADODataSet3.Active := False;
  DataModule2.ADODataSet3.CommandText := 'select zdjecieID, plik from zdjecia where pacjentID = ' + IntToStr(pacjentID) + ';';
  DataModule2.ADODataSet3.Active := True;
  iloscZdjec := DataModule2.ADODataSet3.RecordCount;
  SetLength(zdjecia, iloscZdjec);
  for i := 1 to iloscZdjec do
  begin
    zdjecia[i] := TImage.Create(Form1);
    zdjecia[i].Parent := TabSheet3;
    zdjecia[i].Width := 160;
    zdjecia[i].Height := 100;
    zdjecia[i].Left := 3 + (160 * (i - 1));
    zdjecia[i].Top := 35;
    zdjecia[i].Name := 'zdjecie' + IntToStr(i);
    jpg := TJPEGImage.Create;
    jpg.LoadFromFile(DataModule2.ADODataSet3.FieldByName('plik').AsString);
    zdjecia[i].Picture.Assign(jpg);

  end;

end;

Niestety procedura się wykłada w linijce

zdjecia[i].Name := 'zdjecie' + IntToStr(i);

Czemu? I czy ta procedura jest w miarę poprawna??

3

Gdybyś zerknął do dokumentacji, to wiedziałbyś, że tablice dynamiczne indeksowane są od zera.
Innymi słowy SetLength(Tab, 10); tworzy tablicę z dziesięcioma elementami o indeksach <0, 9>.

0

No ok. To jest drobnostka, ponieważ procedura wykłada się w pierwszym kroku pętli.

0

Przeleć debuggerem i zobacz, co się wywala.

0

Zwracam honor. Faktycznie, gdy zamienię zdjecie[i] na zdjecie[i-1] to zaczyna działa. Przepraszam za kłopot. Temat do zamknięcia. :)

1

Dlaczego po prostu nie zrobisz for i := 0 to iloscZdjec-1 do? :P
Przy okazji jedno obliczenie wewnątrz wtedy Ci się uprości.

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