AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Maximale Arraylänge?

Ein Thema von Delphi-Narr · begonnen am 26. Sep 2010 · letzter Beitrag vom 27. Sep 2010
Antwort Antwort
Benutzerbild von Delphi-Narr
Delphi-Narr

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

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
Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#2

AW: Maximale Arraylänge?

  Alt 26. Sep 2010, 12:26
Der für das Problem relevante Teil mal etwas freigestellt:
Delphi-Quellcode:
     SetLength(PS,l);

     for i:=0 to l-1 do
     begin
          PS[i]:=XYtoPixels(XV[i],YV[i]);
     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;
Da erkenne ich jetzt kein Fehler, das Polyline eine Obergrenze an hat, ist mir auch nicht bekannt.

Bei SetLength mal einen Breakpoint setzen und auch die Größe von XV/YV testen. Wenn die schon bei 199 Werten stehen bleiben, die Zuweisung dort prüfen (Der Code fehlt leider).

PS: Zeigen die Setter X/YValues direkt auf ein Array oder gibt es eine SetFunktion?

Geändert von Satty67 (26. Sep 2010 um 12:29 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:43 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz