Zum Inhalt springen

Fraunz81

Mitglieder
  • Gesamte Inhalte

    46
  • Benutzer seit

  • Letzter Besuch

Alle Inhalte von Fraunz81

  1. Deine Aussage verstehe ich nicht ganz. :confused: Kannst du mir das nochmal etwas genauer erklären?? Kann ich für jedes neue Item eine andere Grösse eingeben bzw. für jedes subItem? Wenn ich diese Grösse (int item.cchTextMax ) verändere muss ich dann ein malloc durchführen und dann den Text in die Variable pszText kopieren mit strcpy?? Ist das bezogen auf mein ListViewNotify bezogen oder wie ich ein weiters Element einfüge. Warum gerade 2 weitere Nachrichten bzw. entfernt wird??? Entfernt: von der struct oder von dem angezeigten Bereich? Danke schon mal.
  2. Habe noch etwas vergessen. So sieht das ListViewNotify(hwnd, lParam) aus: LRESULT ListViewNotify(HWND hWnd, LPARAM lParam) { LPNMHDR lpnmh = (LPNMHDR) lParam; HWND hwndListView = GetDlgItem(hWnd, ID_LISTVIEW); unsigned long j = 0; unsigned long anzahl_zeichen = 0; TCHAR *szpTemp = NULL; TCHAR *szpBindestrich = " - ", *szpStrichpunkt = "; "; switch(lpnmh->code) { case LVN_GETDISPINFO: { LV_DISPINFO *lpdi = (LV_DISPINFO *)lParam; TCHAR szString[MAX_PATH]; if(lpdi->item.iSubItem) { if(lpdi->item.mask & LVIF_TEXT) { if (lpdi->item.iSubItem == 1) lstrcpy(lpdi->item.pszText, dbD_ptr[lpdi->item.iItem].szpid); if (lpdi->item.iSubItem == 2) lstrcpy(lpdi->item.pszText, dbD_ptr[lpdi->item.iItem].szpName); if (lpdi->item.iSubItem == 3) lstrcpy(lpdi->item.pszText, dbD_ptr[lpdi->item.iItem].szpFilmlength); if (lpdi->item.iSubItem == 4) lstrcpy(lpdi->item.pszText, dbD_ptr[lpdi->item.iItem].szpVQuality); if (lpdi->item.iSubItem == 5) lstrcpy(lpdi->item.pszText, dbD_ptr[lpdi->item.iItem].szpGenre); if (lpdi->item.iSubItem == 6) { j = 0; anzahl_zeichen = 0; for(j = 0; j < dbD_ptr[lpdi->item.iItem].iAudio_count; j++) { anzahl_zeichen += strlen(*(dbD_ptr[lpdi->item.iItem].szpSprache + j)) + strlen(szpBindestrich) + strlen(*(dbD_ptr[lpdi->item.iItem].szpAQuality + j)) + strlen(szpStrichpunkt); } szpTemp = (TCHAR *) malloc(sizeof(TCHAR) * (anzahl_zeichen + 1)); //j = 0; for(j = 0; j < dbD_ptr[lpdi->item.iItem].iAudio_count; j++) { if (j == 0) strcpy(szpTemp, *(dbD_ptr[lpdi->item.iItem].szpSprache + j)); else strcat(szpTemp, *(dbD_ptr[lpdi->item.iItem].szpSprache + j)); strcat(szpTemp, szpBindestrich); strcat(szpTemp, *(dbD_ptr[lpdi->item.iItem].szpAQuality + j)); strcat(szpTemp, szpStrichpunkt); } lstrcpy(lpdi->item.pszText, szpTemp); free(szpTemp); } if (lpdi->item.iSubItem == 7) { //wsprintf(szString, "Schauspieler - Column %d", lpdi->item.iItem + 1, lpdi->item.iSubItem); //lstrcpy(lpdi->item.pszText, szString); j = 0; anzahl_zeichen = 0; for(j = 0; j < dbD_ptr[lpdi->item.iItem].iActor_count; j++) { anzahl_zeichen += strlen(*(dbD_ptr[lpdi->item.iItem].szpActor + j)) + strlen(szpStrichpunkt); } szpTemp = (TCHAR *) malloc(sizeof(TCHAR) * (anzahl_zeichen + 1)); for(j = 0; j < dbD_ptr[lpdi->item.iItem].iActor_count; j++) { if (j == 0) strcpy(szpTemp, *(dbD_ptr[lpdi->item.iItem].szpActor + j)); else strcat(szpTemp, *(dbD_ptr[lpdi->item.iItem].szpActor + j)); strcat(szpTemp, szpStrichpunkt); } lstrcpy(lpdi->item.pszText, szpTemp); free(szpTemp); } if (lpdi->item.iSubItem == 8) { //wsprintf(szString, "Besitzer - Column %d", lpdi->item.iItem + 1, lpdi->item.iSubItem); lstrcpy(lpdi->item.pszText, dbD_ptr[lpdi->item.iItem].szpUser); } if (lpdi->item.iSubItem == 9) { //wsprintf(szString, "Medienanzahl - Column %d", lpdi->item.iItem + 1, lpdi->item.iSubItem); lstrcpy(lpdi->item.pszText, dbD_ptr[lpdi->item.iItem].szpAnzahl); } if (lpdi->item.iSubItem == 10) { //wsprintf(szString, "Kurzbeschreibung - Column %d", lpdi->item.iItem + 1, lpdi->item.iSubItem); lstrcpy(lpdi->item.pszText, dbD_ptr[lpdi->item.iItem].szpText); } } } else { if(lpdi->item.mask & LVIF_TEXT) { wsprintf(szString, "%d", lpdi->item.iItem + 1); lstrcpy(lpdi->item.pszText, szString); } } } return 0; case LVN_ODCACHEHINT: { LPNMLVCACHEHINT lpCacheHint = (LPNMLVCACHEHINT)lParam; /* This sample doesn't use this notification, but this is sent when the ListView is about to ask for a range of items. On this notification, you should load the specified items into your local cache. It is still possible to get an LVN_GETDISPINFO for an item that has not been cached, therefore, your application must take into account the chance of this occurring. */ } return 0; case LVN_ODFINDITEM: { LPNMLVFINDITEM lpFindItem = (LPNMLVFINDITEM)lParam; /* This sample doesn't use this notification, but this is sent when the ListView needs a particular item. Return -1 if the item is not found. */ } return 0; } return 0; }
  3. So habe ich die LVN_GETDISPINFO - Behandlung eingebaut: LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { static HINSTANCE hInstance; static HWND hwndStatus, hwndStatusBar, hwndListView, hwndComboBox; LPSTR lpstr = "String1"; int ComboBox_Index = 0, i = 0; TCHAR *dbName = "film_dbtest"; switch(message) { case WM_CREATE: hwndListView = CreateListView(hinst, hwnd); InitListView(hwndListView); hwnd_ListView = hwndListView; break; } } break; case WM_NOTIFY: return ListViewNotify(hwnd, lParam); case WM_SIZE: case WM_COMMAND: switch(LOWORD(wParam)) { case IDM_FILE_LOGIN: DialogBox(hInstance, TEXT("LoginBox"), hwnd, LoginDlg); break; case IDM_FILE_END: DestroyWindow(hwnd); break; case IDM_EDIT_DS_ADD: DialogBox(hInstance, TEXT("Datensatz_h"), hwnd, DatensatzHDlg); ListViewItem_add(hwndListView); break; case IDM_EDIT_DS_CHANGE: DialogBox(hInstance, TEXT("Datensatz_ae"), hwnd, DatensatzAEDlg); break; case IDM_EDIT_DS_CLEAR: DialogBox(hInstance, TEXT("Datensatz_l"), hwnd, DatensatzLDlg); break; case IDM_EDIT_SEARCH: DialogBox(hInstance, TEXT("SearchBox"), hwnd, DatensatzSearchDlg); break; } return 0; case WM_DESTROY: verbindung_schliessen(); PostQuitMessage(0); return 0; } return DefWindowProc(hwnd, message, wParam, lParam); } So füge ich ein weiteres Item ein: void ListViewItem_add(HWND hwnd_ListView) { /* typedef struct _LVITEM { UINT mask; int iItem; int iSubItem; UINT state; UINT stateMask; LPTSTR pszText; int cchTextMax; int iImage; LPARAM lParam; #if (_WIN32_IE >= 0x0300) int iIndent; #endif } LVITEM, FAR *LPLVITEM; */ LPLVITEM lvItem; TCHAR szItem[10] = ""; TCHAR *szpTemp = NULL; TCHAR *szpBindestrich = " - ", *szpStrichpunkt = "; "; long lIndex = 0, i = 0, j = 0, anzahl_zeichen = 0; lvItem = (LPLVITEM) malloc(sizeof(LPLVITEM)); lvItem->mask = 0; lvItem->iSubItem = 0; lvItem->state = 0; lvItem->stateMask = 0; lvItem->pszText = ""; lvItem->cchTextMax = 0; lvItem->iImage = 0; lvItem->iItem = ListView_GetItemCount(hwnd_ListView) + 1; lIndex = ListView_InsertItem(hwnd_ListView, lvItem); for(i = 0; i < 10; i++) { switch(i) { case 0: wsprintf(szItem, "%d", lIndex); MessageBox(NULL, szItem, TEXT("Itemidex"), MB_OK); lvItem->pszText = szItem; ListView_SetItemText(hwnd_ListView, lIndex, i, szItem); break; case 1: ListView_SetItemText(hwnd_ListView, lIndex, i, dsh.szpid); break; .... case 6: //Audio j = 0; anzahl_zeichen = 0; while(*(dsh.szpSprache + j) != NULL || *(dsh.szpAQuality + j) != NULL) { anzahl_zeichen += strlen(*(dsh.szpSprache + j)) + strlen(szpBindestrich) + strlen(*(dsh.szpAQuality + j)) + strlen(szpStrichpunkt); j++; } szpTemp = (TCHAR *) malloc(sizeof(TCHAR) * (anzahl_zeichen + 1)); j = 0; while(*(dsh.szpSprache + j) != NULL || *(dsh.szpAQuality + j) != NULL) { if (j == 0) strcpy(szpTemp, *(dsh.szpSprache + j)); else strcat(szpTemp, *(dsh.szpSprache + j)); strcat(szpTemp, szpBindestrich); strcat(szpTemp, *(dsh.szpAQuality + j)); strcat(szpTemp, szpStrichpunkt); j++; } ListView_SetItemText(hwnd_ListView, lIndex, i, szpTemp); free(szpTemp); break; case 7: //Schauspieler j = 0; anzahl_zeichen = 0; while(*(dsh.szpActor + j) != NULL) { anzahl_zeichen += strlen(*(dsh.szpActor + j)) + strlen(szpStrichpunkt); j++; } szpTemp = (TCHAR *) malloc(sizeof(TCHAR) * (anzahl_zeichen + 1)); j = 0; while(*(dsh.szpActor + j) != NULL) { if (j == 0) strcpy(szpTemp, *(dsh.szpActor + j)); else strcat(szpTemp, *(dsh.szpActor + j)); strcat(szpTemp, szpStrichpunkt); j++; } ListView_SetItemText(hwnd_ListView, lIndex, i, szpTemp); free(szpTemp); break; .... case 10: ListView_SetItemText(hwnd_ListView, lIndex, i, dsh.szpText); break; } } } Das neue Item wird hinzugefügt, nur der Text wird nicht richtig dargestellt bzw wenn ich zu dem neuen Item scrolle beendet sich mein Programm mit einem Fehler: read kann nicht ausgeführt werden. Ich denke das es mit dem WM_NOTIFY zusammen hängt, da 2 verschiedene structs verwendet werden.
  4. Ich glaube ich habe so ein virtuelles ListView eingebaut. Bei so einem ListView werden nur die Daten geholt, die im Fenster Platz haben, verstehe ich das richtig?? Erst wenn ich hinuterscrolle werden die nächsten Daten eingelesen? Kann es deswegen erst dann zu Fehler kommen, wenn man weiter hinuterscrollt, die wie folgt kurz beschrieben sind. 1. Ist der Text auf eine bestimmte Länge begrenzt, weil wenn ich zu der Zeilennummer 67 gescrollt habe meldet mein Programm einen Fehler (read konnte nicht durchgeführt werden) und beendet sich. 2. Bei der Zeilennummer 187 beendet sich mein Programm mit dem Fehler: unbekannter Softwarefehler und eine Fehlernummer dazu, ich glaub das war 409. Diese Fehler bekomme ich wenn ich die Schauspieler in das ListView auch eintragen lasse. Die Schauspieler werden zu jedem Film wie folgt eingetragen: z. B.: id Filmbezeichnung ... Schauspieler Kurztext 1 film1 Actor1; Actor2; Actor3; ... kurze Beschreibung Habe ich vielleicht zu viele Daten in das ListView schon geschrieben? Muss ich mehr Speicher für das ListView anfordern? Geht das überhaupt oder wird das von Windows intern erledigt? Ich hoffe ich habe nicht zu verwirrend geschrieben. Danke schon mal.
  5. Also ich weis nicht was ein virtuelles ListView ist. Genau so weis ich auch nicht wie du das erkennst, dass es für ein virtuelles ListView gehört. Kannst du mir sagen an was man das kennt???? :confused: void InsertItem_func(HWND hwnd_Dlg) { LPLVITEM lvItem; HWND hwnd_ListView = NULL, hwnd_Parent = NULL; long Index = 0; TCHAR szIndex[10] = ""; hwnd_Parent = GetParent(hwnd_Dlg); hwnd_ListView = Dlg..(hwnd_Parent, ID_LISTVIEW); lvItem = (struct _LVITEM *) malloc(sizeof(_LVITEM)); Index = ListView_InsertItem(hwnd_ListView, lvItem); //Hier bekomme ich immer ein -1 als Ergebnis //ListView_SetItemText(HWND hwnd, int i, int iSubItem, LPCSTR pszText); wsprintf(szIndex, "%d", Index); ListView_SetItemText(hwnd_ListView, Index, 0, szIndex); ListView_SetItemText(hwnd_ListView, Index, 1, dsh.szpName); ListView_SetItemText(hwnd_ListView, Index, 2, dsh.szpFilmlength); ... } So irgendwie habe ich das versucht zu lösen. Aber jetzt habe ich gelesen das ListView_SetItemText eine LVN_GETDISPINFO notification message auslöst und ich glaub da wird ein WM_NOTIFY ausgelöst. Vorschläge???
  6. Ich glaube ich habe etwas gefunden in der MSDN. Nur leider weis ich nicht ganz wie ich das verwenden soll, da ich 2 verschiedene structs verwendet. Eine davon verwendet schon das WM_NOTIFY. Wie könnte ich den folgenden Code umschreiben um ohne dem WM_NOTIFY arbeiten zu können? Hier der Link zur Info: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/commctls/listview/listview_using.asp Hier das Beispiel von der MSDN: // This code snippet adds three items, each with three // subitems, to a list-view control. // hWndListView - handle to the list-view control. // The following application-specific structure, // PETINFO, is used in the snippet. typedef struct tagPETINFO { char szKind[10]; char szBreed[50]; char szPrice[20]; }PETINFO; // A PETINFO variable is declared and initialized as // follows: PETINFO rgPetInfo[ ] = { {"Dog", "Poodle", "$300.00"}, {"Cat", "Siamese", "$100.00"}, {"Fish", "Angel Fish", "$10.00"}, }; // Some code to create the list-view control. // Initialize LVITEM members that are common to all // items. lvI.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM | LVIF_STATE; lvI.state = 0; lvI.stateMask = 0; // Initialize LVITEM members that are different for each item. for (index = 0; index < 3; index++) { lvI.iItem = index; lvI.iImage = index; lvI.iSubItem = 0; lvI.lParam = (LPARAM) &rgPetInfo[index]; lvI.pszText = LPSTR_TEXTCALLBACK; // sends an // LVN_GETDISP // message. if(ListView_InsertItem(hWndListView, &lvI) == -1) return NULL; } // Because the application specifies LPSTR_TEXTCALLBACK, it // sends LVN_GETDISPINFO notification messages. The // application must process these notification messages and // supply the text for the subitems. // The text is stored in a previously listed // application-defined structure called PETINFO. case WM_NOTIFY: switch (((LPNMHDR) lParam)->code) { case LVN_GETDISPINFO: switch (((LPNMLVDISPINFO)lParam)->item.iSubItem) { case 0: plvdi->item.pszText = rgPetInfo[plvdi->item.iItem].szKind; break; case 1: plvdi->item.pszText = rgPetInfo[plvdi->item.iItem].szBreed; break; case 2: plvdi->item.pszText = rgPetInfo[plvdi->item.iItem].szPrice; break; default: break; } return 0; } // NOTE: in addition to setting pszText to point to // the item text, you could copy the item text into pszText // using StringCchCopy. For example: // StringCchCopy(rgPetInfo[plvdi->item.iItem].szKind, // sizeof(rgPetInfo[plvdi->item.iItem].szKind), // plvdi->item.pszText); Danke schon mal.
  7. Ich habe ein ListView mit 10 subItems erstellt und habe es schon mit einigen Zeilen befüllen lassen. Jetzt möchte ich aber noch items hinzufügen können. Wie funktioniert das, bei mir liefert es immer ein -1 zurück. Ich hätte das mit einem SetItem Macro versucht und eine LVITEM struct verwendet. Dann wollte ich die Zeile mit dem Macro SetTextItem befüllen wollen. Vielen Dank im voraus.
  8. Schade das es nicht in einer Abfrage funktioniert. Wenn du mit Schnittmenge das addieren der Einzelergebnisse meinst, dann hast du recht, dass ist nicht erwünscht. Ich muss nämlich wissen wie viele Audiospuren/ Schauspieler je Film in der Datenbank eingetragen sind um dann dynamisch Speicher dafür reservieren zu können. Trotzdem, DANKE für die schnelle Antwort.
  9. Wenn ich eine Abfrage formuliere, kann ich nur so abfragen das zuerst besitzerid = 1 und nach videoformatid und filmbezeichnung sortiert wird. Dann besitzerid = 2. Dann besitzerid = 3 usw. Ich möchte aber sagen das z. B.: besitzerid 1 und 2 egal sind und nur nach videoformatid und filmbezeichnung sortiert wird und dann erst die besitzerid 3 aufgelistet wird. bsp.: filmbezeichnung videoformatid besitzerid film1 2 1 film2 2 2 film3 2 1 film4 2 1 film5 2 1 film6 2 2 film7 3 1 film8 3 2 film9 3 1 film10 3 1 film11 3 1 film12 3 2 film13 3 3 film14 3 3 film15 3 3 film16 3 4 film17 3 4 film18 3 4 Ich weis, dass meine Erklärungen meisten nicht ganz verständlich sind, sorry dafür. Ich hoffe das es jetzt verständlicher ist. Wenns noch nicht verständlich genug war, bitte schreiben. Sonst hoffe ich das ihr eine Antwort für mich habt. Danke schon mal.
  10. Also ich hab das zur Zeit so gelöst das ich die Audiospuren bzw Schauspieler nebeneinander schreiben lasse. Jetzt hatte ich aber das Problem, das bei einer id 60 Schauspieler vorgekommen sind und mir einen Fehler gemeldet habe wenn ich zu dieser id gescrollt habe: read konnte nicht durchgeführt werden. Ich lasse den Text in eine lv_dispinfo struct schreiben, ist die auf eine bestimmte anzahl an zeichen begrenzt? Und wenn ich noch weiter hinunterscrolle, bei id 186, bekomme ich einen Unbekannten Softwarefehler. Fehlernummer weis ich jetzt leider nicht, ich glaube irgend etwas mit 409 oder so. Auf was kann das liegen, auf dem ListView - Control, oder wieder auf meiner dynamischen Speicherreservierung. Danke schon mal im voraus.
  11. Hallo! Ich benötige eine Abfrage für meine Datenbank, dabei möchte ich 3 Tabellen verknüpfen (join). In der ersten Tabelle habe ich eine forlaufenden ID-Nummer (auto_increment). In den anderen 2 Tabellen kommen diese IDs öfters vor. Jetzt brauche ich eine Abfrage in der ich von den beiden Tabellen jeweils die Anzahl der vorkommenden IDs addiert. Zur Zeit mach ich das mit 2 Abfragen, kann man das auf eine zusammen legen? So mach ich es zur Zeit: Select b.hauptdarstellerid, count(b.hauptdarstellerid) from filmtable a, schauspieler b where a.id = b.hauptdarstellerid group by b.hauptdarstellerid order by a.besitzerid, a.videoformatid, a.filmbezeichnung, b.hauptdarsteller; Select b.audiospurenid, count(b.audiospurenid) from filmtable a, audiotable b where a.id = b.audiospurenid group by b.audiospurenid order by a.besitzerid, a.videoformatid, a.filmbezeichnung, b.audiospuren; Bei mir zählt er das sonst zusammen und das kann ich nicht brauchen. Wenn das nicht gehen sollte, ist es auch ok, aber meine 2. Frage ist mir sehr wichtig. 2. Frage: Dann hätte ich eine Spezialabfrage benötigt. In meiner Datenbank können mehrere Besitzer eingetragen werden. Ich möchte eine Abfrage zusammenbasteln mit der es möglich ist 2 besitzerids zusammen zu nehmen und nach videoformatid und filmbezeichnung sortieren zu lassen. Weitere besitzerids sollen getrennt nach videoformatid und filmbezeichnung sortiert werden. Weis jemand ob das möglich ist? Wenn ja, vielleicht mit einem Beispiel. Meine Tabelle heißt: filmtable Beinhaltet diese Felder: id, filmbezeichnung, filmlaenge, videoformatid, filmart, besitzerid, medienanzahl, kurztext Danke schon mal in voraus.
  12. Wenn es nicht rein OOP mäßig sein soll, hilft dir vielleicht diese Seite weiter Das Buch nennt sich "c von a bis z". http://pronix.de/modules/C/openbook/
  13. ComboBoxen selber erstellen. Wie meinst du dass? Ich dachte mir die ComboBoxen über die einzelnen Zellen positionieren, aber ich habe eben keine Ahnung wie ich das anstellen soll. Listcontrol komplett selbst zu malen Wie "malt" man ein ListControl selber. Ich hab zwar das Buch von Petzold - Windows Programmierung, da steht etwas drinnen über Subclassing, ist das was ich brauche? Das ListView hab ich mir von Projekten von CodeProjekt und MSDN irgenwie zusammen gestoppelt, aber wenn du sagst das ich die ComboBoxen in dem ListView nicht wirklich darstellen kann, wird mir nichts anderes übrig bleiben diese ListView selbst zu basteln. Aber nur wie??? :confused:
  14. Das SDK habe ich zuhause, das kann ich jederzeit studieren. Ich dachte da an Infos die nicht in der MSDN stehen. Vielleicht hat da jemand schon etwas versucht und hat Ansätze, die er mir vermitteln könnte. Andere Frage: Wenn ich keine ComboBoxen verwende, wie kann ich mehrere Hauptdarsteller in einer Zelle untereinander darstellen?? Müsste ich die Darsteller mit einem '\r' , '\n' oder '\n\r' getrennt in einen String schreiben und den dann einer Zelle (subitem) zuweisen? Trotzdem Danke, Mächtiger Pirat.
  15. Hallo zusammen! Kann mir jemand sagen wo ich infos zu ListView's bekomme. Die Infos, die ich gefunden habe wird meisten die MFC verwendet, die will ich jedoch nicht verwenden. Ich benötige ein ListView mit 10 Spalten, in 2 Spalten davon sollen Comboboxen bzw ListBoxes in Einsatz kommen. Kann man ListBoxen dazu bringen, dass sie sich aufklappen lassen oder geht das nur bei ComboBoxen? Grund: Weil ein Film z. B. mehrere Hauptdarsteller, mehrere Audiospuren hat. Ein paar Infos zu ListView's habe ich in der MSDN gefunden, aber nicht wirklich viel. Die 10 Spalten habe ich auch schon und mit einer Laufvariable init. Jedoch weis ich nicht wie ich das mit den ComboBoxen machen soll. Vielleicht ein Array of ComboBoxes?? Vielen Dank schon mal.
  16. Gestern habe ich meine Fehler gefunden. Wer ein wenig rätseln will wo der Fehler ist, hier die fehlerhaften Anweisungen: dsae.szpSprache = (TCHAR **) malloc(sizeof(TCHAR *) (anzahl_reihen + 1)); dsae.szpAQuality = (TCHAR **) malloc(sizeof(TCHAR *) (anzahl_reihen + 1)); dsae.szpActor = (TCHAR **) malloc(sizeof(TCHAR *) (anzahl_reihen + 1)); Und hier die korrigierte Version: dsae.szpSprache = (TCHAR **) malloc(sizeof(TCHAR *) [B]*[/B] (anzahl_reihen + 1)); dsae.szpAQuality = (TCHAR **) malloc(sizeof(TCHAR *) [B]*[/B] (anzahl_reihen + 1)); dsae.szpActor = (TCHAR **) malloc(sizeof(TCHAR *) [B]*[/B] (anzahl_reihen + 1)); Warum mir der VC6 - Compiler (Autorenversion) da keinen Fehler gemeldet hat, verstehe ich nicht ganz. Hat der Compiler bei den hier gezeigten Anweisungen eine Typumwandlung druchführen wollen??? Und warum hat er bei der Speicherbelegung nicht schon einen Fehler gemeldet??? Mein CBuilderX - Compiler von Borland hat mit dem Fehler "Nicht-Funktion" die Compilierung beendet. Auf jeden Fall vielen Dank an Klotzkopp, du hast mich auf die Idee gebracht die anderen 2 Funktionen heraus zu nehmen. :uli
  17. if (row != "") Anfangs dachte ich das dieser Wert NULL ist jedoch wird ein Leerzeichen übergeben. Warum kann ich mir die Abfrage != NULL sparen wenn ich free aufrufe? Ich dachte, wenn ich zweimal einen Speicherbereich freigebe bzw. wenn noch kein Speicherbereich mit malloc alokiert wurde, kann es zu Probleme kommen. Kannst du soviel wie möglich aus dem Code rauswerfen, so dass der Fehler immer noch auftritt? Ich werde versuchen so viel Code als möglich herauszunehmen und poste den Code morgen dann nochmal. Hoffentlich stolper ich über diesen Fehler und kann das entgültig korrigieren. Wer in seine C, C++ Programme MySQL verwenden will der findet auf folgender Seite gute infos: http://pronix.de/modules/C/openbook/
  18. In der Verarbeitung der Daten wird es nicht liegen. (funktion void data_copy_to_controls(HWND hDSAEDlg) ) Habe ich deshalb wegelassen, da ich sonst nicht unter die 10000 Zeichen kommen. Ich entschulidge mich gleich für den Programmierstil und die Unübersichtlichkeit search_filmtable_id in dieser Funktion tritt der Fehler auf wenn man in diese das zweite Mal dann wieder aufruft um den Speicher wieder freizugeben und neu zu alokieren. BOOL CALLBACK DatensatzAEDlg(HWND, UINT, WPARAM, LPARAM); //Funktionen zum suchen der angeforderten Daten im "Datensatz ändern"-Dialog void search_filmtable_id(HWND); void search_audiotable_id(); void search_schauspieler_id(); void data_copy_to_controls(HWND); void search_filmtable_id(HWND hDSAEDlg) { unsigned long anzahl_reihen = 0; unsigned int i = 0; int iIndex = 0, iLength = 0; MYSQL_ROW row; MYSQL_RES *mysql_res; char *query; //*string; char *select = "SELECT * FROM filmtable WHERE id = "; HWND hwndDSAE = NULL; //Handle zu IDC_CHANGE_ID ermitteln //ListBox szpid hwndDSAE = GetDlgItem(hDSAEDlg, IDC_CHANGE_ID); //Prüfen, ob IDC_ADD_OWNER Listbox text enthält if ((iIndex = SendMessage(hwndDSAE, LB_GETCURSEL, 0, 0)) >= 0) { iLength = SendMessage(hwndDSAE, LB_GETTEXTLEN, iIndex, 0); if (dsae.szpid != NULL) { free(dsae.szpid); dsae.szpid = NULL; } dsae.szpid = (TCHAR *) malloc(sizeof(TCHAR) * (iLength + 1)); SendMessage(hwndDSAE, LB_GETTEXT, iIndex, (LPARAM) dsae.szpid); } query = (char *) malloc(strlen(select) + strlen(dsae.szpid) + 1); strcpy(query, select); strcat(query, dsae.szpid); /* Jetzt die Anfrage an den Datenbankserver */ mysql_query(mysql, query); check_error(); /* Daten der Anfrage abholen */ mysql_res = mysql_store_result(mysql); check_error(); /* Anzahl der gefundenen Datensätze ermitteln */ anzahl_reihen = (unsigned long) mysql_num_rows (mysql_res); //printf ("Anzahl gefunden: %lu\n\n", anzahl_reihen); /* Gefundener Datensatz bzw. Datensätze ausgeben */ while ((row = mysql_fetch_row (mysql_res)) != NULL) { /* Einzelne Spalten der Zeile ausgeben */ for (i = 0; i < mysql_num_fields(mysql_res); i ++) switch(i) { case 0: //Hier kann man die ID erfassen break; case 1: //printf ("%60s ",row[i]); //Filmbezeichnung if (dsae.szpName != NULL) { free(dsae.szpName); dsae.szpName = NULL; } dsae.szpName = (TCHAR *) malloc(sizeof(TCHAR) * (strlen(row[i]) + 1)); wsprintf(dsae.szpName, "%s", row[i]); break; case 2: //printf ("%5s ",row[i]); //Filmlänge if (dsae.szpFilmlength != NULL) { free(dsae.szpFilmlength); dsae.szpFilmlength = NULL; } dsae.szpFilmlength = (TCHAR *) malloc(sizeof(TCHAR) * (strlen(row[i]) + 1)); wsprintf(dsae.szpFilmlength, "%s", row[i]); break; case 3: //printf ("%5s ",row[i]); //VideoformatID //dsae.szpVQuality = (TCHAR *) malloc(sizeof(TCHAR) * (strlen(row[i]) + 1)); if (dsae.szpVQuality != NULL) { free(dsae.szpVQuality); dsae.szpVQuality = NULL; } //wsprintf(dsae.szpVQuality, "%s", row[i]); dsae.iVideo = str2int(row[i]); dsae.szpVQuality = (TCHAR *) malloc(sizeof(TCHAR) * (strlen(*(video.format + (dsae.iVideo - 1))) + 1)); wsprintf(dsae.szpVQuality, "%s", *(video.format + (dsae.iVideo - 1))); break; case 4: //printf ("%5s ",row[i]); //FilmartID //dsae.szpGenre = (TCHAR *) malloc(sizeof(TCHAR) * (strlen(row[i]) + 1)); //wsprintf(dsae.szpGenre, "%s", row[i]); if (dsae.szpGenre != NULL) { free(dsae.szpGenre); dsae.szpGenre = NULL; } dsae.iGenre = str2int(row[i]); if (dsae.iGenre) { MessageBox(NULL, row[i], TEXT("In der If Anweisung Genre"), MB_OK); dsae.szpGenre = (TCHAR *) malloc(sizeof(TCHAR) * (strlen(*(genre.art + dsae.iGenre - 1)) + 1)); wsprintf(dsae.szpGenre, "%s", *(genre.art + dsae.iGenre - 1)); } else break; case 5: //printf ("%5s ",row[i]); //BesitzerID //dsae.szpUser = (TCHAR *) malloc(sizeof(TCHAR) * (strlen(row[i]) + 1)); //wsprintf(dsae.szpUser, "%s", row[i]); if (dsae.szpUser != NULL) { free(dsae.szpUser); dsae.szpUser = NULL; } dsae.iUser = str2int(row[i]); //MessageBox(NULL, row[i], TEXT("UserID"), MB_OK); //MessageBox(NULL, *(besitzer.user + dsae.iUser - 1), TEXT("User"), MB_OK); dsae.szpUser = (TCHAR *) malloc(sizeof(TCHAR) * (strlen(*(besitzer.user + dsae.iUser - 1)) + 1)); wsprintf(dsae.szpUser, "%s", *(besitzer.user + dsae.iUser - 1)); break; case 6: //printf ("%5s ",row[i]); //Medienanzahl if (dsae.szpAnzahl != NULL) { free(dsae.szpAnzahl); //dieses free funktioniert dsae.szpAnzahl = NULL; } //dsae.iA = str2int(row[i]); dsae.szpAnzahl = (TCHAR *) malloc(sizeof(TCHAR) * (strlen(row[i]) + 1)); wsprintf(dsae.szpAnzahl, "%s", row[i]); break; case 7: //printf ("%50s ",row[i]); //Kurzbeschreibung if (dsae.szpText != NULL) { free(dsae.szpText); //dieses free funktioniert nicht mehr???? dsae.szpText = NULL; } if (row[i] != "") { dsae.szpText = (TCHAR *) malloc(sizeof(TCHAR) * (strlen(row[i]) + 1)); wsprintf(dsae.szpText, "%s", row[i]); //strcpy(dsae.szpText, row[i]); } else break; } //printf("\n"); } /* free(dsae.szpFilmlength); dsae.szpFilmlength = NULL; free(dsae.szpName); dsae.szpName = NULL; free(dsae.szpAnzahl); dsae.szpAnzahl = NULL; free(dsae.szpText); dsae.szpText = NULL; */ /* Speicherplatz wieder freigeben */ mysql_free_result(mysql_res); // free(string); free(query); } void search_audiotable_id() { unsigned long anzahl_reihen; unsigned int i = 0, j = 0; MYSQL_ROW row; MYSQL_RES *mysql_res; char *query; //, *string; char *select = "SELECT * FROM audiotable where audiospurenid ="; query = (char *) malloc(strlen(select) + strlen(dsae.szpid) + 1); strcpy(query, select); strcat(query, dsae.szpid); /* Jetzt die Anfrage an den Datenbankserver */ mysql_query(mysql, query); check_error(); /* Daten der Anfrage abholen */ mysql_res = mysql_store_result(mysql); check_error(); /* Anzahl der gefundenen Datensätze ermitteln */ anzahl_reihen = (unsigned long) mysql_num_rows (mysql_res); dsae.szpSprache = (TCHAR **) malloc(sizeof(TCHAR *) (anzahl_reihen + 1)); dsae.szpAQuality = (TCHAR **) malloc(sizeof(TCHAR *) (anzahl_reihen + 1)); //printf ("Anzahl gefunden: %lu\n\n", anzahl_reihen); /* Gefundener Datensatz bzw. Datensätze ausgeben */ while ((row = mysql_fetch_row (mysql_res)) != NULL) { /* Einzelne Spalten der Zeile ausgeben */ for (i = 0; i < mysql_num_fields(mysql_res); i++) { switch(i) { case 0: //Hier kann man die AudiospurenID erfassen break; case 1: //printf ("%60s ",row[i]); //Audiospuren *(dsae.szpSprache + j) = (TCHAR *) malloc(sizeof(TCHAR) * (strlen(row[i]) + 1)); wsprintf(*(dsae.szpSprache + j), "%s", row[i]); break; case 2: //printf ("%5s ",row[i]); //Audioqualität *(dsae.szpAQuality + j) = (TCHAR *) malloc(sizeof(TCHAR) * (strlen(row[i]) + 1)); wsprintf(*(dsae.szpAQuality + j), "%s", row[i]); break; } //printf("\n"); } j++; } *(dsae.szpSprache + anzahl_reihen) = NULL; *(dsae.szpAQuality + anzahl_reihen) = NULL; /* Speicherplatz wieder freigeben */ mysql_free_result(mysql_res); // free(string); free(query); } void search_schauspieler_id() { unsigned long anzahl_reihen; unsigned int i = 0, j = 0; MYSQL_ROW row; MYSQL_RES *mysql_res; char *query; //, *string; char *select = "SELECT * FROM schauspieler where hauptdarstellerid ="; query = (char *) malloc(strlen(select) + strlen(dsae.szpid) + 1); strcpy(query, select); strcat(query, dsae.szpid); /* Jetzt die Anfrage an den Datenbankserver */ mysql_query(mysql, query); check_error(); /* Daten der Anfrage abholen */ mysql_res = mysql_store_result(mysql); check_error(); /* Anzahl der gefundenen Datensätze ermitteln */ anzahl_reihen = (unsigned long) mysql_num_rows (mysql_res); dsae.szpActor = (TCHAR **) malloc(sizeof(TCHAR *) (anzahl_reihen + 1)); //printf ("Anzahl gefunden: %lu\n\n", anzahl_reihen); /* Gefundener Datensatz bzw. Datensätze ausgeben */ while ((row = mysql_fetch_row (mysql_res)) != NULL) { /* Einzelne Spalten der Zeile ausgeben */ for (i = 0; i < mysql_num_fields(mysql_res); i ++) { switch(i) { case 0: //Hier kann man die HaupdarstellerID erfassen break; case 1: //printf ("%60s ",row[i]); //Hauptdarsteller *(dsae.szpActor + j) = (TCHAR *) malloc(sizeof(TCHAR) * (strlen(row[i]) + 1)); wsprintf(*(dsae.szpActor + j), "%s", row[i]); break; } //printf("\n"); } j++; } *(dsae.szpActor + anzahl_reihen) = NULL; /* Speicherplatz wieder freigeben */ mysql_free_result(mysql_res); // free(string); free(query); }
  19. Hat noch jemand eine Idee was falsch sein kann?? Kann es daran liegen dass eine Struktur einen zusammenhängenden Speicher benötigt? Ich habe gelesen das ein Windowsprogramm nur einen 1MB grossen HEAP - Speicher zugewiesen bekommt und ich vielleicht schon zu viel reserviert habe und dadurch nicht den ganzen Speicher wieder freigeben kann. Wenn ja, wie reserviere ich einen zweiten HEAP - Speicher unter Windows XP. Oder ist das SP2 von Windows XP schuld? Hat sich irgend etwas geändert, was ich nicht berücksichigt habe? Vielleicht wisst ihr ein paar Internetseiten wo ich nachlesen könnte?
  20. Ich glaube zwar nicht das ich zu wenig Speicher reserviert habe, da das freigeben funktioniert wenn ich die Elemente in der selben Funktion zum Schluss noch freigebe. Aber das könnte ich heute abend bzw. morgen dann noch mal testen. Das Problem tritt erst auf wenn ich wieder in diese Funktion zurückkehre und dann erst die Elemente freigebe, bevor ich ein weiteres Mal Speicher alokiere. Beispiel: funktion1() { //wenn vor dem malloc freigeben wird, funkt es nicht if (dsae.szpAnzahl != NULL) { free(...); ...szpAnzahl = NULL; } //funkt noch if (dsae.szpText != NULL) { free(...); //dieser Aufruf verursacht den Crash ...szpText = NULL; } //funkt noch //hier werden für die Elemente //szpid, szpName, szpFilmlength, szpVQuality, szpGenre, szpUser, //szpAnzahl, szpText mit malloc Speicher reserviert //wenn hier freigegeben wird funkt es } funktion2() { //hier werden für die Elemente //szpSprache, szpQuality //mit malloc Speicher reserviert } funktion3() { //hier werden für die Elemente //szpActor //mit malloc Speicher reserviert } funktion4() { //Wird der Button gedrückt werden die drei Funktionen aufgerufen funktion1(); funktion2(); funktion3(); //Verarbeitung der Daten } Die String Klasse will ich nicht verwenden, da ich mich zu wenig damit beschäftige und ich mit den Pointern mehr vertraut machen will. Danke für die schnellen Antworten.
  21. Hallo! Bin neu in diesem Forum. Ich habe eine globale Struktur wie folgt deklariert: struct _DatensatzAE { unsigned int iGenre; //int-Wert des Genres in der Tabelle Filmtable unsigned int iVideo; //int-wert des Videoformats unsigned int iUser; //int-wert des Usernamen TCHAR *szpid; //id in Zeichen formuliert TCHAR *szpName; //Bezeichnung des Films TCHAR *szpFilmlength; //Länge des Films in Minuten TCHAR *szpVQuality; //Videoqualität des Films TCHAR *szpGenre; //Das Filmgenre TCHAR **szpSprache; //Array für die angegebenen Sprachen des Films TCHAR **szpAQuality; //Audioqualität der einzelnen Sprachen zum Film TCHAR **szpActor; //Array für die Schauspieler TCHAR *szpUser; //ausgewählte Besitzer aus der ListBox TCHAR *szpAnzahl; //Anzahl der Medien auf dem sich der Film befindet TCHAR *szpText; //Kurzbeschreibung zum Film } dsae = { 0, 0, 0, NULL, NULL, NULL, NULL, NULL , NULL, NULL, NULL, NULL, NULL, NULL}; In drei verschiedenen Funktionen stelle ich mittels malloc für diese TCHAR's Speicher zur Verfügung. (Die Daten frage ich von einer MySQL Datenbank ab. Es kann dadurch sein das einige Felder ein "\n" enthalten, was so viel heißt es ist leer.) Mein Problem bei der Sache ist, wenn ich wieder in eine Funktion zurückkehre, in der ich Speicher alokieren möchte, gebe ich den Speicher für die einzelnen Elemente wieder frei. Hier liegt das Problem, wenn ich szpAnzahl freigebe funkt es noch, wenn ich dann in weiterer folge szpText freigeben will stürzt mein Programm mit Access Violation (0xC0000005) ab. Gebe ich jedoch den Speicher der einelnen Elemente noch bevor die Funktion zuende ist wieder frei funktioniert die free-Anweisung. Ich brauche die Daten jedoch noch in einer Anderen Funktion. Wenn jemand eine Erklärung dazu hätte wäre das ganz toll. Danke. PS.: Die Elemente werden nicht der Reihe nach, so wie sie in der Struct aufgelistet sind, mit malloc/free alokiert/freigeben.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Weiterlesen  

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...