Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Rave Zugriffsverletztung bei übergabe von Bitmap (https://www.delphipraxis.net/150274-rave-zugriffsverletztung-bei-uebergabe-von-bitmap.html)

TUX_der_Pinguin 12. Apr 2010 11:06


Rave Zugriffsverletztung bei übergabe von Bitmap
 
Ich habe in meinem Projekt ein Report an den eine Grafik übergeben wird, unter Delphi 2007
funktioniert noch alles einwandfrei. Seit der Umstellung auf Delphi 2009 mit Rave 7.6.2 BE
klappt es nicht mehr bzw. bei einer Grafik geht es, wählt man eine andere erhält man eine
Zugriffsverletzung. Bei den Grafiken handelt es sich jeweils um JPEG Dateien mit einer
Auflösung von 250x75 Pixel, die Dateigröße beträgt einmal ca. 40 KB (Diese Datei wird übergeben)
bei der Anderen ca. 4 KB (Bei dieser Datei gibt es die Zugriffsverletzung).

Ich habe auch eine weitere Grafik ausprobiert um auszuschließen das die Grafik selbst korrupt ist,
aber auch bei einer anderen Grafik erhalte ich immer die Zugriffsverletzung.

Ich bin mit dem Debugger durch den Quelltext gelaufen und der Fehler tritt bei Connection.WriteBlobData
auf, ich habe jedoch keine Idee wieso bzw. wie ich das ändern muss.

Delphi-Quellcode:
procedure TfrmCertificate.RvCustomConHeaderGetRow(Connection: TRvCustomConnection);
var
  MemStream: TMemoryStream;
  Bitmap: TBitmap

begin

  MemStream := TMemoryStream.Create;
  try
    Bitmap := TBitmap.Create;
    try
      try
        if Assigned(imgSignature.Picture.Graphic) then begin
          //Unterschriftdatei zuweisen
          Bitmap.Assign(imgSignature.Picture.Graphic);

          //'Unterschrift'
          Connection.WriteStrData('', '');
        end
        else begin
          //'leer' Bitmap erzeugen...
          Bitmap.PixelFormat := pf4bit;
          Bitmap.Width      := 2;
          Bitmap.Height     := 2;

          //'Unterschrift'
          Connection.WriteStrData(cmbSignature.Text, '');
        end;{else}

        Bitmap.SaveToStream(MemStream);
        Connection.WriteBlobData(MemStream.Memory^, MemStream.Size);
      except
        on E: Exception do ShowMessage(E.Message); //Bitmap ungültig
      end;

    finally
      Bitmap.Free;
    end;
  finally
    MemStream.Free;
  end;

end;
Mittlerweile glaube ich das Rave Report 7.6.2 sowas von total verbuggt ist und ich mich frage wieso es kein Update gibt.

mfg

TUX

TUX_der_Pinguin 13. Apr 2010 08:10

Re: Rave Zugriffsverletztung bei übergabe von Bitmap
 
So ich habe eine Lösung gefunden wie ich das Problem mit Rave 7.6.2 umschiffen kann. Merkwürdigerweise kommt der
Report damit klar wenn die Grafiken eine Auflösung haben von 531 x 189 Pixel was dem Grafik Objekt im Report
entspricht, das Objekt hat dort eine Größe von 45 x 16 mm. Und Grafiken die nicht in diese Auflösung passen
können nicht korrekt an den Report übergeben werden und so erscheint eine Zugriffsverletzung.

In der folgenden Lösung erstelle ich ein leeres Bitmap mit den "richten" Werten und kopiere einfach die Grafik
auf dieses Bitmap und das schicke ich zum Report und dann läuft es.

Delphi-Quellcode:
  //'Unterschrift' Datei...
  if Assigned(imgSignature.Picture.Graphic) then begin

    MemStream := TMemoryStream.Create;
    try
      Bitmap := TBitmap.Create;
      try
        try
          //Bitmap erzeugen mit der entsprechenden Größe (45x16 mm)
          Bitmap.PixelFormat := pf32bit;
          Bitmap.Height := 189;
          Bitmap.Width := 531;

          //Unterschrift Grafik auf Bitmap Zeichnen
          Bitmap.Canvas.StretchDraw(Rect(0,0,Bitmap.Width, Bitmap.Height), imgSignature.Picture.Graphic);

          //Unterschrift in Speicher kopieren
          Bitmap.SaveToStream(MemStream);

          //'Unterschrift' an Report übergeben
          Connection.WriteStrData('', '');
          Connection.WriteBlobData(MemStream.Memory^, MemStream.Size);
        except
          on E: Exception do ShowMessage(E.Message);
        end;
      finally
        Bitmap.Free;
      end;
    finally
      MemStream.Free;
    end;

  end
  else begin
    //'Unterschrift'
    Connection.WriteStrData(cmbSignature.Text, '');
    Connection.WriteBlobData(nil^, 0);
  end;{else}
Ich hoffe das das jetzt alle Bugs waren im Rave Report System.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:58 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