wxWidgets C++; Waar kan ik mijn String definen?

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Sando
  • Registratie: Januari 2007
  • Niet online

Sando

Sandoichi

Topicstarter
Jeetje, ik maakte toen ik ~10 was wel eens consoleprogrammaatjes in C of C++, ik weet niet meer welke. Nu probeer ik het 15 jaar later weer eens op te pikken een stapje verder met een GUI, zou ik toch moeten kunnen, maar ik zou zweren dat ik het opeens 100 keer moeilijker vind. :P Is dat nou het resultaat van biertjes in mijn studententijd? :')

Consoleprogrammaatjes lukt nog steeds wel, maar als ik wxWidgets wil gebruiken om een mooi venstertje te krijgen dan kan ik het simpelste probleem niet meer debuggen.

Ik pak het standaard helloworld.cpp voorbeeld van WxWidgets. Doet het prima. Maar als ik de Hello World string door een stringvariabele wil vervangen krijg ik het maar niet gecompileerd.

hworld.cpp zit in de documentatie, kan geen direct linkje vinden dus ik zal even heel irritant de hele code hier neerzetten, maar de enige regels van mij zijn: 6, 7, 20, 43, (44)

Ik gebruik toevallig linux, maar het zou niets uit hoeven maken als jij windows gebruikt.
$ g++ hworld.cpp `wx-config --cxxflags --libs`
hworld.cpp:43: error: 'szString was not declared in this scope'
hworld.cpp:44: error: 'LszString was not declared in this scope'
(nee geen typo, _() zet dat ervoor ofzo).

Dit is niet een meteen-naar-GoT situatie. Ik heb regel 20 en 43 werkelijk overal neergezet. Ik heb er zelfs allemaal andere programma's bijgehaald, maar de hele grote programma's zijn te groot voor mij om te analyseren. Ik heb het echt geprobeert, ik durf het bijna niet te zeggen maar ik ben er gewoon al de hele dag mee bezig.

Kan iemand mij vertellen waarom ik het fout doe en hoe het wel moet? Alsjeblieft? O+

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
/*
 * hworld.cpp
 */

#include "wx/wx.h" 
#include <string>
using namespace std;

class MyApp: public wxApp
{
    virtual bool OnInit();
};

class MyFrame: public wxFrame
{
public:

    MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size);
    
    string szString;

    void OnQuit(wxCommandEvent& event);
    void OnAbout(wxCommandEvent& event);

    DECLARE_EVENT_TABLE()
};

enum
{
    ID_Quit = 1,
    ID_About,
};

BEGIN_EVENT_TABLE(MyFrame, wxFrame)
    EVT_MENU(ID_Quit, MyFrame::OnQuit)
    EVT_MENU(ID_About, MyFrame::OnAbout)
END_EVENT_TABLE()

IMPLEMENT_APP(MyApp)

bool MyApp::OnInit()
{
    szString = "Hello World";
    MyFrame *frame = new MyFrame( _(szString), wxPoint(50, 50),
                                  wxSize(450,340) );
    frame->Show(true);
    SetTopWindow(frame);
    return true;
} 

MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size)
: wxFrame( NULL, -1, title, pos, size )
{
    wxMenu *menuFile = new wxMenu;

    menuFile->Append( ID_About, _("&About...") );
    menuFile->AppendSeparator();
    menuFile->Append( ID_Quit, _("E&xit") );

    wxMenuBar *menuBar = new wxMenuBar;
    menuBar->Append( menuFile, _("&File") );

    SetMenuBar( menuBar );

    CreateStatusBar();
    SetStatusText( _("Welcome to wxWidgets!") );
}

void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
{
    Close(TRUE);
}

void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event))
{
    wxMessageBox( _("This is a wxWidgets Hello world sample"),
                  _("About Hello World"),
                  wxOK | wxICON_INFORMATION, this);
}

🇪🇺 Buy from EU (GoT)


Acties:
  • 0 Henk 'm!

  • w.l
  • Registratie: Mei 2007
  • Laatst online: 31-05 23:40

w.l

Zo moeilijk is het niet hoor ...

Je gebruikt 'szString' in MyApp::OnInit() alsof het een data member is van MyApp, maar het is een data member van MyFrame.

Acties:
  • 0 Henk 'm!

  • Sando
  • Registratie: Januari 2007
  • Niet online

Sando

Sandoichi

Topicstarter
Dit is slechts een iteratie, ik krijg de zelfde fout als ik de factor van 'szString' in de root zet (of hoe noem je dat, buiten de klassen), en ik probeer te zorgen dat die variabele overal te gebruiken is. Global zeg maar.

Ik ben ongetwijfeld in de war maar dat kon toch altijd gewoon? Het lijkt wel alsof WxWidgets de regels verandert maar het heeft ws met mijn nooberigheid te maken.

