Main class

Intrebari despre programarea cu VC++ incluzand mediul de dezvoltare, instalare, setari, debugger, compilator, linker si documentatie.
Post Reply
User avatar
Zanetti
Membru
Membru
Posts: 80
Joined: 20 Jul 2007, 08:57
Location: Tg.Mures

Main class

Post by Zanetti » 12 Apr 2008, 23:13

Orice proiect Dialog based are o clasa de baza, CProjectNameApp, care are o singura instanta pe toata durata de viata a programului si unde in functia InitInstance se instanteaza un obiect de tip CProjectNameDlg .

Care e scopul acestei clase, in afara de aspectele de mai sus? E recomandat sa ma folosesc de aceasta clasa, adica sa declar variabile membre si chiar functii??
De obicei, cand ma folosesc de aceasta clasa??

Exemple din aplicatiile voastre sunt binevenite, nu cod, doar explicatii gen: "aplicatia avea 3 clase... aveam nevoie de variabila/functia...pt asta m-am folosit de clasa CProjectNameApp...pt ca...".

Multumesc!


Ai fost facut DE Dumnezeu si PENTRU Dumnezeu - si pana vei intelege asta,viata ta nu va avea sens.

User avatar
Silviu Ardelean
Senior
Senior
Posts: 1175
Joined: 12 Jul 2007, 09:22
Judet: Timiş
Location: Timisoara
Contact:

Re: Main class

Post by Silviu Ardelean » 13 Apr 2008, 13:05

Dupa cum cred ca stii, metoda InitInstance() te ajuta sa initializezi / instantiezi diverse obiecte globale, obiecte pe care le potzi distruge pe metoda complementara, ExitInstance().
Intr-o astfel de metoda vei gasii implicit:

Code: Select all

InitCommonControls();
CWinApp::InitInstance();
AfxEnableControlContainer();
SetRegistryKey(_T("Local AppWizard-Generated Applications"));
MSDN-ul face descrierea acestor metode si nu voi intra in detalii.

Un exemplu, cerut de tine e si metoda SetRegistryKey(). Iti permite sa customizezi locatia din registrii in care potzi salva diverse setari ale aplicatiei. In acest caz locatia setarilor aplicatiei tale este:
  • \HKEY_CURRENT_USER\Software\Local AppWizard-Generated Applications\
Ulterior, din clasa dialog sau alte clase instantate vei putea salva in registrii setarile dorite.

Un alt exemplu ar fi situatia in care ai lucra cu API-ul de socket-uri. E clar ca pe durata de viata a aplicatiei va trebui sa ai initializat Winsock 2 DLL-ul in proces. Pentru asta folosim WSAStartup().
Daca tu ai mai multe clase ce lucreaza cu socket-uri atunci aceasta metoda e ceea mai indicata locatie sa initializezi socket-urile in proces.
De asemenea, in ExitInstance() vei elibera Winsock 2 DLL din proces: WSACleanup();.

Cu siguranta, exista si alte exemple... astea mi-au venit acum in minte. :geek:
O zi faina! ;)

Dragos Cojocari
Membru++
Membru++
Posts: 789
Joined: 11 Jul 2007, 14:11

Re: Main class

Post by Dragos Cojocari » 14 Apr 2008, 11:19

Clasa App nu ar trebui sa faca nimic mai mult decat ce e prevazut de framework: entry point, crearea ferestrei principale etc. Tot ceea ce tine de logica aplicatiei tale ar trebui tinut in layerul/pachetul de business.

User avatar
Silviu Ardelean
Senior
Senior
Posts: 1175
Joined: 12 Jul 2007, 09:22
Judet: Timiş
Location: Timisoara
Contact:

Re: Main class

Post by Silviu Ardelean » 14 Apr 2008, 12:18

Prin MSDN-ul gasim:
  • The standard InitInstance implementation created by the MFC Application Wizard performs the following tasks:
    * As its central action, creates the document templates that in turn create documents, views, and frame windows. For a description of this process, see Document Template Creation.
    * Loads standard file options from an .ini file or the Windows registry, including the names of the most recently used files.
    * Registers one or more document templates.
    * For an MDI application, creates a main frame window.
    * Processes the command line to open a document specified on the command line or to open a new, empty document.

    You can add your own initialization code or modify the code written by the wizard.
Eu zic ca acest entry point permite destule... :D

Dragos Cojocari
Membru++
Membru++
Posts: 789
Joined: 11 Jul 2007, 14:11

Re: Main class

Post by Dragos Cojocari » 14 Apr 2008, 13:16

