wxWidgets widgetek mozgatása

 ( termih | 2011. július 19., kedd - 13:15 )

Szeretném egérrel húzni, vonni a ComboBox-okat, esetleg TextCtrl-eket futási időben. A wxWindow osztályból örökölt Move() metódustól elszáll a program. De ha csak megpróbálom lekérdezni GetPostion() metódussal az elem pozícióját a program szintén elszáll.

Szeretem a méretezőkkel (sizer) való munkát de most pont nem ilyet szeretnék. "Googleban" egyszer találkoztam ilyen kérdéssel, arra pont a Move() metódust ajánlották. Valakinek tapasztalat, ötlet, irány, bármi?

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ő.

szerintem nem hoztad még létre a controlt. Create() volt?

Csak az ablakon (frame) van ilyen Create()

Create(parent, id, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_STYLE, _T("id"));

Ilyen kellene a TextCtrl1-re is példának okáért? Az alábbiakhoz hasonlóan?


TextCtrl1->Create(parent, ID_TEXTCTRL1, wxEmptyString);
TextCtrl1->Connect(wxEVT_LEFT_DOWN,wxMouseEventHandler(gregistryFrame::OnLeftDown));
TextCtrl1->Connect(wxEVT_MOTION,wxMouseEventHandler(gregistryFrame::OnMotion));

Mint itt az első sor? Persze azt most csak három paraméterrel írtam.

Micsának köszönöm a választ!

Végül rájöttem mi a gond. A Connect() metódus hívásával volt gond. Amikor a konstruktorban eseményt rendeltem például a ComboBox1-hez:

ComboBox1->Connect(wxEVT_LEFT_DOWN,wxMouseEventHandler(gregistryFrame::OnLeftDown), NULL, this);

nem adtam meg az utolsó paramétert (ami megmondja melyik objektum hívhatja a függvényt), esetünkben a "this". Ha az nincs megadva, akkor működik gond nélkül, ha az esemény hatására, például csak egy üzenetablakot akarok feldobni, de ha mozgatni akarok egy objektumot a Move() metódussal, akkor kifagy a program. Érdekesség hogy ha NULL-t állítok be a this helyett, akkoris kifagy, pedig a dokumentáció szerint, ha NULL értékre állítom, akkor a this-t használja. Tehát ezt a this-t mindenképpen meg kell adni.

És működik!

Ui: A Create() amit Micsa írt, úgy látom akkor kell csak, ha egy komponenst úgy hozunk létre, hogy a konstruktorában nem adtunk meg paramétert.

"dokumentáció szerint, ha NULL értékre állítom, akkor a this-t használja."
Szerintem nem ugyanarrol a this-rol van szo. C++ -nal, ha jol emlekszem, a this az instance-local variable, vagyis mindenki magarol allitja, hogy o a this. Ez esetben az adott control lesz a this.

Inkabb ugy lenne ez helyes - ha mar - hogy az objektum a parent erteket hasznalja, amennyiben ez ertelmezett (az objektum osszerendelesek kolcsonosen tudnak egymasrol).

Amire viszont erdemes figyelni, hogy a parent objektum az a controlt tartalmazo container lesz, nem pedig a te appod. Ez alol akkor van kivetel, ha az appod parentje egy container - adott esetben eppen egy window.

Mit akarok ezzel mondani... nem biztos, hogy szegeny controller tudja, hogy te az appodra gondoltal ugy, mint this.
--
Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant. | Gentoo Portal

Érdekesség hogy ha NULL-t állítok be a this helyett, akkoris kifagy, pedig a dokumentáció szerint, ha NULL értékre állítom, akkor a this-t használja.

Én nem ismerem ezt a dokumentációt, de az halálbiztos, hogy a Combobox1->Connect nem tudja kitalálni, hogy ahonnan meghívtad, ott mi volt a this értéke. A Combobox1->Connect-ben is van ugyan this, de ott annak az értéke a Combobox1 lesz, nem pedig az, mint ami a hívónál volt. Tehát nem hihető az a dokumentáció, amely szerint a NULL helyett a this-t fogja használni...