Dämliches Problem beim Auslesen aus einer ListBox



  • Und zwar möchte ich aus einer Listbox das selektierte Element auslesen und es in einen int umwandeln. Aber wie mache ich das am einfachsten? Visual C++ bringt anscheinend nichts dafür mit... Ich kann nur in einen String^ umwandlen. Eine Funktion um ein String^ in einen int umzuwandeln, ist nicht angegeben. 😕
    Und was bedeuten diese ^ hinter den Klassennamen? Kennzeichnen die damit ihre selbst implementierten Standardklassen? Inwiefern unterscheiden die sich von den normalen?

    Bis dann denn!

    McTrevor

    p.s.: hat sich erledigt. Habe in der Doku doch noch die statische Klasse Convert ausfindig gemacht, die das gewünschte leistet.



  • Ich vermute, du bist sowieso im falschen Forum gelandet.
    Das ^ gibts in der MFC nicht.



  • Dieser Thread wurde von Moderator/in estartu aus dem Forum MFC (Visual C++) in das Forum C++/CLI mit .NET verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Die Frage die sich mir hier erst mal stellt: Was steckst Du denn in die ListBox rein???
    Aber prinzipiell geht es natürlich so:

    int i = Convert::ToInt32(this->listBox1->SelectedValue);
    


  • Ich stecke int-Werte rein. Habe ja auch mittlererweile rausgefunden, wie ich da nachher auch wieder ints rausbekomme. Kann mir aber trotzdem jemand mal kurz erklären, was es mit den ^-Zeichen auf sich hat bei .NET? Und wie das ganze "Verwalten" mit ref funktioniert? Was der tiefere Sinn dahinter ist? Wollte jetzt in einer verwalteten Klasse ( ref class sonstwas{} ) ganz normal eine Enumeration definieren, nur wie mache ich das?

    Bis dann denn!

    McTrevor



  • McTrevor schrieb:

    Kann mir aber trotzdem jemand mal kurz erklären, was es mit den ^-Zeichen auf sich hat bei .NET? Und wie das ganze "Verwalten" mit ref funktioniert? Was der tiefere Sinn dahinter ist?

    Das ^ ist einfach eine "Referenz" auf ein managed-object.
    Verwalten musst Du da gar nichts, das macht doch der Garbage-Collector; der verwaltet wann ein Objekt nicht mehr gebraucht wird und löscht es dann selbstständig. D.h. Du brauchst Dich nicht mehr um das Löschen von Objekten zu kümmern.

    McTrevor schrieb:

    Wollte jetzt in einer verwalteten Klasse ( ref class sonstwas{} ) ganz normal eine Enumeration definieren, nur wie mache ich das?

    enum class MyEnum
      {
        A,
        B,
      };
    


  • Heißt das, Microsoft hat einen Großteil von C++ reimplementiert, damit der User sich nicht mehr um die ordentliche Verwaltung seiner Objekte kümmern muss? Ist die STL auch reimplementiert worden? Wenn es davon keine managed-Version gibt, wie kann ich dann die STL benutzen? Der Compiler erlaubt mir nicht, in einer verwalteten Klasse einen nicht verwalteten Member zu definieren. Das heißt doch dann auch, daß ich in einer verwalteten Klasse die STL nicht benutzen kann, oder? Gibt es eine Möglichkeit, das zu kombinieren, oder muss man das ganze Projekt entweder verwaltet umsetzen oder komplett drauf verzichten?

    Bis dann denn!

    McTrevor

    p.s.: Ach danke überhaupt für die Hilfe. Ich hoffe, ich nerve noch nicht. 😃



  • McTrevor schrieb:

    Heißt das, Microsoft hat einen Großteil von C++ reimplementiert, damit der User sich nicht mehr um die ordentliche Verwaltung seiner Objekte kümmern muss?

    Ich glaube Du bringst hier was durcheinander...
    C++ ist und bleibt C++. Hier musst Du Dich auch um new/delete kümmern.

    Was Du verwendest ist C++/CLI! Dies basiert auf dem .NET-Framework!
    Das erkennst Du auch an den neuen Schlüsselworten, die es in C++ nicht gibt, wie:
    - ref
    - value
    - gcnew
    - usw...

    Und Dein Projekt wird mit /clr übersetzt.

    McTrevor schrieb:

    Ist die STL auch reimplementiert worden? Wenn es davon keine managed-Version gibt, wie kann ich dann die STL benutzen?

    Wenn Du das .NET-Framework verwendest, gibt es eigentlich kaum einen Grund, warum Du STL verwenden willst. Sag doch mal was Du machen willst und dann sage ich Dir die passende .NET-Klasse...

    Zukünftig soll es aber eine STL für .NET geben (STL.NET; einfach mal in google suchen).

    [/quote]Der Compiler erlaubt mir nicht, in einer verwalteten Klasse einen nicht verwalteten Member zu definieren.[/quote]

    Dazu gibt es das "gcroot" template!

    [/quote]Das heißt doch dann auch, daß ich in einer verwalteten Klasse die STL nicht benutzen kann, oder? Gibt es eine Möglichkeit, das zu kombinieren, oder muss man das ganze Projekt entweder verwaltet umsetzen oder komplett drauf verzichten?[/quote]Also eigentlich kannst Du es kombinieren, nur macht es in einer verwalteten Klasse keinen Sinn, da Du Dich ja dann wieder um die Speicherverwaltung kümmern müsstest, was ja dann wieder den Sinn verfehlt...



  • Also ich benutze meißt so Sachen wie maps, vectoren, sets... nichts ungewöhnliches halt. Aber wenn es dafür entsprechende Pendants in einer managed-version gibt, nehme ich auch gerne die.

    Bis dann denn!

    McTrevor



  • Eine Möglichkeit wäre:

    std::vector<T> => System::Collections::Generic::List<T>
    std::map<TKey, TValue> => System::Collections::Generic::Dictionary<TKey, TValue>
    std::set<T> => System::Collections::Generic::TreeSet<T>
    


  • Ah danke. In der Dokumentation bin ich unter Container oder den stl-Namen natürlich nicht fündig geworden, aber auf Collections hätte ich kommen können.

    Bis dann denn!

    McTrevor



  • Ich habe mir jetzt mal ein bischen angelesen, wie das alles mit NET und CLI überhaupt funktioniert. Nun stellt sich mir aber folgende Frage:

    Ist diese CLR (Laufzeitumgebung für den erzeugten Zwischencode) auf allen Windowsmaschinen bereits installiert, oder muss die irgendwo runtergeladen und installiert werden? Immerhin möchte ich die Anwendung nicht nur auf dem Rechner benutzen, auf dem ich sie erstellt habe. Oder gibt es evtl eine Möglichkeit, die Bequemlichkeit der Windows-Forms (der Designer ist echt extrem komfortabel zu handhaben) mit den Vorteilen von Maschinencode zu kombinieren? Oder geht das wegen der Garbage-Collection absolut nicht?

    Bis dann denn!

    McTrevor

    p.s.: Laufen die Programme dann evtl sogar unter Linux mit Mono(hieß es so?)?



  • McTrevor schrieb:

    Ist diese CLR (Laufzeitumgebung für den erzeugten Zwischencode) auf allen Windowsmaschinen bereits installiert

    Nein.

    McTrevor schrieb:

    oder muss die irgendwo runtergeladen und installiert werden?

    Ja.
    http://www.microsoft.com/downloads/details.aspx?FamilyID=0856eacb-4362-4b0d-8edd-aab15c5e04f5

    McTrevor schrieb:

    Immerhin möchte ich die Anwendung nicht nur auf dem Rechner benutzen, auf dem ich sie erstellt habe. Oder gibt es evtl eine Möglichkeit, die Bequemlichkeit der Windows-Forms (der Designer ist echt extrem komfortabel zu handhaben) mit den Vorteilen von Maschinencode zu kombinieren? Oder geht das wegen der Garbage-Collection absolut nicht?

    Das geht nicht. Du musst auf den Zeilmaschinen das .NET-Framework installieren.
    Es gibt zwar Ansätze wo dieses .NET-Framework in Deiner EXE "mit drin" ist, aber dies wird von MS nicht unterstützt.

    McTrevor schrieb:

    Laufen die Programme dann evtl sogar unter Linux mit Mono(hieß es so?)?

    Prinzipiell laufen die da schon. Nur die Unterstützung von Windows-Forms ist dort noch sehr miserabel; somit kann man sagen, dass Windows-Forms Applikationen unter Linux (noch) nicht laufen.
    ASP.NET und Consolen-Applikationen laufen hingegeben fast ohne Probleme mit mono.



  • Ah, vielen Dank. Ich hätte nachher da wieder fluchend vorgesessen, wenn es auf den anderen Maschinen nicht läuft und ich nicht weiß, warum. Aber gibt es echt keine Möglichkeit eine Anwendung mit Formular-Fenstern mit der Visual C++ Express-Edition zu erstellen, die als Maschinencode vorliegt und deren Formulare mit dem Designer erstellt wurden? Ich meine, es gibt doch auch viele kleine fertig kompilierte Tools mit so einer Oberfläche die wurden bestimmt auch mit diesem oder einem ähnlichen Editor erstellt, von einigen AUsnhamen jetzt mal abgesehen.

    Bis dann denn!

    McTrevor



  • McTrevor schrieb:

    oder einem ähnlichen Editor erstellt

    Ja. Du meinst aber vermutlich die MFC und den Resourcen-Editor. Mit dem kannst Du native Anwendungen erstellen, die das .NET-Framework nicht benötigen. Die MFC ist aber erst ab der Standard-Edition verfügbar.
    Du kannst natürlich auch reine Win32-API machen... ist aber etwas aufwendiger... das arbeiten mit dem .NET-Framework macht doch vieles einfacher (und man gewöhnt sich sehr schnell daran).



  • Nein, der Designer benutzt die Windows Forms Klasse und die sind nunmal managed, also brauchst du das Framework - da gibt auch keine Ausnahmen.



  • Na gut, dann müssen die Leute, die das Proggie nachher nutzen wollen, eben in den sauren Apfel beißen und und sich die Runtime-Environment installieren... Oder ich überlege es mir doch nochmal anders und probiere es mit QT. Läßt sich denn QT problemlos verwenden, wenn ich die Entwicklungsumgebung von Microsoft nutze, oder sind da wieder Fallstricke eingebaut?

    Bis dann denn!

    McTrevor

    p.s.: Und danke nochmal... So langsam kann ich diesen ganzen Buchstaben-Abkürzungssalat auch mit Inhalten verbinden.



  • McTrevor schrieb:

    Läßt sich denn QT problemlos verwenden, wenn ich die Entwicklungsumgebung von Microsoft nutze, oder sind da wieder Fallstricke eingebaut?

    Mit der Express-Edition habe ich noch keine Erfahrung... da solltest Du mal im QT-Forum fragen...



  • Die Qt 4.0 Open Source Edition für Windows läuft sowieso nur mit Mingw, für Integration in und Support von MSVC++ (auch Express) brauchts ne lizensierte Qt-Edition...

    (Quelle: http://www.trolltech.com/download/qt/windows.html)



  • So ich habe mir nun eine enum class definiert und auch einige Variablen, die diese Enumeration als Typ haben Wenn ich nun den Zahlenwert einer einer Enumerationvariable auslesen will, kann ich einfach casten:

    static enum class type {TYP0,TYP1,TYP2,TYP3};
    type t1 = TYP1;
    Combobox1->selectedIndex = int (t1);
    

    Danach wird die zweite Zeile in der Combobox selektiert.

    Nur wenn ich jetzt zu einer selektierten Zeile die Variable entsprechend setzen will, wie mache ich das dann? Ich kann zwar den Enumeration Typ in einen int casten, aber nicht andersrum...

    Bis dann denn!

    McTrevor

    p.s.: Habe es jetzt selbst hinbekommen. Das Problem war, daß ich die Enumeration in einer anderen Klasse definiert hatte und nicht den vollen Bezeichner angegeben hatte, also:

    t1 = KlasseInDerTYPdefiniertIst::type(Combobox->SelectedIndex);
    

Log in to reply