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

Need some help me C++


gas4metal

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

Καλησπέρα σε όλους και σε όλες. Είμαι new member και παρακαλώ συγχορέστε με αν η ερώτησή μου έχει ξαναειπωθεί...

 

Σε Tubro C++ 2006, έχω ένα TList και μέσα από 2 for δημιουργώ δυναμικά και έπειτα προσθέτω panels μέσα σε αυτήν την List. Το πρόβλημά μου είναι το εξής: μετά την δημιουργία των Panels και την ένταξή τους στην List, πώς μπορώ να αναφερθώ στο καθένα ξεχωριστά???? Αν είχαμε έναν πίνακα πχ και ήθελα να κάνω μια αναζήτηση, μέσα σε μια for θα έβαζα pinakas. Με Panels πώς θα γίνει???

 

Για να σας δώσω μια γενική εικόνα, τον Ναρκαλιευτή έχω να δημιουργήσω και τα έχω όλα έτοιμα εκτός από τα OnClick Events του κάθε Panel ξεχωριστά. Εκεί εντοπίζεται το πρόβλημα. Αν θέλετε ένα συνοπτικό παράδειγμα: http://www.pastebin.ca/844889

 

Αν και είναι λίγο παλιός ο κώδικας περιγράφει αυτό που θέλω να κάνω: μέσα στο ButtonClick (που είναι ο μόνος τρόπος που βρήκα για να δημιουργήσω δυναμικά ένα OnClick Event -αν ξέρετε κάποιον άλλο, πείτε τον μου, θα με βοηθήσει) το οποίο και εξισώνω με το OnClick του κάθε Panel, θέλω να πω τί θα κάνει το κάθε Panel όταν πατηθεί. Ε αυτό "το κάθε Panel" δεν ξέρω πως να πώ... πως θα αναφερθώ στο κάθε Panel της List ξεχωριστά???

 

Όπως θα δείτε δοκίμασα να ονομάσω εγώ τα Panels σύμφωνα με τα i, j της δημιουργίας τους αλλά το πρόβλημα παραμένει... Έστω ότι νωρίζω ότι τα Panels μου είναι τα pnl11,pnl12,pnl13. Πώς θα αναφερθώ σε αυτά δυναμικά???

 

Αυτά.. Ελπίζω να εχει κάποιος την λύση στο πρόβλημα μου.

 

P.S. Το κείμενο το μετέτρεψα απο greeklish σε ελληνικά, εξού κ τα παρακάτω posts.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Αν κατάλαβα καλά θέλεις να ορίσεις ένα OnClick event/procedure για κάθε TPanel που δημιουργείς. Για να κάνεις κάτι τέτοιο θα πρέπει καταρχήν να δηλώσεις ένα τέτοιο OnClick event στο private (ή public) τμήμα της φόρμας σου (πχ. Form1) ως εξής:

 

>
private:
void __fastcall PanelClick(TObject*);

 

Ύστερα θα πρέπει να γράψεις το ανάλογο Procedure στην class της φόρμας σου ως εξής (ας υποθέσουμε πως η φόρμα σου ονομάζεται Form1):

 

>
void __fastcall TForm1::PanelClick(TObject *Sender)
{
// Κώδικας ...
}

 

Τέλος θα πρέπει να υποδείξεις κατά την δημιουργία του TPanel αυτό το ClickEvent ως εξής:

 

>
[..]
newPanel->OnClick= PanelClick;
[..]

 

Μάλιστα, δεν χρειάζεται να δηλώσεις ξεχωριστά OnClick event για κάθε TPanel αφού μπορείς να ξεχωρίζεις κάθε TPanel με την βοήθεια του TObject *Sender το οποίο μπορείς να κάνεις cast σε TPanel εκμεταλλευόμενος την κληρονομικότητα της VCL, έτσι με ένα OnClick event μπορούμε να διαχειριστούμε περισσότερα από ένα TPanel.

 

>
void __fastcall TForm1::PanelClick(TObject *Sender)
{
// We got clicked, but from whom?
TPanel *ourPanel=(TPanel*)Sender;
}

 

