Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Problem mit Records in Class bei Abfrage der Class (https://www.delphipraxis.net/120226-problem-mit-records-class-bei-abfrage-der-class.html)

Helmi 7. Sep 2008 10:44


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:
  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;
Wie man sieht besteht sie unter anderem auch aus 2 dynamischen Arrays.

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?

mkinzler 7. Sep 2008 10:47

Re: Problem mit Records in Class bei Abfrage der Class
 
Vielleicht scheinen auch nur die Dimensionen der Arrays nicht richtig erkannt zu werden.

DeddyH 7. Sep 2008 10:56

Re: Problem mit Records in Class bei Abfrage der Class
 
Oder sind nicht richtig gesetzt. Evtl. SetLength() vergessen?

Helmi 7. Sep 2008 11:04

Re: Problem mit Records in Class bei Abfrage der Class
 
Zitat:

Zitat von DeddyH
Oder sind nicht richtig gesetzt. Evtl. SetLength() vergessen?

SetLength wurden verwendet
Die Länge der dyn Arrays stimmt auch überein - aber die Variablen sind leer bzw. false

DeddyH 7. Sep 2008 11:05

Re: Problem mit Records in Class bei Abfrage der Class
 
Dann zeig doch mal den Code zum Einfügen.

Helmi 7. Sep 2008 11:19

Re: Problem mit Records in Class bei Abfrage der Class
 
Hier die komplette Procedure die in die Tobjectlist schreibt:
Delphi-Quellcode:
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;
Es ist eigentlich alles kommentiert.

DeddyH 7. Sep 2008 11:29

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:

Helmi 7. Sep 2008 11:38

Re: Problem mit Records in Class bei Abfrage der Class
 
Zitat:

Zitat von DeddyH
Auf den ersten Blick kann ich nichts Auffälliges entdecken, da steckt vielleicht der Fehler im Detail :gruebel:

Wie meinst du das?

Falls es was hilft - hier die Procedure wo es abgefragt wird:

Delphi-Quellcode:
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;
Die Definition von "HButton_aufbauen" und "VButton_aufbauen" schaut so aus:
Delphi-Quellcode:
  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);
[Edit]
Ich hab jetzt einen Fehler gefunden, bei Active muss es so heissen:
Delphi-Quellcode:
Active := StrToBoolDef(ListeButton.Values['Active'], false);
anstatt
Delphi-Quellcode:
Active := StrToBoolDef(ListeButton.Values['Font'], false);
Jetzt funktioniert das Active


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