Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Streamen von Record (https://www.delphipraxis.net/165876-streamen-von-record.html)

v2afrank 19. Jan 2012 14:15

Delphi-Version: 2006

Streamen von Record
 
Liste der Anhänge anzeigen (Anzahl: 1)
In einem meiner Projekte benutze ich die JvDesignUtils um meine Formulare in eine Datei zu speichern. Das klappt auch ganz wunderbar. Jetzt wollte ich einen abgeleitetet Datentyp um ein Record ergänzen. Dieses Record wird aber nicht abgespeichert. Ich habe mal ein kleines Demoprogramm angehängt, was das machen sollte.
Hier mal der Code dazu
Delphi-Quellcode:
unit Main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls,JvDesignUtils;
type TMeinTyp=(mt_Typ1,mt_Typ2,mt_Typ3);

type TMeinRecord=record
 MyBoolean:Boolean;
 Mystring:string;
 MyTyp:TMeinTyp;
end;
type
  TForm6 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    procedure SaveLayOutToFile(Filename:string);
    procedure LoadLayOutFromFile(Filename: string);
    procedure SaveForm;
  end;

 type TMyLabel=class (TLabel)
   private
    fmyboolean:Boolean;
    fMyRecord:TMeinRecord;
   public

    procedure ZeigeDich;
   published
    property MyBoolean:Boolean read fmyboolean write fmyboolean;
    property MyRecord:TMeinRecord read fMyRecord write fMyRecord;
 end;
var
  Form6: TForm6;

implementation

{$R *.dfm}
 procedure TForm6.SaveForm;
 var
 fFile: TFileStream;
 i: Integer;
 begin
 fFile := TFileStream.Create('C:\Test.txt', fmCreate);
 try
 for i :=0 to self.ComponentCount-1 do
 begin
 fFile.WriteComponent(self.Components[i]);
 end;
 finally
 fFile.Free;
 end;
 end;
 

procedure TForm6.Button1Click(Sender: TObject);
var
 ALabel:TMyLabel;
begin
 ALabel:=TMyLabel.Create(Self);
 ALabel.Parent:=self;
 ALabel.Left:=150;
 ALabel.Top:=50;
// ALabel.MyRecord.MyTyp:=mt_Typ2;
 ALabel.ZeigeDich;
end;

procedure TForm6.Button2Click(Sender: TObject);
begin
 SaveLayOutToFile('C:\Test2.txt');
end;

procedure TForm6.Button3Click(Sender: TObject);
begin
LoadLayOutFromFile('C:\Test2.txt');
end;

procedure TForm6.SaveLayOutToFile(Filename: string);
begin
    DesignSaveComponentToFile(self, Filename);

end;
procedure TForm6.LoadLayOutFromFile(Filename: string);
begin
    DesignLoadComponentFromFile(self, FileName, nil);
end;
 { TMyLabel }


procedure TMyLabel.ZeigeDich;
begin
 case MyRecord.MyTyp of
   mt_Typ1: Caption:='mt_Typ1';
   mt_Typ2: Caption:='mt_Typ2';
   mt_Typ3: Caption:='mt_Typ3';
 end;
end;

initialization
  registerclass(TMyLabel);
 finalization
  unregisterclass(TMyLabel);
end.
Die abgespeicherte Datei hat folgenden Inhalt
Delphi-Quellcode:
object Form6: TForm6
  Left = 176
  Top = 232
  ActiveControl = Button2
  Caption = 'Form6'
  ClientHeight = 364
  ClientWidth = 544
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  Position = poDesigned
  Visible = True
  PixelsPerInch = 96
  TextHeight = 13
  object TMyLabel
    Left = 150
    Top = 50
    Width = 42
    Height = 13
    Caption = 'mt_Typ1'
    MyBoolean = False
  end
  object Button1: TButton
    Left = 48
    Top = 48
    Width = 75
    Height = 25
    Caption = 'Erzeuge Label'
    TabOrder = 0
    OnClick = Button1Click
  end
  object Button2: TButton
    Left = 48
    Top = 79
    Width = 75
    Height = 25
    Caption = 'Speichern'
    TabOrder = 1
    OnClick = Button2Click
  end
  object Button3: TButton
    Left = 48
    Top = 110
    Width = 75
    Height = 25
    Caption = 'Laden'
    TabOrder = 2
    OnClick = Button3Click
  end
end
Wie man sieht wird Myboolean abgespeichert, aber nicht das Record. Kann mir einer von Euch sagen wo da mein Denkfehler ist ?
Danke

himitsu 19. Jan 2012 14:33

AW: Streamen von Record
 
Schau mal in die Compilermeldungen ... ich glaub da sollte irgendwas von wegen Record-Property und Published drinstehn, also daß diese sich nicht vertragen.

v2afrank 20. Jan 2012 06:37

AW: Streamen von Record
 
Nein, das Programm compiliert ohne Warning oder Hinweise

himitsu 20. Jan 2012 08:41

AW: Streamen von Record
 
Hmm, stimmt, keine Meldung :shock:

Aber mit Records als Property gibt es eh "nur" Probleme ... zumindestens sobald diese nicht ReadOnly sind.

Gib deinem Property mal einen Setter und dann versuch Folgendes.
Delphi-Quellcode:
MyForm.MyRecord.MyBoolean := True;
.
Das Funktioniert nicht, es wird zurecht nichts gesetzt, und hier sollte XE2 endlich eine Meldung ausspucken (hatte man in den alten Delphis vergessen zu machen).

v2afrank 20. Jan 2012 12:16

AW: Streamen von Record
 
Hast Recht. Da meckert der Compiler.
Hast Du denn eine Idee für einen Workaround ?
Ich probier jetzt mal TMeinRecord als Kalsse zu deklarieren, obwohl das in meiner eigentlichen Anwendung sicherlich einige Änderungen nach sich ziehen wird


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