L
Hallo,
ich habe mal ein wenig mit den wxDataViewList Klassen usw. herum gespielt.
Hat unter Linux (wxGTK/Mac PPC) auch ganz gut funktioniert.
Nun ist das Ganze aber unter Mac OS X (Leopard) so ziemlich unsauber in der Darstellung und die Bedienung klappt auch nicht.
Wer hat denn damit schonmal zu tun gehabt und kennt evtl. andere Lösungswege
Daten in (für den User in gleicher Weise) einer Tabelle darzustellen ?
Danke
Lothar
Hier der Code eines Datenmodells und des Formulars. Der Code rund um UAP_REQUEST ist speziell aus meinem Framework um die Datenbankverbindung bereitzustellen:
// Generated class for FormularID = 2
class Formulare : public wxDataViewListModel {
public:
Formulare();
virtual ~Formulare();
virtual bool InitModel();
virtual unsigned int GetNumberOfRows();
virtual unsigned int GetNumberOfCols();
virtual wxString GetColType( unsigned int col );
virtual void GetValue( wxVariant &variant, unsigned int col, unsigned int row );
virtual bool SetValue( wxVariant &value, unsigned int col, unsigned int row );
protected:
void ReadDataRow(lb_I_Query* sampleQuery);
wxArrayString m_toolbarimage;
wxArrayString m_name;
wxArrayString m_menuname;
wxArrayString m_eventname;
wxArrayString m_menuhilfe;
wxArrayString m_anwendungid;
wxArrayString m_typ;
wxArrayString m_columnTypes;
unsigned int numberOfRows;
unsigned int numberOfColumns;
};
Formulare::Formulare()
{
InitModel();
}
Formulare::~Formulare() {
}
unsigned int Formulare::GetNumberOfRows()
{
return numberOfRows;
}
unsigned int Formulare::GetNumberOfCols()
{
return numberOfColumns;
}
wxString Formulare::GetColType( unsigned int col )
{
return m_columnTypes[col];
}
void Formulare::ReadDataRow(lb_I_Query* sampleQuery) {
int column = 0;
column++;
UAP(lb_I_String, s_toolbarimage)
s_toolbarimage = sampleQuery->getAsString(column);
if (s_toolbarimage->charrep() == NULL) *s_toolbarimage = "";
m_toolbarimage.Add(s_toolbarimage->charrep());
column++;
UAP(lb_I_String, s_name)
s_name = sampleQuery->getAsString(column);
if (s_name->charrep() == NULL) *s_name = "";
m_name.Add(s_name->charrep());
column++;
UAP(lb_I_String, s_menuname)
s_menuname = sampleQuery->getAsString(column);
if (s_menuname->charrep() == NULL) *s_menuname = "";
m_menuname.Add(s_menuname->charrep());
column++;
UAP(lb_I_String, s_eventname)
s_eventname = sampleQuery->getAsString(column);
if (s_eventname->charrep() == NULL) *s_eventname = "";
m_eventname.Add(s_eventname->charrep());
column++;
UAP(lb_I_String, s_menuhilfe)
s_menuhilfe = sampleQuery->getAsString(column);
if (s_menuhilfe->charrep() == NULL) *s_menuhilfe = "";
m_menuhilfe.Add(s_menuhilfe->charrep());
column++;
UAP(lb_I_Long, l_anwendungid)
l_anwendungid = sampleQuery->getAsLong(column);
m_anwendungid.Add(l_anwendungid->charrep());
column++;
UAP(lb_I_Long, l_typ)
l_typ = sampleQuery->getAsLong(column);
m_typ.Add(l_typ->charrep());
numberOfColumns = column;
}
bool Formulare::InitModel() {
lbErrCodes err = ERR_NONE;
UAP(lb_I_Database, database)
UAP(lb_I_Query, sampleQuery)
char* databasename = "lbDMF";
char* databaseuser = "dba";
char* databasepass = "dbpass";
char* dbbackend = "DatabaseLayerGateway";
UAP_REQUEST(getModuleInstance(), lb_I_PluginManager, PM)
AQUIRE_PLUGIN_NAMESPACE_BYSTRING(lb_I_Database, dbbackend, database, "'database plugin'")
database->init();
if (database->connect(databasename, databasename, databaseuser, databasepass) != ERR_NONE) {
wxLogError("Error connecting to database.");
return false;
}
sampleQuery = database->getQuery(databasename, 0);
char* sql = "select "
"toolbarimage, "
"name, "
"menuname, "
"eventname, "
"menuhilfe, "
"anwendungid, "
"typ, "
"ID FROM Formulare ORDER BY ID";
sampleQuery->query(sql);
int row = 0;
m_columnTypes.Add("string");
m_columnTypes.Add("string");
m_columnTypes.Add("string");
m_columnTypes.Add("string");
m_columnTypes.Add("string");
m_columnTypes.Add("string");
m_columnTypes.Add("string");
if (sampleQuery->first() == ERR_NONE) {
row++;
ReadDataRow(sampleQuery.getPtr());
while (sampleQuery->next() == ERR_NONE) {
row++;
ReadDataRow(sampleQuery.getPtr());
}
}
numberOfRows = row;
sampleQuery->close();
database->close();
}
void Formulare::GetValue( wxVariant &variant, unsigned int col, unsigned int row ) {
int column = 0;
if (column == col) {
variant = (wxString) m_toolbarimage[row];
}
column++;
if (column == col) {
variant = (wxString) m_name[row];
}
column++;
if (column == col) {
variant = (wxString) m_menuname[row];
}
column++;
if (column == col) {
variant = (wxString) m_eventname[row];
}
column++;
if (column == col) {
variant = (wxString) m_menuhilfe[row];
}
column++;
if (column == col) {
variant = (wxString) m_anwendungid[row];
}
column++;
if (column == col) {
variant = (wxString) m_typ[row];
}
column++;
}
bool Formulare::SetValue( wxVariant &value, unsigned int col, unsigned int row ) {
int column = 0;
if (column == col) {
m_toolbarimage[row] = value.GetString();
return true;
}
column++;
if (column == col) {
m_name[row] = value.GetString();
return true;
}
column++;
if (column == col) {
m_menuname[row] = value.GetString();
return true;
}
column++;
if (column == col) {
m_eventname[row] = value.GetString();
return true;
}
column++;
if (column == col) {
m_menuhilfe[row] = value.GetString();
return true;
}
column++;
if (column == col) {
m_anwendungid[row] = value.GetString();
return true;
}
column++;
if (column == col) {
m_typ[row] = value.GetString();
return true;
}
column++;
return true;
}
void MyFrame::OnShowFormulare(wxCommandEvent& event) {
if (dataview_left) {
dataview_left->Destroy();
dataview_left = NULL;
}
// Left wxDataViewCtrl
dataview_left = new wxDataViewCtrl( panel, wxID_ANY );
Formulare *model = new Formulare;
dataview_left->AssociateModel( model );
int column = 0;
wxDataViewTextRenderer *text_renderertoolbarimage = new wxDataViewTextRenderer( wxT("string"), wxDATAVIEW_CELL_EDITABLE );
wxDataViewColumn *thecolumntoolbarimage = new wxDataViewColumn( wxT("toolbarimage"), text_renderertoolbarimage, column );
dataview_left->AppendColumn( thecolumntoolbarimage );
column++;
wxDataViewTextRenderer *text_renderername = new wxDataViewTextRenderer( wxT("string"), wxDATAVIEW_CELL_EDITABLE );
wxDataViewColumn *thecolumnname = new wxDataViewColumn( wxT("name"), text_renderername, column );
dataview_left->AppendColumn( thecolumnname );
column++;
wxDataViewTextRenderer *text_renderermenuname = new wxDataViewTextRenderer( wxT("string"), wxDATAVIEW_CELL_EDITABLE );
wxDataViewColumn *thecolumnmenuname = new wxDataViewColumn( wxT("menuname"), text_renderermenuname, column );
dataview_left->AppendColumn( thecolumnmenuname );
column++;
wxDataViewTextRenderer *text_renderereventname = new wxDataViewTextRenderer( wxT("string"), wxDATAVIEW_CELL_EDITABLE );
wxDataViewColumn *thecolumneventname = new wxDataViewColumn( wxT("eventname"), text_renderereventname, column );
dataview_left->AppendColumn( thecolumneventname );
column++;
wxDataViewTextRenderer *text_renderermenuhilfe = new wxDataViewTextRenderer( wxT("string"), wxDATAVIEW_CELL_EDITABLE );
wxDataViewColumn *thecolumnmenuhilfe = new wxDataViewColumn( wxT("menuhilfe"), text_renderermenuhilfe, column );
dataview_left->AppendColumn( thecolumnmenuhilfe );
column++;
wxDataViewTextRenderer *text_rendereranwendungid = new wxDataViewTextRenderer( wxT("string"), wxDATAVIEW_CELL_EDITABLE );
wxDataViewColumn *thecolumnanwendungid = new wxDataViewColumn( wxT("anwendungid"), text_rendereranwendungid, column );
dataview_left->AppendColumn( thecolumnanwendungid );
column++;
wxDataViewTextRenderer *text_renderertyp = new wxDataViewTextRenderer( wxT("string"), wxDATAVIEW_CELL_EDITABLE );
wxDataViewColumn *thecolumntyp = new wxDataViewColumn( wxT("typ"), text_renderertyp, column );
dataview_left->AppendColumn( thecolumntyp );
column++;
// layout dataview controls.
wxBoxSizer *sizer = new wxBoxSizer( wxHORIZONTAL );
sizer->Add( dataview_left, 3, wxGROW );
panel->SetSizer( sizer );
sizer->Fit(this);
}