Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Wie Image aus VCL-Formular-Datei (.dfm) auslesen (https://www.delphipraxis.net/179321-wie-image-aus-vcl-formular-datei-dfm-auslesen.html)

Harry Stahl 26. Feb 2014 17:59

Wie Image aus VCL-Formular-Datei (.dfm) auslesen
 
Weiß jemand, in welchem Format Delphi die Images in der Formulardatei speichert? In der Textfassung sieht das ja ungefähr so aus:
Code:
object Image1: TImage
    Left = 48
    Top = 40
    Width = 105
    Height = 105
    HelpType = htKeyword
    HelpKeyword = 'g'
    Picture.Data = {
      07544269746D6170E6040000424DE60400000000000036000000280000001400
      0000140000000100180000000000B00400000000000000000000000000000000
Ich würde nun gern die Image mit einem externen Programm laden, manipulieren und wieder zurückschreiben. Kennt jemand einen einfachen Weg?

Bernhard Geyer 26. Feb 2014 18:49

AW: Wie Image aus VCL-Formular-Datei (.dfm) auslesen
 
Die Daten sind Hex-Codiert.
In deinem Beispiel steht TBitmap + den Binärstream des Bitmaps drin.

himitsu 26. Feb 2014 19:05

AW: Wie Image aus VCL-Formular-Datei (.dfm) auslesen
 
Mit TReader einlesen, in TWriter kopieren und dabei das Gewünschte verändern.
(man muß nur mal nachsehn, ob bei dem Textformat etwas beachtet werden muß, da das Format grundsätzlich erstmal binär ist ... eventuell gibt es auch irgendwo ein paar Konvertierungsfunktionen)

Man könnte auch ganz böse die DFM "laden", also eine Form-Insttanz erstellen (die Methodenzeiger müssen aber beachtet werden), ändert dann in der TImageInstanz das Bild und speichert die DFM danach wieder ab.

Perlsau 26. Feb 2014 19:20

AW: Wie Image aus VCL-Formular-Datei (.dfm) auslesen
 
Mich würde interessieren, was der Hintergrund dieser Anforderung ist: Um an die Bitmap- bzw. Picture-Daten zu kommen, genügt doch einfach ein
Delphi-Quellcode:
Image1.Picture.SaveToFile(Dateiname);
... wozu benötigt man dann die DFM, um dort umständlich die Picture-Daten auszulesen und zu interpretieren?

Bernhard Geyer 26. Feb 2014 20:36

AW: Wie Image aus VCL-Formular-Datei (.dfm) auslesen
 
Zitat:

Zitat von Perlsau (Beitrag 1249759)
Mich würde interessieren, was der Hintergrund dieser Anforderung ist: Um an die Bitmap- bzw. Picture-Daten zu kommen, genügt doch einfach ein
Delphi-Quellcode:
Image1.Picture.SaveToFile(Dateiname);
... wozu benötigt man dann die DFM, um dort umständlich die Picture-Daten auszulesen und zu interpretieren?

Stimmt. Das wäre die Frage.
Wenn sowas austauschbar gestaltet werden soll gibt es 100 bessere und einfachere Lösungen als das im DFM zu machen.

himitsu 27. Feb 2014 02:20

AW: Wie Image aus VCL-Formular-Datei (.dfm) auslesen
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1249766)
Wenn sowas austauschbar gestaltet werden soll gibt es 100 bessere und einfachere Lösungen als das im DFM zu machen.

z.B. in die Resourcen und das Bild im OnCreate (oder so) ins Image laden. (wie man eine Resource 'ner EXE ändert, sollte sich leicht finden lassen)

Buddelfish 27. Feb 2014 07:02

AW: Wie Image aus VCL-Formular-Datei (.dfm) auslesen
 
Also wenn ich eine DFM ohne PAS-Datei hätte und wollte das Bild haben, würde ich einfach ein neues Formular mit allen Komponeten der DFM-Datei erstellen, speichern, DFM austauschen, wieder laden und dann das Bild kopieren. Alles über die IDE und alles ohne Programmcode. Sollte in 1 Minute erledigt sein.

Vermutlich reicht es, ein TImage auf eine Form zu klatschen, speichern, DFM austauschen, laden, Fehler wegklicken, fertig.

Sir Rufo 27. Feb 2014 07:14

AW: Wie Image aus VCL-Formular-Datei (.dfm) auslesen
 
Eventuell hilft ja dieser Link weiter

DFM Parser and Search Utility

Harry Stahl 27. Feb 2014 17:19

AW: Wie Image aus VCL-Formular-Datei (.dfm) auslesen
 
Zitat:

Zitat von himitsu (Beitrag 1249757)
Mit TReader einlesen, in TWriter kopieren und dabei das Gewünschte verändern.

Leider habe ich mit TReader und TWriter gar keine Erfahrung (vermute mal, das verwendet man im Rahmen der Komponenten-Entwicklung?).

Ich habe mal versucht, ein Programm zu erzeugen, das zwei Images auf der Form hat. Nun wollte ich erst mal die Image2 laden und dann "kopieren" (wie Du schreibst) und in Image1 schreiben (die Image-Manipulation habe ich mir also erst einmal geschenkt).

So sieht der Source-Code aus:

Code:
procedure TForm43.FormCreate(Sender: TObject);
var
  writer: TWriter;
  reader : TReader;
  msr, msw: TMemorystream;
begin
  msr:= TMemorystream.create;
  msw := TMemorystream.create;

  reader := TReader.Create (msr,0);
  // Liest Komponente "Image2"
  reader.ReadComponent (Image2); // Hier kommt stream-lesefehler

  Writer := TWriter.Create (msw, 0);

  msr.position := 0;
  msw.CopyFrom (msr, msw.size);
  writer.WriteComponent (Image1);
end;
Bei der gekennzeichneten Zeile kommt der Fehler wie beschrieben.

Was mache ich falsch, bzw. muss ich anders machen?

Harry Stahl 27. Feb 2014 17:30

AW: Wie Image aus VCL-Formular-Datei (.dfm) auslesen
 
Zitat:

Zitat von Perlsau (Beitrag 1249759)
Mich würde interessieren, was der Hintergrund dieser Anforderung ist:...

Ich möchte diese Sache nicht in Programm selber machen, welches die DFM-Datei enthält, sondern mit einem externen Programm eine DFM-Datei laden (bzw. daraus nur die TImage-Komponente), diese dann manipulieren (z.B. von 24-Bit in ein transparentes 32-Bitmap ändern) und dann in die Form zurückschreiben (also in der textuellen Fassung).

Hintergrund ist u.a., dass z.B. bei der Konvertierung mit dem MIDA-Converter die i.d.R. 24-Bit Bitmaps auch in 24-Bit konvertiert werden. Dann werden diese aber mit den hässlichen Hintergrundfarben (z.B. Pink) angezeigt. Insofern möchte ich vorher mit einem kleinen Programm alle 24-Bit Bitmaps in einem Rutsch in 32-Bit Bitmaps ändern, die "Hintergrundfarbe" durch Transparenz ersetzen, damit diese Bitmaps dann in der FMX-Form transparent angezeigt werden können.

Wenn man z.B. 100 oder mehr TSpeedButtons in einer Form hat, mit entsprechenden Glpyhs, wäre es schon ein irrer Aufwand, hinterher manuell die Bitmaps bearbeiten zu müssen, das will ich mir halt ersparen (habe zwar den MIDA-Leuten vorgeschlagen, diese Option in deren Programm einzubauen, habe daher aber bislang noch keine Antwort erhalten [Sie wollten es prüfen]).


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:35 Uhr.
Seite 1 von 4  1 23     Letzte »    

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