multiplatformos fejlesztés wxwidgets-szel

 ( doc | 2006. július 28., péntek - 19:53 )

nekiálltam vindóz alatt wxdev-cpp-vel egy wxwidgets-es alkalmazás fejlesztésének
szépen megy is minden, de szeretném Linux alatt is lefordítani. hogy álljak neki?
fogtam a Kdevelopot, új wxwidgets project, belapátoltam a file-okat, de a make elhasal...
hogy kéne ezt csinálni?

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

ehem. Azt nemtom, hogy hogyan kell IDE-vel csináltatni Makefile-t, viszont kézzel nagyon egyszerű. Pld. a forráskód könyvtárába csinálsz egy file-t, ügyelsz arra, hogy tabbal történjen az indentálás (ahol írtam hogy tab, ott 1 tab legyen a szöveg és a sor eleje között, csak itt hupon nemtom hogy kell ezt beszúrni):

CXX = $(shell wx-config --cxx)
 
PROGRAM = wxProgram
 
OBJECTS = main.o MainFrame.o
 
# implementation
 
.SUFFIXES:      .o .cpp
 
.cpp.o :
 tab $(CXX) -c `wx-config --cxxflags` -o $@ $<
 
all:    $(PROGRAM)
 
$(PROGRAM):     $(OBJECTS)
 tab $(CXX) -o $(PROGRAM) $(OBJECTS) `wx-config --libs`
 
clean:
 tab rm -f *.o $(PROGRAM)

Na ez egy alap verzió, de ezt aztán lehet módosítgatni. Beírod shell-be hogy make, aztán már fordul is a cucc.
Természetesen a PROGRAM és az OBJECTS változóknak a projekted szerint adj értéket.

köszi a gyors választ!
Makefile van (bár nem kézzel csináltam, hanem az automake :D)
bár kipróbálom, hátha tényleg ez a baj,de inkább másra gyanaXom

a hibaüzi eleje a következő:

