unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type TForm1 = class(TForm) img1: TImage; img2: TImage; img3: TImage; btn1: TButton; edt1: TEdit; edt2: TEdit; lbl1: TLabel; btn2: TButton; btn3: TButton; procedure btn1Click(Sender: TObject); procedure FormActivate(Sender: TObject); procedure btn3Click(Sender: TObject); procedure btn2MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure btn2MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); private { Private declarations } public { Public declarations } end; var Form1: TForm1; x: Integer; //souřadnice obrázku x (left) y: Integer; //souřadnice obrázku y (top) ex: Integer; //počet sloupců ey: Integer; //počet řádků c: Integer; //indexování pole i: integer; //smyčka FOR pro pole prusvitky: array of TImage; //pole průsvitek implementation {$R *.dfm} procedure TForm1.btn1Click(Sender: TObject); //klikneme na tlačítko a tvoříme begin //lepší by byla funkce a volat ji po stisku tlačítka. c:=0; //Nastavíme první index na 0, pro případ že něco zůstane viset v paměti ex:=StrToInt(edt1.Text) ; //čtení z edt1 a převod na INT ey:=StrToInt(edt2.Text); //čtení z edt1 a převod na INT btn1.Caption:=inttostr(ex*ey); //zobrazíme počet prvků v poli SetLength(prusvitky,(ex)*(ey)+1); //nastavíme velikost pole, podle aktuální velikosti prusvitky[0]:=TImage.Create(Form1); //vytvoříme první prvek pole [0], ale to jediné nepoužíváme prusvitky[0].Parent:=Form1; //Jedná se o automatickou ochranu proti nesprávnému kliknutí. //Zjištěno v průběhu programování, že kliknutí na pozadí, dává index 0 //dalo by se to řešit, ochranou proti chybám, ale jednoduší je jej nepoužít y se to řešit ochranou proti chybám, ale proč psát řádky. A jedno for y:=0 to ey-1 do begin //vytváříme obrázky do čtyřúhelníku, protože počítáme od 0, je velikost for x:=0 to ex-1 do begin //řádků a sloupců vždy -1 c:=c+1; //přičteme index edt1.Text:=inttostr(ex); //chráníme přepsání v editu edt2.Text:=inttostr(ey); //chráníme přepsání v editu prusvitky[c]:=TImage.Create(Form1); //tvoříme obrázek prusvitky[c].Parent:=Form1; prusvitky[c].Left:=x*(img1.Width+1); //vzhledem ke stejné velikosti, netřeba přepočítávat pixely prusvitky[c].Top:=y*(img1.Height+1)+48; prusvitky[c].width:=img1.Width; prusvitky[c].Height:=img1.Height; prusvitky[c].Hint:='['+inttostr(c)+']'; //dáme mu popisek prusvitky[c].ShowHint:=true; //zapneme popisek prusvitky[c].Picture:=img1.Picture; //naplníme obrázkem, převezmeme z paměti, netřeba číst z disku end; Application.ProcessMessages; //uvolnujeme vlákno po řádcích, aby jsme viděli že program tvoří end; //šlo by nahradit progresbarem, ale zde zbytečné Form1.Caption:=IntToStr(c); //V Form1.caption si přečteme nejvyšší použíté číslo indexu. Je zbytečné dávat další label na FORM end; procedure TForm1.FormActivate(Sender: TObject); //základní nastavení parametrů FORM begin Form1.WindowState:=wsMaximized; form1.DoubleBuffered:=True; edt1.Text:='32'; //Rozměry pole, aby se to nemuselo při každém startu psát znova edt2.Text:='32'; end; procedure TForm1.btn3Click(Sender: TObject); //klinutí na tlačítko, přemění všechny na červené a ponechá begin for i:=1 to strtoint(Form1.Caption) do begin //délka smyčky se vezme z Form1.caption, protože jsme si tam uložili celou velikost prusvitky[i].Picture:=img3.Picture; //vhodnější by byla další proměná, ale v tomto případě jsem to nepoužil. Případně High(pole) end; //img3.picture = červená end; procedure TForm1.btn2MouseDown(Sender: TObject; Button: TMouseButton; //událost mousedown zapneme všechny na bílo (KPV) Shift: TShiftState; X, Y: Integer); begin application.ProcessMessages; //uvolnujeme vlákno před kreslením, pro případ že se něco toulá v paměti for i:=1 to strtoint(Form1.Caption) do begin prusvitky[i].Picture:=img2.Picture; //img2.picture = bílá end; application.ProcessMessages; //uvolnujeme vlákno po vykreslení, zobrazí se všechny najednou end; procedure TForm1.btn2MouseUp(Sender: TObject; Button: TMouseButton; //událost mouseUP zapneme všechny na šedo, do základu Shift: TShiftState; X, Y: Integer); begin application.ProcessMessages; //uvolnujeme vlákno před kreslením, pro případ že se něco toulá v paměti for i:=1 to strtoint(btn1.Caption) do begin prusvitky[i].Picture:=img1.Picture; //img1.picture = šedá end; application.ProcessMessages; //uvolnujeme vlákno po vykreslení, zobrazí se všechny najednou end; end.