Nie wczytuje obrazu do TImage

Witam, muszę znowu poprosić mądrzejszych o pomoc:

procedure TForm1.Button1Click(Sender: TObject);

type

  TKarta = record

    Karta : string;

    Punkty : integer;

  end;

const

i : integer=1;

tablica : array[0..51] of TKarta = (

(Karta: 'dwojkapik.bmp'; Punkty: 2;),

(Karta: 'trojkapik.bmp'; Punkty: 3;),

(Karta: 'czworkapik.bmp'; Punkty: 4;),

(Karta: 'piatkapik.bmp'; Punkty: 5;),

(Karta: 'szostkapik.bmp'; Punkty: 6;),

(Karta: 'siodemkapik.bmp'; Punkty: 7;),

(Karta: 'osemkapik.bmp'; Punkty: 8;),

(Karta: 'dziewiatkapik.bmp'; Punkty: 9;),

(Karta: 'dziesiatkapik.bmp'; Punkty: 10;),

(Karta: 'waletpik.bmp'; Punkty: 2;),

(Karta: 'damapik.bmp'; Punkty: 3;),

(Karta: 'krolpik.bmp'; Punkty: 4;),

(Karta: 'aspik.bmp'; Punkty: 11;),

(Karta: 'dwojkaserce.bmp'; Punkty: 2;),

(Karta: 'trojkaserce.bmp'; Punkty: 3;),

(Karta: 'czworkaserce.bmp'; Punkty: 4;),

(Karta: 'piatkaserce.bmp'; Punkty: 5;),

(Karta: 'szostkaserce.bmp'; Punkty: 6;),

(Karta: 'siodemkaserce.bmp'; Punkty: 7;),

(Karta: 'osemkaserce.bmp'; Punkty: 8;),

(Karta: 'dziewiatkaserce.bmp'; Punkty: 9;),

(Karta: 'dziesiatkaserce.bmp'; Punkty: 10;),

(Karta: 'waletserce.bmp'; Punkty: 2;),

(Karta: 'damaserce.bmp'; Punkty: 3;),

(Karta: 'krolserce.bmp'; Punkty: 4;),

(Karta: 'asserce.bmp'; Punkty: 11;),

(Karta: 'dwojkatrefl.bmp'; Punkty: 2;),

(Karta: 'trojkatrefl.bmp'; Punkty: 3;),

(Karta: 'czworkatrefl.bmp'; Punkty: 4;),

(Karta: 'piatkatrefl.bmp'; Punkty: 5;),

(Karta: 'szostkatrefl.bmp'; Punkty: 6;),

(Karta: 'siodemkatrefl.bmp'; Punkty: 7;),

(Karta: 'osemkatrefl.bmp'; Punkty: 8;),

(Karta: 'dziewiatkatrefl.bmp'; Punkty: 9;),

(Karta: 'dziesiatkatrefl.bmp'; Punkty: 10;),

(Karta: 'walettrefl.bmp'; Punkty: 2;),

(Karta: 'damatrefl.bmp'; Punkty: 3;),

(Karta: 'kroltrefl.bmp'; Punkty: 4;),

(Karta: 'astrefl.bmp'; Punkty: 11;),

(Karta: 'dwojkakaro.bmp'; Punkty: 2;),

(Karta: 'trojkakaro.bmp'; Punkty: 3;),

(Karta: 'czworkakaro.bmp'; Punkty: 4;),

(Karta: 'piatkakaro.bmp'; Punkty: 5;),

(Karta: 'szostkakaro.bmp'; Punkty: 6;),

(Karta: 'siodemkakaro.bmp'; Punkty: 7;),

(Karta: 'osemkakaro.bmp'; Punkty: 8;),

(Karta: 'dziewiatkakaro.bmp'; Punkty: 9;),

(Karta: 'dziesiatkakaro.bmp'; Punkty: 10;),

(Karta: 'waletkaro.bmp'; Punkty: 2;),

(Karta: 'damakaro.bmp'; Punkty: 3;),

(Karta: 'krolkaro.bmp'; Punkty: 4;),

(Karta: 'askaro.bmp'; Punkty: 11;));

var

k : integer;

begin

Randomize;

Button2.Enabled := True;

case i of

1: begin

   k := random(52);

   Image1.Picture.LoadFromFile(tablica[k].Karta);

   Label3.Caption := IntToStr(StrToInt(Label3.Caption) + tablica[k].punkty);

Niby w tablicy są 52 (0 - 51) indeksy. Zmienna k również losuje liczby tylko z przedziału 0 - 51 a mimo wszystko wyświetla mi komunikat Bitmap Image is not valid. Oczywiście nie zawsze, raz na jakiś czas. Nie wiem dlaczego, jakby ktoś miał pomysł proszę o pomoc.

