Nie wczytuje obrazu do TImage


(Mr Hektor) #1

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.


([alex]) #2

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.


(Mr Hektor) #3

Pokazuje mi takie cos:


([alex]) #4

Na którym indeksie wywaliło ?


(Mr Hektor) #5

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


([alex]) #6

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


(Mr Hektor) #7

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.


([alex]) #8

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.


(Mr Hektor) #9

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.


([alex]) #10

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