Textbox mit SFML führt immer zu std::bad_alloc



  • Hallo zusammen, ich wollte in SFML eine Textbox erstellen. Die Klasse sieht so aus:

    #include "Textbox.hpp"
    
    	Textbox::Textbox(std::string id, sf::Vector2f position ,sf::Vector2f size ,std::string defaultstring)
    	{
    		setID(id);
    		mPosition = position;
    		mSize     = size;
    		setBlocked(false);
    		mText.setString(defaultstring);
    		mText.setCharacterSize(size.y-8);
    		mIsActive = false;
    		setClicked(false);
    
    		createGraphic();
    	}
    
    	void Textbox::reset()
    	{
    	}
    
    	void Textbox::createGraphic()
    	{
    		quads = sf::VertexArray(sf::Quads,5);
    		lines = sf::VertexArray(sf::LinesStrip,5);
    
    		quads[0].position = sf::Vector2f(mPosition.x , mPosition.y);
    		quads[1].position = sf::Vector2f(mPosition.x + mSize.x,      mPosition.y);
    		quads[2].position = sf::Vector2f(mPosition.x + mSize.x,      mPosition.y + mSize.y);
    		quads[3].position = sf::Vector2f(mPosition.x , mPosition.y + mSize.y);
    		quads[4].position = sf::Vector2f(mPosition.x , mPosition.y);
    
    		quads[0].color = sf::Color(255,255,255,255);
    		quads[1].color = sf::Color(255,255,255,255);
    		quads[2].color = sf::Color(255,255,255,255);
    		quads[3].color = sf::Color(255,255,255,255);
    		quads[4].color = sf::Color(255,255,255,255);
    
    		lines[0].position = sf::Vector2f(mPosition.x , mPosition.y);
    		lines[1].position = sf::Vector2f(mPosition.x + mSize.x,      mPosition.y);
    		lines[2].position = sf::Vector2f(mPosition.x + mSize.x,      mPosition.y + mSize.y);
    		lines[3].position = sf::Vector2f(mPosition.x , mPosition.y + mSize.y);
    		lines[4].position = sf::Vector2f(mPosition.x , mPosition.y);
    
    		lines[0].color = sf::Color(0,0,0,255);
    		lines[1].color = sf::Color(0,0,0,255);
    		lines[2].color = sf::Color(0,0,0,255);
    		lines[3].color = sf::Color(0,0,0,255);
    		lines[4].color = sf::Color(0,0,0,255);
    
    		mText.setColor(sf::Color(87,158,56));
    		TextboxRect = sf::IntRect(mPosition.x,mPosition.y,mSize.x,mSize.y);
    	}
    
    	void Textbox::update(sf::Event *e, sf::RenderWindow *rw)
    	{
    		updateText();
    		checkMouseToBox(e,rw);
    	}
    
    	void Textbox::draw(sf::RenderWindow *rw)
    	{
    		rw->draw(quads);
    		rw->draw(lines);
    		rw->draw(mText);
    	}
    
    	void Textbox::checkMouseToBox(sf::Event *e,sf::RenderWindow *rw)
    	{
    
    		if(TextboxRect.contains(static_cast<sf::Vector2i>(sf::Mouse::getPosition(*rw))))
    		{
    			if(mIsActive == false)
    			{
    				if(sf::Mouse::isButtonPressed(sf::Mouse::Button::Left))
    				{
    					if(sf::Event::MouseButtonReleased)
    					{
    							mIsActive = true; 
    							mText.setString("");
    					}
    				}
    			}
    		}
    	}
    
    	void Textbox::checkEnterdText(sf::Event *e,sf::RenderWindow *rw)
    	{
    		if(mIsActive == true)
    		{
    			for (int i = 0; i < 5; ++i)
    			{
    				quads[i].color = sf::Color(212,212,212);
    			}
    			mText.setColor(sf::Color(198,28,28));
    
    			if(e->type == e->TextEntered)
    			{
    				std::string name = ""; 
    				if (e->text.unicode < 128)
    				{
    					if(e->text.unicode != 13)
    					{
    						 name += static_cast<char>(e->text.unicode);
    						 mText.setString(mText.getString()+name);
    					}
    				}
    
    				if(mText.getLocalBounds().width > Textbox::mSize.x)
    				{
    					std::string t;
    					t = mText.getString();
    					t.resize(t.size()-1);
    					mText.setString("");
    					mText.setString(t);
    				}
    
    			}
    
    			if (sf::Keyboard::isKeyPressed(sf::Keyboard::BackSpace))
    			{	
    				std::string temp;
    				temp = mText.getString();
    				if(temp.size() >= 1)
    				{
    					temp.resize(temp.size()-1);
    					mText.setString(temp);
    				}
    			}
    		}
    		else
    		{
    			mText.setColor(sf::Color(87,158,56));
    			for (int i = 0; i < 5; ++i)
    			{
    				quads[i].color = sf::Color(255,255,255);
    			}
    		}
    
    		    if (sf::Keyboard::isKeyPressed(sf::Keyboard::Return))
    			{	
    				mIsActive = false;
    			}
    	}
    
    	void Textbox::updateText()
    	{
    		mText.setPosition(mPosition.x,mPosition.y+mSize.y/2-mText.getCharacterSize()/2-5);
    	}
    
    	void Textbox::handle(sf::Event *e,sf::RenderWindow *rw)
    	{
    		checkEnterdText(e,rw);
    	}
    
    	void Textbox::setPosition(sf::Vector2f position)
    	{
    		mPosition = position;
    		createGraphic();
    	}
    

    Wenn ich sie nun in einer anderen Datei aufrufen möchte:

    Textbox *t = new Textbox(...);
    

    bekomme ich immer einen Fehler names "C++ exception: std::bad_alloc". Weis jemand evtl. woran das liegt?



  • was sagt der Debugger ?



  • if(mText.getLocalBounds().width > Textbox::mSize.x) 
                     { 
                         std::string t; 
                         t = mText.getString(); 
                         t.resize(t.size()-1);  // <---------------- nix globb!
                         mText.setString(""); 
                         mText.setString(t); 
                     }
    

Anmelden zum Antworten