lapper.cpp:23: error: `lapperFrame' has not been declared
lapper.cpp:23: error: non-member function `const wxEventTable* GetEventTable()' cannot have `const' method qualifier
lapper.cpp: In function `const wxEventTable* GetEventTable()':
lapper.cpp:23: error: `lapperFrame' has not been declared
lapper.cpp:23: error: `sm_eventTable' was not declared in this scope
lapper.cpp:23: warning: unused variable 'sm_eventTable'
lapper.cpp: At global scope:
lapper.cpp:23: error: `lapperFrame' has not been declared
/usr/local/include/wx/frame.h:222: error: `const wxEventTable wxFrameBase::sm_eventTable' is protected
lapper.cpp:23: error: within this context
lapper.cpp:23: error: `lapperFrame' has not been declared
lapper.cpp:23: error: `sm_eventTableEntries' was not declared in this scope
lapper.cpp:23: error: `lapperFrame' has not been declared
lapper.cpp:24: error: `Menu_File_Quit' was not declared in this scope
lapper.cpp:24: error: `lapperFrame' has not been declared
lapper.cpp:24: error: `OnQuit' was not declared in this scope
lapper.cpp:25: error: `Menu_File_About' was not declared in this scope
lapper.cpp:25: error: `lapperFrame' has not been declared
lapper.cpp:25: error: `OnAbout' was not declared in this scope
lapper.cpp: In function `wxApp* wxCreateApp()':

a szóban forgó file tartalma (az elejéről a megjegyzéseket kitöröltem, a 23. sor a BEGIN_EVENT_TABLE-s):

#include
#include "lapper.h"

BEGIN_EVENT_TABLE( lapperFrame, wxFrame )
EVT_MENU( Menu_File_Quit, lapperFrame::OnQuit )
EVT_MENU( Menu_File_About, lapperFrame::OnAbout )
END_EVENT_TABLE()

IMPLEMENT_APP(lapperapp)

bool
lapperapp::OnInit()
{
lapperFrame *frame = new lapperFrame( wxT( "Hello World" ), wxPoint(50,50), wxSize(450,340) );

frame->Show(TRUE);
SetTopWindow(frame);
return TRUE;
}

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

menuFile->Append( Menu_File_About, wxT( "&About..." ) );
menuFile->AppendSeparator();
menuFile->Append( Menu_File_Quit, wxT( "E&xit" ) );

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

SetMenuBar( menuBar );

CreateStatusBar();
SetStatusText( wxT( "Welcome to Kdevelop wxWidgets app!" ) );
}

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

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

sajna ennyire nem vagyok benne, többet használtam pythonnal, mint c++-szal. De ha bezippelve elküldesz egy részletet, amit nem tudsz lefordítani, azt megnézhetem. lajos.uti@freepop.hu

ez :
"
#include
#include "lapper.h"
"

így van az eredeti forrásfájlban is ?

mivel a fordító szinte minden 2-ik sora arra panaszkodik, hogy nincs 'lapperFrame', ezért kellene a "lapper.h"-is probléma megoldásához, nem csak a lapper.cpp.

nem, ott volt egy csak gondolom a fórummotor leszedte, azt hitte html tag :)
viszont azt hiszem, nyomon vagyok. kicsit beletúrtam a kdevelopba.
a wxDev-Cpp a következő file-okat tette a projectbe:
lapperApp.cpp
lapperFrm.cpp

viszont a KDevelopban egyedül a saját maga által kreált lapper.cpp szerepel. hogy tudom neki megmondani hogy nekem nem kell a lapper.cpp, kell viszont a lapperApp.cpp és a lapperFrm.cpp?
nézegettem a project beállításokat, a filecsoportokat, de sehol nem találtam ilyen lehetőséget (pedig tuti ott van, csak én vagyok nagyon béna :D)

MOD: megvan, a megoldás a Makefile.am :)
most már egész szépen állok, frissítek egy új wxwidgets-re oszt' hátha...

SIKERÜLT!!!!

na ekkora sikerélményem sem mostanában volt :D

köszi mindenkinek a segítő szándékot

a gond már csak az, hogy fagy... vindózon tökéletesen műXik, de itt nem megy :(
na átnézem a kódot, hátha... :D:D

na megvan a gond: a véletlenszámgenerátor nem megy
a rand() mindig 0-t ad vissza, ez mitől lehet?
az elején van egy srand(time(NULL)), vindóz alatt megy is tökéletesen

hali
esetleg:
time_t tm;
srand(time(&tm));
/* bocs az esetleges helyesirasi hidakert */

úgy tűnik, mégsem ez a gond
valamiért meg voltam győződve róla hogy a rand() [0;1[ intervallumban adja a számokat, erre kiderült hogy int a visszatérési érték...
ez csak azért furcsa, mert az előbbi logika alapján számolva vindóz alatt tökéletes az eredmény...
lehet hogy a fordító olyan kódot generál ahol vmi túlcsordulás miatt pont működik? vagy vindóz alatt tényleg [0;1[ -et ad vissza? na amint egy vindóz közelébe kerülök kipróbálom :)

MÁS:

keresztplatformos fejlesztésről lévén szó, jó lenne ha windows és Linux alatt egyaránt tudnék file-okat menteni. perpill. ebben az akadályoz, hogy Linux alatt '/' , vind alatt meg '\' a könyvtárelválasztó.
hogy lehetne vagy lekérdezni fordítási időben hogy milyen opr. alatt vagyok, vagy más módon eldönteni hogy mi kell nekem? van egy-két vad ötletem, de ha van rá szabályos megoldás, akkor inkább használnám azt...

pl.
#ifdef windoz
sep = '\\';
#endif
#ifdef linux
sep = '/';
#endif

mikor pedig forditasz a forditonak(gcc) atadod a megfelelo makrot a -D segitsegevel
/* bocs az esetleges helyesirasi hidakert */

ilyesmire gondoltam köszi, csak a -D-re nem jöttem rá :)
ennek mindjárt utánanézek, köszi a választ!

amúgy megoldottam a dolgot úgy, hogy simán "/"-t használok, ez vindóz alatt is műXik :)

Pont írni akartam, hogy ezt a problémát szerintem már megoldották helyetted...

"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee."
-- Ted Ts'o

két új kérdés:
1. hogy tudom a parancssori paramétereket kezelni? itt ugye nincs main amiben az argc és argv változókat tudom kezelni...

2. hogy csináljak helpet, hogy az mindkét oprendszeren működjön?

2. Én ezeket az osztályokat nézném meg alaposabban:

wxHelpController
wxHelpControllerHelpProvider
wxHelpEvent
wxHelpProvider

KisKresz

köszi mindkét segítséget!

ez a commandline kezelés nekem kicsit vad (meg sokkal többet is tud, mint nekem kell), azért megpróbálom kihámozni belőle a lényeget
nekem igazából csak az kellene, hogy egy változóba valahogy bele tudjam rakni az első parancssori paramétert (ami egy filenév elérési úttal) (mindenféle '-' ellenőrzés meg egyebek nélkül...)

egész szépen haladok :)
viszont újabb probléma merült fel, ha valaki tud léCCi segítsen
szeretném egy wxTextCtrl-ben lekezelni a duplaklikket.
próbáltam a wxFrame-re beállítani, de meg sem hívódik a function, hiába klikkelgetek jobbra-balra
hogy kellene ezt megoldani?

a helpet én is megnéztem, erre írtam hogy megcsináltam ahogy szerintem jó de nem hívja meg

az event table-ben szerepel a EVT_LEFT_DCLICK(lapperFrm::DoubleClick) sor,
mégsem kerül rá soha a vezérlés a DoubleClick függvényre...

Azt hiszem az okozza a gondot, hogy a duplaklikk eseményt (és az egér eseményeket általában) csak ott tudod elkapni ahol kiváltódtak, tehát a textCtrl-ben.
Tehát azt az EVT_LEFT_DCLICK nem a Frame event table-jében kéne legyen, mert így elvileg azokat a duplakattintásokat kepod el amik a frame-en történtek. Nyilván ha leraktál egy Panel-t vagy valamit, akkor azokat amiket oda nyomsz megint nem kapod el...

A megoldás tehát az, hogy a saját TextCTRL osztályodban kapod el a duplakattot, majd továbbküldöd mint wxCommandEventet:


wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED, GetId());
event.SetEventObject(this);
GetEventHandler()->ProcessEvent(event);				

Sajnos DCLICKED esemény nincs, és ez egyébként sem button de teljesen mindegy milyen eseményt dobsz, csak arra kell, hogy el tudd kapni...

Ezt meg normálisan el tudod kapni EVT_BUTTON( id, lapperFrm::DoubleClick)-el, ahol az id értelemszerűen a TextCtrl id-je.

Ez talán kicsit gányolás, hogy nem DCLICKED eseményt dobtunk, mert mi van, ha a kattintást is kezelni akarod, megteheted hogy egy új EVT_COMMAND_TEXTCTLR_DCLICK eseményt definiálsz magadnak, hogy hogyan az benne van a fentebb linkelt leírásban.

"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee."
-- Ted Ts'o

na mégegy gond (azért nemt'om figyelitek-e, egyre 'komolyabb' problémáim vannak, a végén még megtanulok programozni :D)
szóval a programom egy csomó szövegfile-t kezel (wxTextFile)
ezeket szeretném egy zip-be csomagolva kezelni. van is ugye erre egy wxFileSystem nevű találmány, de nem sikerült rájönnöm, hogy tudok megnyitni belőle wxTextFile-ként valamit. amit találtam az annyi hogy stream-ként tudom kezelni. ugye meg lehet ezt oldani, mert stream-ekkel nem akarok buveszkedni, meg megegyszer megirni a komplett wxTextFile-t csak hogy zipfs-bol is menjen...

El kell, hogy szomorítsalak, de a To-Do listben az van, hogy:
"Integrate wxFileSystem with wxWidgets (currently only wxHtml uses it)."
Gondolom ez egyértelmű...

Egyébként semmi extra nincs a wxTextFile-ban, annyit csinál, hogy beolvassa a teljes file-t egy wxArrayString-be.

Szerintem 10 sorból megvagy. :)

"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee."
-- Ted Ts'o

aha, köszi végül is így belegondolva nem mondasz hülyeséget :D

Nekem a wxdev-cpp-vel kapcsolatban lenne kérdésem, ha valaki használja! (esetleg codeblocks alatt ugyanaz)
Hogyan lehet az IDE elemkészletét bővíteni további wxWidgets komponensekkel úgy, hogy azok megjelenjenek a "from designer" ablaknál?