Auf Buttonklick neue Editbox erstellen -> geht nicht
-
Da sagt er mir, dass eine Zugriffsverletzung im Programm aufgetreten ist. Es liegt an der einen Zeile sum[n]=...
Davor hab ich ja auf die selbe Weise sum[0] erstellt und das funktioniert.
Das steht aber unter WM_CREATE.
-
tjo das Problem wird darin liegen, das dein sum nicht groß genug ist
DU musst ihn eigentlich jedesmal vergrößern wenn de ++n; aufrufst...
-
der LPCREATESTRUCT lparam cast..das geid ned in WM_COMMAND, das geht nur in WM_CREATE
-
Und wie genau mach ich das?
Kann man das nicht mit Malloc machen? aber irgendwie verlangt der da von mir ein void oder sowas.Und wie kann ich dann die Box ohne LPCREATESTRUCT erstellen?
-
GetModuleHandle(0), der hInstance eine globale Variable machen!?
Ob sum[] groß genug ist oder nicht können wir ja schlecht wissen du zeigst uns ja nicht wie du es definiert hast. Wie dem auch sei wenn es eine feste größe hat solltest du natürlich erstmal überprüfen ob n noch im gültigen bereich liegt bevor du es als index in das array benutzt...
-
naja... ich geh halt davon aus das er sum ne feste größe gegeben hat ... und das d.h. kommt

-
Sum ist ne Variable der Klasse summand:
class summand { public: int anz; char buffer[255]; int boxwidth; int boxhight; int ableiten(); HWND hEdit; };Ich habs jetzt mit GetModuleHandle(0) versucht und dadurch lassen sich irgendwie nur 2 neue Boxen erstellen, obwohl ich ja eigentlich 10 deklariert habe.
-
Hallo.
Das Problem besteht weiterhin.
Ich kann nur eine Box hinzufügen, aber warum nicht mehr?
Es kommt kein Fehler, es passiert einfach nichts, wenn ich ein zweites mal auf den Button klicke.Hat eventuell jemand eine Idee, woran das liegen könnte.
-
Max3000 schrieb:
Sum ist ne Variable der Klasse summand
Dann zeig doch bitte auch noch, wo du den Speicher für dein summand-Array reservierst und die einzelnen Instanzen erzeugt werden...
-
Speicherreservierung hab ich so gemacht:
void *ptr; ptr=∑ ptr=malloc(100);(ich hoffe das ist nicht totaler Schwachsinn).
Von Instanzen hab ich ehrlich gesagt noch nie was gehört.
-
das ist aber totaler quatsch
-
loooooooooooooooool
-
Wie dann???
-
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;