Registriert seit: 29. Aug 2009
Ort: Duisburg
437 Beiträge
Delphi 2007 Professional
|
AW: Maximale Arraylänge?
26. Sep 2010, 12:52
Es kommt weder Fehlermeldung noch Absturz. Der Graph wird einfach nicht mehr gezeichnet. Nur die Achsen sind noch sichtbar...
Hier der Aufruf, um zu malen
Delphi-Quellcode:
var i:integer;
begin
randomize;
for i:=0 to 198 do
begin
G1.XValues[i]:=-400+4*i;
G1.YValues[i]:=Random(599)-300;
end;
G1.Redraw;
end;
Es werden die Werte 0 bis 198 zufällig eingetragen (zumindest y) und der Graph wird neu gezeichnet. Dieser aufruf klappt, dich wenn man die 198 durch 199 ersetzt, klappt es nicht mehr... Arraylänge wird vorher angepasst.
Hier die Prozedur "Redraw" Sorry für formatierung, ist nur kopiert...
Delphi-Quellcode:
procedure TLbGraph.Redraw(Delete:Boolean=True);
var i,l,X,Y,dX,dY:integer;
Ps:Array of TPoint;
Pt:TPoint;
XA,YA:Boolean; //Achsen zeichnen???
begin
SetLength(Ps,0);
if (Length(XV)=0) or (Length(YV)=0) then exit;
if Length(XV)>Length(YV) then l:=Length(YV) else l:=Length(XV); //den kürzeren Array nehmen
SetLength(PS,l);
for i:=0 to l-1 do
begin
PS[i]:=XYtoPixels(XV[i],YV[i]);
end;
if Delete then G.canvas.FillRect(Rect(0,0,width,height));
XA:=False;
YA:=False;
Pt:=XYToPixels(0,0);
if (PT.x>30) and (Pt.x<width-30) then
begin
x:=Pt.x;
YA:=True;
end
else
x:=10;
if (PT.y>30) and (Pt.y<height-30) then
begin
y:=Pt.y;
XA:=True;
end
else y:=height-30;
if XA then
begin
G.canvas.pen.color:=clblack;
//XAchse malen
G.canvas.MoveTo(-1,Y);
G.canvas.LineTo(width+1,y);
i:=10;
while i<width-40 do
begin
G.canvas.Font.size:=5;
if (i<x-20) or (i>x+20) then G.canvas.TextOut(i,Y-10,FloatToStrf(PixelsToXY(i,i).x,fffixed,10,2));
i:=i+50;
end;
end;
if YA then
begin
G.canvas.pen.color:=clblack;
//YAchse malen
G.canvas.MoveTo(X,-1);
G.canvas.LineTo(X,height+1);
i:=10;
while i<height-40 do
begin
G.canvas.Font.size:=5;
if (i<y-20) or (i>y+20) then G.canvas.TextOut(X+10,i,FloatToStrf(PixelsToXY(i,i).y,fffixed,10,2));
i:=i+50;
end;
end;
G.Canvas.pen.color:=clgray;
if not XA then
begin
i:=10;
while i<width-40 do
begin
G.canvas.Font.size:=5;
if (i<x-20) or (i>x+20) then G.canvas.TextOut(i,y,FloatToStrf(PixelsToXY(i,i).x,fffixed,10,2));
i:=i+50;
end;
end;
if not YA then
begin
i:=10;
while i<height-40 do
begin
G.canvas.Font.size:=5;
if (i<y-20) or (i>y+20) then G.canvas.TextOut(x,i,FloatToStrf(PixelsToXY(i,i).y,fffixed,10,2));
i:=i+50;
end;
end;
//Graphen zeichnen
if GraphKind=gkstraight then
begin
G.canvas.pen.color:=clred;
G.canvas.Polyline(Ps);
end
else
if GraphKind=gkrounded then
begin
G.canvas.pen.color:=clred;
G.canvas.Polybezier(Ps);
end;
end;
ist noch recht provisorisch, aber prinzipiell klappt es.
Viele Grüße!
Edit: Ich habe diesen Record auch schon erstellt. Ich habe mir nur noch nicht überlegt, wie der Nutzer die Werte dann eintragen kann. Darum getrennt. Die Tags hab ich oben nur vergessen
|