Menue speichern_unter



  • Wer kann mir sagen, warum ich in Zeile 12 wg.

    count
    

    folgende Fehlermeldung erhalte:
    Fehler 7 error C2039: 'Count': Ist kein Element von 'System::Array'

    private: System::Void speichernToolStripMenuItem_Click(System::Object^  sender, System::EventArgs^  e) 
    		 {
    		  if (strDateiname==String::Empty) {
        speichernunterToolStripMenuItem_Click(sender,e);
      } else {
        if (textBox1->Text->Length==0) {
    		if (System::Windows::Forms::MessageBox::Show(S"Soll wirklich eine leere Datei angelegt werden?","Anfrage",MessageBoxButtons::YesNo,MessageBoxIcon::Question,MessageBoxDefaultButton::Button1)==System::Windows::Forms::DialogResult::No) {
            return;
          } // if
        } //if
    	StreamWriter^ FileName=File::CreateText(strDateiname);
          for( int nI=0; nI<textBox1->Lines->Count; nI++) {
          Schreiber->WriteLine(textBox1->Lines->Item[nI]);
        } //for
        Schreiber->Close();
      }			  
    		 }
    


  • Weil Count kein Element von Array ist ?

    (Du denkst schon beim Posten und beim Programmieren nach ? Liest auch mal die Fehlermeldungen ? Schaust mal in die MSDN um die Member von Textbox-Lines zu prüfen ?)



  • Renate schrieb:

    Wer kann mir sagen, warum ich in Zeile 12 wg.

    count
    

    folgende Fehlermeldung erhalte:
    Fehler 7 error C2039: 'Count': Ist kein Element von 'System::Array'

    Also ich bin noch ein frischling bei C++/CLI aber da das Element

    Lines
    

    der Textbox ein Array ist kann man die Länge des Array's über

    Length
    

    bekommen.

    Dann müsste dein Quelltext so aussehen: (vorausgesetzt der Rest ist richtig!)

    private: System::Void speichernToolStripMenuItem_Click(System::Object^  sender, System::EventArgs^  e)
             {
              if (strDateiname==String::Empty) {
        speichernunterToolStripMenuItem_Click(sender,e);
      } else {
        if (textBox1->Text->Length==0) {
            if (System::Windows::Forms::MessageBox::Show(S"Soll wirklich eine leere Datei angelegt werden?","Anfrage",MessageBoxButtons::YesNo,MessageBoxIcon::Question,MessageBoxDefaultButton::Button1)==System::Windows::Forms::DialogResult::No) {
            return;
          } // if
        } //if
        StreamWriter^ FileName=File::CreateText(strDateiname);
          for( int nI=0; nI<textBox1->Lines->Length; nI++) { //hier ist die Änderung
          Schreiber->WriteLine(textBox1->Lines->Item[nI]);
        } //for
        Schreiber->Close();
      }             
             }
    


  • Knuddlbaer schrieb:

    Weil Count kein Element von Array ist ?

    (Du denkst schon beim Posten und beim Programmieren nach ? Liest auch mal die Fehlermeldungen ? Schaust mal in die MSDN um die Member von Textbox-Lines zu prüfen ?)

    Du brauchst mir nicht meine eigenen Fragen zurückposten, wenn Du nichts anderes zu sagen hast!!!!!

    Ich vermute mir fehlt ein Array, denn bei VC 2003 hat's geklappt, außerdem ist meine TextBox auf multiline eingestellt!!

    Also, alles klar?????



  • Rudi G schrieb:

    Renate schrieb:

    Wer kann mir sagen, warum ich in Zeile 12 wg.

    count
    

    folgende Fehlermeldung erhalte:
    Fehler 7 error C2039: 'Count': Ist kein Element von 'System::Array'

    Also ich bin noch ein frischling bei C++/CLI aber da das Element

    Lines
    

    der Textbox ein Array ist kann man die Länge des Array's über

    Length
    

    bekommen.

    Dann müsste dein Quelltext so aussehen: (vorausgesetzt der Rest ist richtig!)

    private: System::Void speichernToolStripMenuItem_Click(System::Object^  sender, System::EventArgs^  e)
             {
              if (strDateiname==String::Empty) {
        speichernunterToolStripMenuItem_Click(sender,e);
      } else {
        if (textBox1->Text->Length==0) {
            if (System::Windows::Forms::MessageBox::Show(S"Soll wirklich eine leere Datei angelegt werden?","Anfrage",MessageBoxButtons::YesNo,MessageBoxIcon::Question,MessageBoxDefaultButton::Button1)==System::Windows::Forms::DialogResult::No) {
            return;
          } // if
        } //if
        StreamWriter^ FileName=File::CreateText(strDateiname);
          for( int nI=0; nI<textBox1->Lines->Length; nI++) { //hier ist die Änderung
          Schreiber->WriteLine(textBox1->Lines->Item[nI]);
        } //for
        Schreiber->Close();
      }             
             }
    

    Hallo und vielen Dank erstmal, ich bin auch neu bei VC 2005.
    jetzt bekomm ich leider die nächste Fehlermeldung (Z. 13 Item )

    Fehlermeldung:
    "Item": Verwenden Sie "default", um auf die Standardeigenschaft (Indexer) der System::Array-Klasse zuzugreifen.

    Wenn ich mal helfen kann, nur zu, aber evtl. kannst Du nochmal helfen
    Danke, Danke,Danke,Danke,



  • Renate schrieb:

    StreamWriter^ FileName=File::CreateText(strDateiname);
          for( int nI=0; nI<textBox1->Lines->Length; nI++) { //hier ist die Änderung
          Schreiber->WriteLine(textBox1->Lines->Item[nI]);
        } //for
        Schreiber->Close();
      }             
             }
    

    Hallo und vielen Dank erstmal, ich bin auch neu bei VC 2005.
    jetzt bekomm ich leider die nächste Fehlermeldung (Z. 13 Item )

    Zugriff auf die einzelnen Elemente des Arrays bekommt man durch <Array-Bezeichener>[index] also ohne Item direkt hinter dem Array "Lines" kommt in eckigen Klammern der Index.

    In deinem Fall:

    textBox1->Lines[nI]
    

    Also man kann die Elemente von einem Array auf zwei Wegen "ausgeben".

    Über die "klassische" for-Schleife oder über die .NET for each-Schleife:

    Hier erstmal die "klassische" Variante:

    for( int nI=0; nI<textBox1->Lines->Length; nI++) { //hier ist die Änderung
          Schreiber->WriteLine(textBox1->Lines[nI]);
        } //for
    

    Oder über die for each schleife:

    for each(String ^element in textBox->Lines) {
        Schreiber->WriteLine(element);
    }
    

    Der Nachteil von for each ist das man dadurch -meines Wissens- nur Lesenden Zugrif auf die einzelnen Elmente bekommt und nicht's in das Array schreiben kann.

    Deswegen nehme ich persönlich immer die for-Schleife auch wenn ich mich um einige Sachen (z. B. um die Länge des Arrays, um die erhöhung etc.) mehr kümmern muss 😉

    Ich hoffe ich konnte helfen



  • Na man liest von Dir immer wieder Fragen deren Antwort in der Fehlermeldung steckt. Man müsste diese halt einfach mal lesen und eventuell mal F1 dazu drücken oder auf die Idee kommen sich die Klasse in der MSDN anzusehen. Das funktioniert im VS2005 genauso gut wie im VS2003 .

    Wer kann mir sagen, warum ich in Zeile 12 wg. C/C++ Code:
    [...] Fehler 7 error C2039: 'Count': Ist kein Element von 'System::Array'
    folgende Fehlermeldung erhalte:

    Antwort:

    Weil Count kein Element von Array ist?

    Die Antwort steht aber schon in der Fehlermeldung.

    Zum "verwenden Sie default...:"

    Drückt man F1 bei der Fehlermeldung, erhält man doch die notwendige Information:

    Fehlermeldung
    'Accessor': Verwenden Sie 'Standard', um auf die Standardeigenschaft (Indexer) der Klasse 'Typ' zuzugreifen
    'accessor': use 'default' to access the default property (indexer) for class 'type'

    int main() {
       IndexerClass ^ ic = gcnew IndexerClass;
       ic->Item[0] = 21;   // C3293
       ic->default[0] = 21;   // OK
    

    (Oder die Suche nach C3293 liefert http://msdn2.microsoft.com/en-us/library/ms173629(VS.80).aspx)

    Etwas später wird dann auch angeführt, das der default Indexer einfach mit [] erreicht werden kann.

    Du musst beim ENtwickeln von Software einfach lernen auch mal mit den Fehlermeldungen und der Dokumentation zu arbeiten. Sicherlich gibt es Probleme die auch in der Doku vergraben sind deren Antwort man aber nicht findet weil die Erfahrung oder das Knowhow fehlt. Die einfachen Probleme liefern aber eine gute Basis für das Üben von Informationsbeschaffung. Wenn sich Dir eine Information schon regelrecht aufdrängt und Du diese nicht siehst, solltest Du da unbedingt ein wenig Üben!

    @Rudi:

    foreach und readonly:

    Das ganze wird AFAIK dadurch erreicht, das IEnumerator::Current nur den getter Implementiert. Man könnte jetzt
    einen Member aufrufen um einen Wert zu ändern.

    Beispiel:

    ref class myTest
    		{
    			public: int x;
    			public: void setx(int y){x = y;}
    		};
    
    		 System::Collections::Generic::List<myTest^> ^ list = gcnew System::Collections::Generic::List<myTest ^>();
    		 for(int i=0;i < 10;++i)
    		 {
    			 myTest ^t = gcnew myTest();
    			 t->x = i;
    			 list->Add(t);
    		 }
    
    		 for each(myTest^ i in list)
    			 i->setx(99);
    

    Beachten sollte man aber:

    Ein Enumerator bleibt so lange gültig, bis die Auflistung geändert wird. Wenn an der Auflistung Änderungen vorgenommen werden, z. B. durch Hinzufügen, Ändern oder Entfernen von Elementen, ist der Enumerator unwiderruflich ungültig, und der nächste Aufruf von MoveNext oder Reset löst eine InvalidOperationException aus. Wenn die Auflistung zwischen MoveNext und Current geändert wird, gibt Current das Element zurück, auf das der Enumerator festgelegt wurde, auch wenn er bereits ungültig ist.

    http://msdn2.microsoft.com/de-de/library/system.collections.ienumerator.current(VS.80).aspx

    (Das gilt natürlich auch wenn man den indexer und for verwendet, hier sagt man explizit das man weiß was die Auflistung bei Änderungen von Werten macht.)



  • Knuddlbaer schrieb:

    @Rudi:

    foreach und readonly:

    Das ganze wird AFAIK dadurch erreicht, das IEnumerator::Current nur den getter Implementiert. Man könnte jetzt
    einen Member aufrufen um einen Wert zu ändern.

    Beispiel:

    ref class myTest
    		{
    			public: int x;
    			public: void setx(int y){x = y;}
    		};
    
    		 System::Collections::Generic::List<myTest^> ^ list = gcnew System::Collections::Generic::List<myTest ^>();
    		 for(int i=0;i < 10;++i)
    		 {
    			 myTest ^t = gcnew myTest();
    			 t->x = i;
    			 list->Add(t);
    		 }
    	
    		 for each(myTest^ i in list)
    			 i->setx(99);
    

    Beachten sollte man aber:

    Ein Enumerator bleibt so lange gültig, bis die Auflistung geändert wird. Wenn an der Auflistung Änderungen vorgenommen werden, z. B. durch Hinzufügen, Ändern oder Entfernen von Elementen, ist der Enumerator unwiderruflich ungültig, und der nächste Aufruf von MoveNext oder Reset löst eine InvalidOperationException aus. Wenn die Auflistung zwischen MoveNext und Current geändert wird, gibt Current das Element zurück, auf das der Enumerator festgelegt wurde, auch wenn er bereits ungültig ist.

    http://msdn2.microsoft.com/de-de/library/system.collections.ienumerator.current(VS.80).aspx

    (Das gilt natürlich auch wenn man den indexer und for verwendet, hier sagt man explizit das man weiß was die Auflistung bei Änderungen von Werten macht.)

    Vielen Dank für die super Erklärung und das Beispiel aber da ich noch ein Anfänger bin verstehe ich noch nicht so wirklich alles aber wenn etwas weiter bin werde ich mir das noch ganz genau angucken 😃

    Danke 🙂


Anmelden zum Antworten