Ja mam zrobić w programie poniżej żeby wierzchołki grafu sie powiększały gdy będzie z niego wychodzi więcej krawędzi , nie jestem w stanie tego zrobić :|

Program działa ok

Cały program jest tu [URL="http://rapidshare.de/files/38168884/zali_algorytmika__GRAF___.rar.html"]klik[/URL]

type
TForm1 = class(TForm)
Start: TBitBtn;
Koniec: TBitBtn;
ColorBox1: TColorBox;
LabeledEdit1: TLabeledEdit;
LabeledEdit2: TLabeledEdit;
PaintBox1: TPaintBox;
procedure KoniecClick(Sender: TObject);
procedure StartClick(Sender: TObject);
procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

vertex = record
x,y,r: Integer; lab: Char; kol: TColor;
{ x,y = wspolrzedne, r = promien }
{ lab = etykieta, kol = kolor }
end;

edge = record
src,trg,val,thn: Integer; kol: TColor;
{ src = nr.wierzch.zrodlowego }
{ trg = nr.wierzch.docelowego }
{ val = waga, thn = grubosc, kol = kolor }
end;

graph = record
lw,lk: Integer; { liczba wierzcholkow i krawedzi }
zw: array of vertex ; { zbior wierzcholkow }
zk: array of edge; { zbior krawedzi }
end ;

var
Form1: TForm1;
xmn,ymn,xmx,ymx: Integer;
gg: graph;
bw1,bw2: Integer; { numery bliskich wierzcholkow }

implementation

function pointin ( x,y: Integer ): Boolean;
begin {========================== pointin }
pointin := (xmn<x) and (x<xmx)
and (ymn<y) and (y<ymx)
end ; {========================== pointin }

function de( x1,y1,x2,y2: Integer ): Real;
begin { odleglosc euklidesowa ======= de }
de := Sqrt(Sqr(x1-x2)+Sqr(y1-y2))
end ; { odleglosc euklidesowa ======= de }

{$R *.dfm}

procedure newvert (xx,yy: Integer; var vv: vertex) ;
{ uzupelnienie gg o nowy wierzcholek }
var s: string;
begin {=================================== newvert }
vv.x := xx; vv.y := yy; vv.r := 12;
s := Form1.LabeledEdit1.Text;
vv.lab := s[1];
vv.kol := Form1.ColorBox1.Selected;
gg.lw := gg.lw+1; SetLength ( gg.zw , gg.lw );
gg.zw[gg.lw-1] := vv;
s[1] := Succ(s[1]);
Form1.LabeledEdit1.Text := s;
end ; {=================================== newvert }

procedure rysvert ( vv: vertex ) ;
begin {================= rysvert }
with Form1.PaintBox1.Canvas do begin
Pen.Width := 2;{1;}
Brush.Color := vv.kol;
Ellipse(vv.x-vv.r,vv.y-vv.r,vv.x+vv.r,vv.y+vv.r);
TextOut(vv.x-5,vv.y-8,vv.lab);
end
end ; {================= rysvert }

procedure newedge ( s,t: Integer; var ee: edge) ;
begin {================================ newedge }
ee.src := s; ee.trg := t;
ee.thn := 2; ee.kol := clBlack;
ee.val := StrToInt(Form1.LabeledEdit2.Text);
gg.lk := gg.lk+1; SetLength ( gg.zk , gg.lk );
gg.zk[gg.lk-1] := ee
end ; {================================ newedge }

procedure deledge ( nre: Integer );
{ wyrzucenie krawedzi numer 'nre' }
var n: Integer;
begin {================== deledge }
n := nre+1;
while n<gg.lk do begin
gg.zk[n-1] := gg.zk[n];
n := n+1
end;
gg.lk := gg.lk-1
end ; {================== deledge }

procedure delvert ( nrv: Integer );
{ usuwanie wierzchołka z incydentnymi krawedziami }
var i,ost: integer;
begin {================================== delvert }
ost := gg.lw-1;
{ zamieniamy wierzchołek nrv z ost w krawedziach }
if nrv<ost then begin
gg.zw[nrv] := gg.zw[ost];
i := 0;
while i<gg.lk do begin
if gg.zk[i].src = ost then
gg.zk[i].src := nrv else
if gg.zk[i].src = nrv then
gg.zk[i].src := ost ;
if gg.zk[i].trg = ost then
gg.zk[i].trg := nrv else
if gg.zk[i].trg = nrv then
gg.zk[i].trg := ost ;
i := i+1
end
end;
{ wyrzucamy krawedzie incydentne z ost }
i := 0;
while i<gg.lk do begin
if (gg.zk[i].src=ost) or
(gg.zk[i].trg=ost) then
deledge(i) else i:=i+1
end;
{ usuwamy ost }
gg.lw := ost
end ; {================================== delvert }

