AW: Wie Image aus VCL-Formular-Datei (.dfm) auslesen
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.
|
AW: Wie Image aus VCL-Formular-Datei (.dfm) auslesen
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:
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.)
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; Die Methode 'ReadComponentData' ist vermutlich für alle Komponenten gleich. Sie erwartet einen String der Form (o.ä.)
Delphi-Quellcode:
und liest die Daten über
'object ImageList: TImageList #13#10 Bitmap = {494...} end'
Delphi-Quellcode:
ein.
TStream.ReadComponent
Über die Factory kann man das dann problemlos und beliebig erweitern. Unübersichtlich ist es auch nicht, das die Aufgaben schon komplett verteilt sind. |
AW: Wie Image aus VCL-Formular-Datei (.dfm) auslesen
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:44 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