Ein Form mehrfach laden
-
void go_to(AnsiString nick) { LONG MyGWL_EXSTYLE = GetWindowLong(Form2->Handle, GWL_EXSTYLE); SetWindowLong(Form2->Handle, GWL_EXSTYLE, MyGWL_EXSTYLE | WS_EX_APPWINDOW ); Form2->Caption=nick; Form2->Show(); }So sieht mein Programmcode bisweilen aus. Wenn ich jetzt aber mit einem anderen Übergabewert ein weiteres Form anzeigen lassen will dann ändert er die Caption des aktuellen Forms einfach nur um. Klar stimmt ja auch...
Meine Frage wäre.. wie ich mehrere Forms erstellen kann.Meine Idee ist es unter Umständen die Form zu kopieren und umzubennen oder so...
Sodaß, er einfach jedes Mal Form2 mit einer neuen Captino versieht und es dann umbenennt.Wie sowas zu realisieren ist... da würd ich auch eure Hilfe vertrauen

Wäre nett

-
Form2* myform = new Form2(this);
myform->Caption="wwwww";
myform->Show();
...
delete form;Diese Technik in Form eines Arry aus Zeigern.
-
Christian211 schrieb:
Form2* myform = new Form2(this);
myform->Caption="wwwww";
myform->Show();
...
delete form;Diese Technik in Form eines Arry aus Zeigern.
Das mit new haben mir schon mehrere Leute gesagt... scheint also der richtige Ansatz zu sein...
Also ich hab den Quelltext wie folgt umbenannt:void go_to(AnsiString nick) { LONG MyGWL_EXSTYLE = GetWindowLong(Form2->Handle, GWL_EXSTYLE); SetWindowLong(Form2->Handle, GWL_EXSTYLE, MyGWL_EXSTYLE | WS_EX_APPWINDOW ); Form2* myform = new Form2(this); myform->Caption=nick; myform->Show(); delete myform; }Jetzt bekomme ich aber einige Fehler angezeigt die wie folgt lauten:
[C++ Error] winhand.cpp(9): E2451 Undefined symbol 'myform' [C++ Error] winhand.cpp(9): E2303 Type name expected [C++ Error] winhand.cpp(9): E2379 Statement missing ; [C++ Error] winhand.cpp(12): E2158 Operand of 'delete' must be non-const pointerMag mir da jemand helfen?
Ich hab mit Pointern dank unseres tollen Programmierlehrers noch nie gearbeitet.
Ich kenn mich da kein Stück mit aus. Also wäre eine möglichst genaue und "idiotensichere" Erklärung ganz nett
-
Bin mir nicht sicher, aber versuchs mal mit
myForm *Form2 = new TForm2(this);oder so ähnlich
-
BCB6-User schrieb:
Bin mir nicht sicher, aber versuchs mal mit
myForm *Form2 = new TForm2(this);oder so ähnlich
eher so
TForm2 *myForm = new TForm2(this);bis bald
akari
-
BCB6-User schrieb:
Bin mir nicht sicher, aber versuchs mal mit
myForm *Form2 = new TForm2(this);oder so ähnlich
[C++ Error] winhand.cpp(9): E2451 Undefined symbol 'myForm' [C++ Error] winhand.cpp(9): E2297 'this' can only be used within a member function [C++ Error] winhand.cpp(10): E2451 Undefined symbol 'myform' [C++ Error] winhand.cpp(12): E2158 Operand of 'delete' must be non-const pointerdiese Fehler bekomme ich wenn ich folgenden Code probiere...
void go_to(AnsiString nick) { LONG MyGWL_EXSTYLE = GetWindowLong(Form2->Handle, GWL_EXSTYLE); SetWindowLong(Form2->Handle, GWL_EXSTYLE, MyGWL_EXSTYLE | WS_EX_APPWINDOW ); myForm *Form2 = new TForm2(this); myform->Caption=nick; myform->Show(); delete myform; }Hmm

Bin ja mal gespannt ob da noch jemand Rat weiß
Danke schonmal für die bisherigen bemühungen

-
akari schrieb:
BCB6-User schrieb:
Bin mir nicht sicher, aber versuchs mal mit
myForm *Form2 = new TForm2(this);oder so ähnlich
eher so
TForm2 *myForm = new TForm2(this);bis bald
akarijetzt bekomm ich immerhin nur noch einen Fehler

