OPENFILENAME struktur und sortierungsalgorithmus



  • jo, ich hab zwei probleme:

    1.könnte mir mal jemand ein beispiel für eine komplette ausgefüllte OPENFILENAME struktur aufschreiben? in der msdn is ja nur eine aufzählung, aws man alles ausfüllen kann, anhand dessen bin ich auch schon so weit:

    ofn.lStructSize = sizeof(OPENFILENAME);
    	ofn.hwndOwner = hWnd;
    	ofn.hInstance = hInstance;
    	ofn.lpstrFile = *Program.buffer3;
    

    wie bekomme ich jetzt das mit dem dateitypfilter hin? den teil hab ich net wirklich verstanden...

    2.ich brauch für mein projekt ebenfalls einen algorythmus, der eine char in verschiedene char variablen aufteillt. und zwar an den stellen wo ein komma steht.( das lehrzeichen hinter dem komma und das komma selbst sollen verschwinden). desweiteren sollen noch die Lehrzeichen inerhalb der wörter dur dieses zeichen '_' ersetzt werden. bisher hab ich mit einiger hilfe das hier hinbekommen:

    #include<iostream>
    #include<string>
    #include<vector>
    using namespace std;
    
    char text[] = "test1, test2, test3, test4";
    vector<string> someFunc(const string& in);
    
    int main()
    {
        vector<string> dat;
        dat = someFunc(text);
    
        for(vector<string>::iterator iter=dat.begin();iter != dat.end();iter++)
        {
            cout<<*iter<<endl;
        }
    
        getchar();
        getchar();
        return 0;
    
    }
    
    vector<string> someFunc(const string& in)
    {
     string tmp;
     vector<string> erg;
     for(string::const_iterator iter= in.begin();iter != in.end();iter++)
     {
            if(*iter == ',')
            {
                erg.push_back(tmp);
                tmp="";
                *iter++;
            }
            else if(*iter == ' ')
            {
                erg.push_back(tmp);
                tmp="_";
            }
            else
            {
                tmp += *iter;
            }
     }
     erg.push_back(tmp);
     return erg;
    }
    

    aber das trennt erstens in strings und zweitens fängt es nach den lehrzeiche, die durch _ ersetzt weden sollen einen neuen string an... hoffe ihr könnt mir helfen. thx im vorraus.



  • kommt schon. i-jemand weiß doch bestimmt die antwort...



  • zu 1.

    lpstrFilter besteht aus einer Liste nullterminierter Strings, wovon zwei aufeinanderfolgende Strings immer zusammengehören. Der erste ist die Beschreibung des Filters, der zweite der Dateifilter selbst. Es muss also immer eine durch 2 teilbare Anzahl solcher nullterminierter Strings in lpstrFilter stehen.
    In der Doku ist doch auch ein Beispiel:

    "All Files\0*.*\0\0"
    

    Bestehend aus der Beschreibung

    "All Files\0"
    

    und dem Dateifilter

    "*.*\0"
    

    Die Liste wird mit einem separaten Nullzeichen abgeschlossen.

    Wenn du mehr Filter brauchst, musst du die Liste entsprechend erweitern, zB:

    "Configuration files (*.ini)\0*.ini\0All files (*.*)\0*.*\0\0"
    

    zu 2.

    Erstmal, was hier gemacht wird, funktioniert nicht wirklich zuverlässig. Du änderst tmp, dadurch kann der Iterator ungültig werden. Beim ersten Fund eines Kommas ist es eigentlich schon geschehen, da tmp geleert wird. Besser ist es, du veränderst an der Quelle (tmp) selbst nichts, und machst die jeweiligen Anpassungen beim Ergebnis (erg) bzw. beim Kopieren. Oder du durchläufst die Quelle indizierend.

    Zur Vorgehensweise:
    - du suchst Zeichen für Zeichen nach einem Komma
    - sofern eines gefunden wird, kopierst du den String bis dahin, ausgehend vom Anfang oder der letzten Fundstelle und ohne Komma, ins Ergebnis
    - nachfolgendes Leerzeichen überspringen
    - parallel dazu wird jedes Leerzeichen zu '_' umgewandelt



  • THX, für die antworten. aber du kanst mir nich sagen, warum mir die save file box nicht angezeigt wir( mit oben geposteter OPENFILENAME struktur). Ich rufe sie per GetSaveFileName(&ofn) auf, aber es passiert nix, nada, niente...



  • Würde mal spontan darauf tippen, dass du den Member nMaxFile nicht auf eine gültige Grösse gesetzt hast.

    Du solltest auch darauf achten, dass alle relevanten Member einen gültigen Wert haben. Entweder die Member per Hand einzeln setzen oder einfach default initialisieren:

    OPENFILENAME ofn = {};
    // bzw.
    ofn = OPENFILENAME();
    


  • thx. wenn ich die auf vordefiniert setzte, kann ich dan einzelne noch ändern?



  • klappt noch immer net... aufruf sieht so aus: GetSaveFileName(&ofn); richtig, oder?



  • braucht ihr den kompletten code?



  • Hast du fuer das ofn.lpstrFile ein vordefiniertes char/wchar Array verwendet?
    z.B. File[1024]=" ";



  • Den dekliniere ich in einer Klasse, so:
    char *buffer3[256]; //Buffer für Filename
    als Public.



  • Arathorns Sohn schrieb:

    Den dekliniere ich in einer Klasse, so:
    char *buffer3[256]; //Buffer für Filename
    als Public.

    EDIT: Du musst dem Array-Zeiger bei der Initialisierung einen Wert übergeben, da der Zeiger sonst keine Addresse enthält.



  • das geht leider nicht. wenn ich schreibe char *buffer3[] = NULL; meint er, das das nicht geht.



  • Arathorns Sohn schrieb:

    das geht leider nicht. wenn ich schreibe char *buffer3[] = NULL; meint er, das das nicht geht.

    Versuchs mal so
    char* buffer3[256] ={"",""}; (enstpricht 2 Stringelementen)



  • Da meint Borland:

    [C++ Fehler] Main.h(24): E2233 Klassenelement kann hier nicht initialisiert werden



  • Arathorns Sohn schrieb:

    Da meint Borland:

    [C++ Fehler] Main.h(24): E2233 Klassenelement kann hier nicht initialisiert werden

    Hmm, ich habe es mir noch mal überlegt. Eigentlich sollte es schon reichen, wenn du die Initialisierung weglässt...
    Kannst du nicht mal den Code posten? 🙂

    EDIT: Du musst aber *buffer3 irgendwo initialisieren (z.B. *buffer3=" "; )



  • THX, jetzt gibts keinen fehler mehr, das fenster wird aber noch immer net angezeigt... hier mal der code( sagt, wenn ihr die header braucht, aber da steht eh nich viel zum thema drin^^)

    #include"Main.h"
    App Program;
    LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
    
    App::App()   //Konstruktorfunktion
    {
    	 strcpy(szClassName, "Vokabeltrainer");
    }
    
    App::~App()  //Destruktorfunktion
    {
    }
    
    HWND hWnd; // Window Handle
    MSG message; //Messages
    WNDCLASSEX wc; //Window class
    HMENU menu;    // Menu Handle
    OPENFILENAME ofn = {}; //OpenFileName structure
    *buffer3[] = {NULL};
    
    int App::Vokabeldatei_erstellen()
    {
    return 0;
    }
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR szCmdLine, int iCmdShow)
    {
    
    	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;
    	}
    
    	ofn.lStructSize = sizeof(OPENFILENAME);
    	ofn.hwndOwner = hWnd;
    	ofn.hInstance = hInstance;
    	ofn.lpstrFile = *Program.buffer3;
    
    	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);
    	//UpdateWindow(hWnd);
    
    	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 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:"; // <-
    	Program.optionen[0] = FALSE;
    	//Program.optionen[1] = FALSE;
    	DWORD d;
    	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(wParam))
                {
    				case IDM_NEWVOK:
    				{
    					Program.Vokabeldatei_erstellen();
    					break;
                    }
                    case IDM_OPENVOK:
                    case IDM_SAVEVOK:
                    case IDM_PRACTICEVOK:
                    case IDM_HELP:
                    {
                        MessageBox(hWnd, TEXT("Funktion noch nicht implementiert"), TEXT("Vokabeltrainer"), MB_OK | MB_ICONWARNING);
                    } break;
                    case IDM_\1:
    				{
                        GetSaveFileName(&ofn);
    					//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;
    			}
    
    			if (lParam == (LPARAM)GetDlgItem(hWnd, IDC_BTN_INSERT)) {
    			if (HIWORD(wParam) == BN_CLICKED) {
    				MessageBox(NULL, TEXT("Funktion noch nicht implementiert"), TEXT("Vokabeltrainer"), MB_ICONWARNING | MB_OK);
    			}
    
    			}
    
    		} break;
    
    	   case WM_CTLCOLORSTATIC:
    	   {
    		   if ((HWND) lParam == GetDlgItem(hWnd, IDC_EDIT_1)) {
    			   SetBkColor((HDC)wParam, RGB(255, 255, 255));
    			   return (LRESULT)hBrush;
    		   }
    		   SetBkMode((HDC)wParam, GetSysColor(COLOR_WINDOW));
    		   SetBkColor((HDC)wParam, GetSysColor(COLOR_WINDOW));
    		   return 0;
           }break;
    
    	   case WM_CTLCOLOREDIT:
    	   {
    		   if((HWND)lParam == GetDlgItem(hWnd, IDC_EDIT_2))
    		   {
    			   SetBkColor((HDC)wParam, RGB(255, 255, 255));
    			   return (LRESULT)hBrush;
    		   }
    		   if((HWND)lParam == GetDlgItem(hWnd, IDC_EDIT_3))
    		   {
    			   SetBkColor((HDC)wParam, RGB(255, 255, 255));
    			   return(LRESULT)hBrush;
    		   }
    
    	   }break;
    
    	   case WM_CREATE:
    	   {
    		   hBrush = CreateSolidBrush(RGB(255, 255, 255));
    
    		   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)
    								{
    								return -1;
    								}
    
    		   UpdateWindow(hWnd);
    	   }break;
    
           case WM_PAINT:
                    {
                         HDC hDC;
                         PAINTSTRUCT ps;
    
                         hDC = BeginPaint(hWnd, &ps);
                         {
                             SetBkMode(hDC, TRANSPARENT);
                             TextOut(hDC, 40, 50, szUeberschrift1, sizeof(szUeberschrift1) - 1);
                             TextOut(hDC, 40, 100, szUeberschrift2, sizeof(szUeberschrift2) - 1);
    						 if (Program.optionen[0] == TRUE)
                             {
                                 TextOut(hDC, 310, 10, szUeberschrift4, sizeof(szUeberschrift4) - 1);
                             }
                             else if(Program.optionen[0] == FALSE)
                             {
                                 TextOut(hDC, 310, 10, szUeberschrift3, sizeof(szUeberschrift3) - 1);
                             }
    
                         }
    					 EndPaint(hWnd, &ps);
    				}break;
    
    	   case WM_DESTROY:
    	   {
    		   if (hBrush) {
    			   DeleteObject(hBrush);
    		   }
    		   PostQuitMessage (0);
    		   break;
           }
    
    	}
    
       	return DefWindowProc(hWnd, message, wParam, lParam);
    }
    


  • Ich sehe immer noch nirgendwo, dass nMaxFile auf einen gültigen Wert gesetzt wird. Auch lpstrFile ist für mich noch fraglich. Du solltest dir die Platform SDK Dokumentation wirklich nochmal genau anschauen.

    Hier mal ein kurzes Beispiel, wie es aussehen kann:

    TCHAR buf[MAX_PATH] = TEXT("");
    OPENFILENAME ofn = {};
    ofn.lStructSize = sizeof(ofn);
    ofn.hwndOwner = hWnd;
    ofn.hInstance = hInstance;
    ofn.lpstrFile = buf;
    ofn.nMaxFile = sizeof(buf) / sizeof(*buf);
    GetSaveFileName(&ofn);
    


  • ach, ok, dann hab ich deinen alten post von letzter seite falsch verstanden... ich dachte, das müsse ich nicht, wenn ich
    OPENFILENAME ofn = {}; verwende...

    es funzt, danke sehr^^ aber ein klitzekleines problem hab ich noch. ich mach das ganze für die schule, und wollte es auf einem schulcomputer zum löaufen bringen( altes teil, win 2000^^) dabei bekomme ich diese fehlermeldung( das bild sieht unten so seltsam aus, weil ich den usb stick zu früh rausgezogen habe^^):
    http://s2.directupload.net/images/071109/temp/vh77xdrd.jpg

    was kann ich da machen? die bemängelte dll raussuchen und in edn system32 ordner tun oder wie? den projektordner hab ich übrigends komplett aufm stick mitgenommen.



  • Arathorns Sohn schrieb:

    was kann ich da machen? die bemängelte dll raussuchen und in edn system32 ordner tun oder wie?

    Yep, genau so. Ansonsten schau mal, ob der Borland Kompiler bzw. deine IDE eine Option bietet, statisch zu linken. Dann sollte eigentlich sämtlicher Code der Runtime direkt in die Executable gepackt werden, so dass nur noch Abhängigkeiten bezüglich der System Bibliotheken (kernel32, user32, ...) bestehen. Und die sind bei Windows immer vorhanden.



  • danke, du hat mir echt sehr geholfen^^


Anmelden zum Antworten