Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   TPicture mit eigener BMP-Extension (https://www.delphipraxis.net/169761-tpicture-mit-eigener-bmp-extension.html)

Dennis07 10. Aug 2012 00:50

Delphi-Version: 7

TPicture mit eigener BMP-Extension
 
Hallo,
Ich stehe mal wieder vor einem Problem...
Diesmal will ich eine Art Animation, bestehend aus vier Bilden machen.
Ich habe diese Auch bereits fertig und habe auf meinem Formular ein TImage platziert.
Mithilfe eines Timers will ich immer eines der vier Bilder auf das TImage übertragen, doch so weit komme ich nicht.
Aus Datenschutzgründen muss ich das BMP-Bild als .TEX-Datei speichern (also nur mit einer anderen Dateiendung). Wenn ich nun die Datei mit der TImage.Picture.LoadFromFile('xyz.tex'); -Funktion lade, kommt ein Fehler, dass die TEX-Dateiendung nicht unterstützt wird.
Mal abgesehen davon, dass ich es sehr dürftig entworfen finde, dass der TPicture-Handler nicht einfach mal alle ihm bekannten Dateiformate durchprobiert, hilft mir die Finktion RegisterFileFormat leider auch nicht wirklich weiter, da mir die entsprechende Unit für BMP-Dateien nicht bekannt ist (die für JPEG funktioniert hier nicht).

Hier die OnShow-Prozedur, bei der die Externen Bilder zunächst in den Zwischenspeicher geladen werden, um beim OnTimer-Ereignis abrufbereit zu sein...
Delphi-Quellcode:
  //Img_0.RegisterFileFormat('TEX','Texture file',TBmpImage); SCHEINT NICHT ZU FUNKTIONIEREN!
  Img_0 := TPicture.Create;
  Img_0.LoadFromFile(ExtractFilePath(Application.ExeName) + 'resource\texture\00' + xTEX);
  Img_1 := TPicture.Create;
  Img_1.LoadFromFile(ExtractFilePath(Application.ExeName) + 'resource\texture\01' + xTEX);
  Img_2 := TPicture.Create;
  Img_2.LoadFromFile(ExtractFilePath(Application.ExeName) + 'resource\texture\02' + xTEX);
  Img_3 := TPicture.Create;
  Img_3.LoadFromFile(ExtractFilePath(Application.ExeName) + 'resource\texture\03' + xTEX);
  Img_4 := TPicture.Create;
  Img_4.LoadFromFile(ExtractFilePath(Application.ExeName) + 'resource\texture\04' + xTEX);
Hier die Timer-Prozedur:
Delphi-Quellcode:
procedure TfmUpdater.TimerTimer(Sender: TObject);
begin
  case ImageID of
   (0 or 4): begin
     imAnimation.Picture := Img_1;
     ImageID := 1;
   end;
   1: begin
     imAnimation.Picture := Img_2;
     ImageID := 2;
   end;
   2: begin
     imAnimation.Picture := Img_3;
     ImageID := 3;
   end;
   3: begin
     imAnimation.Picture := Img_4;
     ImageID := 4;
    end;
  end;
end;
Danke für eure Hilfe;
Dennis

himitsu 10. Aug 2012 01:02

AW: TPicture mit eigener BMP-Extension
 
Zitat:

SCHEINT NICHT ZU FUNKTIONIEREN!
WAS scheint nicht zu funktionieren?

Fehlermeldungen sind schon was Tolles. :roll:

Wenn du weißt, daß es ein Bitmap ist, dann lade es doch auch als Bitmap und überlaß' nicht TPicture das Rätselraten. :stupid:
Delphi-Quellcode:
Img_0.Bitmap.LoadFromFile(...); // TPicture erstellt das TBitmap automatisch

Img_1.Graphic := TBitmap.Create;
Img_1.Graphic.LoadFromFile(...);

// und wenn kein direkter Zugriff auf eine eigenschafft besteht
Img_1.Graphic := TJpegImage.Create;
TJpegImage(Img_1.Graphic).LoadFromFile(...);
(Img_1.Graphic as TJpegImage).LoadFromFile(...);

Dennis07 10. Aug 2012 03:50

AW: TPicture mit eigener BMP-Extension
 
Hallo,
Alle Varianten funktionieren nicht.
Es kommt in jedem Fall eine Zugriffsverletzung. Ob ich es mit dem Bitmap oder der Grafik als TJpegImage versuche, immer kommt diese Fehlermeldung und das Bild wird nicht angezeigt.

Es kann natürlich auch sein, dass ich deinen Code nicht richtig intepretiert habe. Du scheinst ja immer 2 Varianten für das LoadFromFile gegeben zu haben. Was genau muss ich jetzt deiner Meinung nach in den Quelltext eintragen?

Danke;

haentschman 10. Aug 2012 05:51

AW: TPicture mit eigener BMP-Extension
 
Moin...

wann wird denn dein Timer aktiviert ? Noch vor dem OnShow ? Wenn ja greifst du auf unerzeugte Objekte zu... ob TBitmap oder TPicture ist da egal... 8-)