[C++ Error] winhand.cpp(9): E2297 'this' can only be used within a member function
-
Mach die Funktion go_to zu einer Memberfunktion von (vermutlich) Form1. Oder schau mal in der Hilfe nach, was denn dort überhaupt übergeben werden kann.
Anonsten kann ich dir nur raten, erst mal ein paar Tutorials mit den Grundlagen durchzuarbeiten.
Und bitte keine Fullquotes machen.
Grüße Joe_M.
-
Hallo
ach, das hab ich ja ganz übersehen. Die Fehlermeldung ist schon ganz aussagekräftig, this kann nur in Methoden benutzt werden, also Funktionen, die einer Klasse wie TForm1 zugeordnet sind. Dies solltest du in einem Tutorial über Objektorientierte Programmierung in C++ nachlesen.
Du kannst jetzt ganz einfach die Methode go_to deiner Fensterklasse zuordnen (wenn die Fensterklasse TForm1 heißt) :
void TForm1::go_to(AnsiString nick) { LONG MyGWL_EXSTYLE = GetWindowLong(Form2->Handle, GWL_EXSTYLE); SetWindowLong(Form2->Handle, GWL_EXSTYLE, MyGWL_EXSTYLE | WS_EX_APPWINDOW ); myForm *Form2 = new TForm2(this); myform->Caption=nick; myform->Show(); delete myform; }Außerdem öffnest du noch das zugehörige Headerfile zu diesem Fenster, und gibts dort noch die Definition der Methode an
public : ... void go_to(AnsiString nick);/Edit : zu spät (@ Joe_M : für deine Statistik *grins*)
/Edit : momentmal, eigentlich ist das this in TForm2(this) gar nicht nötig, TForm2(NULL) ist in diesem Fall völlig ausreichend
bis bald
akari
-
{ myform->Show(); delete myform; }Ist mir gerade noch aufgefallen. So wird das Form2, direkt nach Erstellung, sofort wieder gelöscht. Bestenfalls flackert es mal kurz auf, egal, ob der Konstruktor mit, oder ohne Owner-Parameter aufgerufen wird.
@akari: Scheint mein Glückstag zu sein.

Grüße Joe_M.
-
Hallo
ja, statt Show() sollte wohl ShowModal() aufgerufen werden.
bis bald
akari
-
LOL
Also joa.. danke erstmal

Wird schonklappen
Nur... muss ich jetzt das delete woanders rein packen.. macht wenig sinn, dass ich das öffne wenn ichs direkt wieder lösch
Aber danke leute
ihr habt mir sehr geholfen 
-
akari schrieb:
ja, statt Show() sollte wohl ShowModal() aufgerufen werden.
Hmm.. weiß net obs nu daran liegt.. auf jeden Fall kann ich jetzt gar net mehr zum Form1 um ein weiteres Fenster zu öffnen

-
Hallo
dann schau dir mal in der Borland-Hilfe an, was TForm::ShowModal() macht.
Ansonsten must du wirklich das delete an eine endere Stelle verlegen, nämlich dann wenn du das entprechende Fenster schließt.
Eventuell wäre ja eine MDI-Anwendung für dich das bessere Konzept.bis bald
akari
-
Hatte doch
myform->Show(); ... delete form;geschrieben. Die ... bedeuten, dass dazwischen was kommt und der Zeiger freizugeben ist.
Du kannst den Zeiger global anlegen, im Konstruktor initialisieren und im Destruktor löschen. So kann du Show() verwenden ohne in der Funktion ein delete zu machen
-
Christian211 schrieb:
Du kannst den Zeiger global anlegen, im Konstruktor initialisieren und im Destruktor löschen. So kann du Show() verwenden ohne in der Funktion ein delete zu machen
Das klingt gut. Nur wie global anlegen? Sorry... ich steh irgendwie aufm Schlauch...
-
Hi Christian,
scheinst ja jetzt auch öfter hier zu sein...
Es hatte dir doch keiner einen Vorwurf gemacht. Es war einfach ein Mißverständnis von Shevron. Wie das eben so ist, wenn man sich nicht die Mühe macht, sich intensiv mit den Grundlagen auseinander zu setzen, bevor man sich an ein GUI-Projekt wagt.Allein diesen Satz find ich sehr treffend:
shevron schrieb:
Das mit new haben mir schon mehrere Leute gesagt... scheint also der richtige Ansatz zu sein...
Noch jemand, der keine F1-Taste auf seiner Tastur hat... Oder der einfach zu faul ist, sie zu benuten. Ich kann mir nichr vorstellen, dass man an new und delete vorbeikommt, wenn man auch nur ein einziges Grundlagentutorial durcharbeitet.
Sorry, Shevron, aber Du mußt zuerst ein paar Grundlagen lernen. So führt jede Antwort von uns nur zu 2 Neuen Fragen. Und die werden alle ausführlichst in Grundlagentutorials beantwortet.
-
Nach 2 Jahren Programmierung sollte man meinen es zu können nicht wahr?

Aber wie schon gesagt.. mein Lehrer war nicht so die Granate...
-
Sollte man tatsächlich meinen... Es ist mir schleierhaft, wie man 2 Jahre lang C++ lernen kann, ohne einmal mit Themen, wie 'Lebensdauer von Variablen' oder 'Dynamische Instanzen von Objekten' in Kontakt zu geraten.
Wie auch immer, es kann nicht schaden, die Lücken mit einem Tutorial zu schließen. Müßte doch recht schnell gehen.
-
joa mach ich jetzt auch mal.. also bis gleich ^^