Frage zu größe einer Editfeld
-
Hallo,
ich hänge gerade an einen Problem fest.
Ich erstelle ein ganz normales Fenster:
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { WNDCLASSEX wc; MSG Msg; //InitCommonControls(); wc.cbSize = sizeof(WNDCLASSEX); wc.style = 0; wc.lpfnWndProc = WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon(NULL, MAKEINTRESOURCE(ID_ICON)); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wc.lpszMenuName = MAKEINTRESOURCE(IDR_MENU); wc.lpszClassName = g_szClassName; wc.hIconSm = (HICON)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(ID_ICON), IMAGE_ICON, 16, 16, 0 ); if(!RegisterClassEx(&wc)) { MessageBox(NULL, "Fensterklasse konnte nicht Initialisiert werden!", "Error!", MB_ICONEXCLAMATION | MB_OK); return 0; } hwnd = CreateWindowEx(0, g_szClassName, g_szClassName, WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT, NULL, NULL, hInstance, NULL); if(hwnd == NULL) { MessageBox(NULL, "Konnte kein Fenster erstellen!", "Error!",MB_ICONEXCLAMATION | MB_OK ); return 0; } ShowWindow(hwnd, nCmdShow); UpdateWindow(hwnd); while(GetMessage(&Msg, NULL, 0, 0) > 0) { TranslateMessage(&Msg); DispatchMessage(&Msg); } return Msg.wParam; }und erstelle dazu ein ganz normales Editfeld:
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) { case WM_CREATE: { HWND hStatus; //Textfeld erstellen hEdit=CreateWindowEx(WS_EX_CLIENTEDGE, "edit", "", WS_CHILD | WS_VISIBLE |WS_VSCROLL | WS_HSCROLL |ES_MULTILINE | ES_AUTOVSCROLL |ES_AUTOHSCROLL,0, 0, 0, 0, hwnd,(HMENU)IDC_MAIN_EDIT,GetModuleHandle(NULL), NULL); if(hEdit == NULL) MessageBox(hwnd, "Fehler beim Erstellen des Textfelds","Fehler", MB_OK | MB_ICONERROR); .....Jetzt lese ich eine TXT ein und schreibe das zeug in das Fenster:
FILE* fp; char gesamtausgabe[330]; fp=fopen(pszFileName,"r"); //pszFileName ist bekannt while ( fgets(line, 300, fp) != NULL) { strcat(gesamtausgabe,line); strcat(gesamtausgabe,"\r\n\0"); SendMessage(hEdit, EM_REPLACESEL, (WPARAM)(BOOL)FALSE, (LPARAM)(LPCSTR)gesamtausgabe); // dies dient nur um festzustellen wieviel sich im Textfeld befindet long iLength; iLength = GetWindowTextLength(hEdit); ofstream fout( "Text.txt" ); fout << iLength; laufendezahl++; }Jetzt komm ich zu meinem Problem.
Egal was ich mache nach 30.000 Zeichen kann nix mehr in das Textfeld geschrieben werden.
Datei die Großer als 30.000 Zeichen sind werden abgeschnitten.
Kann man die größe anpassen oder erweitern?
oder gibt es einen besseren weg?-Turis
-
Aus "Edit Controls":
http://msdn.microsoft.com/en-us/library/ms997530.aspx
"Single-line edit controls are limited to a maximum of 32K (32,767 bytes) of text and, of course, to a single line. By default, single-line edit controls are limited to 30,000 characters."Siehe auch KB74225:
"INFO: Size Limits for a Multiline Edit Control"
http://support.microsoft.com/kb/74225Nun, die Grenzen des Edit Controls sind Dir nun bekannt.
Die Frage ist, was möchtest Du erreichen?
Was soll im Editfeld dargestellt werden? Immer den kompletten Inhalt? Oder vielleicht nur Auschschnitte einer Datei?
Wie groß darf die Datei sein?HTH,
Martin
-
Also im Editfeld soll die gesamt Datei angezeigt werden.
Bei dem was ich vor habe sind die txt Datein schon mal gute 50mb groß.-Turis
-
Nun, 50 MByte Text kannst Du schon mal gar nicht mit dem Edit Control handhaben.
Er kann nun mal nur bis 64 kBytes (in Multiline-Ausführung)Auch das Rich-Edit Control unterliegt einer 64kByte Einschränkung [ich denke mal daß dies so ist, doch kann mich dabei irren]
Somit bleibt es Dir nichts anderes übrig, als
(a) das Edit-Control selbst nachzubilden oder
(b) fertige Edit-Controls einzubinden.Zu (a): Edit-Control oder Text-Editor nachbilden, mit sehr lehrreichem Win32-APi Quellcode: "Design and Implementation of a Win32 Text Editor" http://www.catch22.net/tuts/neatpad
Zu (b): Ein von vielen möglichen Varianten wäre das Scintilla Control http://www.scintilla.org/
HTH,
Martin
-
Zur Anzeige einer Datei ist eine listbox besser geeignet als ein edit-control. Wo da die Grenzen liegen musst du in der Doku nachlesen oder ausprobieren. Kann mir als Benutzer deines Programmes aber schwer vorstellen 50 MB scrollen zu sollen. Da kommst du zur Fragestellung 'Benutzerfreundlichkeit' und brauchst dafür angepasste Lösungen!
-
Hallo,
ich danke euch für die Antworten.
@Mmacher
Ich werde mir die Variante a mal genauer ansehen, auch wenn es wohl schwer wird.@berniebutt
Die Benutzer sollen natürlich nicht 50mb scrollen, deswegen wird der Text vor der Ausgabe von mir bzw. gibt es dann möglichkeiten den Text zu Filtern.
Das mit der Listbox werde ich mir auch ansehen.
-
Mmacher schrieb:
Aus "Edit Controls":
http://msdn.microsoft.com/en-us/library/ms997530.aspx
"Single-line edit controls are limited to a maximum of 32K (32,767 bytes) of text and, of course, to a single line. By default, single-line edit controls are limited to 30,000 characters."Siehe auch KB74225:
"INFO: Size Limits for a Multiline Edit Control"
http://support.microsoft.com/kb/74225Nun, die Grenzen des Edit Controls sind Dir nun bekannt.
Die Frage ist, was möchtest Du erreichen?
Was soll im Editfeld dargestellt werden? Immer den kompletten Inhalt? Oder vielleicht nur Auschschnitte einer Datei?
Wie groß darf die Datei sein?Deine Links beziehen sich auf die 16bit Windows Anwendungen

BTW: NOTEPAD benutzt ein Multiline Edit control.
Dessen Größe ist beschränkt auf die Größe des Speichers von Windows...Ja! Und auch 50MB gehen in ein Multiline Edit Control!
-
Martin Richter schrieb:
Deine Links beziehen sich auf die 16bit Windows Anwendungen

Auweia, da bin ich aber böse darauf reingefallen.
Lebe immer noch in dem Glauben, der Windows-eigene Texteditor kann nur mit Dateien bis 64kBytes umgehen.
Tja, einmal gelernt ist wieder schwer wegzukriegen.Nun, dann kann dem Turis doch recht einfach geholfen werden:
Setze Dein Edit Control auf Multiple-Line (Stil ES_MULTILINE) und auf die gewünschte Buffergröße (Message EM_SETLIMITTEXT).Martin
-
Mmacher schrieb:
Nun, dann kann dem Turis doch recht einfach geholfen werden:
Setze Dein Edit Control auf Multiple-Line (Stil ES_MULTILINE) und auf die gewünschte Buffergröße (Message EM_SETLIMITTEXT).
MartinDanke das klapt super.