jaenicke 10. Aug 2012 06:30

AW: TPicture mit eigener BMP-Extension
 
Zitat:

Zitat von Dennis07 (Beitrag 1177611)
Es kommt in jedem Fall eine Zugriffsverletzung. Ob ich es mit dem Bitmap oder der Grafik als TJpegImage versuche, immer kommt diese Fehlermeldung und das Bild wird nicht angezeigt.

Eine Zugriffsverletzung? An welcher Stelle bei welchem Code?

Wenn die Meldung mit der Dateierweiterung bei LoadFromFile der TBitmap kommen sollte (was ich eigentlich nicht glaube), kannst du die in TFileStream laden und dann mit LoadFromStream arbeiten.

Bummi 10. Aug 2012 07:13

AW: TPicture mit eigener BMP-Extension
 
Liste der Anhänge anzeigen (Anzahl: 1)
Passt nicht ganz hier her, aber Du kannst natürlich auch ein eigens Grafikformat an eine Endung binden, wie die Daten dargestellt werden liegt dann bei Dir.

Bummi 10. Aug 2012 07:15

AW: TPicture mit eigener BMP-Extension
 
Liste der Anhänge anzeigen (Anzahl: 2)
Passt nicht ganz hier her, aber Du kannst natürlich auch ein eigens Grafikformat an eine Endung binden, wie die Daten dargestellt werden liegt dann bei Dir.
Ansonsten wurde die Streamlösung auf TBitmap ja bereits genannt.

Blup 10. Aug 2012 08:15

AW: TPicture mit eigener BMP-Extension
 
Unabhängig von der eigentlichen Frage:
Delphi-Quellcode:
  case ImageID of
   (0 or 4): begin
So wird 0 und 4 bitweise verknüpft und nur mit dem Ergebnis 4 verglichen.

Sollen beide Fälle berücksichtigt werden, muss das so ausschaun:
Delphi-Quellcode:
  case ImageID of
    0, 4: begin

himitsu 10. Aug 2012 08:16

AW: TPicture mit eigener BMP-Extension
 
Es waren 3 einzelne Beispiele und jeweils auch nur eine Variable, hatte bei der Letzten nur vergessen weiterzuzählen.

Ja und wie genau lautet die Fehlermeldeung?
Du wirst es nicht glauben, aber Strg+C funktioniert in den Fehlerdialogen (wird dir mit einem Beep bestätigt) und auch in den Compilermeldungen.


Den Debugger kennst du?

Lade doch in deinem DTimer mal ganz einfache Bitmaps *.bmp ... knallt es da immernoch?

Dennis07 10. Aug 2012 22:11

AW: TPicture mit eigener BMP-Extension
 
Zitat:

Zitat von haentschman (Beitrag 1177612)
Moin...

wann wird denn dein Timer aktiviert ? Noch vor dem OnShow ? Wenn ja greifst du auf unerzeugte Objekte zu... ob TBitmap oder TPicture ist da egal... 8-)

Echt? Das wäre mir neu... Normalerweise werden die Objekte und Variablen doch schon vor auslösen des OnCreate-Ereignisses (also noch lange vor dem OnShow-Ereignis) erstellt...
Mit TStringList etc. funktioniert das doch auch....

Und selbst wenn es so ist: Wo soll ich das erzeugen der TPictures denn sonst hinpacken, da gibt es ja nicht mehr allzu viele Alternativen...

EDIT: ...und JA, ich erzeuge sie beim OnShow-Ereignis, nicht vorher.

haentschman 11. Aug 2012 05:25

AW: TPicture mit eigener BMP-Extension
 
Nochmal...

wenn dein Timer bereits im OnCreate oder im Objektinspektor aktiviert wird könnte dein erstes Timer Event bereits vor OnShow auftreten. Da du die Objekte erst im OnShow erzeugst könnten sie zu dem Zeitpunkt noch nicht vorhanden sein.
--> Timer erst nach dem Erzeugen der Images aktivieren.
8-)

