Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Klassen, Vererbung und CAST (https://www.delphipraxis.net/216168-klassen-vererbung-und-cast.html)

bernhard_LA 12. Nov 2024 16:45

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 ?

Olli73 12. Nov 2024 17:09

AW: Klassen, Vererbung und CAST
 
Lass Mal den Cast auf TBitmap weg. Den brauchst du hier nicht, da von TBitmap abgeleitet wurde

Olli73 12. Nov 2024 17:12

AW: Klassen, Vererbung und CAST
 
Oder ist es dort ein anderes TBitmap als VCL.Graphics.TBitMap?

jziersch 12. Nov 2024 17:17

AW: Klassen, Vererbung und CAST
 
Zitat:

Zitat von bernhard_LA (Beitrag 1543063)
Warum bekomme ich in der Funktion verarbeiteBMP eine Zugriffsverletzung wenn ich die Weite eine Bitmap auswerten will ?

Die TBitmap hat selber keine breite - beim auslesen wird eine interne DIB abgefragt, also FImage.FDIB.dsBm. Vermutlich ist in Deinem Fall FImage nicht zugewiesen.

Du müsstest also beim LoadFromFile dieses DIB anlegen.

bernhard_LA 13. Nov 2024 16:21

AW: Klassen, Vererbung und CAST
 
kurze Rückmeldung :

ohne den cast auf TBitmap compiliert mein code nicht

himitsu 13. Nov 2024 16:34

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:
TBitmap(bmp)
( @Compiler: MACH ES, ich weiß was ich tue und falls nicht ... selbst Schuld)
soft:
Delphi-Quellcode:
(bmp as TBitmap)
(lieber Compiler, mach es bitte und wenn falsch, dann hau mir eine runter, damit ich es lerne)

jziersch 13. Nov 2024 17:28

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.

Olli73 13. Nov 2024 17:40

AW: Klassen, Vererbung und CAST
 
Zitat:

Zitat von jziersch (Beitrag 1543106)
Eine TBitmap gibt es auch in WinAPI.Windows: TBitmap = tagBITMAP;

verarbeiteBMP() verwendet vielleicht diesen Typ. Am Besten auch dort den namespace VCL.Graphics. angeben.


Womit wir wieder bei Beitrag #3 wären :)

Blup 13. Nov 2024 18:24

AW: Klassen, Vererbung und CAST
 
Übergeben wird ein Nachkomme von "VCL.Graphics.TBitMap".
Delphi-Quellcode:
...
verarbeiteBMP( TBitmap(bmp));
Das ruft ja richtig: "Ich bin keine Nachkomme von der TBitmap-Klasse, die diese Funktion erwartet."

Siehe himitsu, so bekommt man auch die richtige Fehlermeldung und läuft nicht in eine Zugriffsverletzung:
Delphi-Quellcode:
...
verarbeiteBMP(bmp as TBitmap);

DeddyH 14. Nov 2024 05:59

AW: Klassen, Vererbung und CAST
 
Wie schon erwähnt wäre der Cast auf TBitmap eh unnötig, wenn alles richtig wäre.
Zitat:

Zitat von bernhard_LA (Beitrag 1543102)
kurze Rückmeldung :

ohne den cast auf TBitmap compiliert mein code nicht

Da sollte man doch stutzig werden und die Compiler-Meldungen lesen.

gubbe 14. Nov 2024 08:58

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.

bernhard_LA 20. Nov 2024 12:06

AW: Klassen, Vererbung und CAST
 
wie müsste ich meine code erweitern damit
Zitat:

FImage.FDIB.dsBm
angelegt wird ?



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;

bernhard_LA 22. Nov 2024 08:57

AW: Klassen, Vererbung und CAST
 
Die Parameter Übergabe mit
Delphi-Quellcode:
Procedure ProcessThisBitmap ( abmp as TBitmap)
liefert bei mir folgenden Fehler :

Zitat:

[dcc64 Error] Unit_Testcases.pas(646): E2015 Operator not applicable to this operand type

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;

gubbe 22. Nov 2024 09:05

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.

DeddyH 22. Nov 2024 09:09

AW: Klassen, Vererbung und CAST
 
Ich verstehe auch nicht, was Du da tust. Wie wäre es denn hiermit?
Delphi-Quellcode:
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;
[edit] Benutzungsbeispiel ergänzt [/edit]


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