AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Problem mit Records in Class bei Abfrage der Class
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit Records in Class bei Abfrage der Class

Ein Thema von Helmi · begonnen am 7. Sep 2008 · letzter Beitrag vom 7. Sep 2008
Antwort Antwort
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.312 Beiträge
 
Delphi XE2 Professional
 
#1

Problem mit Records in Class bei Abfrage der Class

  Alt 7. Sep 2008, 10:44
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?
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Problem mit Records in Class bei Abfrage der Class

  Alt 7. Sep 2008, 10:47
Vielleicht scheinen auch nur die Dimensionen der Arrays nicht richtig erkannt zu werden.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: Problem mit Records in Class bei Abfrage der Class

  Alt 7. Sep 2008, 10:56
Oder sind nicht richtig gesetzt. Evtl. SetLength() vergessen?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.312 Beiträge
 
Delphi XE2 Professional
 
#4

Re: Problem mit Records in Class bei Abfrage der Class

  Alt 7. Sep 2008, 11:04
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
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: Problem mit Records in Class bei Abfrage der Class

  Alt 7. Sep 2008, 11:05
Dann zeig doch mal den Code zum Einfügen.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.312 Beiträge
 
Delphi XE2 Professional
 
#6

Re: Problem mit Records in Class bei Abfrage der Class

  Alt 7. Sep 2008, 11:19
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.
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: Problem mit Records in Class bei Abfrage der Class

  Alt 7. Sep 2008, 11:29
Auf den ersten Blick kann ich nichts Auffälliges entdecken, da steckt vielleicht der Fehler im Detail
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.312 Beiträge
 
Delphi XE2 Professional
 
#8

Re: Problem mit Records in Class bei Abfrage der Class

  Alt 7. Sep 2008, 11:38
Zitat von DeddyH:
Auf den ersten Blick kann ich nichts Auffälliges entdecken, da steckt vielleicht der Fehler im Detail
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:
Active := StrToBoolDef(ListeButton.Values['Active'], false); anstatt
Active := StrToBoolDef(ListeButton.Values['Font'], false); Jetzt funktioniert das Active
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  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 00:59 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