![]() |
Record in Record - Der linken Seite kann nichts zugewiesen..
Hi,
ich habe folgende records:
Delphi-Quellcode:
Warum erhalte ich jetzt die Meldung "Der linken Seite kann nichts zugewiesen werden.". Kann ich keinen Record als Feld eines Records verwenden?
type
TRec1 = record Enabled: Boolean; Text: String; end; TRec2 = record Feld1: TRec1; Feld2: TRec1; end; ... var myRec: TRec2; begin myRec.Feld1.Enabled := True; end; |
Re: Record in Record - Der linken Seite kann nichts zugewies
Bin mir nicht ganz sicher, aber muss vor "TRec2 = record" nicht noch ein "type"?
|
Re: Record in Record - Der linken Seite kann nichts zugewies
Hallo Andreas,
Wenn es so ist, wie du geschrieben hast, dürfte der Fehler nicht auftauchen. Wenn allerdings Die Records in einer Tlist stecken dann kann es schon passieren. Gruß K-H |
Re: Record in Record - Der linken Seite kann nichts zugewies
Zitat:
Delphi-Quellcode:
Man kann aber type optional an jeder der Deklarationen voranstellen. Behebt aber mein Problem nicht :(
type
TRec = record // end; TObj = class(TObject); TObjEvent = procedure() of object; EDIT: Zitat:
Delphi-Quellcode:
Und ich versuche von außen auf diese Eigenschaft zu zugreifen. Ich versuch mal das Feld als public zu definieren. Mal schauen was passiert...
TSomething = class(TComponent)
private FRec: TRec2; published property Rec: TRec2 read fRec write FRec; end; EDIT2: Als public gehts auch nicht :wall: |
Re: Record in Record - Der linken Seite kann nichts zugewies
Also irgendwas läuft bei dir schief :gruebel: habe den Code gerade in D2010 eingefügt, compiliert und alles hat funktioniert. Würde mich auch wundern, wenn das nicht funktionieren würde. Sicher, dass du es so gemacht hast, wie im ersten Post beschrieben?
Edit: Sorry, hab nicht komplett zu Ende gelesen. Edit 2: Wenn du statt dem Record eine Klasse nutzen würdest, dann geht das, was du willst. Und wenn ich eine public-Variable einfüge, so compiliert und funktioniert es bei mir! |
Re: Record in Record - Der linken Seite kann nichts zugewies
Hier mal mein original Code:
StartupListView.pas
Delphi-Quellcode:
Hauptunit, TStartupListView wird ganz normal auf die Form gezogen
type
TStartupListViewColumn = record Visible: Boolean; Text: String; end; TStartupListViewColumns = record Name: TStartupListViewColumn; Status: TStartupListViewColumn; Command: TStartupListViewColumn; Location: TStartupListViewColumn; AppName: TStartupListViewColumn; AppManufacturer: TStartupListViewColumn; AppDescription: TStartupListViewColumn; FileName: TStartupListViewColumn; Parameters: TStartupListViewColumn; end; TStartupListView = class(TListView) private FVisibleColumns: TStartupListViewColumns; ... protected procedure SetVisibleColumns(Value: TStartupListViewColumns); procedure UpdateColumns; ... public ... property VisibleColumns: TStartupListViewColumns read FVisibleColumns write SetVisibleColumns; end; ... procedure TStartupListView.SetVisibleColumns(Value: TStartupListViewColumns); begin FVisibleColumns := Value; UpdateColumns; end; procedure TStartupListView.UpdateColumns; begin Columns.BeginUpdate; try Columns.Clear; Columns.Add.Caption := FVisibleColumns.Name.Text; if FVisibleColumns.Status.Visible then Columns.Add.Caption := FVisibleColumns.Status.Text; if FVisibleColumns.Command.Visible then Columns.Add.Caption := FVisibleColumns.Command.Text; if FVisibleColumns.Location.Visible then Columns.Add.Caption := FVisibleColumns.Location.Text; if FVisibleColumns.AppName.Visible then Columns.Add.Caption := FVisibleColumns.AppName.Text; if FVisibleColumns.AppManufacturer.Visible then Columns.Add.Caption := FVisibleColumns.AppManufacturer.Text; if FVisibleColumns.AppDescription.Visible then Columns.Add.Caption := FVisibleColumns.AppDescription.Text; if FVisibleColumns.FileName.Visible then Columns.Add.Caption := FVisibleColumns.FileName.Text; if FVisibleColumns.Parameters.Visible then Columns.Add.Caption := FVisibleColumns.Parameters.Text; finally Columns.EndUpdate; end; end;
Delphi-Quellcode:
Die Meldung wird bei jeden Schreib-Zugriff auf VisibleColumns ausgegeben.
procedure TfrmManager.ToolButton1Click(Sender: TObject);
begin StartupListView1.VisibleColumns.Name.Visible := True; StartupListView1.VisibleColumns.Status.Visible := True; StartupListView1.VisibleColumns.Command.Visible := True; StartupListView1.VisibleColumns.Location.Visible := True; StartupListView1.VisibleColumns.AppName.Visible := True; StartupListView1.VisibleColumns.AppManufacturer.Visible := True; StartupListView1.VisibleColumns.AppDescription.Visible := True; StartupListView1.VisibleColumns.FileName.Visible := True; StartupListView1.VisibleColumns.Parameters.Visible := True; StartupListView1.StartupList := damData.StartupList; StartupListView1.Refresh; end; Naja, wenn niemand mehr eine Idee hat, verwende ich halt ne Klasse. |
Re: Record in Record - Der linken Seite kann nichts zugewies
Bei so einer Frage solltest du schon den Code zeigen, der deinen Fehler erzeugt, und nicht oberflächlich ähnlichen, der aber problemlos kompiliert werden kann. :wall:
Schau mal ![]() |
Re: Record in Record - Der linken Seite kann nichts zugewies
Siehe meinen obigen Post -> Edit.
Willst du eigentlich, dass du über den Objektinspektor auf die Eigenschaften zugreifen kannst? Dann würde ich auf Klassen umsteigen. Da hast du imho eh eine bessere Handhabung. |
Re: Record in Record - Der linken Seite kann nichts zugewies
Zitat:
Zitat:
Zitat:
EDIT: Hab die records jetzt in Klasse umgebaut. Funktioniert alles super, danke an alle :thumb: |
Re: Record in Record - Der linken Seite kann nichts zugewies
Zitat:
Delphi-Quellcode:
kompiliert das ohne Fehler oder Warnungen.
program Project1;
{$APPTYPE CONSOLE} uses SysUtils; type TRec1 = record Enabled: Boolean; Text: string; end; TRec2 = record Feld1: TRec1; Feld2: TRec1; end; procedure Test; var myRec: TRec2; begin myRec.Feld1.Enabled := True; end; begin Test; end. Zitat:
|
Re: Record in Record - Der linken Seite kann nichts zugewies
Das grundlegende Problem wird die Verwendung als Property sein. Records sind Wertetypen (im Gegensatz zu Referenztypen wie Klassen), und ein Getter liefert dir statt einer Referenz auf das tatsächliche Feld eine Kopie der Werte daraus. Wenn du in dieser Kopie etwas änderst, würde das keinerlei Auswirkungen auf das Feld haben - auch wenn es erlaubt wäre dies zu tun. Die Lösung ist in der Tat entweder ordentlich mit Klassen zu arbeiten, oder sehr unordentlich von Hand mit Pointern auf die Records zu hantieren.
|
Re: Record in Record - Der linken Seite kann nichts zugewies
Das was Medium geschrieben hat trifft ja den Kern der Sache, wobei ich ein (persönliches) Problem mit den Klassen habe.
So wie MyStringlist[i]:='text' nicht geht, MyString:='Text' aber sehr wohl, verhält es sich bei Records und allen anderen Datenstrukturen genauso. Es muß der Umweg über "echte" variablen gegangen werden.
Delphi-Quellcode:
Gruß
myString:=Mystringlist[i];
myString:=TUWASMIT(Mystring); MyStringlist[i]:=myString; K-H |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:21 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-2025 by Thomas Breitkreuz