![]() |
Problem mit Records in Class bei Abfrage der Class
Hallo,
ich hab eine Liste vom Typ TObjectList in der ein paar Classen vom gleichen Typ gespeichert werden. Die Class TStateClass schaut so aus:
Delphi-Quellcode:
Wie man sieht besteht sie unter anderem auch aus 2 dynamischen Arrays.
TStateHButton = record
Name : String; Bitmap : String; Text : String; ID : String; Kind : Byte; Length : Byte; Font : String; Active : Boolean; end; TStateVButton = record Bitmap : String; Active : Boolean; end; TStateClass = class Name : String; Mask : String; Previous : String; Calc : String; Section : Byte; Horz_Buttons : array of TStateHButton; Vert_Buttons : array of TStateVButton; end; In einer Procedure wird die Class erstellt (TStateClass.Create), beschrieben, die Länge der dynamischen Arrays gesetzt und Diese ebenfalls beschrieben. Alles soweit kein Problem. In einer anderen Procedure wird die TObjectlist durchgearbeitet und die einzelnen Class (TStateClass) ausgelesen und verarbeitet. Und da hab ich ein Problem. Ich kann zwar beim Auslesen der Class problemlos auf den Inhalt der Variablen der Class zugreifen (wie z. B. Name, Mask, Previous,...) aber wenn ich auf die Variablen der dynamischen Zugreife, dann sind diese immer leer (Bitmap = '' und Active = false), obwohl ich sicher bin, dass diese beschrieben wurden. Ich hab den Verdacht, dass bei meiner Abspeicherung in die TObjectlist ein Fehler passiert und der Inhalt der dynamischen Arrays nicht mitgespeichert wird. Was mach ich falsch, bzw. wie kann ich auf den Inhalt der dynamischen Arrays zugreifen? |
Re: Problem mit Records in Class bei Abfrage der Class
Vielleicht scheinen auch nur die Dimensionen der Arrays nicht richtig erkannt zu werden.
|
Re: Problem mit Records in Class bei Abfrage der Class
Oder sind nicht richtig gesetzt. Evtl. SetLength() vergessen?
|
Re: Problem mit Records in Class bei Abfrage der Class
Zitat:
Die Länge der dyn Arrays stimmt auch überein - aber die Variablen sind leer bzw. false |
Re: Problem mit Records in Class bei Abfrage der Class
Dann zeig doch mal den Code zum Einfügen.
|
Re: Problem mit Records in Class bei Abfrage der Class
Hier die komplette Procedure die in die Tobjectlist schreibt:
Delphi-Quellcode:
Es ist eigentlich alles kommentiert.
procedure TMaskForm.State_initialisieren;
var State_Dateiliste : TStringList; Valuesliste : TStringList; ListeButton : TStringList; State_Ini : TIniFile; Dummy_StateClass : TStateClass; S_Name : String; S : String; i_Position : Integer; i_Length : Integer; i : Integer; j : Integer; k : Integer; l : Integer; begin //State-Dateiliste erzeugen State_Dateiliste := TStringList.Create; //Liste der State-Zustände erzeugen Valuesliste := TStringList.Create; //Button-Liste erzeugen ListeButton := TStringList.Create; try //Zustände GetFilesInDirectory(Masken_Ordner, '*.sta', State_Dateiliste); for i := 0 to Pred(State_Dateiliste.Count) do begin //Ini-Datei des States erzeugen State_Ini := TIniFile.Create(State_Dateiliste.Strings[i]); //Dummy_StateClass pro State erzeugen Dummy_StateClass := TStateClass.Create; try with State_Ini do begin //Namen des Zustandes auslesen S_Name := ReadString('State', 'Name', ''); If Pos(New_State, S_Name) = 1 then begin //Splash-Screen updaten SplashScreenForm.InfoText := Format('State: "%s" wird initialisiert...', [S_Name]); //kurze Wartezeit (0.25 sek) Delay(250); //Values für den Zustand auslesen ReadSectionValues('State', Valuesliste); with Dummy_StateClass do begin //Grunddaten schreiben Name := S_Name; Mask := Valuesliste.Values['Mask']; Previous := Valuesliste.Values['Previous']; Calc := Valuesliste.Values['Calc']; Section := StrToIntDef(Valuesliste.Values['Section'], 0); //horizontale Buttons in Klasse speichern ReadSectionValues('Horz_Button', Valuesliste); //Größe der des Arrays der horizontalen Buttons setzen SetLength(Horz_Buttons, Anzahl_Horz_Buttons_max); //Größe der des Arrays der vertikalen Buttons setzen SetLength(Vert_Buttons, Anzahl_Vert_Buttons_max); //Namen leeren = Position leer for j := low(Horz_Buttons) to high(Horz_Buttons) do Horz_Buttons[j].Name := ''; for j := 0 to Pred(Valuesliste.Count) do begin //Liste der einzelnen Properties der horizontalen Buttons //auslesen (innerhalb von {}) S := Valuesliste.ValueFromIndex[j]; //Liste der Properties des einzelnen Button erstellen Make_List(ListeButton, S); //eingestellte Position und Position des Buttons auslesen i_Position := StrToIntDef(ListeButton.Values['Position'], 0); i_Length := StrToIntDef(ListeButton.Values['Length'], 0); //Wenn Position oder Länge = 0 ist, Schleife weiter //laufen lassen If (i_Position = 0) or (i_Length = 0) then continue; //nicht mehr leer? - dann Schleife weiter laufen lassen If Horz_Buttons[i_Position].Name <> '' then continue; //Ist die Position + die Länge des Buttons größer //als die maximale Anzahl Buttons pro Seite, dann //Schleife weiter laufen lassen l := i_Position div Anzahl_Horz_Buttons; If i_Length > 1 then If (i_Position + i_Length) > (Succ(l) * Anzahl_Horz_Buttons) then continue; with Horz_Buttons[i_Position] do begin Bitmap := ListeButton.Values['Bitmap']; Text := ListeButton.Values['Text']; ID := ListeButton.Values['ID']; Kind := StrToIntDef(ListeButton.Values['Kind'], 0); Length := i_Length; Font := ListeButton.Values['Font']; Active := StrToBoolDef(ListeButton.Values['Font'], false); end; //Wenn die Länge des Buttons länger ist als 1 //dann den Nachbar-Button mit dem Namen des ersten //Buttons beschreiben If i_Length > 1 then for k := i_Position to (i_Position + i_Length) do Horz_Buttons[k].Name := Horz_Buttons[i_Position].Name; end; //vertikale Buttons in Klasse speichern ReadSectionValues('Vert_Button', Valuesliste); for j := 0 to Pred(Valuesliste.Count) do begin //Liste der einzelnen Properties der vertikalen Buttons //auslesen (innerhalb von {}) S := Valuesliste.ValueFromIndex[j]; //Liste der Properties des einzelnen Button erstellen Make_List(ListeButton, S); //Properties in Array schreiben (vertikale Buttons) for k := low(Vert_Buttons) to high(Vert_Buttons) do begin Vert_Buttons[k].Bitmap := ListeButton.Values['Bitmap']; Vert_Buttons[k].Active := StrToBoolDef(ListeButton.Values['Font'], false); end; end; end; end; end; // Liste_State.Add(Dummy_StateClass); finally //Ini-Datei löschen und freigeben FreeAndNil(State_Ini); end; end; finally //StringListen löschen und freigeben FreeAndNil(Valuesliste); FreeAndNil(State_Dateiliste); FreeAndNil(ListeButton); end; end; |
Re: Problem mit Records in Class bei Abfrage der Class
Auf den ersten Blick kann ich nichts Auffälliges entdecken, da steckt vielleicht der Fehler im Detail :gruebel:
|
Re: Problem mit Records in Class bei Abfrage der Class
Zitat:
Falls es was hilft - hier die Procedure wo es abgefragt wird:
Delphi-Quellcode:
Die Definition von "HButton_aufbauen" und "VButton_aufbauen" schaut so aus:
function State_erzeugen(State_ID: String; Anzahl_Horz_Buttons, max_Horz_Buttons,
Seite: Integer): TStateInfos; var i : Integer; begin //Rückgabewerte vordefinieren Result.Previous_State_ID := ''; Result.Mask_ID := ''; try for i := 0 to Pred(MaskForm.Liste_State.Count) do begin //ausgewähltes States in der Liste suchen If TStateClass(MaskForm.Liste_State.Items[i]).Name = State_ID then begin with TStateClass(MaskForm.Liste_State.Items[i]) do begin // s_calc := Calc; //Horizontale Buttons erzeugen HButton_aufbauen(Horz_Buttons, Anzahl_Horz_Buttons,Seite, 0, Mask); //Vertikale Buttons erzeugen VButton_aufbauen(Vert_Buttons, Section); //Previous-Button disablen MaskForm.Button_Previous.Visible := false; If Pos(New_State, Previous) = 1 then begin //Previous-Button einblenden, wenn Previous-State angegeben ist MaskForm.Button_Previous.Visible := Previous <> ''; //Privious-State zurückgeben (als Result) Result.Previous_State_ID := Previous; end; //Maske anzeigen (als Result) If Pos(New_Mask, Mask) = 1 then Result.Mask_ID := Mask; end; end; end; finally // end; end;
Delphi-Quellcode:
[Edit]
procedure HButton_aufbauen(HButtonListe: array of TStateHButton;
Anzahl_Horz_Buttons, max_Horz_Buttons, Seite: Integer; Mask_ID: String); procedure VButton_aufbauen(VButtonListe: array of TStateVButton; aktive_Section: Integer); Ich hab jetzt einen Fehler gefunden, bei Active muss es so heissen:
Delphi-Quellcode:
anstatt
Active := StrToBoolDef(ListeButton.Values['Active'], false);
Delphi-Quellcode:
Jetzt funktioniert das Active
Active := StrToBoolDef(ListeButton.Values['Font'], false);
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:40 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