Glupia tablica i onmousedown :Y

0

prosze oto kod tekst pod kodem :U

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ExtCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    Image1: TImage;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  polygon : array of tpoint; //tablica 
o : integer;//i jedna zmienna
u : integer =-1; //und druga zmienna
  

implementation

{$R *.DFM}



procedure TForm1.Button1Click(Sender: TObject);
var
dp : integer;
i,i2 : integer;
begin
//to na razie tylko graficzy algorytm podzielenia wielokąta wypukłego na trójkąty
image1.canvas.moveto(polygon[0].x,polygon[0].y);
for i:=1 to o do
begin
image1.canvas.lineto(polygon[i].x,polygon[i].y);
end;
image1.canvas.lineto(polygon[0].x,polygon[0].y);

////////
dp := high(polygon) div 2;
image1.canvas.moveto(polygon[dp].x,polygon[dp].y);
for i2:=0 to o do
begin
if not (polygon[dp].x = polygon[i2].x) then
if not (polygon[dp].y = polygon[i2].y) then
begin
image1.canvas.moveto(polygon[dp].x,polygon[dp].y);
image1.canvas.lineto(polygon[i2].x,polygon[i2].y);
end;
end;
////////
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
//okresla ilewielakat ma miec wierzcholkow + 1
randomize;
repeat
o := random(8);
until o > 3;
setlength(polygon,o);
form1.caption := inttostr(o);
end;

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
//okresla punkty dla polygonu (wielokoąta)
inc(u);
if u > o then exit;
image1.canvas.pixels[x,y] := clred;
polygon[ u ].x := x;
polygon[ u ].y := y;
button1.caption := inttostr(u);
end;

end.

no spoko ale jak uzyje sobie deklarowania tych tepych wierzcholkow (procedura onmousedown) to mi zanczyna przyzamykaniu palikacji wywalac błędy i nie wiem czemu a jak tego nie uzyje (tego onmousedown) to aplikacja sie zamknie normalnie :U
http://www.resportgql.republika.pl/blad.jpg

0

A co to takiego?
polygon.x := x;
polygon.y := y;

Przecież Polygon to tablica. Powinno być:
Polygon[i].x := x;

Jak w ogóle kompilator to przepuścił?

/* dopisane */
Sorry. Błąd kodowania. Tag delphi nie usunął [ u ]. Szukam dalej błędu.

OK. Już mam. Wychodzisz poza zakres tablicy. Jeżeli ustawiasz SetLength(Polygon, o) to tablica ma o elementów, ale ostatni element to o-1. Więc albo inaczej odwołuj się, albo zadeklaruj o jeden więcej. Proponuję to drugie rozwiązanie, zwłaszcza, że:

repeat
o := random(8);
until o > 3;
setlength(polygon,o);

Można zastąpić przez:
o := random(5);
o := o + 3;
SetLength(Polygon, o+1);

0

oh dziekuje :D woohoow ! :d [browar]

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