logisches Problem



  • Hallo zusammen,

    ich hab' ein Problem das sich irgendwie nicht wirklich lösen lässt von mir... 😞 es verändert sich zwar immer wieder, aber wie es sein sollte, bring ich es nicht hin. und zwar: Ich habe ein INI-File aus dem ich Parameterwerte auslesen möchte und dann in einer TStringGrid darstellen will... mit dem Code:

    ParamFile = new TIniFile(ExtractFileDir(ParamStr(0)) + "\\Param.ini");
    Grid->RowCount=1;
    int INDCount=0;
    AnsiString AlreadyUsed_AS;
    int f=0;//Fehlerzähler nullen
    for (int i=1; i<=4096; i++)
      {
      Grid->RowCount=Grid->RowCount+1; // Eine Zeile hinzufügen
      Grid->FixedRows=1;               // fixed rows für die beschriftung festlegen
      Grid->Cells[1][i-f+INDCount]=ParamFile->ReadString("Parameters",i,"100000");// ^Parameter aus INI-File lesen und in Tabelle einfügen
      if (Grid->Cells[1][i-f+INDCount]=="100000")// Wenn beim auslesen aus Ini-File als Defaultwert 1000 eingefüllt wurde...
        {
        f++;                           // Fehlervar. um eins inkrementieren
        Grid->RowCount=Grid->RowCount-1;// Eine Zeile löschen
        }
      else
        Grid->Cells[0][i-f]=i;           // Parameternummer einfügen
      if (Grid->Cells[1][i-f].Pos("(IND)")&&Grid->Cells[1][i-f+INDCount]!=AlreadyUsed_AS)// Wenn (IND) irgendwo im Parameter steht
        {
        AlreadyUsed_AS=Grid->Cells[1][i-f+INDCount];
        for (int IND_int=1; IND_int<=256; IND_int++)
          {
          INDCount++;
          Grid->RowCount=Grid->RowCount+1;        // eine Zeile hinzufügen
          Grid->Cells[1][i+IND_int-f+INDCount]=ParamFile->ReadString("Parameters",AnsiString(i)+"."+AnsiString(IND_int),"100000");// ^Parameter aus INI-File lesen und in Tabelle einfügen
          if (Grid->Cells[1][i+IND_int-f+INDCount]=="100000")    // Wenn beim auslesen aus Ini-File als Defaultwert 1000 eingefüllt wurde...
            break;
          else
            Grid->Cells[0][i+IND_int-f+INDCount]=AnsiString(i)+"."+AnsiString(IND_int);// Parameternummer einfügen à la system, das der IND-Wert hinter dem Punkt steht, z.B. 17.1
          }
        }
      }
    }
    

    Im INI-FIle steht:

    [Parameters]
    1=Achsart
    2=Weg pro Getriebeumdrehung
    3=Getriebeuntersetzungsfaktor
    4=Anwendereinheit
    5=Anwendergeschwindigkeit
    6=Software-Endschalter Anfang
    7=Software-Endschalter Ende
    8=Referenzgeschwindigkeit
    10=Maximalgeschwindigkeit
    11=Positions-Zielbereich
    12=Geschwindigkeits-Zielbereich
    17=PI Verstärkung Geschwindigkeits-Regler (IND)
    17.1=P Verstärkung
    17.2=I Verstärkung
    17.3=P Konstante Zähler
    17.4=P Konstante Nenner
    17.5=I Konstante Zähler
    17.6=I Konstante Nenner
    18=PI Verstärkung Positions-Regler (IND)
    18.1=P Verstärkung
    18.2=I Verstärkung
    18.3=P Konstante Zähler
    18.4=P Konstante Nenner
    18.5=I Konstante Zähler
    18.6=I Konstante Nenner
    27=Drehmomentbeschränkung (IND)
    27.1=Maximales Drehmoment
    27.2=Drehstromkonstante
    28=Maximalen Strom
    29=Iststrom eff
    

    und im TStringGrid:

    [Parameters]
    1    |Achsart
    2    |Weg pro Getriebeumdrehung
    3    |Getriebeuntersetzungsfaktor
    4    |Anwendereinheit
    5    |Anwendergeschwindigkeit
    6    |Software-Endschalter Anfang
    7    |Software-Endschalter Ende
    8    |Referenzgeschwindigkeit
    10   |Maximalgeschwindigkeit
    11   |Positions-Zielbereich
    12   |Geschwindigkeits-Zielbereich
    17   |PI Verstärkung Geschwindigkeits-Regler (IND)
    18   |
    27   |P Verstärkung
    28   |
    29   |I Verstärkung
    
    17.3 |PI Verstärkung Positions-Regler (IND)
         |Drehmomentbeschränkung (IND)
    17.5 |Maximalen Strom
         |Iststrom eff
    

    und es so sollte es drin stehen:

    <snip> Viele andere Parametet</snip>
    17    |PI Verstärkung Geschwindigkeits-Regler (IND) 
    17.1  |P Verstärkung 
    17.2  |I Verstärkung 
    17.3  |P Konstante Zähler 
    17.4  |P Konstante Nenner 
    17.5  |I Konstante Zähler 
    17.6  |I Konstante Nenner 
    18    |PI Verstärkung Positions-Regler
    

    Was hab' ich mir falsch überelgt? Warum stimmt das nicht? Kann mir da jemand weiterhelfen? Vielen Dank!



  • hmmm, fällt mir auch nix zu ein.
    aber warum versuchst du nicht mal das ini file als textfile zeilenweise einzulesen?
    also jede zeile in einen string, dann string aufdröseln, und die werte links bzw rechts vom '=' dann ab ins stringgrid?
    wäre vielleicht einfacher?



  • Okay got it!
    Konnte es lösen! 🙂
    wie? so hab' ichs gemacht:

    ParamFile = new TIniFile(ExtractFileDir(ParamStr(0)) + "\\Param.ini");
    Grid->RowCount=0;                  // RowCount setzen
    AnsiString AlreadyUsed_AS="";      // Variable deklariert in der der bereits gebrdauchte IND-String gespeichert wird
    for (int i=1; i<=4096; i++)
      {
      Grid->RowCount=Grid->RowCount+1; // Eine Zeile hinzufügen
      Grid->FixedRows=1;               // fixed rows für die beschriftung festlegen
      Grid->Cells[1][Grid->RowCount]=ParamFile->ReadString("Parameters",i,"100000");// ^Parameter aus INI-File lesen und in Tabelle einfügen
      if (Grid->Cells[1][Grid->RowCount]=="100000")// Wenn beim auslesen aus Ini-File als Defaultwert 1000 eingefüllt wurde...
        Grid->RowCount=Grid->RowCount-1;// Eine Zeile löschen
      else
        Grid->Cells[0][Grid->RowCount]=i;// Parameternummer einfügen
      if (Grid->Cells[1][Grid->RowCount].Pos("(IND)")&&Grid->Cells[1][Grid->RowCount]!=AlreadyUsed_AS)// Wenn (IND) irgendwo im Parameter steht
        {
        AlreadyUsed_AS=Grid->Cells[1][Grid->RowCount];
        for (int IND_int=1; IND_int<=256; IND_int++)
          {
          Grid->RowCount=Grid->RowCount+1;// eine Zeile hinzufügen
          Grid->Cells[1][Grid->RowCount]=ParamFile->ReadString("Parameters",AnsiString(i)+"."+AnsiString(IND_int),"100000");// ^Parameter aus INI-File lesen und in Tabelle einfügen
          if (Grid->Cells[1][Grid->RowCount]=="100000")// Wenn beim auslesen aus Ini-File als Defaultwert 1000 eingefüllt wurde...
            {
            Grid->RowCount=Grid->RowCount-1;// Eine Zeile löschen
            break;
            }
          else
            Grid->Cells[0][Grid->RowCount]=AnsiString(i)+"."+AnsiString(IND_int);// Parameternummer einfügen à la system, das der IND-Wert hinter dem Punkt steht, z.B. 17.1
          }
        }
      }
    }
    

Anmelden zum Antworten