![]() |
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:
Die abgespeicherte Datei hat folgenden Inhalt
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.
Delphi-Quellcode:
Wie man sieht wird Myboolean abgespeichert, aber nicht das Record. Kann mir einer von Euch sagen wo da mein Denkfehler ist ?
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 Danke |
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.
|
AW: Streamen von Record
Nein, das Programm compiliert ohne Warning oder Hinweise
|
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). |
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:07 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz