Problem beim Einlesen einer TXT-Datei



  • Danke für den Tipp. Ich habe mal versucht, es mit VC# 2005 zu kompilieren, nur der gibt mir ganze 28 Fehler aus. Sorry, aber egal was ich versuche, der Compiler weigert sich strikt, das zu kompilieren; deine Änderungen berücksichtigt. Ziemlich rätselhaft 😕



  • schni-schna-schnappi.
    blubb?



  • hustbär schrieb:

    schni-schna-schnappi.
    blubb?

    Ja ein eindeutiges und fundiertes Argument. Man merkt wirklich, dass sich hier jemand Mühe gemacht hat und diese "Information" von einem reifem Menschen stammt!



  • Beachte ihn einfach nicht. Der sucht nur Aufmerksamkeit. Um mal zum Thema zurückzukommen:

    Mittlerweile konnte ich die Fehler bis auf einen eingrenzen. Der Compiler sagt mir nun too few arguments to function 'int GetWindowTextA(HWND__, CHAR int)' und bezieht sich dabei auf folgenden Codeabschnitt:

    GetWindowTextA(GetDlgItem(hwnd, IDC_EDT_TEXT), buffer);
    

    Irgendwas habe ich übersehen, nur was? ^^



  • Was könnte das wohl heißen? "Too few arguments"? Vielleicht, daß du der Funktion zu wenig Argumente übergeben hast, aber das ist jetzt nur eine sehr sehr vage Vermutung von mir.

    Vielleicht sollte man die MSDN (http://msdn2.microsoft.com/en-us/library/ms633520.aspx) diesbezüglich konsultieren oder einfach schauen, was die netten Calltips in Visual Studio sagen. Oder wenn man zum selbst machen zu faul ist, wartet man einfach darauf, daß es einem Jemand anders hinbiegt.



  • Oder wenn man zum selbst machen zu faul ist, wartet man einfach darauf, daß es einem Jemand anders hinbiegt.

    👍



  • Du musst als 3. Argument die länge des zielbuffers angeben.
    Also Bsp.:

    HWND hWnd = ...;
    intlen = GetWindowTextLength(hWnd);
    TCHAR* pTcs = malloc(len + 1);
    GetWindowText(hWnd, pTcs, len + 1);
    // Und am ende
    free(pTcs);
    


  • @ tenchou:

    Ach nein, wirklich? Was "too few arguments" bedeutet wusste ich natürlich nicht... Hältst du mich für komplett bescheuert? Aber damit auch du es endlich kapierst: Ich weiß nicht, was er für Argumente will, DAS ist mein Problem. Und von dir lasse ich mir ganz sicher nicht unterstellen, dass ich faul sei. Ich tippe mir stundenlang die Finger wund, probiere und probiere... und schaffe es einfach nicht. Ich BEMÜHE mich, habe aber zu wenig Erfahrung. Die MSDN habe ich natürlich durchsucht. Und sag mal, würde ich fragen, wenn ich fündig geworden wäre? Lass mich verdammt noch mal in Ruhe! Ich kann Leute wie dich nicht leiden, die meinen, mir erzählen zu müssen, wie viel ich denn für meine Projekte mache...

    Ständig muss ich mir von irgendeinem selbst ernannten Alleskönner vorhalten lassen, wie faul ich doch sei und dass ich nichts allein könne. Mir REICHT es! Wie habe ich denn bitteschön den Editor zustande gebracht, wenn ich doch angeblich faul bin und nichts kann? Soetwas Lächerliches... 😡

    Der Thread von "or lol" setzt dem ganzen noch die Krone auf. Könnte ein Mod dem nicht mal einen Riegel vorschieben? Man versteht etwas nicht, fragt nach und zieht damit gleich das Foren-Niveau nach unten? Da stimmt doch was nicht... Ach ja, mein Rat an dich, or lol: Lerne bitte erst mal, Niveau richtig zu schreiben, bevor du soetwas verzapfst 😉
    _______________________________________________________________________

    @ all:

    Sorry, aber das musste raus. Danke, ssfdf. Der fehler ist nun weg, doch dadurch wurde auch ein neuer (too many arguments) erzeugt. Langsam beginne ich an meinem Compiler zu zweifeln. Ich werde das morgen noch mal durch VC 2005 jagen ;).



  • Itachi schrieb:

    @ tenchou:

    Ach nein, wirklich? Was "too few arguments" bedeutet wusste ich natürlich nicht... Hältst du mich für komplett bescheuert? Aber damit auch du es endlich kapierst: Ich weiß nicht, was er für Argumente will, DAS ist mein Problem. Und von dir lasse ich mir ganz sicher nicht unterstellen, dass ich faul sei. Ich tippe mir stundenlang die Finger wund, probiere und probiere... und schaffe es einfach nicht. Ich BEMÜHE mich, habe aber zu wenig Erfahrung. Die MSDN habe ich natürlich durchsucht. Und sag mal, würde ich fragen, wenn ich fündig geworden wäre? Lass mich verdammt noch mal in Ruhe! Ich kann Leute wie dich nicht leiden, die meinen, mir erzählen zu müssen, wie viel ich denn für meine Projekte mache...

    Ständig muss ich mir von irgendeinem selbst ernannten Alleskönner vorhalten lassen, wie faul ich doch sei und dass ich nichts allein könne. Mir REICHT es! Wie habe ich denn bitteschön den Editor zustande gebracht, wenn ich doch angeblich faul bin und nichts kann? Soetwas Lächerliches... 😡

    Welchen Editor nochmal? Achso du meinst das Fenster mit einem Edit Control, was dir CodeFinder und (D)Evil programmiert haben.

    Itachi schrieb:

    Der fehler ist nun weg, doch dadurch wurde auch ein neuer (too many arguments) erzeugt. Langsam beginne ich an meinem Compiler zu zweifeln. Ich werde das morgen noch mal durch VC 2005 jagen ;).

    LOL, langsam glaube ich du bist ein professioneller Troll.

    Ich kann mich nur wiederholen, lerne bitte erstmal die Grundlagen der C Programmierung. Die allermeisten deiner Fragen haben nichts mit WinAPI zu tun, sondern sind Fragen zur Syntax von C. Sicher ist es spannender sich gleich in die tolle bunte Welt der Fensterprogrammierung zu stürzen, aber tue dir bitte selbst einen Gefallen und lies erstmal ein Buch über C Programmierung. Auf Dauer wird es für dich sonst nur frustrierend sein, irgendwelchen Code zu kopieren, den du nicht nachvollziehen kannst.



  • Also gut, ein letztes Mal für dich, da du es wohl noch immer nicht verstanden hast:

    Schaue dir mal meinen ersten Post in diesem Thema genau an. Was siehst du? Richtig, den von mir geschriebenen Code für den Texteditor, mitsamt Editfeld. Was glaubst du da über mein Projekt zu wissen? Deine Postings sind allesamt provokanter Natur. Aber ich verschwende jetzt auch keine Zeit mehr darauf, dir lang und breit zu erklären, was ich denn nun geschrieben habe und was nicht. Weißt du, du hast eine ziemlich törichte und anmaßende Art an dir. Bevor du mich belehrst, solltest du erst mal daran denken, dass ich auch nur ein Mensch bin, der hier Hilfe sucht. Stattdessen machst du mich fertig, obwohl ich dir nie etwas getan habe. Das würde mir zu denken geben. Naja, spammt hier meinetwegen weiterhin den Thread voll. Meine eigentliche Frage ist eh längst im Gelaber untergegangen. Danke noch mal an alle, die mir geholfen haben, besonders an CodeFinder, merker und (D)Evil. Ich suche mir woanders Hilfe.

    Gruß



  • Nana nu hau nicht gleich ab ... dir rennt bestimmt keiner hinterher ... also
    Sorry das ich den Code nicht kompiliere. Da ich nicht oftgenug die WinAPI brauche, da ich mir die meisten Funktionen, um etwas OOP drin zu haben umbaut habe.

    Das A hinter den Funktionen, steht dafür, um dir zu zeigen, dass es sich um ANSI-Funktionsvarianten und nicht um W für UNICODE-Variaten handelt.

    Um den letzten Fehler aus dem Code rauszuholen(denk mal das es der letzte ist 😉 Hab es nicht kontrolliert): GetWindowTextLenA(GetDlgItem(hWnd, IDC_EDT_TEXT), buffer, len); muss die Zeile korrekt heißen.



  • Aja ... falls du nicht weißt wofür das __argc und das __argv steht ... hmm ... sind globals, die der Compilier dir zur verfügung stellt ... nur ANSI-Variante von vorhanden. Sonnst musst du GetCommandLineW und dann das Ergebnis mit entsprechender Funktion(gibt es eine extra für[s. MSDN Lib]) aufteilen lassen.

    @http://www.catch22.net/tuts/tips2.asp steht es auch nochmal ...



  • Nein, von Abhauen war doch gar keine Rede. Ich wollte mir nur anders helfen ^^

    Ich danke dir auf jeden Fall für deine Antwort. Das "len" am Schluss hat gefehlt, nun lässt sich das Programm wieder kompilieren. Allerdings gibt es wieder eine hundertprozentige Systemauslastung und die Schließen-Buttons funktionieren nicht mehr. Eine Datei wird anscheinend erstellt, doch der Inhalt des Textfeldes wird nicht darin gespeichert. Das sollte ja beim Schließen eigentlich passieren. Ich bin die ganze Zeit schon am Überlegen, wie ich das hinbiegen kann. Alle meine Versuche waren jedoch erfolglos. Hier mal die entsprechenden Codestellen, vielleicht wirst du ja daraus schlau:

    HWND hEdit = CreateWindowEx(WS_EX_CLIENTEDGE,
                     TEXT("EDIT"),
                     TEXT(""),
                     WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_MULTILINE | ES_AUTOVSCROLL,
                     10,
                     100,
                     400,
                     350,
                     hwnd,
                     reinterpret_cast<HMENU>(IDC_EDT_TEXT),
                     reinterpret_cast<HINSTANCE>(GetWindowLongA(hwnd, GWL_HINSTANCE)),
                     NULL);
    
             if (hEdit == NULL)
             {
                       MessageBoxA(hwnd, "Fehler beim Erstellen des Fensters!", NULL, 0);
                       return S_FALSE;
             }
    
             if (__argc > 1)
             {
                        std::ifstream file_stream(__argv[1]);
                        std::stringstream ss;
                        ss << file_stream.rdbuf();
                        SendMessageA(hEdit, WM_SETTEXT, 0, reinterpret_cast<LPARAM>(ss.str().c_str()));
             }
          }
             break;
    
    case WM_CLOSE:
          {
               std::string file_name(__argc > 1 ? __argv[1] : "Bla.txt");
               std::ofstream file_stream(file_name.c_str());
               if(! file_stream)
                    return S_FALSE;
    
               unsigned int len = GetWindowTextLengthA(GetDlgItem(hwnd, IDC_EDT_TEXT)) + 1;
               char* buffer     = new char[len];
               GetWindowTextA(GetDlgItem(hwnd, IDC_EDT_TEXT), buffer, len);
               file_stream << buffer << std::endl;
               delete [] buffer;
          }
          break;
    
          case WM_DESTROY: 
             PostQuitMessage(0);
             break;
    
             default:
             return DefWindowProc(hwnd, uiMsg, wParam, lParam); 
       }
             return S_OK;  
    }
    

    Ich strenge mich wirklich an und versuche den Fehler zu ergründen, aber ich denke wirklich, dass du ein besseres Auge dafür hast 😉

    Da ich nämlich nicht einfach kopflos irgendwelche Codes in mein Programm kopiere, sondern erst mal selbst schaue, wo ich es am Besten hinpacke, habe ich wohl irgendwo etwas verhaspelt. Immerhin ist es nun fast geschafft 😃



  • LOL Zum 5.Mal du musst DestroyWindow() in WM_CLOSE aufrufen oder PostQuitMessage(). Hast du Tomaten auf den Ohren?



  • tencho schrieb:

    LOL Zum 5.Mal du musst DestroyWindow() in WM_CLOSE aufrufen oder PostQuitMessage(). Hast du Tomaten auf den Ohren?

    1. Hat man Tomaten IN den Ohren, nicht darauf,
    2. kann ich geschriebenen Text wohl schlecht hören, weshalb deine Frage etwas suspekt erscheint,
    3. zählt das Zählen offenbar nicht zu deinen Stärken. Ein einziges Mal hast du mich darauf hingewiesen,
    4. hat CodeFinder "PostQuitMessage(0);" in "WM_DESTROY" aufgerufen und da er in Sachen WinAPI sehr gut ist, habe ich das auch so gemacht. Somit wäre ich mit meinen Äußerungen an deiner Stelle mal ganz vorsichtig.
    ________________________________________________________________________

    Nichtsdestotrotz läuft das Programm nun. Ich bedanke mich nun noch einmal bei CodeFinder, merker, (D)Evil und den anderen, die mir geholfen haben, das Erstellen einer TXT-Datei mit meinem Editor zu ermöglichen. Dich, tenchou, kann ich nur bitten, dich in Zukunft aus meinen Threads rauszuhalten, da sonst eh wieder nur Streit entsteht 😉

    Grüße



  • Itachi schrieb:

    Allerdings gibt es wieder eine hundertprozentige Systemauslastung und die Schließen-Buttons funktionieren nicht mehr.

    Du gibst wieder bei WM_CLOSE indirekt ein "return 0" zurück. Radikal zusammengestrichen sieht Deine AppWndProc () so aus :

    LRESULT CALLBACK AppWndProc(HWND hwnd, UINT uiMsg, WPARAM wParam, LPARAM lParam) 
    { 
     switch(uiMsg)
     {
      case WM_CLOSE : // wenn WM_CLOSE ...
      {
       ...            // ... dann mache dieses ...
      }
      break;          // ... und 'break' zum Schluss nach ...
    
      default :
      return DefWindowProc(hwnd, uiMsg, wParam, lParam);
     }
    
     return S_OK;    // ... return S_OK !
    
                     // S_OK ist definiert wie folgt (in der winerror.h) als
                     // #define S_OK ((HRESULT)0x00000000L)
                     // ... also ein return 0 gewissermassen !
    }
    

    Kontrolliere mal bei sämtlichen WM_xxxx die Rückgabewerte.
    🙂



  • Hi,

    ich habe nun alles noch mal angepasst, läuft alles rund. Ich freu mich wie ein Schneekönig, dass das jetzt alles endlich geklappt hat 😃 👍

    Vielen Dank nochmal.

    Gruß


Anmelden zum Antworten