Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi ReadComponentResFile (https://www.delphipraxis.net/34470-readcomponentresfile.html)

Igotcha 23. Nov 2004 16:31


ReadComponentResFile
 
Hallo zusammen,

ich benutze D7 und erhalte eine "Invalid Stream Format"-Fehlermeldung, wenn ich versuche, Form2 gem. nachfolgendem Code zu erstellen.

Form2 wird in den Projektoptionen nicht automatisch erzeugt.

Delphi-Quellcode:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

uses Unit2;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  path: String;
begin
    path:=ExtractFilePath(Paramstr(0));
    Form2:=TForm2.CreateNew(Application);
    ReadComponentResFile(path+'unit2.dfm',Form2);
    Form2.Show;
end;

end.
Unit2 sieht so aus:

Delphi-Quellcode:
unit Unit2;

interface

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

type
  TForm2 = class(TForm)
    Button1: TButton;
    Button2: TButton;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

//{$R *.dfm}

end.
Das Beispiel ist aus dem D6 Kochbuch und eigentlich 1:1 übernommen.

Gruß Igotcha

jim_raynor 23. Nov 2004 16:37

Re: ReadComponentResFile
 
Möchtest du nur ein Formular dynamisch erstellen? Beziehungsweise ein Formular mehrmals öffnen? Dann nimm die Kommentare bei //{$R *.dfm} in Unit 2 weg und lass das mit dem ReadComponentResFile.

Igotcha 23. Nov 2004 17:31

Re: ReadComponentResFile
 
Also wie man eine Form und diese auch dynamisch generiert weiß ich ;-)

Ich möchte aber, dass der User das Layout der Form (innerhalb bestimmter Grenzen) ändern kann.

Dazu gehört z.B.
  • das Hinzufügen von DB-Komponenten zur Anzeige von Daten bzw. Neugruppierung von sichtbaren Komponenten und
  • das Hinzufügen von Buttons, hinter die dann Pascal-Script hinterlegt wird
Es handelt sich also um Standardformen mit einem Standardlayout - dieses soll vom Anwender noch nachkonfiguriert werden können.

Ausserdem suche ich ja eine Antwort auf die Frage, warum da ein "Invalid Stream Format"-Fehler kommt.

Gruß Igotcha

jim_raynor 23. Nov 2004 17:37

Re: ReadComponentResFile
 
Mmmh. Auszug aus der Delphi-Hilfe:
Zitat:

Durch einen Aufruf von ReadComponentResFile können eine Komponente und ihre Nachkommen aus der entsprechenden Darstellung in einer Windows-Ressourcendatei erstellt werden
Wenn ich das richtig interpretiere müsste man die dfm-Datei als Windows-Ressourcendatei (*.res) kompilieren. Aber das möchtest du ja nicht, da der User die selbst bearbeiten soll.

Ich würde ehr vermuten, dass es irgendwie über TReader gemacht werden muss. Allerdings habe ich soetwas noch nie gemacht, sind also alles nur Denkansätze.

Igotcha 23. Nov 2004 17:54

Re: ReadComponentResFile
 
Wie gesagt, das ist ein Beispiel aus einem Buch und 1:1 übernommen. Allerdings war das Beispiel für D6.

Fossibaer58809 27. Nov 2004 11:44

Re: ReadComponentResFile
 
Hallo zusammen,

ich meine mich dunkel erinnern zu können, dass man in Delphi 6 auswählen konnte ob die Formulardateien als Resource oder als Text abgespeichert werden sollen. In Delphi 7 ist das Textformat aber Standard. Deshalb muss die Datei konvertiert werden um sie mit ReadComponentResFile einlesen zu können.

Hier ein kurzes funktionierendes Beispiel (ganz quick and dirty).
Code:
procedure TForm1.Button1Click(Sender: TObject);
var path : string;
    InStream,OutStream : TMemoryStream;
begin
    path:=ExtractFilePath(Paramstr(0));
    Instream := TMemoryStream.Create;
    OutStream := TMemoryStream.Create;
    InStream.LoadFromFile(path+'unit2.dfm');
    InStream.Position := 0;
    ObjectTextToResource(InStream, OutStream);
    OutStream.Position := 0;
    Form2:=TForm2.CreateNew(Application);
    OutStream.ReadComponentRes(Form2);
    InStream.Free;
    OutStream.Free;
    Form2.Show;
end;


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