[VC++] Dialog based app

Pagina: 1
Acties:

  • TheGhostInc
  • Registratie: November 2000
  • Niet online
Ik heb een Dialog based applicatie in mekaar geklust, alleen blijft 1 ding gewoon continu niet werken. Heb het werkend gehad, maar nu weer niet.
Ik denk dus ook dat ik een denk fout maak.

Het volgende:

Ik heb een dialog, vandaar uit roep ik een nieuw dialog aan:
code:
1
2
MyDialog Instance(this);
Instance.DoModal();


Nu wil ik in het dialog waar ik deze code heb staan bij het afsluiten van het dialog dat net aangemaakt is een partijtje data hebben uit het dialog dat wordt afgesloten. Heb het geprobeerd gewoon met global variabelen, maar dat werkt niet goed.
Op welke manier kan ik dit doen?

  • whoami
  • Registratie: December 2000
  • Laatst online: 19:34
Globale variablen zijn niet zo mooi he.

Er zijn al verschillende zo'n topics langs geweest over communictie tussen verscheidene forms. In 1 ervan heb ik een methode gepost hoe ik het altijd doe, maar het is wel in C#:
[rml]whoami in "[ VB.NET] waardes van een andere form?"[/rml]

Maar goed, delegates enzo heb je niet in die vorm in VC++, maar ik geloof wel dat je dat met function pointers kunt oplossen.

Of, je kunt het zo doen:
code:
1
2
3
4
MyDialog* Instance;
Instance = new MyDialog(this);
Instance->DoModal();
int a = Instance->WaardeUitForm;

https://fgheysels.github.io/


  • ^Mo^
  • Registratie: Januari 2001
  • Laatst online: 04-11-2025
whoami schreef op 31 oktober 2002 @ 16:12:
Of, je kunt het zo doen:
code:
1
2
3
4
MyDialog* Instance;
Instance = new MyDialog(this);
Instance->DoModal();
int a = Instance->WaardeUitForm;
Het hoeft trouwens niet speciaal een pointer te zijn voor deze manier... het Instance object gaat niet uit z'n scope zodra DoModal() eindigt...

"There are 10 kinds of people in the world, those who understand binary and those who don't" | Werkbak specs


  • whoami
  • Registratie: December 2000
  • Laatst online: 19:34
_Mo_ schreef op 31 oktober 2002 @ 16:16:
[...]

Het hoeft trouwens niet speciaal een pointer te zijn voor deze manier... het Instance object gaat niet uit z'n scope zodra DoModal() eindigt...


Het is niet daarom dat ik het mbhv een pointer doe hoor.
Een form object is meestal een redelijk groot object, en grote objecten creeër je imho beter op de heap ipv op de stack.

https://fgheysels.github.io/


  • TheGhostInc
  • Registratie: November 2000
  • Niet online
Wanneer wordt de variabele dan precies uitgelezen, is dit als het object aan het afsluiten is, of ergens zodra windows tijd over heeft?

(Of is de compiler zo slim dan nog even de variabele te onthouden?)

  • whoami
  • Registratie: December 2000
  • Laatst online: 19:34
TheGhostInc schreef op 31 oktober 2002 @ 16:22:
Wanneer wordt de variabele dan precies uitgelezen, is dit als het object aan het afsluiten is, of ergens zodra windows tijd over heeft?

(Of is de compiler zo slim dan nog even de variabele te onthouden?)


Na de doModal(), en dat is dan als het scherm afgesloten wordt/is.

Je kunt op die manier ook nog checken op welke knop er gedrukt werd om het scherm af te sluiten, maar ik weet zo de VC++ code niet uit m'n hoodf om dat te doen.

code:
1
2
3
if( MyInstance->ModalResult == IDOK )
{
}

oid.

https://fgheysels.github.io/


  • ^Mo^
  • Registratie: Januari 2001
  • Laatst online: 04-11-2025
whoami schreef op 31 oktober 2002 @ 16:24:

[...]


Na de doModal(), en dat is dan als het scherm afgesloten wordt/is.

Je kunt op die manier ook nog checken op welke knop er gedrukt werd om het scherm af te sluiten, maar ik weet zo de VC++ code niet uit m'n hoodf om dat te doen.

code:
1
2
3
if( MyInstance->ModalResult == IDOK )
{
}

oid.
DoModal geeft deze waarde ook terug... voorbeeld:
C++:
1
2
3
4
5
6
7
8
if( MyInstance->DoModal() == IDOK)
{
    // ...
}
else
{
    // ...
}


Misschien is alloceren op de heap inderdaad wat beter voor grote objecten gezien het feit dat de heap over het algemeen groter is dan de stack ... eigenlijk nooit bij stil gestaan, 'k doe modal dialogs altijd op de stack :*)

"There are 10 kinds of people in the world, those who understand binary and those who don't" | Werkbak specs


  • whoami
  • Registratie: December 2000
  • Laatst online: 19:34
[nohtml]
_Mo_ schreef op 31 oktober 2002 @ 16:29:
[...]

DoModal geeft deze waarde ook terug... voorbeeld:
C++:
1
2
3
4
5
6
7
8
if( MyInstance->DoModal() == IDOK)
{
    // ...
}
else
{
    // ...
}
Nouja, ik had die ModalResult property ook maar genomen omdat ik die ken vanuit Delphi/C++ Builder. Ik weet dus niet of die in die bewoording ook bestaat in VC++ (MFC). :+

https://fgheysels.github.io/


Verwijderd

Na de doModal() functie bestaat het object gewoon nog. De dialog is alleen niet meer visible. Je kan dus gewoon nog bij de properties van dat ding.

Wat betreft stack <> heap : hoe meer op de stack hoe beter, aangezien zaken op de stack niet voor memory leaks kunnen zorgen. Als je toch iets op de heap wil doen, gebruik dan daarvoor een autopointer, zodat je je over deallocatie van het geheugen geen zorgen hoeft te maken...

edit:

Ik zie overigens dat je data uit je dialog wilt hebben. Zit die data in een textbox o.i.d.? Dan kan zoeken op DoDataExchange in de MSDN je helpen ;)

Data in een textbox uit een dialog resource moet je namelijk op de een of andere manier 'van het scherm' halen en in je code zien te krijgen. Daar is dus die DoDataExchange voor... Ik ga hier geen code voor posten, dat is mogelijkerwijs nogal veel en ik denk dat je er meer van leert door uit te zoeken hoe het werkt...

  • TheGhostInc
  • Registratie: November 2000
  • Niet online
Akhorahil: Dat gaat allemaal prima ;)

Het werkt nu alvast. Ik kan met een get functie de spullen uit het dialoogje halen.
Echter hou ik een eigenaardigheidje:

Ik heb een variabele global gedeclareerd, dat heb ik boven de eerste klasse gedaan, tis een struct, dan wordt het zoiets:
code:
1
MyStruct myStruct;

In de file waar ik hem nodig is vraag ik hem dan zo op:
code:
1
extern MyStruct myStruct;


Echter, kan ik dan die variabele wijzigen?
Want ongeacht wat ik erin zet, zodra dan een dialog afsluit en ik terug kom in een ander dialog, dan is de struct ineens ook leeg. Terwijl daarvoor keurig de waarde erin stond, en er ook uit is gelezen.
Ook als ik dan de struct probeer uit te lezen in het afgesloten dialog is die leeg.

Het lijkt er dus op dat er telkens een nieuwe struct wordt aangemaakt die de oude overschrijft oid.
Ik snap niet wat ik precies fout doe.

[ Voor 0% gewijzigd door TheGhostInc op 03-11-2002 13:42 . Reden: typo ]

Pagina: 1