[MSVC++] Meine Menü Klasse



  • Moinsen Community !
    Schade dass es keine Sektion gibt, wo man sein Vollbrachtes Werk veröffentlichen kann

    So. Ich wollt euch mein *erstes* Komplett funktionierendes
    Stücken Code nicht vorenthalten. Es ist eine Klasse, mit deren
    Hilfe ein Menü ausgegeben wird (Win32 Konsole). Da ich z.Zt. C++ lerne,
    wäre ich über Kritik + Verbesserungsvorschläge, sehr erfreut. 😃

    class C_Menue
    The sample code below illustrates
    how to use the C_Menue Class in Visual C++.

    Required Header:
    "menue.h"

    Description:
    DrawMenue(string title, string items, string position);

    title determinates the heading of the menue.

    items determinates the items of the menue.
    Every item is seperated by an comma (,)

    position determinates the alignment of the heading.
    (left[1],right[2],middle[3])

    Sample Code:

    #include "menue.h"
    
    using namespace std;
    
    void main( void )
    {
    
    	C_Menue Menue;
    	Menue.DrawMenue("Hauptmenue", "Datei,Bearbeiten,Optionen,Beenden", "middle");
    
    	system("pause");
    }
    

    Datei menue.h

    #include <string>
    
    class C_Menue
    {
    public:
    	void DrawMenue(std::string title, std::string items, std::string position);
    private:
    	virtual int getItems ( std::string list );
    	virtual int getLongestItem ( std::string list );
    	virtual std::string nextValue ( std::string& list);
    	virtual std::string ntos ( int z );
    };
    

    Datei menue.cpp

    #include "menue.h"
    #include <sstream>
    
    void C_Menue::DrawMenue(std::string title, std::string items, std::string position)
    {													// Fangen wir mal an den Menuestring zusammen zu basteln
    	std::string menue;								// Undzwar hier rein.
    
    	bool set_line = false;							// Zum prüfen ob ein Menüfeld gesetzt werden soll
    	int height = C_Menue::getItems(items)-1;		// Wieviele Eintäge sollns denn werden ?
    	int length = C_Menue::getLongestItem(items)		// Wie lang ist der längste eintrag ?
    							+title.size();
    	std::string buffer;
    
    	for ( int ha = 0; ha <= height; ha++ )			// So. Dann schaun wir mal, wieviele reihen das Menü haben soll
    	{
    		if ( ha == 0 )								// Die erste Reihe beinhaltet immer den Titelnamen.
    		{
    			if (position=="left" || position=="1")	// Kein Problem. Wo soll der Titelname stehen ? left, right, middle ?
    			{
    				int title_length = ((title.size()) + 4);
    				menue.append("\xC9\xB4"+title+"\xC3");
    				for ( int aa = 0; aa < (length-title_length); aa++)
    				{
    					menue.append("\xCD");
    				}
    				menue.append("\xBB\n");
    				length = (menue.size()-3);
    			}
    
    			if (position=="right" || position=="2")	// Für einen Rechtsbündigen Titel
    			{
    				int title_length = ((title.size()) + 4);
    				menue.append("\xC9");
    				for ( int aa = 0; aa < (length-title_length); aa++)
    				{
    					menue.append("\xCD");
    				}
    				menue.append("\xB4"+title+"\xC3\xBB\n");
    				length = (menue.size()-3);
    			}
    
    			if (position=="middle" || position=="3")// Und hier nochmal für einen (mehr oder weniger) Zentrierten Titel
    			{
    				int title_length = ((title.size()) + 4);
    				menue.append("\xC9");
    				for ( int aa = 0; aa < ((length-title_length)/2); aa++)
    				{
    					menue.append("\xCD");
    				}
    				menue.append("\xB4"+title+"\xC3");
    				for ( int bb = 0; bb < ((length-title_length)/2); bb++)
    				{
    					menue.append("\xCD");
    				}
    				if ( ((title_length/2)%2) && !(length%2) ) menue.append("\xCD");
    				else { if ( (length%2) && !((title_length/2)%2) ) menue.append("\xCD"); };
    				menue.append("\xBB\n");
    				length = (menue.size()-3);
    			}
    		}
    
    		if ( !set_line )							// Wird eine Leerzeile gesetzt ?
    		{
    			for ( int a = 0; a <= length; a++ )
    			{
    				if ( a == 0 ) menue.append("\xCC");
    				if ( a == length ) menue.append("\xB9\n");
    				else menue.append("\xC4");
    			}
    			set_line = true;
    		}
    
    		if ( set_line )								// Nun folgt der wichtigste Teil. Menüfeld wird gesetzt. Was soll zur Auswahl stehen ?
    		{
    			for ( int a = 0; a <= length; a++ )
    			{
    				if ( a == 0 ) menue.append("\xBA");
    				if ( a == 1 )						// Hier wird der Feldstring zusammengebastelt
    				{
    					buffer = " ";
    					buffer.append( C_Menue::ntos( (ha+1) ) );
    					buffer.append(". ");
    					buffer.append( C_Menue::nextValue(items) );
    					menue.append(buffer);
    					a = a + buffer.size();			// Dann noch die länge des Stringes zum Counter dazu zählen
    				}
    				if ( a == length ) menue.append("\xBA\n" );
    				else menue.append(" ");				// Und den Rest mit Leerzeichen auffüllen
    			}
    			set_line = false;
    		}
    
    		if ( ha == height )							// Und zu aller letzt Schließen wir das Menü mit einer Endzeile
    		{
    			for ( int b = 0; b <= length; b++ )
    			{
    				if ( b == 0 ) menue.append("\xC8");
    				if ( b == length ) menue.append("\xBC\n");
    				else menue.append("\xCD");
    			}
    		}
    
    	}
    //	printf("%s",menue.c_str());						// Ja ich gebs zu, ich war zu faul ... xD
    	return (char)menue.c_str();
    }													// So. Bekomm ich jetze nen Keks ?
    
    // ***********************************************************************************************************
    
    int C_Menue::getItems ( std::string list )			// Na? Wieviele Elemente befinden sich in dem String ?
    {													// [An dieser Methode hab ich 3 Stunden gearbeitet o.O]
    	char *listcopy = new char[list.size()];			// [Soll heissen, es gibt bestimmt bessere lösungen   ]
    	list.copy( listcopy, list.size() );
    	int items = NULL;
    	char *result = NULL;
    	result = strtok( listcopy, "," );
    	while( result != NULL )
    	{
    		items++;									// Lange Methode ...
    		result = strtok( NULL, "," );
    	}
    	delete listcopy;
    	return items;									// ... wenig Sinn. Aber wenigstens funktionierts.
    }
    
    // ***********************************************************************************************************
    
    int C_Menue::getLongestItem ( std::string list )	// Ok. Und wie lang ist das Längste Element ?
    {													// [Diese hat nich solang gedauert         ]
    	char *listcopy = new char[list.size()];			// [Sehen sich aber zum verwechseln ähnlich]
    	list.copy( listcopy, list.size() );
    	int length = NULL;
    	char *result = NULL;
    	result = strtok( listcopy, "," );
    	while( result != NULL )
    	{
    		if ( length <= strlen( result ) )			// Bis auf diese
    			 length = strlen( result );				// kleine Zeile
    		result = strtok( NULL, "," );
    	}
    	delete listcopy;
    	return length;
    }
    
    // ***********************************************************************************************************
    
    std::string C_Menue::nextValue ( std::string& list)	// Ich wollt schon immer mal nen String in Einzelteile Zerlegen
    {
    	std::string buffer = "Ich bin ein buffer";
    	int z = NULL; z = getItems ( list );
    
    	buffer.erase();
    	buffer.append( list, 0, list.find( ",",0 ) );	// [Und Hepp ! Ein Kommata ! Und jedes mal ...]
    	list.erase( 0, (buffer.size() + 1) );
    
    	return buffer;									// [... kommt ein weiteres Element bei raus   ]
    }
    
    // ***********************************************************************************************************
    
    std::string C_Menue::ntos ( int z )					// Ich geb zu, ich war jung und brauchte nen String
    {
    	std::string str;
    	std::stringstream out;
    	out << z;
    	str = out.str();
    
    	return str;
    }
    


  • Grauenvoller Code, muss man einfach sagen:

    - Benutzt Magic Numbers,
    - Benutzt void main,
    - Benutzt für IDs signeds, die nicht geprüft werden.
    - Unverständliche variablen: "aa".
    usw.



  • int height = C_Menue::getItems(items)-1; // Wieviele Eintäge sollns denn

    unnötig du bist schon in der klasse bzw. initialisierung... daher kannst du den scope operator weglassen.

    i`m so sorry aber mach doch bessere kommentare,

    z.b. wie eine doku, bevor die funktion kommt machst ein kommentar und sagst was du da machen willst und wie du es evtl realisiert wenn es schwerer ist...

    die kommentare an der seite finde ich etwas "scheiße" da ich erstmal alle durchlesen müsste.

    dadurch beokmmst du mehr struktur in den code, ich glaube das meint auch der über mir...



  • Hallo

    Wenn du willst, dass von der Klasse abgeleitet werden soll/kann, (denke ich wegen der virtuellen Funktionen) dann solltest du der Klasse auch einen virtuellen Destruktor spendieren.

    chrische



  • Oh je ...
    Das Teil is schon so alt 😃
    Ich habs schon lang nimmer auf meinem Rechner ..
    War mein allererstes Projekt. Aber immerhin funktioniert es. 🕶



  • naja erst 2monate her xD


Anmelden zum Antworten