procedure del2edge ;
{ usuwanie podwojnych krawedzi jakiejs i ostatniej }
{ !!! rowne gdy nieskierowan (src,trg) = (trg,src) }
var nre,ost: Integer; jest: Boolean;
begin {================================== del2edge }
if gg.lk>1 then begin
nre:=-1; ost:=gg.lk-1;
repeat
nre:=nre+1;
jest:=(gg.zk[nre].src = gg.zk[ost].src)
and (gg.zk[nre].trg = gg.zk[ost].trg)
or (gg.zk[nre].src = gg.zk[ost].trg)
and (gg.zk[nre].trg = gg.zk[ost].src)
until (nre=(ost-1)) or jest;
if jest then begin
deledge(nre);
gg.lk := gg.lk-1
end
end
end ; {================================== del2edge }

procedure rysedge ( ee: edge );
var xs,ys,xt,yt: Integer;
begin {============== rysedge }
{ val,thn: Integer; kol: TColor }
{ ustaw kolor i grubosc, wpisz wage }
Form1.PaintBox1.Canvas.Pen.Width := ee.thn;
xs := gg.zw[ee.src].x;
ys := gg.zw[ee.src].y;
xt := gg.zw[ee.trg].x;
yt := gg.zw[ee.trg].y;
Form1.PaintBox1.Canvas.MoveTo(xs,ys);
Form1.PaintBox1.Canvas.LineTo(xt,yt);
end ; {============== rysedge }

procedure rysgraf ;
{ krawedzie i wierzcholki gg }
var n: Integer;
begin {============= rysgraf }
Form1.PaintBox1.Refresh; {Invalidate}
n:=0;
while n<gg.lk do begin
rysedge ( gg.zk[n] );
n := n+1
end;
n:=0;
while n<gg.lw do begin
rysvert ( gg.zw[n] );
n := n+1
end;
end ; {============= rysgraf }

procedure szukaj(X,Y:Integer; var nw:Integer; var mnd:Real);
{ w grafie 'gg' poszukuje sie najblizszego wierzcholka 'nw'}
var anw: Integer; ad: Real;
begin {============================================ szukaj }
mnd:=de(0,0,Form1.PaintBox1.Height,Form1.PaintBox1 .Width);
nw:=-1; anw:=0;
while anw<gg.lw do begin
ad:=de(X,Y,gg.zw[anw].x,gg.zw[anw].y);
if ad<mnd then begin mnd:=ad; nw:=anw end;
anw:=anw+1
end;
end ; {============================================ szukaj }

procedure TForm1.KoniecClick(Sender: TObject);
var
Ico_i_Klaw, Wynik: Integer;
Tytul, Napis: PChar;
begin
Ico_i_Klaw := mb_YesNo or mb_IconQuestion;
Tytul := 'Koniec ?';
Napis := '';
Wynik := MessageBox(0, Napis, Tytul, Ico_i_Klaw);
if (Wynik = Id_Yes) then Close;
end;

procedure TForm1.StartClick(Sender: TObject);
var s: string;
begin
xmn := Paintbox1.Left + 15;
ymn := Paintbox1.Top + 15;
xmx := Paintbox1.Left + PaintBox1.Width - 15;
ymx := Paintbox1.Top + PaintBox1.Height - 15;
PaintBox1.Invalidate;
ColorBox1.Selected := clRed;
LabeledEdit1.Text := 'A';
gg.lw := 0; SetLength ( gg.zw , 0 );
gg.lk := 0; SetLength ( gg.zk , 0 );
bw1 := -1; bw2 := -1;
s := '';
end;

procedure TForm1.FormMouseDown(Sender: TObject; Button:
TMouseButton; Shift: TShiftState; X, Y: Integer);
var vv: vertex; ee: edge; mnd: Real; nw: Integer;
begin
if pointin(X,Y) then
begin
szukaj ( X,Y,nw,mnd );
if (mnd>24) then { 24 = r+r }
begin { daleki }
if bw1>=0 then { poprzedni byl bliski }
begin { przesuniecie }
gg.zw[bw1].x := X;
gg.zw[bw1].y := Y;
bw1 := -1;
rysgraf;
end else { poprzednio nie bylo }
begin { nowy wierzcholek }
newvert(X,Y,vv);
rysvert(vv);
end
end else
if (mnd<gg.zw[nw].r) then
begin { bliski }
if bw1>=0 then { poprzedni byl bliski }
begin bw2 := nw;
if bw1=bw2 then { usun wierzcholek }
begin
delvert(nw);
bw1:=-1; bw2:=-1;
rysgraf;
end else { wstaw/usun krawedz }
begin
newedge(bw1,bw2,ee);
bw1:=-1; bw2:=-1;
del2edge;
rysgraf;
end
end else bw1:=nw { poprzednio nie bylo }
end else { nijaki }
end else { komunikat 1 }
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Form1.Top := 112;
Form1.Left := 180;
Form1.Height := 620;
Form1.Width := 820;
Form1.PaintBox1.Top := 16;
Form1.PaintBox1.Left := 16;
Form1.PaintBox1.Height := 560;
Form1.PaintBox1.Width := 680;
end;

end.</url>