Srodne teme
Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Pointer na CDilalog (MFC)

[es] :: C/C++ programiranje :: Pointer na CDilalog (MFC)

[ Pregleda: 2347 | Odgovora: 13 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Iznogud
Subotica

Član broj: 1721
Poruke: 209
*.vdial.verat.net



Profil

icon Pointer na CDilalog (MFC)30.10.2003. u 13:41

Poceh od skora da se bavim MSVC++ pa imam jedan problemcic(verujem trivialan za iskusnije).
Naime, da li je moguce dobiti pokazivac na na odredjen dialog prozor ako znam njegov ID?
Definisao sam jednu posebnu klasu cije varijable trebam popuniti sa vrednostima koje se nalze na/u kontrolama na samo dialogu (koji je, jel, posebna klasa);
Preturao sam po MSDN ali nisam se bas najbolje snasao tamo, tj nema ni jedne funkcije za pristup dialogu na osnovu njegovog ID. Mozda neko bolje resenje???


30.10.2003. u 13:41 

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
199.171.112.*



Profil

icon Re: Pointer na CDilalog (MFC)30.10.2003. u 15:58
Imaš konstruktor za CDialog čiji je parametar resource ID, ako sam dobro razumeo šta hoćeš.


30.10.2003. u 15:58 

sspasic
Sasa Spasic

Član broj: 3261
Poruke: 175
212.200.96.*

Jabber: sspasic@elitesecurity.org
ICQ: 35454521


Profil

icon Re: Pointer na CDilalog (MFC)30.10.2003. u 22:59
Laptopovi

Mislim da ne postoji jednostavan nacin, ako postoji uopste.
Uglavnom zato sto je pokazivac na CDialog u stvari pokazivac na instancu objekta CDialog klase, a takvih za jedan resource ID moze da bude vise. Cak i vise klasa (CDialog1, CDialog2...).

Ako uopste postoji nacin, to je da se setas kroz listu SVIH prozora i da pokusas da saznas koji je od njih dijalog sa datim resource ID-om. Sve u svemu, malo verovatno da ti se isplati i ako je moguce.

Mnogo ti je jednostavnije da, cim kreiras objekat, sacuvas negde pokazivac na njega.
30.10.2003. u 22:59 

yooyo
Centroid / Technical director

Član broj: 4891
Poruke: 1101
*.sbb.co.yu



Profil

icon Re: Pointer na CDilalog (MFC)31.10.2003. u 00:42
Nisam bas najbolje razumeo sta zelis da izvedes... Probaj ovako..

1. Recimo da imas klasu CPodaci i imas negde primerak te klase:
CPodaci podaci;

2. Napravi klasu CPodaciDlg i u private deo smesti
CPodaci* m_pPodaci;

3. Modifiuj konstruktor CPodaciDlg:
u .h:
CPodaciDlg(CPodaci*p, CWnd* pParent =NULL)

i u .cpp:
CPodaciDlg::CPodaciDlg(CPodaci*p, CWnd* pParent /*=NULL*/): CDialog(CPodaciDlg::IDD, pParent)
{
m_pPodaci = p;
}

4. Isprogramiraj dialog. Sada iz metoda dialoga mozes da pristupas
public metodama i varijablama u prosledjenom primerku klase CPodaci
tj. m_pPodaci...

5. U CPodaciDlg::OnInitDialog metodi, popuni stanje kontrola vrednostima iz m_pPodaci.

Kada pravis instancu CPodaciDlg to uradi na sledeci nacin:
// modalni dialog
CPodaciDlg pd(&podaci, this);
pd.DoModal();

ili

// nemodalni dialog
CPodaciDlg *m_pPodaciDlg;
...
m_pPodaciDlg = new CPodaciDlg(&podaci);
m_pPodaciDlg->Create(CPodaciDlg::IDD, NULL);


yooyo
31.10.2003. u 00:42 

Beban
Beograd

Član broj: 6351
Poruke: 39
*.ppp-bg.sezampro.yu



Profil

icon Re: Pointer na CDilalog (MFC)31.10.2003. u 01:23
Mislim da ti za taj problem ne treba pointer na dijalog; dijalog definiši kao member promjenljivu u heder fajlu tvoje View klase. Zatim ga pozoveš sa funkcijom DoModal(), pa pointere na njegove kontrole "pokupiš" sa funkcijom GetDlgItem, čiji je argument ID kontrole. Onda, kada imaš pointer na kontrolu, nije ti problem da pročitaš ono što je u njoj zapisano.

Ako je to ono što želiš...
31.10.2003. u 01:23 

Iznogud
Subotica

Član broj: 1721
Poruke: 209
*.163.EUnet.yu



Profil

icon Re: Pointer na CDilalog (MFC)05.11.2003. u 13:50
Bio sam odsutan, tako da do sad nisam imao mogucnost da probam ove vase predloge. Postupiosam onako kako je yooyo predlozio (stom razliko sto meni u stvari treba obrnuto. tj da u klasu podaci prenesem vrednosti sa dialoga.
Naime, uradio sam ovo:
Izmenio sam konstruktor dialog klase i on izgleda ovako:
Code:

CDlgNewMail::CDlgNewMail(CEmail* pem,CWnd* pParent /*=NULL*/)
    : CDialog(CDlgNewMail::IDD, pParent)

Instancu dialoga pravim sa:
Code:

    CEmail email;
    CDlgNewMail* NewMail = new CDlgNewMail(&email);
    NewMail->Create(CDlgNewMail::IDD,NULL);
    NewMail->ShowWindow(SW_SHOW);


Unutar klase CDlgNewMail postoji funkcija OnBsalji() unutar koje se poziva funkcija clanica klase CEmail- GetHeader() na sledeci nacin:
Code:

void CDlgNewMail::OnBsalji() 
{
    ......
    UpdateData(TRUE);
    this.m_pEmail->GetHeader();
}

Gde je m_pEmail clan klase CDlgNewMail definisam kao: CEmail* m_pemail.

Na mestu poziva ove funkcije program pada i ispisuje nesto kao:
"The instructions at "0x10217c15c referenced memory at "blablaxxx". The memory could not read".
Gde ja to gresim???


05.11.2003. u 13:50 

sspasic
Sasa Spasic

Član broj: 3261
Poruke: 175
*.medianis.net

Jabber: sspasic@elitesecurity.org
ICQ: 35454521


Profil

icon Re: Pointer na CDilalog (MFC)05.11.2003. u 14:13
Citat:
Iznogud:
Code:

    CEmail email;
    CDlgNewMail* NewMail = new CDlgNewMail(&email);
    NewMail->Create(CDlgNewMail::IDD,NULL);
    NewMail->ShowWindow(SW_SHOW);


Obrati paznju da ti je email promenljiva na steku, i ona biva unistena na kraju funkcije gde je ovaj kod. U CDlgNewMail::OnBsalji() pokazivac m_pEmail ukazuje na mesto gde se ranije nalazila email promenljva a sad je ko zna sta.

Problem ces da resis tako sto email alociras na heap-u (dakle sa new) a delete objekta radis iz CDlgNewMail destruktora (na primer).
05.11.2003. u 14:13 

Rapaic Rajko
Bgd

Član broj: 4105
Poruke: 462
*.pexim.co.yu



Profil

icon Re: Pointer na CDilalog (MFC)05.11.2003. u 14:21
Problem je kako kreiras CEmail...
Code:

CEmail email;

Ako se ne varam, pointer na ovu instancu prosledjujes konstruktoru tvog dijaloga. E, ali sta cemo sa GarbageColector-om (DragiTata ne voli ovaj naziv)? Sa gornjom deklaracijom, cim izadjes iz nekog scope-a (mislim na par zagrada { } ), GC ubije instancu CEmail-a, i onda tvoj dijalog ima pointer na mrtav objekat (to jest, na parce memorije koje je nekad bilo taj objekat).
Resenje je da zamenis gornju liniju sa
Code:

CEmail *email = new CEmail; // kreiranje na heap-u

i onda to prosledis konstruktoru tvog dijaloga. Ali, onda dijalog mora da preuzme na sebe i unistavanje istog.
Pozdrav

Rajko
05.11.2003. u 14:21 

mipko

Član broj: 11015
Poruke: 109
*.panet.co.yu



Profil

icon Re: Pointer na CDilalog (MFC)19.12.2003. u 11:08
u C++ ?!

Citat:
Rapaic Rajko:
E, ali sta cemo sa GarbageColector-om (DragiTata ne voli ovaj naziv)?

19.12.2003. u 11:08 

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
199.171.112.*



Profil

icon Re: Pointer na CDilalog (MFC)19.12.2003. u 16:02
Rajko stack naziva Garbage Colectorom.
19.12.2003. u 16:02 

mipko

Član broj: 11015
Poruke: 109
*.yubc.net



Profil

icon Re: Pointer na CDilalog (MFC)22.12.2003. u 09:03
Jel se on to samo ludo zeza ili... ?

Citat:
Dragi Tata:
Rajko stack naziva Garbage Colectorom.

22.12.2003. u 09:03 

Rapaic Rajko
Bgd

Član broj: 4105
Poruke: 462
80.93.225.*



Profil

icon Re: Pointer na CDilalog (MFC)25.12.2003. u 09:51
Ne, ne zezam se.
U klasicnom smislu (iz vremena DOS-a i struktuiranog programiranja), stack je memorija po kojoj se seta stack pointer (tako se bese zove) i nista vise. Znaci, kad kompajler oslobadja stack, jednostavno spusti SP za odredjeni broj bajtova, i to je sve.
Medjutim...u C++-u nije (samo) tako. Ili, jeste, ali osim spustanja SP-a (recimo, priliskom izlaska iz nekog scope-a), kompajler poziva i destructor-e svih objekata koji su se nalazili na stack-u iznad SP-a, a to, priznacete, predstavlja malo vecu funkcionalnost u odnosu na "klasican" stack. Pogotovo ako se u tim destructor-ima vrse dodatne akcije; na primer, unistavanje sopstvenih sub objekata koji su kreirani na heap-u, i ko bi ga znao sta jos. Prema tome, danasnji stack je vrlo, vrlo sofisticiran instrument.
Posto to mene neodoljivo podseca na GC, tako ga (ponekad) i nazovem.
Pozdrav

Rajko
25.12.2003. u 09:51 

Ivan Dimkovic
Ivan Dimkovic
Vice President - Product and Business
Development, Cinemo GmbH
EU

Administrator
Član broj: 13
Poruke: 13836
*.dip.t-dialin.net

Sajt: www.linkedin.com/in/ivand..


Profil

icon Re: Pointer na CDilalog (MFC)25.12.2003. u 10:05
Citat:

Posto to mene neodoljivo podseca na GC, tako ga (ponekad) i nazovem.


Ja bih ipak vise voleo da se ovde koristi "stack" - to sto u nekim aspektima C++ koriscenje stacka podseca na neki GC ga svakako ne cini GC-om :) Sve dok je moguce alocirati memoriju sa 'new' koja nece biti dealocirana automatski, to se nikako ne moze nazvati GC-om i mislim da pravi nepotrebnu konfuziju.


SpikeFun - Cortical Neural Network Simulator:
http://www.dimkovic.com/node/1
Demo Video: http://www.youtube.com/watch?v=CQXxzQDjXNc&hd=1
25.12.2003. u 10:05 

Rapaic Rajko
Bgd

Član broj: 4105
Poruke: 462
80.93.225.*



Profil

icon Re: Pointer na CDilalog (MFC)29.12.2003. u 13:18
Citat:
Ivan Dimkovic:
Ja bih ipak vise voleo da se ovde koristi "stack" - to sto u nekim aspektima C++ koriscenje stacka podseca na neki GC ga svakako ne cini GC-om :) Sve dok je moguce alocirati memoriju sa 'new' koja nece biti dealocirana automatski, to se nikako ne moze nazvati GC-om i mislim da pravi nepotrebnu konfuziju.