Daj na chwile (na przykład przed case)

for k:=0 to 51 do

begin

  Image1.Picture.LoadFromFile(tablica[k].Karta);

  ShowMessage(IntTostr(k)+': '+tablica[k].Karta);

end;

I zobacz na którym indeksie cie wywala.

Pokazuje mi takie cos:

Na którym indeksie wywaliło ?

No właśnie nie wiem, bo wyświetliło mi tylko ten 1 error.

Zmień for od 1 jak pójdzie to masz odpowiedź, coś źle z indeksem 0

No faktycznie, w katalogu miałem 2 pliki które miały rozszerzenie bmp, ale coś innego z nimi było nie tak bo miały rozmiar 32kb kiedy reszta kart miała 132kb. Dzięki za pomoc.

Ale pojawił mi się następny błąd :frowning: Już żeby kolejnego tematu nie zakładać, to opiszę go tutaj.

var

k : integer;

m : integer;

pk : integer;


begin

Randomize;

pk := StrToInt(Label6.Caption);

Button2.Enabled := False;

   k := random(52) + 1;

   m := random(52) + 1;

   Image9.Picture.LoadFromFile(tablica[k].Karta);

   Label6.Caption := IntToStr(StrToInt(Label6.Caption) + tablica[k].punkty);

   Image10.Picture.LoadFromFile(tablica[m].Karta);

   Label6.Caption := IntToStr(StrToInt(Label6.Caption) + tablica[m].punkty);

   while pk < 21 do

case x of

1:

 begin

   k := random(52) + 1;

   Image11.Picture.LoadFromFile(tablica[k].Karta);

   Label6.Caption := IntToStr(StrToInt(Label6.Caption) + tablica[k].punkty);

    end;

x := x + 1;

// I aż do 7: tak jest, zmienia się tylko nazwa komponentu Image.

Program ma za zadanie wczytywać karty dopóki liczba punktów (czyli zmienna pk ) nie osiągnie 21. No i użyłem tam while, żeby sprawdzał to za każdym razem i jak jest mniej niż 21 to ma kolejną kartę w TImage wstawiać. Program się kompiluje, ale kiedy do tego momentu, że ma losować karty do 21 pkt, to się zawiesza. Help.

Zapewne nigdzie nie zwiększasz tej zmiennej pk.

Dopóki nie zabrnąłeś zbyt daleko przerób całość.

  1. Zapisz wszystkie karty do jednego pliku *.bmp 4 kolory w rzędzie 13 rzędów w kolejności 2 3 4 5 6 7 8 9 10 A J Q K

  2. Obrazek ładujesz w konstruktorze lub w OnCreate formy

  3. Obrazek wstawiasz w Image po wykrojeniu z dużej bitmapy Rect:=Bounds(W*((numerek karty)and(3)),H*((numerek karty)shr(2)),W,H) gdzie W, H rozmiar jednej karty

  4. Jako kartę wystarczy trzymać numerek od 0 do 51

  5. Punkty karty = (((numerek karty)shr(2))mod(10))+2

  6. W klasie zrób sobie tablice Images:array[0…10]of TImage.

  7. W konstruktorze lub w OnCreate formy wpisz Images[0]:=Image9; Images[1]:=Image10; Images[2]:=Image11; …

  8. Przy losowaniu weź jakby dwie talii Two:array[0…103]of Byte; wypełnij tą tabele liczbami 0…51 i znowu 0…51

  9. Wymieszaj je for p:=103 down to 1 do begin r:=rand(p+1); if r<>p then begin x:=Two[p]; Two[p]:=Two[r]; Two[r]:=x; end; end;

  10. Mając wymieszane karty możesz “brać” je po kolei z Two i w jednej pętli beż żadnych case’of i strasznych tablic struktur losować tyle ile chcesz.

Jeżeli zastosujesz to wszystko to cały program obsługujący tą grę zajmie mniej kodu niż obecnie zajmuje ci losowanie jednego rozdania.

Na pewno to co napisałeś byłoby lepsze i bardziej wydajniejsze od mojego kodu :stuck_out_tongue: Problem w tym, że moje umiejętności nie stoją jeszcze na takim poziomie, żeby to wykonać na Twój sposób nawet jeżeli dokładnie to mi opisałeś. Ale dzięki za chęci :smiley: A i swój problem już rozwiązałem, oczywiście było jak mówiłeś, pk nie było zwiększane i zmienna x również stała w miejscu.

Chyba nie zrozumiałeś. Zrobienie tego wg mojego opisu wymaga mniej umiejętności i mniej czasu.