Einzelnen Beitrag anzeigen

Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#1

sporadisch auftretende Nil-Pointer

  Alt 21. Okt 2005, 14:12
Ich hab hier eine kleine Plotter-Klasse geschrieben. Diese nimmt zweidimensional Daten entgegen und kann diesesowohl absolut als auch relativ als Säulen- oder Liniendiagramm darstellen. Eine kleine Beispielausgabe hab ich angehängt

In der Zeichenprozedur wirft es nun, nahezu zufällig (in etwa 50% der aufrufe), AVs mit "read from 000000000", beim Zugriff auf ein dynamisches array, dessen grenzen eigentlich absolut sicher sind. Auch kommt zwischen durch immer mal ein
Zitat:
---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt PCoins.exe ist eine Exception der Klasse EInvalidOperation mit der Meldung 'Leinwand/Bild erlaubt kein Zeichnen' aufgetreten.
Und das kann ich mir einfach nicht erklären.... Im Anhang die komplette unit, hier die zeichenprozedur:

Delphi-Quellcode:
function TPlotter.DrawGraph(dimensions:TPoint;scale:single;range:TIntArray):TBitMap32;
var i,k:integer;
    P:TPoint;
    mult:single;
    YOffSet:integer;
    value:single;
begin

YOffSet:=3;

//init
result:=TBitmap32.Create;

result.Width := dimensions.X;
result.Height := dimensions.Y;

if updating or (length(fdata) < 1) then exit;

dimensions.X := length(fdata) * length(fdata[1]) * XOffSet;
result.Width := dimensions.X;

result.Canvas.Brush.Color := clwhite;
result.Canvas.Rectangle(0,0,dimensions.X,dimensions.Y);

result.Canvas.Pen.Color := clblack; //hier kommt das mit der leinwand.
result.Canvas.Brush.Style := bsclear;

//param checking
range[0]:=Max(low(fData),range[0]);
range[1]:=Min(high(fData),range[1]);

if fMaxValue <> 0 then
mult := (dimensions.Y -10) / (fMaxValue + YOffSet) * scale
else mult := 1;

//drawing

drawscale(mult,-YOffSet,10,result);

result.Canvas.Pen.Width:=5;

case fstyle of
 sColumns:
  for i := range[0] to range[1] do
   for k:= 0 to length(fData[i])-1 do
     begin
       result.Canvas.Pen.Color := fColors[k];
       P.X := round((i* result.Width / range[1] - range[0] / 2) + k*4 + 20);

       value := fdata[i,k]; // manchmal hier....
       if (drawmode = dmChanges) then
        value := fdata[i,k] - fdata[Max(i-1,0),k]; // und manschmal da....

       P.Y := round(value*mult) ;

       result.Canvas.MoveTo(P.X,result.Height - 1 - round(YOffSet * mult));
       result.Canvas.LineTo(P.X,result.Height - P.Y -round(YOffSet * mult)-1);
    end;
 sLines:
   for k:= 0 to length(fData[0])-1 do
    for i := range[0] to range[1] do
      begin
       result.Canvas.Pen.Color := fColors[k];
       P.X := round((i* result.Width / range[1] - range[0] / 2) + k*4 + 20);

       value := fdata[i,k]; //hier unten natürlich auch.
       if (drawmode = dmChanges) then
        value := fdata[i,k] - fdata[Max(i-1,0),k];

       P.Y := round(value*mult) ;


       if i=0 then
         result.Canvas.MoveTo(0, result.Height - P.Y -round(YOffSet * mult)-1);
       result.Canvas.LineTo(P.X,result.Height - P.Y -round(YOffSet * mult)-1);
      end;
 end;

drawlegend(rect(0,0,100,300),result);
end;
Miniaturansicht angehängter Grafiken
plotter_677.gif  
Angehängte Dateien
Dateityp: pas plotter_203.pas (5,8 KB, 6x aufgerufen)
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat