Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » Probleme mit Einbinden von Form1

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
19.10.2006, 14:09 Uhr
www.pat



Hi!

(Microsoft Visual Studio .NET, VC++)

sry für dieses absolute Anfängerproblem, aber ich schaff es einfach nicht.
Ich will mit einer Funktion aus ComPort.cpp eine ListView in Form1 füllen.
Liegt der Fehler am #include? Unterscheiden sich VisualStudio und Borland?


C++:
#include <vcl.h>
#pragma hdrstop
#include "stdafx.h"

#include "ComPort.h"
#include "Form1.h"
#include <windows.h>

using namespace ListViewDieZweite;

char ComPort::GetData(int x)
{    
     Form1->listView1->Items->Add("GetIDs",0);
     //...    
}





Zitat von Fehler:

d...\ListViewDieZweite\ComPort.cpp(197): error C2143: Syntaxfehler: Es fehlt ';' vor '->'
d...\ListViewDieZweite\ComPort.cpp(197): error C2143: Syntaxfehler: Es fehlt ';' vor '->'

 
Profil || www.pat&">Private Message || www.pat&searchfor=author&startsearch=1&">Suche Download || Zitatantwort || Editieren || Löschen || IP
001
31.10.2006, 09:55 Uhr
LowFly



hmm,
denke schon das sich Borland vom MFC unterscheidet, sind ja zwei unterschiedliche entwicklungsumgebungen oder?

Nein der fehler liegt nicht am include, eher wie du die Classe Form1 verwendest.

Mit dem Pfeil -> zeigst du auf etwas, da du aber nur die classe includet hast, nicht aber von ihr ableitest & sie initialisierst kann das nicht funzen.
Ich kann es mir auch nicht vorstellen, das borland nur durch den include der classe, weis wie es mit ihr zu verfahren hat.

Folgendes sollte funzen.

Code:

CForm1 *pForm1 = new CForm1();
pForm1->listView1->Items->Add("GetIDs",0);

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
31.10.2006, 12:24 Uhr
www.pat



Hi!

danke für deinen Rat!
Hab den Quellcode mal kopiert, angepasst und auf einen Button in Form2 gelegt.


C++:
    Form1 * Form = new Form1();
    Form->listView1->Items->Add("gruß aus Form2",0);



Kompilieren geht, jedoch erscheint in meinen ListView nix.

Was mich atm stört ist dieses ... = new Form1()
Mein Instinkt sagt mir, dass dieses "new" behauptet, dass Form1 noch nicht existiert.

Liege ich da richtig?
Gibt es ein ... = existing Form1() ?


Naja, ich habe außerdem gerade ein noch ein anderes Problem:

Mein schönes static char* wird total umformatiert übergeben.
Ich habe in Form1.h die Variable deklariert:


C++:
public: static char* PortName;



in Settings.cpp benutze ich die Variable um eine Version an einem externen Gerät abzufragen:


C++:
AVR_Commands AVR;
char Response[5];
Form1::HandlePort = AVR.GetVersion(Form1::PortName,Response);



klappt einwandfrei!

jetzt in Form1.cpp:


C++:
char Response[5];
this->HandlePort = AVR.GetVersion(this->PortName,Response);



klappt nicht...

Aus dem Debugger habe ich folgendes:

Settings.cpp übergiebt:
__unnamed000 0x0012dc94 "COM1"


Form1.cpp jedoch:
__unnamed000 0x0012dd58 "{“‚{Àä"

Der char* wird in Settings.cpp gefüllt:


C++:
Misc Convert;
char PortArray[6];
Convert.StrToCharArray(this->comboBoxPorts->Text->ToString(),PortArray);
Form1::PortName=PortArray;





C++:
void Misc::StrToCharArray(System::String * tempStr, char *CharArray)
{
    int charsOfStr=tempStr->get_Length();

    for (int i=0; i<charsOfStr; i++)
    CharArray[i]=static_cast<char>(tempStr->ToCharArray()[i]);

};




Warum interpretiert Settings.cpp meine static-Variable anders als Form1.cpp?

Dieser Post wurde am 31.10.2006 um 12:48 Uhr von www.pat editiert.
 
Profil || www.pat&">Private Message || www.pat&searchfor=author&startsearch=1&">Suche Download || Zitatantwort || Editieren || Löschen || IP
003
31.10.2006, 12:46 Uhr
LowFly




Zitat von Verfasser:

Mein Instinkt sagt mir, dass dieses "new" behauptet, dass Form1 noch nicht existiert.

Liege ich da richtig?
Gibt es ein ... = existing Form1() ?


nein existing Form1 gibt es nicht und dein Instinkt trügt dich.

das new bezieht sich ausschließlich auf CForm1 *pForm1 und belegt pForm1 mit einem neuen Zeiger (->) auf die Classe CForm1.

das in deiner liste nix drinn steht kann daran liegen das er die zeiger (->) nicht mag. Sind für meinen geschmack auch extrem viele zeiger in einer Zeile.

was ich noch nachvollziehen kann ist der Zeiger von Form1 auf die ListView1. alle weiteren zeiger aber nicht.



