AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von Harry Stahl · begonnen am 26. Feb 2014 · letzter Beitrag vom 4. Mär 2014
Antwort Antwort
Seite 4 von 4   « Erste     234   
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#31

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

  Alt 3. Mär 2014, 18:18
Joar und obwohl die Bilder gleich bleiben, meint die Versionierung öfters mal, daß sich in der DFM (ImageList) etwas/massig geändert hat, nur weil man die Form/Datenmodul neu speichert.
$2B or not $2B
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#32

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

  Alt 4. Mär 2014, 08:03
Wie sieht denn nun eigentlich der Lösungsansatz genau aus? Nach den hier vorliegenden Hinweisen würde ich einen Parser vermuten, der aus der DFM die Deklarationen einer Image/ImageList-Komponente extrahiert und isoliert um darauf den jeweiligen Componentreader loszulassen. Ich würde mir noch nicht einmal die Mühe machen, das Hexkauderwelsch zu verstehen.

Das sollte doch für alle Komponenten gleich funktionieren. Man müsste sie nur registrieren und die Bildextrahierlogik auf Basis der konkreten Properties individuell programmieren. Dafür bietet sich eine Factory an. Der Pseudocode sähe so aus:

Delphi-Quellcode:
Procedure ExtractImages (aDFM : string; aImages : TList);
var
  index : Integer;
  imageComponentDFM : string;
  classType : TComponentClass;
  definition : string;
  extractor : IComponentImageExtractor;

Begin
  repeat
    imageComponentDFM := ExtractNextPortion(aDFM, index); // get next component definition
    if imageComponentDFM='then break; // no more components
    SplitDFMIntoClassAndDefinition(imageComponentDFM, classType, definition);
    extractor := TComponentImageExtractorFactory.Create(classType);
    if extractor = nil then continue; // the class is not registered
    extractor.ReadComponentData(definition);
    extractor.ExtractImages(aImages);
  until false;
end;

type
  IComponentImageExtractor : interface
    Procedure ReadComponentData (aDefinition : String); // Will initialize the component from the DFM definition
    Procedure ExtractImages (aImages : TList); // Will copy the images from the component to the list
  end;

  TComponentImageExtractorFactory : class
    class procedure Create (aComponentClass : TComponentClass);
    class procedure Register (aExtractor : IComponentImageExtractor; aComponentClass : TComponentClass);
  end;
Für jede Komponente, die Bildinformationen enthält, implementiert man einen 'ComponentImageExtractor', der die beiden recht banalen Methoden implementiert und registriert die Klasse zusammen mit der Komponente, für die der Extractor gedacht ist (also TImage, TImageList, TBitBtn usw.)

Die Methode 'ReadComponentData' ist vermutlich für alle Komponenten gleich. Sie erwartet einen String der Form (o.ä.) 'object ImageList: TImageList #13#10 Bitmap = {494...} end' und liest die Daten über TStream.ReadComponent ein.

Über die Factory kann man das dann problemlos und beliebig erweitern. Unübersichtlich ist es auch nicht, das die Aufgaben schon komplett verteilt sind.
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.538 Beiträge
 
Delphi 11 Alexandria
 
#33

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

  Alt 4. Mär 2014, 18:57
Wie sieht denn nun eigentlich der Lösungsansatz genau aus? Nach den hier vorliegenden Hinweisen würde ich einen Parser vermuten, der aus der DFM die Deklarationen einer Image/ImageList-Komponente extrahiert und isoliert um darauf den jeweiligen Componentreader loszulassen.
Ja, Da vermutest Du richtig. Ich gebe zu, ich habe es mir (mal wieder) einfach gemacht. Ich gestehe, dass neben Standard-Datenbanken meine zweite Schwachstelle die Komponentenprogrammierung ist. Bevor ich mich jetzt in die da üblicherweise zu verwendenden Funktionen einarbeite, mache ich es eben so. Ich brauch letztlich auch "nur" noch ein paar Informationen über die "Header" der Grafikkomponenten rausfinden und dann bin ich auch schon fertig.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 4 von 4   « Erste     234   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:49 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