🇪🇺 Buy from EU (GoT)


Acties:
  • 0 Henk 'm!

  • w.l
  • Registratie: Mei 2007
  • Laatst online: 31-05 23:40

w.l

Probeer eens szString in de class MyApp te zetten. Dan zou het moeten werken.

Lost dit iets op ?

C++:
1
2
3
 
    MyFrame *frame = new MyFrame( _(szString.data()), wxPoint(50, 50),
                                  wxSize(450,340) );

[ Voor 52% gewijzigd door w.l op 15-05-2010 18:52 ]


Acties:
  • 0 Henk 'm!

  • Comp_Lex
  • Registratie: Juni 2005
  • Laatst online: 11:56
Dit probleem heeft niks met wxWidgets te maken. Je probeert een variabele te gebruiken in een class waar het niet gedefinieerd is. Dit is een zeer basic probleem dat je even met 1 google had kunnen oplossen. Je moet je programming skills opvijzelen.

Acties:
  • 0 Henk 'm!

  • Sando
  • Registratie: Januari 2007
  • Niet online

Sando

Sandoichi

Topicstarter
w.l schreef op zaterdag 15 mei 2010 @ 18:42:
Probeer eens szString in de class MyApp te zetten. Dan zou het moeten werken.

Lost dit iets op ?

C++:
1
2
3
 
    MyFrame *frame = new MyFrame( _(szString.data()), wxPoint(50, 50),
                                  wxSize(450,340) );
Ik heb string szTitle; in MyApp gezet, en daarna in de root, en daarna gewoon overal. En toch krijg ik steeds: error: 'LszString was not declared in this scope' ook met jouw tip .data().
Moet ik mijn declaratie anders formuleren ofzo?

code:
1
2
3
4
class MyApp: public wxApp {
    string szString;
    virtual bool OnInit();
};
code:
1
2
3
4
    szString = "Hello World";
    
    MyFrame *frame = new MyFrame(
        _(szString.data()),


En toch heb ik die factordefinitie zo letterlijk uit C++ For Dummies gekopieerd. :P
Comp_Lex schreef op zaterdag 15 mei 2010 @ 18:50:
Dit probleem heeft niks met wxWidgets te maken. Je probeert een variabele te gebruiken in een class waar het niet gedefinieerd is. Dit is een zeer basic probleem dat je even met 1 google had kunnen oplossen. Je moet je programming skills opvijzelen.
Flauw. Ik kan moeilijk nog basic'er dan dit beginnen om de boel op te vijzelen. Doe maar niet offtopic oordelen hier. Tenzij je je uitspraken kracht bijzet met 1 google die me uit de brand helpt.
-edit-
Zou wel stoer zijn als je 1 regel code in OP aanpast waardoor het gewoon werkt. Ik ben namelijk al tig googles verder zonder causale verbetering in mijn situatie.

[ Voor 5% gewijzigd door Sando op 15-05-2010 22:07 ]

🇪🇺 Buy from EU (GoT)


Acties:
  • 0 Henk 'm!

  • - peter -
  • Registratie: September 2002
  • Laatst online: 09-09 20:00
code:
1
2
3
4
5
6
7
8
9
bool MyApp::OnInit()
{
    string szString = "Hello World";
    MyFrame *frame = new MyFrame( _(szString), wxPoint(50, 50),
                                  wxSize(450,340) );
    frame->Show(true);
    SetTopWindow(frame);
    return true;
}

Doet ie het ook niet als je de string in de OnInit definieert?

Acties:
  • 0 Henk 'm!

  • Sando
  • Registratie: Januari 2007
  • Niet online

Sando

Sandoichi

Topicstarter
Nee, gek he?
Zo gek toch niet dat het lijkt alsof wxWidgets de regels verandert?
-edit-
Ik heb gewoon
code:
1
2
#include <string>
using namespace std;

en de string declaratie zelf geeft ook geen foutmelding.

-edit-

Wacht eens, toch maar naar die foute L in de errors gekeken, blijkt dat _() door wxWidgets een L in de functie geplaatst krijgt. Blijkbaar loopt ie intern te klooien om iets te doen. Gevolg, er kan echt alleen iets tussen aanhalingstekens in.

Ik kan niet de string van te voren definieren en zonder _() in new MyFrame zetten omdat ik dan een hele pagina aan foutmeldingen krijg.

Is het dan niet mogelijk om ergens een Hello World te declareren die aan alle functies en classes door te geven is? Zodat bij wijze van spreken maar 1 var in Hello Mars hoeft te veranderen om mijn hele app te updaten?

[ Voor 106% gewijzigd door Sando op 15-05-2010 22:38 ]

🇪🇺 Buy from EU (GoT)


Acties:
  • 0 Henk 'm!

  • Devil
  • Registratie: Oktober 2001
  • Niet online

Devil

King of morons

Als ik het zo zie dan verwacht hij een object met type const wxString&, terwijl je hem als 'string' declared. Wat voor foutmelding krijg je precies met de code van - peter -?

After all, we are nothing more or less than what we choose to reveal.


Acties:
  • 0 Henk 'm!

  • Sando
  • Registratie: Januari 2007
  • Niet online

Sando

Sandoichi

Topicstarter
Puur hopeloos geklooi

code:
1
2
3
4
5
6
7
8
9
bool MyApp::OnInit()
{
    wxString szString = _("Hello World");
    MyFrame *frame = new MyFrame( szString, wxPoint(50, 50),
                                  wxSize(450,340) );
    frame->Show(true);
    SetTopWindow(frame);
    return true;
}

werkt wel. :')

Ik snap absoluut niet de logica van die functie om een string unicode te maken als je niet eens een variabele naar die functie kan pasen :?

🇪🇺 Buy from EU (GoT)


Acties:
  • 0 Henk 'm!

  • Devil
  • Registratie: Oktober 2001
  • Niet online

Devil

King of morons

Je kunt in je MyApp object zoveel variabelen declaren als je wilt en dan kun je naar hartelust 'passen'.

Ik zou even een stuk lezen over C++ namespace. Een bepaalde declaratie is alleen geldig binnen zijn namespace.

[ Voor 35% gewijzigd door Devil op 15-05-2010 22:53 ]

After all, we are nothing more or less than what we choose to reveal.


Acties:
  • 0 Henk 'm!

  • Sebazzz
  • Registratie: September 2006
  • Laatst online: 16-09 15:42

Sebazzz

3dp

Sando schreef op zaterdag 15 mei 2010 @ 22:29:
Nee, gek he?
Zo gek toch niet dat het lijkt alsof wxWidgets de regels verandert?
Klopt, dat doet wxWidgets. De _() is geen functie, maar een preprocessor macro.

[Te koop: 3D printers] [Website] Agile tools: [Return: retrospectives] [Pokertime: planning poker]


Acties:
  • 0 Henk 'm!

  • Sando
  • Registratie: Januari 2007
  • Niet online

Sando

Sandoichi

Topicstarter
@ Sebazzz
Ahh, dus toch die wx. Ik ging er zomaar vanuit dat het een wxWidgets functie was omdat ik dacht dat macro's niet inline konden, maar alleen op hun eigen regel, meestal zonder puntkomma zoals DECLARE_EVENT_TABLE(). Maar dat het een macro is verklaart een hoop.
Vertel dat ook even aan Lex ;)

