Einzelnen Beitrag anzeigen

Benutzerbild von Delphi-Narr
Delphi-Narr

Registriert seit: 29. Aug 2009
Ort: Duisburg
437 Beiträge
 
Delphi 2007 Professional
 
#4

AW: Maximale Arraylänge?

  Alt 26. Sep 2010, 11: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
  Mit Zitat antworten Zitat