![]() |
Delphi-Version: 11 Alexandria
Klassen, Vererbung und CAST
ich habe eine Klasse TBitMapExtension welche über ihre LoadFromFile, SaveToFile in der Lage ist eine Vielzahl von Grafikformaten (*.jpg, *.tig, *.png) zu verarbeiten
Über einen Cast übergebe ich die Klasse an eine Funktion welche für den Dateityp TBitmap entworfen wurde.
Delphi-Quellcode:
TBitMapExtension = Class(VCL.Graphics.TBitMap)
procedure LoadFromFile(const Filename: String); override; procedure SaveToFile(const Filename: String); override; public ...... end;
Delphi-Quellcode:
Procedure verarbeiteBMP ( ambp : TBitmap)
begin w := abmp.width; // hier kommt es zur AV end;
Delphi-Quellcode:
/// Hauptprogramm
bmp := TBitMapExtension.Create; bmp.loadfromFile(); verarbeiteBMP( TBitmap(bmp)); Warum bekomme ich in der Funktion verarbeiteBMP eine Zugriffsverletzung wenn ich die Weite eine Bitmap auswerten will ? |
AW: Klassen, Vererbung und CAST
Lass Mal den Cast auf TBitmap weg. Den brauchst du hier nicht, da von TBitmap abgeleitet wurde
|
AW: Klassen, Vererbung und CAST
Oder ist es dort ein anderes TBitmap als VCL.Graphics.TBitMap?
|
AW: Klassen, Vererbung und CAST
Zitat:
Du müsstest also beim LoadFromFile dieses DIB anlegen. |
AW: Klassen, Vererbung und CAST
kurze Rückmeldung :
ohne den cast auf TBitmap compiliert mein code nicht |
AW: Klassen, Vererbung und CAST
Dann hat die Variable "bmp" den falschen Typ!
Und abhängig davon, erlaubt der Compiler, dass dort etwas rein kommt, was kein TBitmap oder Nachfahre ist, womit dieser harte Cast alles noch schlimmer machen wird. Wenn du dich nicht mit Casts auskennst, dann verwende niemals harte, sondern nur weiche Casts. hart:
Delphi-Quellcode:
( @Compiler: MACH ES, ich weiß was ich tue und falls nicht ... selbst Schuld)
TBitmap(bmp)
soft:
Delphi-Quellcode:
(lieber Compiler, mach es bitte und wenn falsch, dann hau mir eine runter, damit ich es lerne)
(bmp as TBitmap)
|
AW: Klassen, Vererbung und CAST
Eine TBitmap gibt es auch in WinAPI.Windows: TBitmap = tagBITMAP;
verarbeiteBMP() verwendet vielleicht diesen Typ. Am Besten auch dort den namespace VCL.Graphics. angeben. |
AW: Klassen, Vererbung und CAST
Zitat:
Womit wir wieder bei Beitrag #3 wären :) |
AW: Klassen, Vererbung und CAST
Übergeben wird ein Nachkomme von "VCL.Graphics.TBitMap".
Delphi-Quellcode:
Das ruft ja richtig: "Ich bin keine Nachkomme von der TBitmap-Klasse, die diese Funktion erwartet."
...
verarbeiteBMP( TBitmap(bmp)); Siehe himitsu, so bekommt man auch die richtige Fehlermeldung und läuft nicht in eine Zugriffsverletzung:
Delphi-Quellcode:
...
verarbeiteBMP(bmp as TBitmap); |
AW: Klassen, Vererbung und CAST
Wie schon erwähnt wäre der Cast auf TBitmap eh unnötig, wenn alles richtig wäre.
Zitat:
|
AW: Klassen, Vererbung und CAST
Überprüfe doch einfach mal die Reihenfolge des per uses eingebundenen Units.
Wenn Du schon oben explizit "VCL.Graphics.TBitMap" angeben musst, dann steht im interface Abschnitt wahrscheinlich Uses VCL.graphics, WinApi.Windows Vertausche das und dann solltest Du auch überall das gleiche TBitmap haben. |
AW: Klassen, Vererbung und CAST
wie müsste ich meine code erweitern damit
Zitat:
Delphi-Quellcode:
procedure TBitMapExtension.LoadFromFile(const Filename: String);
var flag: bool; begin /// .... für alle unterschiedlichen Grafiktypen if (Lowercase(ExtractFileExt(Filename)) = '.jpeg') then begin LoadJPEG(self, Filename); flag := TRUE; end; end; procedure LoadJPEG(Bmp: TBitMap; Filename: string); var JPEG: TJPEGImage; begin JPEG := TJPEGImage.Create; try JPEG.LoadFromFile(Filename); with Bmp do begin PixelFormat := pf16bit; // Width := jpeg.Width; // Height := jpeg.Height; Assign(JPEG); // PixelFormat := pf24bit; end; finally JPEG.Free; end; end; |
AW: Klassen, Vererbung und CAST
Die Parameter Übergabe mit
Delphi-Quellcode:
liefert bei mir folgenden Fehler :
Procedure ProcessThisBitmap ( abmp as TBitmap)
Zitat:
auch der Versuch die Höhe / Weite nochmals expliziert zu setzen liefert keine Verbesserung- Beim Zugriff auf .width oder .height bekomme ich eine Zugriffsverletzung in der Unterrutine. Der Aufruf von .width .height innerhalb des Codeblocks der Definition der Variablen funktioniert problemlos
Delphi-Quellcode:
procedure LoadJPEG(Bmp: TBitMap; Filename: string);
var JPEG: TJPEGImage; begin JPEG := TJPEGImage.Create; try JPEG.LoadFromFile(Filename); with Bmp do begin PixelFormat := pf16bit; // Width := jpeg.Width; // Height := jpeg.Height; BMP.SetSize(jpeg.Width,jpeg.Height); Assign(JPEG); // PixelFormat := pf24bit; end; finally JPEG.Free; end; end; |
AW: Klassen, Vererbung und CAST
Wenn Du jetzt schon wieder Probleme mit dem Typ von TBitmap hast, solltest Du vielleicht erst mal unsere Hinweise dazu lesen. Ich kann nicht erkennen, dass dies gelöst ist. Statt dessen stellst Du neue Fragen.
|
AW: Klassen, Vererbung und CAST
Ich verstehe auch nicht, was Du da tust. Wie wäre es denn hiermit?
Delphi-Quellcode:
[edit] Benutzungsbeispiel ergänzt [/edit]
type
TBitmapHelper = class helper for Vcl.Graphics.TBitmap procedure LoadJPEG(Filename: string); end; ... implementation {$R *.dfm} uses jpeg; { TBitmapHelper } procedure TBitmapHelper.LoadJPEG(Filename: string); var lJPG: TJPEGImage; begin lJPG := TJPEGImage.Create; try lJPG.LoadFromFile(Filename); Assign(lJPG); finally lJPG.Free; end; end; // Benutzung: procedure TFormDingens.MachWas; var lBMP: TBitmap; begin lBMP := TBitmap.Create; try lBMP.LoadJPEG(JPEGFilename); lBMP.SaveToFile(BMPFilename); finally lBMP.Free; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:47 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz