C
Hallo
Wenn es interessiert hier ist der Code der zu 90 Prozent wie oben beschrieben funktioniert.
// Speicher reservieren
wxLocale *sprache = new wxLocale(wxLANGUAGE_GERMAN, wxLOCALE_CONV_ENCODING);
MeinGridCellEditor* editor = new MeinGridCellEditor(-1,1,wxFILTER_NUMERIC);
m_grid1->RegisterDataType(wxGRID_VALUE_STRING,new wxGridCellFloatRenderer(-1,2), editor);
Dann noch eine Sache am Rande.
Wenn ihr einen double Wert in String konvertirt schaut mal auf den Punkt im String.
double d_wert = 0.77;
wxString s_str= s_str.Format(wxT("%.2f"),d_wert);
Komentiert dann mal die Zeile
wxLocale *sprache = new wxLocale(wxLANGUAGE_GERMAN, wxLOCALE_CONV_ENCODING);
aus und schaut wieder auf den Punkt im String.
Nun weiter im Code.
MeinGridCellEditor.h
#pragma once
#include <wx/grid.h>
#include <wx/string.h>
#include "STL_TextValidator.h"
class MeinGridCellEditor :public wxGridCellTextEditor
{
public:
MeinGridCellEditor(int row = -1,int col = -1,long style = wxFILTER_NONE);
~MeinGridCellEditor(void);
private:
wxString m_AlterWert;
wxGrid* m_grid;
int m_col;
int m_row;
int m_tmp_row;
int m_tmp_col;
long m_style;
bool m_signalton;
STL_TextValidator textValidator;
virtual void Create(wxWindow* parent , wxWindowID id , wxEvtHandler* evtHandler);
virtual bool IsAcceptedKey(wxKeyEvent& event);
virtual void StartingKey(wxKeyEvent& event);
virtual void BeginEdit(int row, int col, wxGrid* grid);
virtual bool EndEdit(int row, int col, wxGrid *grid) ;
};
MeinGridCellEditor.cpp
#include "MeinGridCellEditor.h"
MeinGridCellEditor::MeinGridCellEditor(int row,int col,long style)
: m_grid(NULL)
, m_col(0)
, m_row(0)
, m_tmp_row(-1)
, m_tmp_col(-1)
{
m_row = row;
m_col = col;
m_style= style;
}
MeinGridCellEditor::~MeinGridCellEditor(void)
{
}
bool MeinGridCellEditor::IsAcceptedKey(wxKeyEvent& event)
{
if ( wxGridCellEditor::IsAcceptedKey(event) )
{
int Tastenkode = event.GetKeyCode();
// Hier werden alle Tasteneingaben bis ASCII 128 erlaubt
if (Tastenkode < 128)
{
return true;
}
}
return false;
}
void MeinGridCellEditor::Create(wxWindow* parent , wxWindowID id , wxEvtHandler* evtHandler)
{
wxGridCellTextEditor::Create(parent,id, evtHandler);
}
void MeinGridCellEditor::BeginEdit(int row, int col, wxGrid* grid)
{
wxASSERT_MSG(m_control,wxT("Der wxGridCellTextEditor muss zuerst erstellt werden!"));
m_tmp_row = row;
m_tmp_col = col;
if (grid->GetRows() - 1 == row)
{
// Hier wird wenn erwünscht eine Zeile in die Tabelle eingefügt
// grid->AppendRows(1, false);
}
// Hier wird wenn wahr eine Spalte für Zahleneingabe ausgewählt
if (m_col == m_tmp_col)
{
textValidator.SetStyle(wxFILTER_NUMERIC);
this->Text()->SetValidator(textValidator);
}
else
{
textValidator.SetStyle(wxFILTER_NONE);
this->Text()->SetValidator(textValidator);
}
wxGridCellTextEditor::BeginEdit(row, col, grid);
}
void MeinGridCellEditor::StartingKey(wxKeyEvent& event)
{
int keyCode = event.GetKeyCode();
if (m_col == m_tmp_col)
{
if ((keyCode < 128) && ( wxIsdigit(keyCode) || keyCode == ',' || keyCode == '.'))
{
wxGridCellTextEditor::StartingKey(event);
return;
}
}
else
{
if ((keyCode < 128))
{
wxGridCellTextEditor::StartingKey(event);
return;
}
}
event.Skip();
}
bool MeinGridCellEditor::EndEdit(int row, int col, wxGrid *grid)
{
wxString text(Text()->GetValue());
// Hier wir geschaut ob das Komma an der Ersten stelle steht
if(text.First(',')== 0)
{
// wenn wahr wird eine Null vor den Komma geschrieben
wxString str;
str= text.BeforeFirst(',');
str <<wxT("0");
str <<text;
text.Clear();
text <<str;
}
grid->GetTable()->SetValue(row, col, text);
return true;
}
STL_TextValidator.h
#pragma once
#include <wx/valtext.h>
class STL_TextValidator :public wxTextValidator
{
DECLARE_DYNAMIC_CLASS(STL_TextValidator)
public:
STL_TextValidator(const wxTextValidator& val);
STL_TextValidator(long style = wxFILTER_NONE, wxString *val = 0);
~STL_TextValidator(void);
private:
virtual wxObject* Clone(void)const;
virtual void OnChar(wxKeyEvent& event);
DECLARE_EVENT_TABLE()
};
STL_TextValidator.cpp
#include "STL_TextValidator.h"
IMPLEMENT_DYNAMIC_CLASS(STL_TextValidator, wxValidator)
BEGIN_EVENT_TABLE(STL_TextValidator, wxTextValidator)
EVT_CHAR(STL_TextValidator::OnChar)
END_EVENT_TABLE()
STL_TextValidator::STL_TextValidator(const wxTextValidator& val)
{
}
STL_TextValidator::STL_TextValidator(long style , wxString *val)
{
}
STL_TextValidator::~STL_TextValidator(void)
{
}
void STL_TextValidator::OnChar(wxKeyEvent& event)
{
if ( m_validatorWindow )
{
int keyCode = event.GetKeyCode();
wxString m_AlterWert(((wxTextCtrl*)m_validatorWindow)->GetValue());
// Nur Zahlen Eingabe zulassen
if(wxTextValidator::GetStyle() ==wxFILTER_NUMERIC)
{
if (wxIsdigit(keyCode) || keyCode == '.' || keyCode == ',' ||keyCode<WXK_SPACE||
keyCode== WXK_DELETE|| keyCode=='-' || keyCode=='+' || keyCode > WXK_START)
{
switch (keyCode)
{
case WXK_NUMPAD_DECIMAL:
case '.':
if(keyCode == '.')
{
return;
}
case ',':
if (m_AlterWert.Find(',')==-1) //keine doppelten Komma zulassen
{
((wxTextCtrl*)m_validatorWindow)->WriteText(_T(","));
return;
}
else
{
return;
}
break;
case '-':
case '+':
return;
break;
default:
event.Skip();
break;
}
}
else
{
wxBell();
event.Skip();
}
}
}
event.Skip();
}
wxObject* STL_TextValidator::Clone(void)const
{
return new STL_TextValidator(*this);
}
Das sind bestimmt noch ein paar Fehler drin, aber im großen ganzen erfüllt es meinen Zweck.
Der Bediener kann in einer Spalte nur Zahlen eingeben es wird Komma geschrieben und die zwei Stellen nach dem Komma.
Viel spaß
Califax