Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Εχω δύο κλάσεις οπου η μια ( η βασική ) περιέχει ενα αντικείμενο της δεύτερης κλάσης οπως παρακάτω:

 

>
//---------------------------------------------------------------------------
class TmainForm : public TForm
{
__published:	// IDE-managed Components
private:	// User declarations

TnewUserForm* [b]newUserF;[/b]

public:		// User declarations

};

 

 

 

και η απορέσουσα

 

 

>
class [b]TnewUserForm[/b] : public TForm
{
__published:	// IDE-managed Components

private:	// User declarations
public:		// User declarations

};

 

 

Το πρόβλημα είναι πως όταν στον constructor της βασικής κλάσης προσπαθώ να δεσμεύσω μνήμη για ενα νέο αντικείμενο της απορεουσας κλάσης με χρηση της new μου εμφανίζει το παρακάτω μνμ λάθους:

 

Δηλαδη:

 

>
__fastcall TmainForm::TmainForm(TComponent* Owner)
: TForm(Owner)
{
[b]newUserF = new TnewUserForm();[/b]
}

 

 

[bCC32 Error] main.cpp(69): E2285 Could not find a match for 'TnewUserForm::TnewUserForm()'
Δημοσ.

Όχι, είναι επειδή βάζεις τις παρενθέσεις (προφανώς λόγω πρότερης εμπειρίας σε Java): στην C++ όταν θέλεις να καλέσεις τον default constructor δεν βάζεις παρενθέσεις.

 

http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.2

 

Και σε C++ και σε Java, όταν δεν έχεις κανέναν constructor υπάρχει ο προκαθορισμένος από τη γλώσσα, χωρίς παραμέτρους.

Δημοσ.

Εχω δύο κλάσεις οπου η μια ( η βασική ) περιέχει ενα αντικείμενο της δεύτερης κλάσης οπως παρακάτω:

 

>
//---------------------------------------------------------------------------
class TmainForm : public TForm
{
__published:	// IDE-managed Components
private:	// User declarations

TnewUserForm* [b]newUserF;[/b]

public:		// User declarations

};

 

 

 

και η απορέσουσα

 

 

>
class [b]TnewUserForm[/b] : public TForm
{
__published:	// IDE-managed Components

private:	// User declarations
public:		// User declarations

};

 

 

Το πρόβλημα είναι πως όταν στον constructor της βασικής κλάσης προσπαθώ να δεσμεύσω μνήμη για ενα νέο αντικείμενο της απορεουσας κλάσης με χρηση της new μου εμφανίζει το παρακάτω μνμ λάθους:

 

Δηλαδη:

 

>
__fastcall TmainForm::TmainForm(TComponent* Owner)
: TForm(Owner)
{
[b]newUserF = new TnewUserForm();[/b]
}

 

Προφανώς δουλεύεις με C++ Builder, από ότι κατάλαβα επιθυμείς να ανοίξεις μια νέα TForm (ονόματι NewUserForm) στον Constructor της αρχικής αρχικής φόρμας του προγράμματος (ονόματι MainForm).

 

Για να το κάνεις αυτό, καταρχήν θα πρέπει να συμπεριλάβεις το header της NewUserForm στο Unit της αρχικής φόρμας MainForm. Για να γίνει αυτό, αφού ανοίξεις το αρχείο με τον κώδικα CPP της MainForm πας "File->Use Unit.." και από εκεί επιλέγει το αρχείο που περιέχει την NewUserForm σου και πατάς OK. Εναλλακτικά (αν δεν θες να το κάνεις μέσο "File->Use Unit..") απλά προσθέτεις στα #include της MainForm το ανάλογο αρχείο .H της NewUserForm, πχ:

 

>
#include "NewUserForm.h"

 

Τώρα, πας στον Constructor της MainForm και ορίζεις, για παράδειγμα:

 

>
__fastcall TMainForm::TMainForm(TComponent* Owner)
: TForm(Owner)
{
TNewUserForm *ptrNewUserForm = new TNewUserForm(this);
ptrNewUserForm->Show();
}

 

Ο Constructor κάθε νέου TForm απαιτεί έναν ιδιοκτήτη (Owner) μορφής TComponent, για ευκολία ορίζω τον ιδιοκτήτη αυτόν ως "this" (δηλαδή την MainForm) - για αυτό λαμβάνεις σφάλμα από τον μεταφραστή καθώς δεν υπάρχει (κενός) TForm() constructor στην VCL.

 

Αν όλα πάνε καλά μόλις τρέξεις το πρόγραμμα θα δεις δυο φόρμες ανοιχτές, η μια θα είναι το NewUserForm και η άλλη στο προσκήνιο η MainForm.

 

--

 

Επίσης να έχεις υπόψη σου ότι κάθε φόρμα που προσθέτεις στο Project σου μέσο του C++ Builder είναι ρυθμισμένη εξ ορισμού να δημιουργείται αυτόματα με την έναρξη εκτέλεσης του προγράμματος, αυτό σημαίνει ότι δεν είναι απαραίτητη η δημιουργία της μέσο της new.

 

Σε αυτή την περίπτωση αφού συμπεριλάβεις το ανάλογο .H στο MainForm.CPP σου αρκεί να δηλώσεις ->Show() της φόρμας αυτής στο OnShow event της κεντρικής σου φόρμας (και όχι στον Constructor της!), πχ:

 

>
void __fastcall TMainForm::FormShow(TObject *Sender)
{
NewUserForm->Show();
}

 

Για να ορίσεις ποίες φόρμες επιθυμείς να δημιουργούνται αυτόματα από τον C++ Builder κατά την εκτέλεση του προγράμματος και ποίες όχι (δημιουργώντας της χειροκίνητα με new) πας στο Project->Options->Forms και ορίζεις ανάλογα τα περιεχόμενα των "Auto-create forms:" & "Available forms".

 

--

 

Καλή τύχη!

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...