Dennis07 11. Aug 2012 09:51

AW: TPicture mit eigener BMP-Extension
 
Achso, so meinst du das....
Nein, der Timer wird natürlich auch erst im OnShow-Ereignis aktiviert, und zwar nachdem die Bilder in den RAM geladen wurden...
Hierran kann es also nicht liegen.

Dennis

Bummi 11. Aug 2012 10:14

AW: TPicture mit eigener BMP-Extension
 
Delphi-Quellcode:
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls;

type
  TBitMapArray=Array[0..3] of TBitMap;
  TForm2 = class(TForm)
    Timer1: TTimer;
    Image1: TImage;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    FBitMapArray:TBitMapArray;
    FIndex:Integer;
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

Procedure BMPCreateAndLoadFromFile(var bmp:TBitmap;const fn:String);
begin
  bmp := TBitmap.Create;
  bmp.LoadFromFile(fn);
end;


procedure TForm2.FormCreate(Sender: TObject);
Const
  Path='C:\Bilder\IconCollection\ix_ap_all\48x48\plain_bitmap\';
begin
  BMPCreateAndLoadFromFile(FBitMapArray[0],Path + 'about.tex');
  BMPCreateAndLoadFromFile(FBitMapArray[1],Path + 'add.xxx');
  BMPCreateAndLoadFromFile(FBitMapArray[2],Path + 'add2.yyy');
  BMPCreateAndLoadFromFile(FBitMapArray[3],Path + 'bookmark.aaa');
end;

procedure TForm2.FormDestroy(Sender: TObject);
var
 i:Integer;
begin
  for I := 0 to High(FBitMapArray) do
      FreeAndNil(FBitMapArray[i]);

end;

procedure TForm2.Timer1Timer(Sender: TObject);
begin
    Image1.Picture.Assign(FBitMapArray[FIndex]);
    inc(FIndex);
    if FIndex > 3 then Findex := 0;

end;

end.

Dennis07 11. Aug 2012 10:57

AW: TPicture mit eigener BMP-Extension
 
Hallo,
Und es gibt keine Möglichkeit, den TFileStream zu umgehen?
Ich verstehe nicht, wieso ich nicht einfach Vier Bilder erzeugen kann und diese dann bei bedarf in das TImage einlesen kann....
Weiß jemand von euch einen möglichen Grund?

freeway 11. Aug 2012 11:46

AW: TPicture mit eigener BMP-Extension
 
du kannst auch ohne TFileStream die Bilder in das array laden, anderseits was spricht gegen TFileStream ?
TFileStream erkennt an der Extension um welches Format es sich handelt

Dennis07 11. Aug 2012 12:11

AW: TPicture mit eigener BMP-Extension
 
Ja, nun ist das aber ja genau nicht das, was ich will.
Mein Problem entstand ja erst durch die abgeänderte extension. Ich darf die BMP-Endung nicht verwenden, die Dateien sind aber im BMP-Format.
Kann ich nicht dem TPicture sagen, es soll die TEX-Datei wie eine BMP-Datei behandeln?

Bummi 11. Aug 2012 12:27

AW: TPicture mit eigener BMP-Extension
 
intern wird eh in einem Stream geladen, nimmt sich also nichts.
Du kannst MyGraphic.pas aus Posting #6 auch problemlos so umbauen dass Du *.TEX als Bitmap direkt per Image1.Picture.LoadfromFile('Pfad\beispiel.TEX') laden kannst.

EDIT:
oberes (#13) angepasst (ohne sichtbare Streams)

haentschman 11. Aug 2012 14:10

AW: TPicture mit eigener BMP-Extension
 
Zitat:

Nein, der Timer wird natürlich auch erst im OnShow-Ereignis aktiviert, und zwar nachdem die Bilder in den RAM geladen wurden...
...dann ist der Part gut. Kontrolliere trotzdem nochmal ob sich nicht im OI ein Häckchen verirrt hat. Ich glaube, daß die Lösung einfacher ist als die vielen Beispiele. So viele, eigentlich funktionierende, Varianten können nicht irren... 8-)

Dennis07 11. Aug 2012 15:00

AW: TPicture mit eigener BMP-Extension
 
Zitat:

Zitat von haentschman (Beitrag 1177819)
...dann ist der Part gut. Kontrolliere trotzdem nochmal ob sich nicht im OI ein Häckchen verirrt hat. Ich glaube, daß die Lösung einfacher ist als die vielen Beispiele. So viele, eigentlich funktionierende, Varianten können nicht irren... 8-)