New...? Kakve veze "new" ima sa stack-om? Valjda ima veze sa heap-om...

Ali ajde bas, kad si ga pomenuo, da to udenem u kontekst cele price. Sve sto se alocira sa new (na heap-u, jasno), mora da se eksplicitno unisti sa delete. Ovo "eksplicitno" znaci svojerucnom akcijom programera; nema ko drugi to da uradi; i to je upravo razlika u odnosu na stack.
Na stack-u radi automatizam. Ako deklarisem u nekom scope-u u nekoj funkciji instancu klase, automatski sam je kreirao (default konstruktorom, recimo) NA STACK-u, i cim izadjem iz scope-a, instanca se automatski unistava, bez specijalnog koda za to.
Necu da gnjavim vise na ovu temu. Slazemo se da stvari rade upravo onako kako i rade, a kako cemo to nazivati - ma to je vec stvar ukusa.

Sto se mene tice, moj ukus je - apatinsko pivo i dobro crno vino, obzirom da nastupaju praznici, pa kad izbistrim utiske (i glavu), mozemo da nastavimo diskusiju...
Pozdrav

Rajko
29.12.2003. u 13:18 

[es] :: C/C++ programiranje :: Pointer na CDilalog (MFC)

[ Pregleda: 2347 | Odgovora: 13 ] > FB > Twit

Postavi temu Odgovori

Srodne teme
Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.