Was ist das eigendlich
ein Dialogfeld-, ein SDI- o. ein MDI- basierendes Project?? was ist ListView1 ist das eine CListCtrl oder eine CListView?? wäre interesannt zu wissen da ich sonst ins blaue reinrate wo der Fehler stecken könnte.


[NEW EDIT]
lass mal die this-> Zeiger weg die sind unnötig wenn du eine Funktion aus der selben classe aufrufst in der die funktion erstellt ist.


Code:

Beispiel:
HandlePort = AVR.GetVersion(PortName,Response);


Dieser Post wurde am 31.10.2006 um 12:51 Uhr von LowFly editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
31.10.2006, 13:06 Uhr
www.pat



Wow, ging das schnell!



Zitat von LowFly:
[quote LowFly]
Was ist das eigendlich
ein Dialogfeld-, ein SDI- o. ein MDI- basierendes Project?? was ist ListView1 ist das eine CListCtrl oder eine CListView?? wäre interesannt zu wissen da ich sonst ins blaue reinrate wo der Fehler stecken könnte.
[/code]


ListView ist (glaub ich) die .NET-Version von ListControl.
Ich beschreibs mal:
Hier kann ich Ansichten Wählen (Details, List, Large Icons, Small Icons), und Items adden.
Ich nutze hauptsächlich "Details" und lasse mir IDs in der Tabelle anzeigen (this->listView1->GridLines = true



Zitat von LowFly:
[quote LowFly]
[NEW EDIT]
lass mal die this-> Zeiger weg die sind unnötig wenn du eine Funktion aus der selben classe aufrufst in der die funktion erstellt ist.


Code:

Beispiel:
HandlePort = AVR.GetVersion(PortName,Response);




Klappt leider nicht...
Jetzt wird nichts übergeben.

PortName 0x0012dc94 "" char*
// Edit

Ich denke diese '->' sind relativ gängig, zumindest bei mir. Ich arbeite dauernd damit.
Wenn die benutzt kommt ständig eine Liste mit Vorschlägen, was man nach dem Pfeil einsetzen kann.

Aber ich behalte deinen Vorschlag trotzdem mal drin, vielleicht ist das die Lösung und irgentwo fehlt noch ne winzige Kleinigkeit!


Edit:

Sry, hab nen Fehler im Debug-Modus gemacht.
bei GetVersion kommt wieder folgendes an:

C++:
// von Settings.cpp aufgerufen:
+    __unnamed000    0x0012dc94 "COM1"    char*  

// von Form1.cpp aufgerufen:
+    __unnamed000    0x0012dc94 "&"    char*


Dieser Post wurde am 31.10.2006 um 13:16 Uhr von www.pat editiert.
 
Profil || www.pat&">Private Message || www.pat&searchfor=author&startsearch=1&">Suche Download || Zitatantwort || Editieren || Löschen || IP
005
31.10.2006, 14:33 Uhr
www.pat



Ich habe atm die Vermutung, dass ich "static" falsch verstanden habe...

Wenn man eine Variable im Header deklariert (z.B. public: char* Buchstaben;) und man ihr in einer Funktion einen Wert zuweist verliert sie doch ihren Wert wenn die Funktion fertig ist.


Stimmt es, dass eine statische Variable im Header, (z.B. public static char* Buchstaben)
ihren Wert behält?
Wenn man diese Variable in Form1.h deklariert sollte es doch wie eine globale Variable funktionieren, oder?

Edit:
Irgentwie muss ich mir halt merken welchen Port ich benutze.

Gibt es eine sinnvollere Möglichkeit in einem Programm so einen Wert zu speichern bis das Programm geschlossen wird?
Soll ichs in eine *.ini schreiben? Oder ist das auch unschön?

Dieser Post wurde am 31.10.2006 um 14:52 Uhr von www.pat editiert.
 
Profil || www.pat&">Private Message || www.pat&searchfor=author&startsearch=1&">Suche Download || Zitatantwort || Editieren || Löschen || IP
006
31.10.2006, 15:08 Uhr
LowFly




Zitat von Verfasser:

ListView ist (glaub ich) die .NET-Version von ListControl


das wiederum glaube ich nicht.
CEditView, CRecordView, CFormView, CHtmlView, CListView, CScrollView, CTreeView... Sind alles Classen die ausschließlich in SDI & MDI projecten verwendet werden. Und in einem project das du als Dialogfeld erstellt hast kann man keine CListView verwenden. bzw. können kannst du es. es führt nur zu keinem ergebniss.

anderstrum aus einem SDI o. MDI Project kann man ein Dialogfeld ausführen.

was mir bei deinen Zeigern & Memberbezeichnungen schräg einläuft (unverständlich) ist, du verweist aus einer CFormView auf eine CListView das kann nicht gehn.
Wenn du in einer CFormView eine Liste haben willst so must du in der CFormView eine CListCtrl einfügen. Das machst du über den ResourcenEditor in dem Arbeitsbereich. Der Liste gibst du dann eine Membervariable. Wenn du dann aus einer anderen Classe etwas in die Liste einfügen willst geht das dann wie folgt.


Code:

CFormView *pView = new CFormView();
pView->m_ListCtrl.SetItemText(...);



Eine andere Möglichkeit wäre anstatt der CFormView gleich eine CListView zu verwenden.
dies würde dann so aussehn.

Code:

CListView *pView = new CListView();
pView->SetItemText(...);




Zitat von Verfasser:

Ich denke diese '->' sind relativ gängig, zumindest bei mir. Ich arbeite dauernd damit.
Wenn die benutzt kommt ständig eine Liste mit Vorschlägen, was man nach dem Pfeil einsetzen kann.


Nur weil du ständig damit arbeitest heist das nicht das es so wie du es machst auch richtig ist. Das es nicht richtig ist solltest du an Form1->listView1->Items->Add o. this->PortName gemerkt haben denn dort funzt es ja nicht. Ferner wird dir die List mit Vorschlägen nicht nur bei einem Zeiger auf die Classe angezeigt, sondern auch mit dem Punkt (.).
Siehe

Code:

CString f,sText="Das Knallt";
f.Format("%s",sText);
MessageBox(f);



Setz mal selbst hinter f nen Punkt & du wirst sehn die liste geht auf.

Wird dir nach einer Membervariable. keine Liste angezeigt, ist die Classe von der aus du versuchst die Funktion o. Membervariable aufzurufen nicht bekannt. bzw. ist der MFC nicht ganz fehlerfrei. Meistens ist dann im Arbeitsbereich/Klassen die Classe nicht mehr aufgeführt. Abhilfe schaft da dann das öffnen der header (von der Classe die nicht mehr vorhanden ist unter Arbeitsbereich/Datein) etwas in der header ändern & wieder speichern. danach sollte die classe im Arbeitsbereich/Klassen wieder sichtbar sein. Somit ist dann auch die Liste wieder da.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
31.10.2006, 15:31 Uhr
LowFly



was es genau mit static und const auf sich hat weis ich jetzt nicht, jedoch kannst du das ganz leicht ausprobieren indem du versuchst die static variable zu ändern. dahingehend wirst du feststellen das sich die static variable schon noch ändern läst.

wenn du eine variable global haben willst must du sie auserhalb einer classe deklarieren und nicht inerhalb. Lies dir mal folgenden Thread aufmerksam durch.

www.c-plusplus.de/forum/viewtopic-var-t-is-156496-and-highlight-is-.html
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
31.10.2006, 15:41 Uhr
www.pat




Zitat von LowFly:

Nur weil du ständig damit arbeitest heist das nicht das es so wie du es machst auch richtig ist.



Jo klar!
Ich bin auch erst seit 2 Monaten dabei.

Einige Infos habe ich z.B. von hier
MSDN.
In der C++Spalte sind diese Pfeile überall (ok, spätestens jetzt habe ich mich wirklich noob ausgedrückt ^^).
Außerdem hat mir das

C++:
this->listView1->Items->Add(StrData, 3);


schon sehr gute Dienste geleistet.
Daher meine Sympatie mit den ->bla->blub->...

Aber ich finde es interessant was du sagst, und es gibt mir zu Denken.
Ist diese Sympatie eine Anfänger-Erscheinung oder ist das ein wesentlicher Unterschied zw. Borland und Microsoft Visual Studio? (Frage an alle)

Den Rest deines Posts muss ich erst noch verdauen. Das meiste hab ich auf Anhieb nicht richtig verstanden. ^^

Vielen Dank auf jeden Fall!!! Hast dir echt Mühe gegeben!


Bin eben über das Wort "Registry" gestolpert und klingt seehr vielversprechend.
Ich lass von mir hören wenn ich weitergekommen bin.

Dieser Post wurde am 31.10.2006 um 15:42 Uhr von www.pat editiert.
 
Profil || www.pat&">Private Message || www.pat&searchfor=author&startsearch=1&">Suche Download || Zitatantwort || Editieren || Löschen || IP
009
31.10.2006, 15:47 Uhr
www.pat



ah, jetzt gehts los: extrem-parallel-Antworting



Zitat von LowFly:
was es genau mit static und const auf sich hat weis ich jetzt nicht, jedoch kannst du das ganz leicht ausprobieren indem du versuchst die static variable zu ändern. dahingehend wirst du feststellen das sich die static variable schon noch ändern läst.

wenn du eine variable global haben willst must du sie auserhalb einer classe deklarieren und nicht inerhalb. Lies dir mal folgenden Thread aufmerksam durch.

[url]http://www.c-plusplus.de/forum/viewtopic-var-t-is-156496-and-highlight-is-.html
[/url]

Viele sagen "Globale Variablen" sind bäh, und will es deswegen gar nicht erst anfangen.

Da kommt dann die Sache mit Registry...
Da hätte ich die Infos sogar beim nächsten Programmstart.

Dieser Post wurde am 31.10.2006 um 15:48 Uhr von www.pat editiert.
 
Profil || www.pat&">Private Message || www.pat&searchfor=author&startsearch=1&">Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: