
vinc
Mitglieder-
Gesamte Inhalte
33 -
Benutzer seit
-
Letzter Besuch
-
hi! ich versuche für eine toolbar eine kontext-sensitive hilfe zu realisieren. dazu möchte ich die htmlhelp-api mit dem kommando HH_TP_HELP_WM_HELP verwenden: HtmlHelp(hwndToolbar, szHelpDir, HH_TP_HELP_WM_HELP, (DWORD)(LPVOID)&ids) ; mit "ids": DWORD ids[] = { uiCmdID[0], 501, uiCmdID[1], 502, uiCmdID[2], 503, 0, 0 }; uiCmdID[] sind die toolbar button IDs und 501... sind die topic IDs. ich erhalte diese fehlermeldung: "no help ID matches control ID #3000". dabei ist meine hilfe datei in ordnung, denn ich habe sie mit einem dialog mit normalen buttons getestet, wobei die funktion, wie oben beschrieben funktioniert. weiß jemand was hier falsch läuft? danke!
-
teste in deiner do-while-schleife auf NULL nicht auf ungleich NULL!!! das sollte zumindest für dein erstes problem helfen
-
vernünftige Anleitung -> C++ Datenbankzugriff
vinc antwortete auf xcvbm's Thema in C++: Compiler, IDEs, APIs
die klasse CRecordset (das ist die, die der anwendungsassistent erzeugt) bietet nur sehr eingeschränkte odbc-funktionen. tabellen und spalten müssen bereits existieren und man kann nur noch die einträge (records) bearbeiten, d.h. erzeugen, ansehen, löschen. um tabellen und spalten anlegen zu können, muss man die klasse CDatabase verwenden. dafür gibt es, glaube ich, keinen assistenten. das geht nur von hand. an dieser stelle mal wieder ein verweis auf die msdn, stichwort "CDatabase". -
für cin gibt es die methode ignore (), d.h. nach cin >> p; ein cin.ignore (); dadurch wird das return, das mit cin >> p; nicht aus dem puffer entfernt wurde, eliminiert. ansonsten wird das return sofort in der zweiten funktion verwendet und somit ist eine eingabe nicht mehr möglich. :eek:
-
hm, der vergleich an sich ist schon ok, führt nur nicht zum gewünschten ziel :OD die zuweisung zu beginn ist allerdings etwas.. naja; also wenn schon dann anzahl 4 wegen der abschließenden 0! mein vorschlag: char Fehler_code[] = "\t1\t"; if(strcmp (Zeichen, Fehler_code) != 0) { Fehler++; } wobei Zeichen ein char-array sein muss. und das sollte dann klappen :cool:
-
Parameterliste eines Funktionskopfes bei einem mehrdimensionalen Array
vinc antwortete auf CyberDemon's Thema in C und C++
tja, da müßte man jetzt erstmal wissen, welchen datentyp a und b haben. wirklich schlau werde ich aus diesen zeilen eigentlich nicht. sind a und/oder b attribute der klasse? ansonsten folgende möglichkeiten: a + b attribute d. klasse: Set_Data_2(void) a attr. d. kl.: Set_Data_2(datentyp b attr. d. kl.: Set_Data_2(void), in der implementierung: return a; a + b nicht attr. d. kl.: Set_Data_2(datentyp a, datentyp , in der implementierung: return a; :confused: -
wahrscheinlich ist das einfachste, eine datei mit dem zurückzugebenden wert zu erzeugen, die dann von einem anderen programm ausgewertet wird. ist zwar nicht doll, aber funktioniert :WD
-
ich glaube nicht das "system ()" funktioniert. schließlichlich ist rückgabeparameter vom typ "int" und wie quetscht man da "hallo" rein??? wie sieht dein "return ()" denn aus?
-
ich denke "main (int argc, char *argv[])" wird dir hier nicht helfen. das problem ist, dass programme mit grafischer oberfläche, wie sie bei borland builder oder bei ms visual studio erzeugt werden nicht mit "main ()" arbeiten, sondern z.b. mit "WinMain (...)". ich weiß das jetzt nicht genau, aber entweder kommt man über die "WinMain (...)" an die kommandozeilenparameter oder es gibt dazu eine funktion wie "GetCommandLine". schau dazu am besten mal in die builder-hilfe, da sollte sowas eigentlich drin stehen. zu main (int argc, char *argv[])": argc enthält die anzahl der übergebenen parameter + 1 für den programmnamen; in dem array argv befinden sich zeiger auf die eigentlilchen parameter. dazu sollte eigentlich in jedem halbwegs ordentlichem lehrbuch oder tutorial zu c/c++ eine erklärung existieren! die ini-datei einfach als ascii-datei einlesen und dann auswerten :bimei
-
und schon wieder ich :OD die funktion ProcessMessageFilter () aus o.g. kb-howto nachfolgend ändern dann dürtfe es gehen: if (lpMsg->message == WM_KEYDOWN) { TRACE("Got WM_KEYDOWN\n"); switch (lpMsg -> wParam) { case VK_F2: AfxMessageBox("F2 taste gedrueckt"); break; case VK_F3: AfxMessageBox("F3 taste gedrueckt"); break; default: break; } }
-
schau dir mal in der kb den folgenden Artikel an: HOWTO: How to Trap WM_KEYDOWN Messages in a CDialog (Q117563) da steht im wesentlichen drin, dass die "normale" tastaturabfrage nicht funktioniert und eine methode wie es doch geht. hab das mal so ausprobiert und man bekommt zumindest die rückmeldung, dass eine taste gedrückt wurde (TRACE...) ich habe allerdings noch nicht herausgefunden wie der zugehörige tasen-code ermittelt werden kann. onkeydown funktioniert nach dieser operation nämlich immer noch nicht (wahrscheinlich wird es das nie). Vielleicht weiß ja jemand wie es auf dieser grundlage weiter geht :marine
-
schade jetzt wollte ich gerade einen link rausschicken :OD du siehst doch am rückgabewert von connect (), ob selbiger mit dem socket funktioniert hat (>=0) und folglich mit welchem socket als erstes ein connect geklappt hat. nun, wie auch immer. ich hab mal ein bisserl was zusammen geschustert, was dir hoffentlich hilft: .... const int nPortCounter = 5; struct fd_set writefds; struct timeval timeout; int selectres; /* Socket */ for (i = 0; i < nPortCounter; i++) { if ((nSocket = socket (AF_INET, SOCK_STREAM, IPPROTO_IP)) < 0) { printf ("Socket error!\n"); return -1; } } /* Connect */ for (i = 0; i < nPortCounter; i++) { if (connect (nSocket, (struct sockaddr*)&sin, sizeof (sin)) < 0) { printf ("Connect error!\n"); printf ("%d\n", WSAGetLastError ()); return -1; } } /* Select */ FD_ZERO (&writefds); for (i = 0; i < nPortCounter; i++) { FD_SET (nSocket, &writefds); } timeout.tv_sec = 2; timeout.tv_usec = 0; if ((selectres = select (0, NULL, &writefds, NULL, &timeout)) < 0) { printf ("Select error!\n"); return -1; } if (selectres == 0) { printf ("Select timeout!\n"); return -1; } else { printf ("anzahl schreibfähiger sockets: %d\n", selectres); for (j = 0; j < nPortCounter; j++) { if (FD_ISSET (nSocket[j], &writefds)) { printf ("%d ok\n", nSocket[j]); } } } .... jetzt hat man 5 sockets, die im struct writefds eingetragen sind und mit denen jeweils ein connect () stattgefunden hat. soweit, sogut. das ist noch nicht richtig spannend . interessant wird es, wenn du die schleife um connect () abänderst z.b. nach: for (i = 2 ; i < nPortCounter; i++) {... jetzt sind nur noch 3 der 5 sockets connected. der select-aufruf prüft nun, ob die im struct angegebenen sockets schreibfähig/verbunden sind. wenn ein socket das nicht ist, wird dieser aus dem struct entfernt. der "verbliebene" struct ist praktisch das ergebnis von select (). hier wären die sockets mit dem index 0 und 1 nicht verbunden, also fliegen sie aus dem struct. das wars. hoffe das war hilfreich gruß vinc :marine
-
tja, hab da auch noch was vergessen double dZahl = 2.236; cout << setiosflags (ios::fixed) << setprecision (2) << dZahl << endl;
-
und #include <iomanip> nicht vergessen! :bimei
-
double dZahl = 2.236; cout << setprecision (2) << dZahl << endl;