Nein, da kann ich dich beruhigen. Bevor ich mir die Mühe mache und hier im Forum einen Post schreibe, habe ich solche Fehlerquellen bereits überprüft... :-D
Danke aber trotzdem, häufig tauchen meine Fehler nähmlich wegen solchen Unaufmerksamkeiten auf.

Zitat:

Zitat von Bummi (Beitrag 1177810)
intern wird eh in einem Stream geladen, nimmt sich also nichts.
Du kannst MyGraphic.pas aus Posting #6 auch problemlos so umbauen dass Du *.TEX als Bitmap direkt per Image1.Picture.LoadfromFile('Pfad\beispiel.TEX') laden kannst.

Wie kann ich es denn so umbauen?
Danke;

Bummi 11. Aug 2012 17:48

AW: TPicture mit eigener BMP-Extension
 
Liste der Anhänge anzeigen (Anzahl: 1)
Halte ich zwar für oversized nur um eine Endung laden zu können, eigentlich eher dafür gedacht ein eigenes Format zu implementieren, aber der Anhang tut was Du willst.

Delphi-Quellcode:
uses TEXBMP.pas;

procedure TForm2.Button1Click(Sender: TObject);
begin
  Image2.Picture.LoadFromFile('C:\Bilder\Bummi.TEX');
end;

Dennis07 11. Aug 2012 18:17

AW: TPicture mit eigener BMP-Extension
 
hm, okay.
Naja, Speicherplatz ist mir egal, die letzendliche Größe spielt bei dieser anwendung keine Rolle (bin aktuell schon bei 1,5MB...)
Okay, ich probiere es heute abend mal aus.
Danke bis hierhin schonmal für eure Hilfe.

Bummi 11. Aug 2012 18:21

AW: TPicture mit eigener BMP-Extension
 
Speicherplatz??? Ich meinte eher den Aufwand ...

EDIT:
ein einfaches
Delphi-Quellcode:
initialization
    TPicture.RegisterFileFormat('TEX', 'BMP mit Endung TEX', TBitmap);
langt auch schon ... also faktischer Aufwand 0

Dennis07 12. Aug 2012 14:45

AW: TPicture mit eigener BMP-Extension
 
Lol... Darauf bin ich ja schon gekommen, nur weiß ich die Unit nicht, in der Bitmap-Images vertreten sind.
Denn: TBitmap wird bei mir nicht gefunden. :shock:

himitsu 12. Aug 2012 17:00

AW: TPicture mit eigener BMP-Extension
 
Sowas steht in der OH?

Delphi-Referenz durchsuchenTBitmap (natürlich macht sich deine installierte OH etwas besser, da sie mehr zu deinem Delphi paßt)

jaenicke 12. Aug 2012 21:43

AW: TPicture mit eigener BMP-Extension
 
Und immer dran denken:
Zuerst Unit Windows, dann Unit Graphics, sonst wird das falsche TBitmap gefunden (es sei denn man schreibt die Unit explizit dazu). :wink:

implementation 12. Aug 2012 22:21

AW: TPicture mit eigener BMP-Extension
 
Zitat:

Aus Datenschutzgründen muss ich das BMP-Bild als .TEX-Datei speichern (also nur mit einer anderen Dateiendung).
Eine andere Dateiendung ist doch kein Datenschutz :shock:

Sir Rufo 12. Aug 2012 22:44

AW: TPicture mit eigener BMP-Extension
 
Zitat:

Zitat von implementation (Beitrag 1177995)
Zitat:

Aus Datenschutzgründen muss ich das BMP-Bild als .TEX-Datei speichern (also nur mit einer anderen Dateiendung).
Eine andere Dateiendung ist doch kein Datenschutz :shock:

Kommt auf die zugrunde liegende Datenschutzverordnung und deren Interpretation an ;)

Dennis07 13. Aug 2012 18:06

AW: TPicture mit eigener BMP-Extension
 
So, danke Leute. Habe es zum laufen bekommen.
Danke an alle, die mir bei der Lösung geholfen haben, es funktioniert einwandfrei.

Zur Datenschutzverordnung: Sir Rufo hat recht. Ich darf keine Dateien verwenden, deren Format offensichtlich am Datei-oder Ordnernamen erkennbar ist. Das tut *.tex meiner Ansicht nach ausreichend.


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