Auf Buttonklick neue Editbox erstellen -> geht nicht
-
Tja.. ich würde da ne Funktion schreiben... die dir den Array immer etwas vergrößert... sonnst bekommst de Probs

Aja...
class CSummand { protected: int m_nCount; char m_cBuffer[255]; int m_nBoxWidth; int m_nBoxHight; HWND m_hEdit; public: int Ableiten(void); bool CreateWindow(...); // Public ist in dem Fall zwar notfalls ok... weils sonnst umständlich ist... aber normal sollte man das net amchen ;) Also immer schön Funktionen dafür schreiben :) };Hmm mach das am einfachsten mit nem Pointer
da gehts leicht...[edit]So... hier mal wie de es machen kannst
[/edit]CSummand* m_pSum // Das auch!; UINT m_nSumCount; // Muss im Konstruktor auf 0 gesetzte werden!Dann kannst de dir ne AddSummand Funktion schreiben... die dann in etwa so aussieht wie diese:
void AddSummand(....) { CSummand* pTmp = NULL; if(m_pSum) { pTmp = new CSummand[m_nSumCount]; memcpy(pTmp, m_pSum, sizeof(CSummand) * m_nSumCount); } delete [] m_pSum; m_pSum = new CSummand[m_nSumCount + 1]; if(pTmp) memcpy(m_pSum, pTmp, sizeof(CSummand) * m_nSumCount); delete [] pTmp; // Hier jetzt bsw. m_pSum[m_nSumCount].CreateWindow(...) oder auch einfach m_pSum[m_nSumCount].hEdit = CreateWindow(...) ... kommt halt drauf an wie de deine Klasse jetzt machst... ++m_nSumCount; }
-
Danke für die Hilfe, aber ich seh trotzdem nicht ganz durch.
Du erstellst also eine temoräre Variable dieser Klasse?Ich hab das jetzt erstmal so umgeschrieben:
class summand { private: int anz; int boxwidth; int boxhight; public: char buffer[10][255]; HWND hEdit; int ableiten(); summand(void); int add_sum(HWND); }; summand::summand(void){ anz=0; boxwidth=50; boxhight=30; buffer[0][0]=NULL; } int summand::add_sum(HWND hwnd){ hEdit = CreateWindowEx (WS_EX_CLIENTEDGE, "Edit", buffer[anz], WS_CHILD | WS_VISIBLE, 20+50*anz, 30, boxwidth, boxhight, hwnd, NULL, GetModuleHandle(0), NULL); anz++; return 0; }Aber wie kann ich jetzt in dieser add_sum-Funktion die Speicherreservierung festlegen?
-
Arg... nein... Ich dachte du hättest einen Array von CSummand angelegt... oder?
Also... in der AddSummand funktion die ich gepostet hab... 1. ne temporäre Variable anlege... den inhalt von m_pSum reinkopieren... dann m_pSum um eins vergrößern.... wieder zurück kopieren... tjo... dann noch den neuen entry ausfüllen... das wärs

Du willst doch einen Array von CSummand? Oder willst du innerhalb von CSummand einen Edit Array... ?!
-
Mir ists eigentlich egal, auf welche Weise.
nagut ich werds nochmal so versuchen.Danke für die Hilfe.
-
class summand { public: summand(void); ~summand(void); protected: struct SumEdit_t { int nWidth; int nHeight; char cBuffer[256]; ::HWND hWnd; } * m_pEdits; UINT m_nEditCount; public: int ableiten(void); int AddSum(::HWND /*hWndParent*/, int /*nWidth*/, int /*nHeight*/, LPCSTR /*lpszBuffer*/); }; summand::summand(void) : m_nEditCount(0), m_pEdits(0) { } int summand::AddSum(::HWND hWndParent, int nWidth, int nHeight, LPCSTR lpszBuffer) { SumEdit_t* pTmp = NULL; if(m_pEdits) { pTmp = new SumEdit_t[m_nEditCount]; memcpy(pTmp, m_pEdits, sizeof(SumEdit_t) * m_nEditCount); } delete [] m_pSum; m_pEdits = new SumEdit_t[m_nEditCount + 1]; if(pTmp) memcpy(m_pEdits, pTmp, sizeof(SumEdit_t) * m_nEditCount); delete [] pTmp; m_pEdits[m_nEditCount].nWidth = nWidth; m_pEdits[m_nEditCount].nHeight = nHeight; _snprintf(m_pEdits[m_nEditCount].cBuffer, 256, "%s", lpszBuffer); m_pEdits[m_nEditCount].hWnd = CreateWindowEx(WS_EX_CLIENTEDGE, "Edit", lpszBuffer, WS_CHILD | WS_VISIBLE, 20+50 * m_nEditCount, 30, nWidth, nHeight, hWndParent, NULL, GetModuleHandle(0), NULL); ++m_nSumCount; return m_nSumCount-1; }Du musst nur noch nen Destruktor basteln... delete [] m_pEdits usw

Aja.. ist jetzt ja ganz einfach aufzurufen... du musst einfach nen object von summand erzeugen und kannst dann mit AddSum so viele Edits hinzufügen wie de willst

PS: Keine Garantie das es funktioniert... hab das gerade einfach hier in das "Nachrichten schreiben"-Feld getippt... also nicht getestet nix

-
Ich bins nochmal. Ich hab das jetzt fast genauso übernommen (außer diesen struct-Block und die Variablennamen), und ich kann trotzdem nur eine Editbox erstellen. Bei einer zweiten passiert gar nix. ICh schicke jetzt am besten mal meinen gesamten Code:
#define STRICT #include <windows.h> /* Declare Windows procedure */ LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM); /* Make the class name into a global variable */ char szClassName[ ] = "WindowsApp"; class summand { protected: UINT anz; int boxwidth; int boxhight; HWND hEdit; char buffer[255]; public: int ableiten(); summand(void); int add_sum(HWND, int); }; summand::summand(void){ boxwidth=50; boxhight=30; buffer[0]=' '; } int summand::add_sum(HWND hwnd, int a){ hEdit = CreateWindowEx (WS_EX_CLIENTEDGE, "Edit", buffer, WS_CHILD | WS_VISIBLE, 20+100*a, 30, boxwidth, boxhight, hwnd, NULL, GetModuleHandle(0), NULL); return a; } int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nFunsterStil) { //...Hier steht der Standardcode, wie bei jeder Windows-Anwendung. } /* This function is called by the Windows function DispatchMessage() */ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { int n=0,i; static HWND hButtonPlus, hButtonMinus; summand* sum; summand* tmp=NULL; switch (message) /* handle the messages */ { case WM_CREATE: hButtonPlus = CreateWindow ("button", "+", WS_CHILD | WS_VISIBLE, 50, 100, 20, 20, hwnd, NULL, ((LPCREATESTRUCT) lParam) ->hInstance, NULL); hButtonMinus = CreateWindow ("button", "-", WS_CHILD | WS_VISIBLE, 70, 100, 20, 20, hwnd, NULL, ((LPCREATESTRUCT) lParam) ->hInstance, NULL); /*sum[0].hEdit = CreateWindowEx (WS_EX_CLIENTEDGE, "Edit", sum[0].buffer, WS_CHILD | WS_VISIBLE, 20, 30, 30, 30, hwnd, NULL, GetModuleHandle(0), NULL);*/ break; case WM_COMMAND: if(lParam==(LPARAM)hButtonPlus){ if(HIWORD(wParam) == BN_CLICKED){ if(sum){ tmp = new summand[n]; memcpy (tmp, sum, sizeof(summand) * n); } delete [] sum; sum = new summand[n+1]; if(tmp) memcpy (sum, tmp, sizeof(summand) * n); delete [] tmp; sum[n].add_sum(hwnd, n); n++; } } break; case WM_DESTROY: PostQuitMessage (0); /* send a WM_QUIT to the message queue */ break; default: /* for messages that we don't deal with */ return DefWindowProc (hwnd, message, wParam, lParam); } return 0; }
-
Was willste überhaupt machen Max3000. Bei jedem Click ein neues Edit Fenster erstellen? Wozu soll das gut sein? Brauchst du wirklich 10.000 Fenszer? Ich würde einfach ein array mit 16, 32 oder wieviel du ca. brauchst machen. hier mein freund das ist doch viel einfacher und wird den zweck sicherlich auch erfüllen
#define MAX_SUM 32 ... ... summand sum[MAX_SUM]; ... ... case WM_COMMAND: if(lParam==(LPARAM)hButtonPlus){ if(HIWORD(wParam) == BN_CLICKED){ if( n < MAX_SUM ) { sum[n].hEdit = CreateWindowEx(WS_EX_CLIENTEDGE, "Edit", sum[n].buffer, WS_CHILD | WS_VISIBLE, 20+n*50, 30, 30, 30, hwnd, NULL, ((LPCREATESTRUCT) lParam) -> hInstance, NULL); n++; } } } break;
-
Das geht bei mir aber genausowenig.
Aber hast recht, ich brauch keine 10000 Fenster, sondern maximal so 20.
So langsam glaube ich aber der Fehler liegt gar nicht an der Klasse und der Speicherreservierung.
-
Hoi,
wenn ich mal indirekt zitieren darf...:int summand::add_sum(HWND hwnd, int a){ hEdit = CreateWindowEx (WS_EX_CLIENTEDGE, "Edit", buffer, WS_CHILD | WS_VISIBLE, 20+100*a, 30, boxwidth, boxhight, hwnd, NULL, GetModuleHandle(0), NULL); return a; }du gibst deinen Button doch gar keine ID... da steht ja NULL

Bin mir nicht ganz sicher ob das der Fehler ist, aber du kannst ja auch mal GetLastError benutzen, um den Fehler genauer zu spezifizieren

-
Hab den Fehler jetzt eingegrenzt.
Die Funktion add_sum läuft jedesmal durch und ich habe auch immer eine andere Adresse von hEdit.Das Problem ist der Index, den ich n genannt habe. Der bleibt immer gleich, obwohl ich den bei jedem Buttonklick hochzählen lasse.
Desswegen erstellt der die neue Editbox immer mit den selben Koordinaten, also sind diese Deckungsgleich und ich kann die dann nicht mehr unterscheiden.
Aber warum zählt der das n nicht hoch?
-
Weil n nicht static ist. Also ich würde erstmal C oder C++ lernen, das ist nicht als Angriff gemeint aber dir würden die Dinge alle einfach WEITAUS klarer sein, wenn du wüsstest was du uberhaupt machst....Der Code ist ein misch aus C und C++ und obendrein verkompliziert WinAPI die Sache...wenn man noch nichts davon richtig beherscht dann gibt das nur Schlamassel...
-
Vielen Dank Meaning jetzt klappt alles.
Ich weiß schon, dass WinAPI noch bissl zu schwer für mich ist, aber trotzdem will ich auch nur mit simplem WinAPI-Funktionen eine Benutzerfreundliche Oberfläche erstellen.
Nochmals vielen Dank an alle, die mir bei meinem Problem geholfen haben.
Besonders an (D)Evil, der anscheinend recht viel Zeit in dieses Problem investiert hat.Grüße
Max
-
Max3000
Naja... wenn 10min viel Zeit sind
Also... ich hab gedacht das du das anderes Lösen wolltest.. na was solls.. mit dem Code den ich dir gegeben hab, hättest du einfach ein (globales) Object von summand angelegt... und hättest dann wenn du gewollt hättest mit AddSum so ziemlcih so viele Edits hinzufügen können wie du wolltest

-
[quote="(D)Evil"]Naja... wenn 10min viel Zeit sind

Es gibt auch Leute, die diesen Thread mit nem "loooool" beantworten (siehe auf Seite 2).
Desswegen bin ich für so eine gute Hilfe sehr dankbar.