Problem it char variable



  • hi, ich hab ein problem mit meiner winapi anwendung. und zwar bekomme ich beim kompilieren diesen fehler:

    [C++ Fehler] Main.cpp(7): E2277 L-Wert erwartet
    

    ich verwende den Borland Turbo C++

    hier ist der programm header

    #include<windows.h>
    
    #define IDR_XPSTYLE 1
    
    #define ID_MENU 501
    
    #define IDM_NEWVOK 200
    #define IDM_OPENVOK 201
    #define IDM_PRACTICEVOK 202
    #define IDM_EXIT 203
    
    #define IDM_HELP 204
    #define IDM_ABOUT 205
    #define IDM_SAVEVOK 206
    
    class App         //Programm Klasse
    {
    public:
        App();       //Konstruktor
        ~App();      //Destruktor
    
        LRESULT CALLBACK WindowProcedure(HWND, UINT, WPARAM, LPARAM);   //Window Procedure
        char szClassName[15];                                           //Klassenname
        int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR);  // Main Funktionfunction
    
        int Vokabeldatei_erstellen();                                   //Funktion zum erstellen einer Vokabeldatei
        int Vokabeldatei_erweitern();                                   //Funktion zum erweitern einer Vokabeldatei
        int Vokabeln_abfragen();                                        //Funktion zum abfragen von Vokabeln aus einer Vokabeldatei
    
        char szUeberschrift1[];                                         //Überschrift für das eingabefeld für die englischen Vokabeln
        char szUeberschrift2[];                                         //Überschrift für das Eingabefeld für die deutschen Vokabeln
        char szUeberschrift3[];                                         //Überschrift für das Eingabefeld zur ausgabe des Inhalts der Vokabeldatei
        char szUeberschrift4[];                                         //Überschrift für das Eingabefeld zur ausgabe der bereits abgefragten Vokabeln
        char szUeberschrift5[];                                         //Überschrift für das Eingabefeld zur eingabe des Dateinamens
    
    private:
        HWND hWnd; // Window Handle
        MSG message; //Messages
        WNDCLASSEX wc; //Window class
        HMENU menu;    // Menu Handle
    
        static HWND hEdit1;   //Editfeld für die ausgabe der Vokabeldatei bzw. der bereits abgefragten Vokabeln
        static HWND hEdit2;   //Editfeld zur eingabe der Englischen Vokabel
        static HWND hEdit3;   //Editfeld zur eingabe der deutschen Vokabel
        static HWND hEdit4;   //editfeld zur Eingabe des Dateinamens
        static HWND hButton1; //Button zum eintragen der Vokabel in die vokabeldatei
        static HWND hButton2; //Button zum speichern der Vokabeldatei
        static HBRUSH hBrush; //Brush für den schrifthintergrund
        static RECT rect;     //Fenstergröße
        bool optionen[10]; //0 = Vokabeln abfragen? 1 = speichern?, 2, 3, 4, 5, 6, 7, 8, 9, 10 = unbelegt
    
    };
    

    Und hier die main.cpp

    #include<windows.h>
    
    #include"Main.h"
    
    LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
    
    App::App()   //Konstruktorfunktion
    {
         szClassName = "Vokabeltrainer"; //fehler bezieht sich hier drauf
    }
    
    App::~App()  //Destruktorfunktion
    {
    }
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR szCmdLine, int iCmdShow)
    {
        return 0;
    }
    

    ich hoffe, ihr könnt mir helfen.



  • strcpy(szClassName, "Vokabeltrainer");



  • thx, aber wofür das strcpy?

    dit: ok, funzt.



  • Die Funktion strcpy() kopiert die Zeichenkette, auf die der Zeiger src zeigt, inklusive des Endzeichens '\0' an die Stelle, auf die der Zeiger dst zeigt.



  • Danke für die erklärung. Wieder etwas schaluer.^^



  • allerdings hab ich jetzt zwei neue probs:
    1. Ich muss mehreren chars einen string zuweisen und wenn ich das mit stdcpy mache haben alle chars den string, den ich der letzten zugewiesen habe...
    2. wenn ich mein programm starte passiert nix.... obwohl ein fenster angezeigt werden müsste. hier sind mal alle dateien des projekts:

    1.main.h

    #include<windows.h>
    
    #define IDR_XPSTYLE 1
    
    #define ID_MENU 501
    
    #define IDM_NEWVOK 200
    #define IDM_OPENVOK 201
    #define IDM_PRACTICEVOK 202
    #define IDM_EXIT 203
    
    #define IDM_HELP 204
    #define IDM_ABOUT 205
    #define IDM_SAVEVOK 206
    
    class App         //Programm Klasse 
    {
    public:
    	App();       //Konstruktor
    	~App();      //Destruktor
    
    	char szClassName[];                                           //Klassenname
    
    	int Vokabeldatei_erstellen();                                   //Funktion zum erstellen einer Vokabeldatei
    	int Vokabeldatei_erweitern();                                   //Funktion zum erweitern einer Vokabeldatei
    	int Vokabeln_abfragen();                                        //Funktion zum abfragen von Vokabeln aus einer Vokabeldatei
    
    	char szUeberschrift1[];                                         //Überschrift für das eingabefeld für die englischen Vokabeln
    	char szUeberschrift2[];                                         //Überschrift für das Eingabefeld für die deutschen Vokabeln
    	char szUeberschrift3[];                                         //Überschrift für das Eingabefeld zur ausgabe des Inhalts der Vokabeldatei
    	char szUeberschrift4[];                                         //Überschrift für das Eingabefeld zur ausgabe der bereits abgefragten Vokabeln
    	char szUeberschrift5[];                                         //Überschrift für das Eingabefeld zur eingabe des Dateinamens
    
    private:
    
    };
    

    main.cpp

    #include<windows.h>
    
    #include"Main.h"
    
    LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
    
    App::App()   //Konstruktorfunktion
    {
    	 strcpy(szClassName, "Vokabeltrainer");
    	 strcpy(szUeberschrift1, "Englische Vokabel: ");   //überschrift für die englischen Vokabeln
    	 strcpy(szUeberschrift2, "Deutsche Vokabel: ");    //überschrift für die deutschen Vokabeln
    	 strcpy(szUeberschrift3, "Inhalt der Vokabeldatei: "); //überschrift für den Inhalt der Vokabeldatei
    	 strcpy(szUeberschrift4, "Berreits abgefragte Vokabeln: "); //überschrift für die berreits abgefragten Vokabeln
    	 strcpy(szUeberschrift5, "Dateiname: ");   //überschrift für den dateinamen
    }
    
    App::~App()  //Destruktorfunktion
    {
    }
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR szCmdLine, int iCmdShow)
    {
     	HWND hWnd; // Window Handle
    	MSG message; //Messages
    	WNDCLASSEX wc; //Window class
    	HMENU menu;    // Menu Handle
    	App Program;
    
    	wc.hInstance = hInstance;
    	wc.lpszClassName = Program.szClassName;
    	wc.lpfnWndProc = WndProc;
    	wc.style = CS_HREDRAW | CS_VREDRAW;
    	wc.cbSize = sizeof(WNDCLASSEX);
    	wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    	wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
    	wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    	wc.lpszMenuName = NULL;
    	wc.cbClsExtra = 0;
    	wc.cbWndExtra = 0;
    	wc.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
    
    	if(!RegisterClassEx(&wc))
    	{
    	   return 0;
    	}
    
    	hWnd = CreateWindowEx(
    		   WS_EX_CLIENTEDGE,
    		   Program.szClassName,
    		   "Vokabeltrainer",
    		   WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX,
    		   CW_USEDEFAULT,
    		   CW_USEDEFAULT,
    		   600,
    		   400,
    		   NULL,
    		   NULL,
    		   hInstance,
    		   NULL);
    
    	ShowWindow(hWnd, iCmdShow);
    
    	menu = LoadMenu(hInstance, MAKEINTRESOURCE(ID_MENU));
    	SetMenu(hWnd, menu);
    
    	while (GetMessage (&message, NULL, 0, 0))
    	{
    		TranslateMessage(&message);
    		DispatchMessage(&message);
    	}
    
    	return message.wParam;
    }
    
    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    
    	//static HWND hEdit1;   //Editfeld für die ausgabe der Vokabeldatei bzw. der bereits abgefragten Vokabeln
    	//static HWND hEdit2;   //Editfeld zur eingabe der Englischen Vokabel
    	//static HWND hEdit3;   //Editfeld zur eingabe der deutschen Vokabel
    	//static HWND hEdit4;   //editfeld zur Eingabe des Dateinamens
    	//static HWND hButton1; //Button zum eintragen der Vokabel in die vokabeldatei
    	//static HWND hButton2; //Button zum speichern der Vokabeldatei
    	//static HBRUSH hBrush; //Brush für den schrifthintergrund
    	//static RECT rect;     //Fenstergröße
    	//bool optionen[10]; //0 = Vokabeln abfragen? 1 = speichern?, 2, 3, 4, 5, 6, 7, 8, 9, 10 = unbelegt
    
    	switch (message) {
    	   /*case WM_CREATE:
    	   {
    				hButton1 = CreateWindow( "button",
                                                     "Eintragen",
                                                     WS_CHILD | WS_VISIBLE,
                                                     0, 0, 0, 0,
    												 hWnd,
                                                     NULL,
                                                     ((LPCREATESTRUCT) lParam) -> hInstance,
                                                     NULL);
    				MoveWindow(hButton1, 70, 150, 160, 22, TRUE);
    
    				break;
           }*/
    	   case WM_DESTROY:
    	   {
    		   /*if (hBrush) {
    			   DeleteObject(hBrush);
    		   }*/
    		   PostQuitMessage (0);
    		   break;
           }
    
    	}
    
    	return DefWindowProc(hWnd, message, wParam, lParam);
    }
    

    Rsrc.rc

    #include <windows.h>
    #include "Main.h"
    
    501 MENU
    BEGIN
       POPUP "&Aufgaben"
       BEGIN
       MENUITEM "&Neue Vokabeldatei anlegen", IDM_NEWVOK
       MENUITEM "&Vokabeldatei bearbeiten", IDM_OPENVOK
       MENUITEM "&Vokabeldatei speichern", IDM_SAVEVOK
       MENUITEM SEPARATOR
       MENUITEM "&Vokabeln abfragen", IDM_PRACTICEVOK
       MENUITEM SEPARATOR
       MENUITEM "&Programm beenden", IDM_EXIT
       END
    
       POPUP "&Hilfe"
       BEGIN
       MENUITEM "&Hilfe", IDM_HELP
       MENUITEM "&Über das Programm", IDM_ABOUT
       END
    END
    
    IDR_XPSTYLE  24 DISCARDABLE "style.bin"
    

    style.bin

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <assembly
       xmlns="urn:schemas-microsoft-com:asm.v1"
       manifestVersion="1.0">
     <assemblyIdentity
        processorArchitecture="x86"
        version="5.1.0.0"
        type="win32"
        name="AUTORNAME"/>
     <description>PROGRAMMNAME</description>
     <dependency>
      <dependentAssembly>
        <assemblyIdentity
             type="win32"
             name="Microsoft.Windows.Common-Controls"
             version="6.0.0.0"
             publicKeyToken="6595b64144ccf1df"
             language="*"
             processorArchitecture="x86"/>
      </dependentAssembly>
     </dependency>
    </assembly>
    

    den tipp mit der style.bin zum verwenden es xpstyles hab ich hier i-wo gefunden.



  • Bitte leute. ich muss das prob bis freitag gelöst ham.( ist für die schule)



  • zu 1.) Ich würde mal speicher deinen char arrays zuweisen.
    zu 2.) Ich habe beim überfliegen nix gesehen aber du hast garkeine Fehlerbehandlung. Werte GetLastError aus und lass dir Fehler wenn du sie hast anzeigen.

    schirrmie



  • Möglichkeit 1: du verwendest tatsächlich char-Arrays - aber dann bitte mit Größenangabe (erstaunlich, daß diese "char xyz[];" durch den Compiler kommen) - und füllst diese mit strcpy() und Co. auf.

    Möglichkeit 2: du ersetzt die char-Arrays durch "echte" Strings (std::string), dann kannst du sogar mit Zuweisungsoperatoren arbeiten.



  • 1. frage: kann man da wo szClassName hinkommt strings verwenden und kann man strings mit TextOut ausgeben?

    geil, nachdem ich GetLastError eingefügt hab, funzts^^ aber dazu bleibt eine frage: wie soll ich den error code ausgeben einfach den return wert in ner variable speichern und ausgeben, oder wie?



  • Nein, da braucht man (afaik) char-Zeiger. (wobei - an Stellen, wo der Wert nur lokal benötigt wird, z.B. für TextOut(), kannst du auch mit c_str() auf die Daten zugreifen)

    Mein Vorschlag: Nimm die MFC, da ersparst du dir eine Menge Stress.



  • Ich könnte auch die VCL nehmen( verwende Borland) aber ich hab das GUI und auch ein paar andere sachen schon in einem anderen projekt fertig.

    aja, wie kann ich den standart öffnen/speichern dialog aufrufen?

    edit: äh, wieso ist s t a n d a r t zensiert?



  • weil es hinten mit d geschrieben wird und nicht mit t
    das ist die gezwungene rechtschreib-korrektur
    {[zum glueck nicht ausgereift, sonst wuerde man meine posts nicht mehr lesen koennen vor lauter * #gg}



  • ah thx. wusst ich garnicht... trotzdem bleibt meine frage:
    wie kann ich den Standard Öfnen/Speicherdialog einbinden?



  • Such nach GetOpenFileName und GetSaveFileName.



  • THX. ich such mal.( du minst doch in der msdn, oder?)



  • So, wieder ein prob( ich hasse es). jett werden die childs nicht angezeigt. wieder keinerleih fehler. hier ist mal nur die WndProc, weil sich nix von edm anderen verändert hat.

    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    
    	static HWND hEdit1;   //Editfeld für die ausgabe der Vokabeldatei bzw. der bereits abgefragten Vokabeln
    	static HWND hEdit2;   //Editfeld zur eingabe der Englischen Vokabel
    	static HWND hEdit3;   //Editfeld zur eingabe der deutschen Vokabel
    	//static HWND hEdit4;   //editfeld zur Eingabe des Dateinamens
    	static HWND hButton1; //Button zum eintragen der Vokabel in die vokabeldatei
    	//static HWND hButton2; //Button zum speichern der Vokabeldatei
    	static HBRUSH hBrush; //Brush für den schrifthintergrund
    	static RECT rect;     //Fenstergröße
        const char szUeberschrift1[] = "Englische Vokabel:"; // Überschrift für das eingabefelde der englischen vokabel
        const char szUeberschrift2[] = "Deutsche Vokabel:"; // Das selbe für die deutsche Vokabel
        const char szUeberschrift3[] = "Inhalt der Vokabeldatei:"; // jo, nomal für das dritte editfeld
        const char szUeberschrift4[] = "Bereits abgefragte Vokabeln:"; // <-
    	const char szUeberschrift5[] = "Dateiname (ohne Endung):"; //Überschrift des savewindows
    
    	Program.optionen[1] = FALSE;
    	Program.optionen[2] = FALSE;
    	switch (message) {
    
    	   case WM_SIZE:
                {
             rect.left    = 0;
             rect.top     = 0;
             rect.right   = LOWORD(lParam);
             rect.bottom  = HIWORD(lParam);
             return 0;
    			 }
    	   case WM_COMMAND:
    	   {
    		switch (LOWORD (lParam)) {
    		   case IDM_NEWVOK:
    		   case IDM_OPENVOK:
    		   case IDM_SAVEVOK:
    		   case IDM_PRACTICEVOK:
    		   case IDM_HELP:
    		   {
    				 MessageBox(hWnd, (LPSTR) "Funktion noch nicht eingebaut.", (LPSTR) Program.szClassName, MB_ICONINFORMATION | MB_OK);
    				 return 0;
    		   }
    		   case IDM_ABOUT :
    		   {
    				 MessageBox(NULL, "Vokabeltrainer  \n Copyright bei Martin 'Arathorns Sohn' Alsfasser \n Dark Grass Software", "Über das Programm", MB_OK);
    				 return 0;
    		   }
    
    		   case IDM_EXIT :
    		   {
    			   PostQuitMessage(0);
    			   return 0;
               }
    		  }
    		  return 0;
    		}
    	   case WM_CREATE:
    	   {
    		   hBrush = CreateSolidBrush(RGB(255, 255, 255));
    
    		   hEdit1 = CreateWindowEx(WS_EX_CLIENTEDGE,
    								   "edit",
    								   NULL,
    								   WS_CHILD | WS_VISIBLE | ES_READONLY | WS_VSCROLL | ES_AUTOVSCROLL | ES_MULTILINE,
    								   0, 0, 0, 0,
    								   hWnd,
    								   NULL,
    								   ((LPCREATESTRUCT) lParam) -> hInstance,
    								   NULL);
               MoveWindow(hEdit1, 310, 30, 270, 310, TRUE);
    
               hEdit2 = CreateWindowEx(WS_EX_CLIENTEDGE,
                                            "edit",
                                            NULL,
                                            WS_CHILD | WS_VISIBLE,
                                            0, 0, 0, 0,
                                            hWnd,
                                            NULL,
                                            ((LPCREATESTRUCT) lParam) -> hInstance,
                                            NULL);
    		   MoveWindow(hEdit2, 40, 70, 230, 22, TRUE);
    
    		   hEdit3 = CreateWindowEx(WS_EX_CLIENTEDGE,
                                            "edit",
                                            NULL,
                                            WS_CHILD | WS_VISIBLE,
                                            0, 0, 0, 0,
                                            hWnd,
                                            NULL,
                                            ((LPCREATESTRUCT) lParam) -> hInstance,
                                            NULL);
    		   MoveWindow(hEdit3, 40, 120, 230, 22, TRUE);
    
    		   hButton1 = CreateWindow( "button",
    									"Eintragen",
    									WS_CHILD | WS_VISIBLE,
    									0, 0, 0, 0,
    									hWnd,
    									NULL,
    									((LPCREATESTRUCT) lParam) -> hInstance,
    									NULL);
    		   MoveWindow(hButton1, 70, 150, 160, 22, TRUE);
    
    		   UpdateWindow(hWnd);
    		   return 0;
           }
    	   case WM_DESTROY:
    	   {
    		   if (hBrush) {
    			   DeleteObject(hBrush);
    		   }
    		   PostQuitMessage (0);
    		   break;
           }
    
    	}
    
    	return DefWindowProc(hWnd, message, wParam, lParam);
    }
    

    habs auch schon mit showWindow und allem probiert, wieder nix gebracht.

    aja, wenn ich im menü auf die einträge klicke, wird die messageBox, die da erscheinen sollte nicht angezeigt....



  • switch (LOWORD (wParam)) {



  • thx dafür, aber anscheinend hat mein pc was dagegen neue fenster zu öffnen. ich hör zwar sounds, aber die messageboxen werden nicht geöffnet...



  • Einmal aufgeräumt ... zwar nicht getestet, aber egal:P

    #define IDC_EDIT_1 1001
    #define IDC_EDIT_2 1002
    #define IDC_EDIT_3 1003
    #define IDC_BTN_INSERT 1004
    
    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        switch (message) 
    	{
    		case WM_COMMAND:
    		{
    			switch (LOWORD(wParam)) 
    			{
    				case IDM_NEWVOK:
    				case IDM_OPENVOK:
    				case IDM_SAVEVOK:
    				case IDM_PRACTICEVOK:
    				case IDM_HELP:
    				{
    					MessageBox(hWnd, TEXT("Funktion noch nicht implementiert"), Program.szClassName, MB_OK | MB_ICONWARNING);
    				} break;
    				case IDM_\1:
    				{
    					MessageBox(NULL, TEXT("Vokabeltrainer\nCopyright bei Martin 'Arathorns Sohn' Alsfasser\nDark Grass Software"), TEXT("Über das Programm"), MB_OK | MB_ICONINFORMATION);
    				} break;
    				case IDM_EXIT:
    				{
    					PostQuitMessage(0);
    				} break;
    			}
    		} break;
    		case WM_CREATE:
    		{
    			if (CreateWindowEx(	WS_EX_CLIENTEDGE, TEXT("edit"), NULL, WS_CHILD | WS_VISIBLE | ES_READONLY | WS_VSCROLL | 
    								ES_AUTOVSCROLL | ES_MULTILINE, 310, 30, 270, 310, hWnd, (HMENU)IDC_EDIT_1, ((LPCREATESTRUCT)lParam)->hInstance,
    								NULL) == NULL ||
    				CreateWindowEx(	WS_EX_CLIENTEDGE, TEXT("edit"), NULL, WS_CHILD | WS_VISIBLE, 40, 70, 230, 22, hWnd, (HMENU)IDC_EDIT_2,
    								((LPCREATESTRUCT)lParam)->hInstance, NULL) == NULL ||
    				CreateWindowEx(	WS_EX_CLIENTEDGE, TEXT("edit"), NULL, WS_CHILD | WS_VISIBLE, 40, 120, 230, 22, hWnd, (HMENU)IDC_EDIT_3,
    								((LPCREATESTRUCT)lParam)->hInstance, NULL) == NULL ||
    				CreateWindowEx(	0, TEXT("button"), TEXT("Eintragen"), WS_CHILD | WS_VISIBLE, 70, 150, 160, 22, hWnd, (HMENU)IDC_BTN_INSERT,
    								((LPCREATESTRUCT)lParam)->hInstance, NULL) == NULL)
    			{
    				MessageBox(NULL, TEXT("Es ist ein Fehler beim erstellen des Fensters aufgetreten!"), TEXT("Fehler"), MB_OK | MB_ICONERROR);
    				return -1;
    			}
    		} break;
    		case WM_DESTROY:
    		{
    			PostQuitMessage(0);
    		} break;
    		default:
    			return DefWindowProc(hWnd, message, wParam, lParam);
    	}
    	return 0L;
    }
    

    ... dann hast du die bescheuerten static's mal alle raus -.- Das Handle auf die Fenster bekommst du per GetDlgItem(hWnd, IDC_EDIT_1) bsw. bei hEdit1 ...


Anmelden zum Antworten