probleme mit einer for schleife



  • guten morgen zusammen,

    ich habe probleme mit einer for schleife. ich möchte eine datenbanktabelle in einer textdatei speichern, das klappt soweit ganz gut.

    so jetzt das problem!
    das feld artikel hat eine länge von 18 zeichen.in der textdatei müssen auch 18 zeichen für das feld artikel vorgesehen sein. ist ein artikel mit 3 zeichen vorhanden müssen die restlichen zeichen mit einen Platzhalter (#) gefüllt werden. wenn jetzt zuerst ein artikel mit 3 zeichen vorhanden ist erscheinen 16 platzhalter in der textdatei der nächste datensatz hat 10 zeichen aber es erscheinen auch 16 plathalter in der textdatei. woran kann das liegen??

    AnsiString Artikel;
            AnsiString PlhIndex; //Platzhalter
            int iD1=0;
            int WertIndex=iD1;
            int tIndex=Artikel.Length();
            int rIndex=18-tIndex; //anzahl der zulässige zeichen - zeichen 
    
    for(int i=0; i<Table1->RecordCount; i++)
            {
                  for ( WertIndex;iD1<rIndex; ++iD1)
                      {
                       PlhIndex += "#";
                       Refresh();
                      }
                Artikel=DBEdit2->Text;
                Memo1->Lines->Add(PlhIndex+Artikel);
                Table1->Next();
            }
    


  • Du solltest deine Platzhaltervariable PlhIndex wieder leeren wenn du einen Artikel abgearbeitet hast.



  • wie mache ich das?? ich bin jetzt seit 5.00 uhr dabei das problem zu lösen aber ich schaffe es nicht



  • Einfach nach dieser Dieser Zeile

    Memo1->Lines->Add(PlhIndex+Artikel);
    

    das hier einfügen

    PlhIndex = "";
    

    Das sollte es schon gewesen sein



  • Hmm mach doch unter Table->Next() ein
    PlhIndex = "";



  • habe ich gemacht im ersten datensatz sind die platzhalter vorhanden ab dem zweiten nicht mehr



  • Also ich würde sagen, da is einiges im argen:

    AnsiString Artikel; 
    AnsiString PlhIndex; 
    int iD1=0; 
    int WertIndex=iD1; 
    int tIndex=Artikel.Length(); // ist hier nicht gut -> Länge immer 0
    int rIndex=18-tIndex;        // dito -> ist immer 18
    
    for(int i=0; i<Table1->RecordCount; i++)  // geht meiner Meinung nach besser mit ner while Schleife
    { 
        // hier solltest du iDl auf 0 setzten
        for(WertIndex;iD1<rIndex; ++iD1) 
        { 
            PlhIndex += "#"; 
            Refresh(); // Wozu ???
        } 
        Artikel=DBEdit2->Text;  // das gehört nach oben vor die innere for Schleife
        // hier müsste dann PlhIndex wieder auf leeren String gesetzt werden
        Memo1->Lines->Add(PlhIndex+Artikel); 
        Table1->Next(); 
    }
    

    Ich kenn jetz zwar diese Table nich aber ich versuchs mal:

    AnsiString Artikel = "";
    int tableIndex = 0;
    // Vorher noch die Table1 auf das erste Element setzten - wie gesagt ich kenn die nicht
    while(tableIndex < Table1->RecordCount)
    {
        Artikel = DBEdit2->Text;
        while(Artikel.length() < 18)
        {
            Artikel += "#";
        }
        Memo1->Lines->Add(Artikel);
    }
    

    Probier mal aus 🙂

    basedow



  • es klappt einfach nicht. [basedow] das mit der while Schleife geht auch nicht. Die schleife wird nicht gestoppt. ich glaube ich sehe den wald vor lauter bäumen nicht mehr



  • basedow schrieb:

    Also ich würde sagen, da is einiges im argen:

    ...aber ob eine unendliche Schleife soviel besser ist?

    basedow schrieb:

    AnsiString Artikel = "";
    int tableIndex = 0;
    // Vorher noch die Table1 auf das erste Element setzten - wie gesagt ich kenn die nicht
    while(tableIndex < Table1->RecordCount)
    {
        Artikel = DBEdit2->Text;
        while(Artikel.length() < 18)
        {
            Artikel += "#";
        }
        Memo1->Lines->Add(Artikel);
    }
    

    Probier mal aus 🙂

    ... vielleicht besser nicht. 😉
    Zumindest nicht, ohne tableIndex hochzuzählen. Und ich vermute irgendwo
    sollte noch ein Zugriff auf Table1 erfolgen (in Abhängigkeit von tableIndex),
    um durch die Datensätze zu navigieren.

    Gruß,

    Alexander



  • wenn du überprüfst ob 0<14 ist und das 1000mal ist es immer false wenn du es nicht inkrementierst oder ?

    da war wohl jmd schneller 😞



  • probier mal die Version, die kommt deiner ziemlich nahe

    AnsiString Artikel;  
    AnsiString PlhIndex = "";  
    int rIndex = 0;        
    
    for(int i=0; i<Table1->RecordCount; i++)  
    {  
        //Hier ist die Zuweisung sinnvoller
        Artikel = DBEdit2->Text;  
        rIndex = 18 - Artikel.Length();
    
        //wie von basedow schon beschrieben, den Zähler hier auf 0 setzten.
        for(int iD1 = 0; iD1<rIndex; ++iD1)  
        {  
            PlhIndex += "#";  
            Refresh();
        }  
    
        Memo1->Lines->Add(PlhIndex+Artikel);  
        //Die Zeichen wieder löschen
        PlhIndex = "";
        Table1->Next();  
    }
    

    @basedow

    guck dir deinen Code mal genauer an, du hast ne endlosschleife :p

    Edit: Kommt davon wenn man(n) trödelt 😉



  • naja, wenn du tableIndex innerhalb der Whileschleife nicht hochzählst kann die Schleife ja nicht stoppen.



  • Hoppla 😃
    Stimmt - da muss natürlich noch was rein.

    AnsiString Artikel = ""; 
    int tableIndex = 0; 
    // Vorher noch die Table1 auf das erste Element setzten - wie gesagt ich kenn die nicht 
    while(tableIndex < Table1->RecordCount) 
    { 
        Artikel = DBEdit2->Text; 
        while(Artikel.length() < 18) 
        { 
            Artikel += "#"; 
        } 
        Memo1->Lines->Add(Artikel); 
        tableIndex++;  // NEU
    }
    

    Jetzt sollte sie auch abbrechen.

    Und wie bereits gesagt, du musst vor der äusseren while-Schleife dafür sorgen, dass deine Table1 auf den ersten Datensatz zeigt. Ich kenn nur die Table-Komponente nicht. Da musst du selber noch mal schauen.

    @all: Man wird ja wohl noch ne blöde Abbruchbedingung vergessen dürfen 😃

    basedow



  • Danke PuppetMaster2k es klappt. ich wollt schon auf den balkon steigen und aus dem 3. stock springen.
    super es klappt!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!



  • Habe mir mal erlaubt die while-Schleife etwas abzuändern.
    Warum nicht bewährte Eigenschaften und Methoden der TTable-Komponente
    verwenden.

    AnsiString Artikel = ""; 
    // int tableIndex = 0; wird nicht mehr benötigt
    // Vorher noch die Table1 auf das erste Element setzten - wie gesagt ich kenn die nicht 
    while(!Table1->Eof) 
    { 
        Artikel = DBEdit2->Text; 
        while(Artikel.length() < 18) 
        { 
            Artikel += "#"; 
        } 
        Memo1->Lines->Add(Artikel); 
        // tableIndex++;  // NEU ... und schon wieder alt
        Table1->Next();
    }
    

    So könnte es vielleicht auch gehen?

    Gruß,

    Alexander



  • ich weiss garnicht wie ich euch danken soll 😃 😃 😃



  • alexander ich werde es ausprobieren. danke



  • @ lisa
    nein, nicht von dem balkon springen 🙂
    denn ich glaube es kommen da noch schierigere aufgaben auf dich zu, an denen du noch mehr verzweifelst, falls du weiter prgrammierst... 😉

    also bitte, kein selbstmord.

    Bj



  • @Alexander: DIEEEEB!!! 😃

    basedow



  • nein das würde ich nicht machen. ich möchte mich doch weiter mit solch netten menschen wie euch unterhalten. noch mal danke ihr habt mir sehr geholfen
    🙂 🙂 🙂
    grus lisa

    p.s selbstmord ist keine lösung!! probleme muss man sich stellen und nicht davor weglaufen 👍



  • basedow schrieb:

    @Alexander: DIEEEEB!!! 😃

    basedow

    Das war kein Diebstahl, das war Tuning 🙂

    Gruß,

    Alexander


Anmelden zum Antworten