Ich bin gerade dabei, meinem Dateimanager-Programm eine Vorschau-Ansicht für Delphi-Formulare zu spendieren (.DFM-Dateien). Man muss also nur auf eine
DFM-Datei klicken und schon bekommt man die Form im Vorschaufenster angezeigt. Die .PAS-Datei wird nicht benötigt und auch kein Delphi auf dem Computer. Das ist eine Sache, die ich mir selber schon lange gewünscht habe, bei den vielen Formularen ist das z.B. im Rahmnen einer Suche ganz praktisch, die mal kurz optisch anzusehen, ohne die in eine Entwicklungsumgebung laden zu müssen.
Das funktioniert soweit schon ganz gut, es werden Forms und Frames angezeigt (siehe anliegenden Screenshot).
Drei Probleme bleiben, wo ich derzeit nicht so richtig weiterkomme, evtl. weiß jemand Rat:
1. Von den Frames kann ich derzeit nur die Basis-Frames anzeigen. Falls das Frame eine Ableitung von einem anderen Frame ist, kommt der Hinweis, dass das Vorfahr-Frame nicht gefunden wurde und der Vorgang wird abgerochen.
Um das Frame ( / Formular) einzulesen, verwende ich die TReader-Klasse:
Delphi-Quellcode:
...
Reader := TReader.Create(S2, 4096);
// S2 enthält den schon eingelesenen DFM-Stream
FormDyna := Tform.Create(
NIL);
if TypeFrame
then begin
AFrame := TFrame.Create(FormDyna);
Reader.ReadRootComponent(AFrame);
// Hier knallt es, wenn ein Vorfahr-Frame vorhanden ist
AFrame.Parent := FormDyna;
AFrame.visible := True;
end else begin
Reader.ReadRootComponent(FormDyna);
end;
...
Was könnte man hier machen, um das Vorfahr-Frame dem Reader zur Verfügung zu stellen?
2. Wenn der Reader eine unbekannte Klasse findet, dann steigt er aus und liefert kein verwendbares Ergebnis zurück. Das ist also etwas anders, als wenn Delphi eine Form-Datei lädt und fehlende bzw. unbekannte Komponenten beanstandet. Es fehlen dann evtl. einige Komponenten, aber das Form wird jedenfalls geladen. Gibt es irgendeine Option oder sonstige Möglichkeit, dem Reader zu sagen, dass er das Laden fortsetzen soll?
Bislang habe ich das so gelöst, dass ich die unbekannten Komponenten nach dem Einlesen an Ort und Stelle und in der ursprünglichen Position gegen ein TPanel austausche, mit dem Namen der Klasse versehen. Das würde ich auch weiterhin so machen, allerdings sind auch bekannte Standard-Komponenten von Delphi-Version zu Delphi-Version schon mal anders, so dass auch da immer noch eine Abbruchgefahr bleibt, insofern wäre es schön, wenn der Reader trotzdem weiterliest.
3. Das Programm kann natürlich nur die Komponenten anzeigen, die es kennt, sprich, die man mit RegisterClass registriert hat. Das kann ich natürlich für alle Standard-Delphi-Klassen machen und für das was ich hier sonst noch so an Drittkomponenten erworben habe.
Aber andere Anwender werden halt andere Komponenten und Klassen haben, die sie vielleicht auch ganz gerne in der Vorschau sehen würden (statt des Ersatzpanels). Kann man die Klassen der Drittkomponenten z.B. über eine
DLL-Datei (die der Anwender selber erstellen und in das Programmverzeichnis kopieren müsste) meinem Programm bekannt machen oder ist eine andere Lösung denkbar?