@ Devil
Ja dat dacht ik ook, maar omdat dit niet werkte dacht ik dat het niet klopte en snapte ik het niet meer.

Gek dat ik met Qt prima uit de voeten kan en dan met wxWidgets, wat velen als veel simpeler bestempelen, vast loop op de eerste meest simpele poging tot iets.

Blij dat ik het weer snap.

🇪🇺 Buy from EU (GoT)


Acties:
  • 0 Henk 'm!

  • Comp_Lex
  • Registratie: Juni 2005
  • Laatst online: 11:56
Nou, je had eerst zeker wel een ander probleem voordat je op het "_()" probleem stuitte. Je instantieerde je string echt wel in een andere class. En hier is mijn eerste hit met Google: http://wiki.wxwidgets.org/WxWidgets_Source_Oddities

Acties:
  • 0 Henk 'm!

  • Sando
  • Registratie: Januari 2007
  • Niet online

Sando

Sandoichi

Topicstarter
Nee ik denk dat je de OP niet zo goed gelezen had.
Sando schreef op zaterdag 15 mei 2010 @ 17:27:
Dit is niet een meteen-naar-GoT situatie. Ik heb regel 20 en 43 werkelijk overal neergezet.
Ik had het allemaal geprobeert dus, en mijn initiële idee dat wxWidgets ermee te maken had was dus wel juist. Informatie op de link van jou had ik al in de wx documentatie gelezen, er staat inderdaad:
Intent: Unicode support.
dus dat klopt ook. Het enige probleem was dat ik niet doorhat dat het een macro ipv functie was die dus geen variabelen accepteert. Simpel verschil, groot ik-begrip-het-niet-verhaal van mijn kant.

Daarom wordt ik aptijd een beetje :') van niet-helpen-wel-oordelen posts die vaak aan elkaar worden uitgedeeld hier op GoT. Maar alsnog bedankt voor de link. :)

🇪🇺 Buy from EU (GoT)

Pagina: 1