AGB  ·  Datenschutz  ·  Impressum  







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

Streamen von Record

Ein Thema von v2afrank · begonnen am 19. Jan 2012 · letzter Beitrag vom 20. Jan 2012
Antwort Antwort
v2afrank

Registriert seit: 9. Mai 2005
Ort: Bocholt
571 Beiträge
 
Delphi XE2 Professional
 
#1

Streamen von Record

  Alt 19. Jan 2012, 14:15
Delphi-Version: 2006
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
Angehängte Dateien
Dateityp: zip streamtest.zip (228,2 KB, 2x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Streamen von Record

  Alt 19. Jan 2012, 14:33
Schau mal in die Compilermeldungen ... ich glaub da sollte irgendwas von wegen Record-Property und Published drinstehn, also daß diese sich nicht vertragen.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
v2afrank

Registriert seit: 9. Mai 2005
Ort: Bocholt
571 Beiträge
 
Delphi XE2 Professional
 
#3

AW: Streamen von Record

  Alt 20. Jan 2012, 06:37
Nein, das Programm compiliert ohne Warning oder Hinweise
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Streamen von Record

  Alt 20. Jan 2012, 08:41
Hmm, stimmt, keine Meldung

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.
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).
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
v2afrank

Registriert seit: 9. Mai 2005
Ort: Bocholt
571 Beiträge
 
Delphi XE2 Professional
 
#5

AW: Streamen von Record

  Alt 20. Jan 2012, 12:16
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
  Mit Zitat antworten Zitat
Antwort Antwort


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 02:09 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