Silviu Ardelean wrote:Eu zic ca acest entry point permite destule... :D
Pai permite dara. :D Cine vrea isi poate scrie tot codul aplicatiei acolo. :) Pina la urma intrebarea poate fi si "pot scrie codul aplicatiei in clasele de UI". Raspunsul e evident DA. Dar daca intrebarea e "e bine a scrie codul aplicatiei in clasele de UI" eu raspund cu NU.

User avatar
Silviu Ardelean
Senior
Senior
Posts: 1175
Joined: 12 Jul 2007, 09:22
Judet: Timiş
Location: Timisoara
Contact:

Re: Main class

Post by Silviu Ardelean » 14 Apr 2008, 14:03

Dragos Cojocari wrote:Pai permite dara. :D Cine vrea isi poate scrie tot codul aplicatiei acolo. :) Pina la urma intrebarea poate fi si "pot scrie codul aplicatiei in clasele de UI". Raspunsul e evident DA. Dar daca intrebarea e "e bine a scrie codul aplicatiei in clasele de UI" eu raspund cu NU.
Evident, ca ar fi hara-kiri (sau cum s-o scrie) sa scrii cod airea acolo. Dar nici sa propagam ideea "don't touch this, ever!".
Exemplele mele de mai sus vin in sustinerea ideii cand te poti atinge de aceasta metoda UI.
Cred ca astfel de exemple ne-a cerut Zanetti... si chiar exista situatii in care e util sa adaugam cod in InitInstance().

Dragos Cojocari
Membru++
Membru++
Posts: 789
Joined: 11 Jul 2007, 14:11

Re: Main class

Post by Dragos Cojocari » 14 Apr 2008, 15:02

Da, ai dreptate. Lista enumerata in MSDN e din lista de features a frameworkului ( in cazul asta MFC). Un exemplu de ce nu ar trebui sa apara acolo e initializarea bazei de date folosita de aplicatie.

User avatar
Zanetti
Membru
Membru
Posts: 80
Joined: 20 Jul 2007, 08:57
Location: Tg.Mures

Re: Main class

Post by Zanetti » 14 Apr 2008, 23:01

Am inteles fratilor. Eu de obicei folosesc class App atunci cand am nevoie de un obiect pe tot parcursul rularii aplicatiei si accesibil din orice clasa. De ex o conexiune la baza de date...

Intrebearea am pus-o datorita faptului ca lucrez la un proiect ce include o placa de achizitie de date. Comunic cu placa de achizitie de date prin portul LPT, eu folosesc VC++ deci am nevoie sa incarc un driver si eram in dubii daca e OK sa fac acesta in clasa App.

Multumesc de raspunsuri.
Ai fost facut DE Dumnezeu si PENTRU Dumnezeu - si pana vei intelege asta,viata ta nu va avea sens.

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Main class

Post by Ovidiu Cucu » 29 Apr 2008, 16:04

Scuze ca ma bag si eu tarziu in discutie dar trebuie sa-mi dau o parere.
In general cand derivam dintr-o clasa a unei biblioteci cum e MFC-ul, pentru ca sa stim pe unde si cum putem "da cu barda dupa pohta ce pohtim" :), ne uitam mai intai in documentatie sa vedem ce metode virtuale avem la dispozitie.
De exemplu, la CWinApp avem:
  • CWinApp::InitInstance - Override InitInstance to initialize each new instance of your application running under Windows. Typically, you override InitInstance to construct your main window object and set the CWinThread::m_pMainWnd data member to point to that window.
  • CWinApp::ExitInstance - Override this function to clean up when your application terminates.
  • CWinApp::DoMessageBox - Override this member function to customize your application-wide processing of AfxMessageBox calls.
  • ...and so on...

User avatar
Marius Bancila
Fondator
Fondator
Posts: 2344
Joined: 11 Jul 2007, 11:45
Judet: Timiş
Location: Timisoara
Contact:

Re: Main class

Post by Marius Bancila » 30 Apr 2008, 09:17

Zanetti wrote:Orice proiect Dialog based are o clasa de baza, CProjectNameApp, care are o singura instanta pe toata durata de viata a programului si unde in functia InitInstance se instanteaza un obiect de tip CProjectNameDlg .
Gresit. Adica nu e complet. E vorbad e orice aplicatie MFC, nu doar dialog based. E la fel si in cazul SDI sau MDI.

Are o singura instanta pentru ca declari un obiect global de tipul respectiv. Insa framework-ul cere existenta unei singure astfel de instante. Daca vrei sa vrezi ce e in spate, cum se creaza si initializeaza, pune un breakpoint in InitInstance si da-i drumul.
Marius Bancila
Fondator Codexpert, Microsoft MVP VC++
Site personal | Blog

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Main class

Post by Ovidiu Cucu » 30 Apr 2008, 11:47

... sau, si mai bine
  • 1. Hit F11
  • 2. F11
  • 3. F11
  • ....
  • n. F11 again...
:D

Post Reply