Ακολουθεί ένα παράδειγμα όπου δημιουργούμε 10 TPanel στην σειρά, και τα ενώνουμε όλα στο ίδιο OnClick procedure, αν το Panel μας έχει ζυγό αριθμό (αποθηκεύουμε τον αύξων αριθμό κάθε νέου TPanel στο Tag member του) κάνουμε ένα Beep διαφορετικά επιστρέφουμε την ονομασία του.

 

Τα procedures που ακολουθούν οφείλουν να δηλωθούν αναλόγως στο νέο project (πχ. το PanelClick θα πρέπει να έχει ένα ανάλογο declaration στο class TForm1, ο κώδικας του FormShow θα πρέπει να τοποθετηθεί στο ανάλογο Procedure που θα πρέπει να έχει δηλωθεί στα Object Inspector Events κτλ..)

 

>
void __fastcall TForm1::PanelClick(TObject *Sender)
{
// We got clicked, but from whom?
TPanel *ourPanel=(TPanel*)Sender;

// If Panel->Tag odd, return it's name else beep
if(ourPanel->Tag%2)
	Beep();
else
	ShowMessage(ourPanel->Name);
}

void __fastcall TForm1::FormShow(TObject *Sender)
{
// Try to create 10 TPanels and store them in a VCL TList ...
try
 {
	listPanel = new TList();
	for(int nPanelCount=0;nPanelCount<10;nPanelCount++)
	 {
		TPanel *newPanel = new TPanel(this);
		newPanel->Name	 = (AnsiString)"P"+(nPanelCount+1);
		newPanel->Visible= true;
		newPanel->Width	 = 50;
		newPanel->Height = 50;
		newPanel->Top	 = 0;
		newPanel->Left	 = nPanelCount*newPanel->Height;
		newPanel->Parent = this;
		newPanel->Tag	 = nPanelCount;
		newPanel->OnClick= PanelClick;
		listPanel->Add(newPanel);
	 }
 }
catch(Exception &Error)
 {
	// On error, clean-up listPanel (if exists)
	if(listPanel!=NULL)
	 {
		for(int nPanelCount=0;nPanelCount<listPanel->Count;nPanelCount++)
		  {
			delete listPanel->Items[nPanelCount];
			listPanel->Items[nPanelCount]=NULL;
		  }
		delete listPanel;
	 }
	Application->ShowException(&Error);		
 }
}

 

Καλή συνέχεια..

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Η εντολή TPanel *tempPanel=(TPanel*)Sender; ήταν αυτή που έψαχνα, ευχαριστώ πολύ...

Τώρα προέκυψε ένα αλλο πρόβλημα :(

 

Τα Panels δεν έχουν OnRightClick events. Πώς θα δημιουργήσω ένα???

 

Συγνώμη αν σας ζαλίζω... Την Δευτέρα παραδίδω και κοντεύω να το τελειώσω.

 

Θα σας στείλω και copy :D

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Μπορείς να δημιουργήσεις ένα τέτοιο custom event για το TPanel (αλλά και για αρκετά άλλα οπτικά components), εκμεταλλευόμενος το MouseDown event, το οποίο θα πρέπει να δηλώσεις περίπου όπως και το OnClick event, δηλαδή:

 

>
private:
void __fastcall PanelMouseDown(TObject*,TMouseButton,TShiftState,int,int);

 

Και ύστερα στην φόρμα ως:

>
void __fastcall TForm1::PanelMouseDown(TObject *Sender,TMouseButton mButton, TShiftState ssShift,int X,int Y)
{
// Right-click on a TPanel?
if(ssShift.Contains(ssRight))
 {
	// Κώδικας όταν πατηθεί το δεξί πλήκτρο του Mouse ..
	TPanel *ourPanel=(TPanel*)Sender;
	ShowMessage(ourPanel->Name);
 }
}

 

Συμπληρώνοντας κατά την δημιουργία των TPanel τα παρακάτω:

 

>
[..]
newPanel->OnMouseDown= PanelMouseDown;
[..]

 

Αυτά..

:)

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...