Zum Inhalt springen

Klotzkopp

Mitglieder
  • Gesamte Inhalte

    9.912
  • Benutzer seit

  • Letzter Besuch

  • Tagessiege

    3

Alle Inhalte von Klotzkopp

  1. Das hier funktioniert unter VC++, dafür aber wahrscheinlich unter Borland nicht: void MyGotoXY(int x, int y) { HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE); COORD c; c.X = x; c.Y = y; SetConsoleCursorPosition( hStdout, c ); } [/code] Du brauchst dafür <windows.h>.
  2. Hier mal ein Beispiel: Erzeugen der Wertes "MeinString" mit dem Inhalt "Mein Stringinhalt" im Schlüssel "HKLM\Software\MeineApp" HKEY hkey; char* pszString = "Mein Stringinhalt"; RegOpenKeyEx( HKEY_LOCAL_MACHINE, "Software\MeineApp", 0, KEY_ALL_ACCESS, &hkey); RegSetValueEx( hKey, "MeinString", 0, REG_SZ, (const BYTE*) pszString, strlen( pszString )+1 ); [/code] Zum Auslesen des Werts den Key wie wie oben öffnen, dann: [code] char pszBuffer[101]; DWORD dwDataSize = 100; RegQueryValueEx( hKey, "MeinString", NULL, REG_SZ, (BYTE*) pszBuffer, &dwDataSize ); Am Rande: Die "Profile"-Methoden (sowohl MFC als auch nicht-MFC) schreiben unter Wintendo (9x,ME) immer noch in die Win.ini (wenn auch in eine gecachte), unter NT/2000 werden die Werte aber in der Registry abgelegt.
  3. Klotzkopp

    LockWorkStation()

    Es gibt nichts vergleichbares unter NT. Aber hier wird eine Alternative beschrieben: http://support.microsoft.com/support/kb/articles/Q262/6/46.ASP
  4. Die Ungenauigkeiten bei Fließkommatypen sind nicht nur durch die festgelegte Stellenanzahl bedingt. Jeder Bruch, dessen Nenner keine Potenz von zwei ist (z.B. 3/10), hat im Dualsystem unendlich viele Nachkommastellen. Man kann eine solche Zahl im Dualsystem nicht mit allen Stellen darstellen.
  5. Du weist szBuffer in f neu zu. Diese Änderung wirkt sich aber nicht auf den Puffer aus, mit dem Du die Funktion aufrufst. Da Du den Zeiger nicht als Referenz übergibt, wird eine Kopie des Zeigers auf dem Stack angelegt. Diese Kopie wird gelöscht, nachdem f beendet ist. Deklariere f einfach als void f( char*& szBuffer ) Wenn Du new und delete verwenden willst, dann musst Du Dich selbst darum kümmern, den Inhalt des alten Puffers in den neuen zu kopieren und den alten zu löschen. <FONT COLOR="#a62a2a" SIZE="1">[ 12. September 2001 11:31: Beitrag 1 mal editiert, zuletzt von Klotzkopp ]</font>
  6. Dann versuch doch mal ShellExecute.
  7. Du hast Recht. Wenn man einen Array mit new[] holt, dann sollte man ihn auch mit delete[] freigeben. In diesem Fall funktioniert es aber trotzdem. Der Unterschied zwischen delete und delete[] besteht bei Arrays darin, dass delete nur den Destruktor des ersten Elements aufruft, während delete[] den Destruktor für jedes Element des Arrays aufruft. Bei Array-Elementen, die wie in diesem Fall keinen Destruktor haben oder brauchen, macht es keinen Unterschied.
  8. Klotzkopp

    Kontextmenü

    <FONT COLOR="#a62a2a" SIZE="1">[ 09. September 2001 21:45: Beitrag 1 mal editiert, zuletzt von Klotzkopp ]</font>
  9. Ich hab was gefunden, das helfen könnte: http://support.microsoft.com/support/kb/articles/Q238/0/80.ASP Versuch doch mal, statt 'select *' alle Felder einzeln aufzulisten, wobei die Textfelder hinten stehen.
  10. Klotzkopp

    Kontextmenü

    1.) GetMessagePos könnte helfen. 2.) (Schuss ins Blaue) Lass mal MNS_AUTODISMISS weg.
  11. Kleiner Anstoss class CBruch { public: CBruch() : m_nZaehler(0) , m_nNenner(1) {} CBruch::CBruch( CBruch& bruch ) : m_nZaehler( bruch.m_nZaehler ), m_nNenner( bruch.m_nNenner ) {} CBruch::CBruch( int nZahl ) : m_nZaehler( nZahl ), m_nNenner(1) {} CBruch::CBruch( int nZaehler, int nNenner ) : m_nZaehler( nZaehler ), m_nNenner( nNenner ) { Kuerzen(); } virtual ~CBruch() {} operator float() const { return (float) m_nZaehler / m_nNenner; } CBruch& operator+( CBruch& Summand ) { int nNeuerNenner = m_nNenner * Summand.m_nNenner; m_nZaehler = m_nZaehler * Summand.m_nNenner + Summand.m_nZaehler * m_nNenner; m_nNenner = nNeuerNenner; Kuerzen(); return *this; } private: void Kuerzen() { if( m_nNenner < 0 ) { m_nZaehler *= -1; m_nNenner *= -1; } if( !m_nZaehler || !m_nNenner ) return; int nGemTeil = 2; while( true ) { if( 0 == m_nZaehler % nGemTeil && 0 == m_nNenner % nGemTeil ) { m_nZaehler /= nGemTeil; m_nNenner /= nGemTeil; continue; } nGemTeil++; if( nGemTeil > m_nZaehler || nGemTeil > m_nNenner ) return; } } int m_nZaehler; int m_nNenner; }; [/code] Der Kürz-Algorithmus ist noch etwas krude, und es ist auch nur ein arithmetischer und ein cast-Operator drin. Aber ich denke, das Prinzip wird klar.
  12. C++ für CE ist erst mal nicht anders als für Win32. Solange es nur um Anwendungsentwicklung geht, ist der wichtigste Unterschied zu Win32 wohl der, dass CE grundsätzlich Unicode ist. Oder willst Du ein Image erstellen? <FONT COLOR="#a62a2a" SIZE="1">[ 07. September 2001 21:34: Beitrag 1 mal editiert, zuletzt von Klotzkopp ]</font>
  13. Du kannst einen CString nicht in einen char umwandeln, weil ein char nur ein Zeichen fasst. Falls Du einen char* meinst, dann kommt es darauf an, ob Du den String nur lesen oder auch ändern willst. Wenn Du nur lesen willst, dann kannst Du einfach den CString anstelle des char* einsetzen. Die Klasse CString hat einen cast-operator für LPCTSTR, das funktioniert dann automatisch. Falls Du den String ändern musst, dann ist toostens Weg der richtige. Allerdings solltest Du den Speicher dynamisch holen, wenn Du nicht vorher weisst, wie lang der String ist: CString strDeinCString = "..."; char* pszString = new char[ strDeinCString.GetLength() + 1 ]; if( !pszString ) { ... // Fehlerbehandlung } strcpy( pszString, strDeinCString ); [/code] Das letzte Zeichen musst Du nicht auf 0 setzen, dass macht strcpy für Dich. Allerdings musst Du, nachdem Du ihn nicht mehr brauchst, den String mit [code] delete pszString; wieder freigeben.
  14. Wie wär's mit: void main() { bool fRepeat; do { clrscr(); ueberschrift(); menue(); fRepeat = false; switch(auswahl) { case 1: printf(" ...... \n"); break; case 2: //snip spielregeln(); fRepeat = true; break; case 3: bla bal bal } } while( fRepeat ); } Oder war das gewollt, dass bei Auswahl 2 zweimal Überschrift und Menü ausgeführt werden? <FONT COLOR="#a62a2a" SIZE="1">[ 05. September 2001 06:54: Beitrag 4 mal editiert, zuletzt von Klotzkopp ]</font>
  15. @Crush: Das Problem dabei ist allerdings, dass die Exception auch dann geworfen wird, wenn der Benutzer Null eingibt. @Elmo: Wenn der Benutzer einen oder mehrere Buchstaben eingibt, bekommt Dein int den Wert 0. Wenn Null keine gültige Eingabe ist, dann prüf einfach den Wert nach der Eingabe und brich gegebenenfalls ab. Wenn Null ein erlaubter Wert sein soll, dann liegt der Fehler an einer anderen Stelle in Deinem Programm. Was machst Du mit der eingegebenen Zahl?
  16. Dieses Sleep(1000) irritiert mich. Erzeugst Du das Event erst 1 Sekunde vor dem Setzen? Du must sicherstellen, dass CreateEvent vor OpenEvent ausgeführt wird. Am besten erzeugts Du das Event gleich zu Beginn von Prozess 1. Prüf besser auch auf jeden Fall den Rückgabewert von OpenEvent (Bei Fehler: NULL)
  17. Das Hauptfenster kannst Du zum Beispiel maximiert darstellen, indem Du in der CXYZApp::InitInstance() ein m_nCmdShow |= SW_SHOWMAXIMIZED; vor dem pMainFrame->ShowWindow(m_nCmdShow); pMainFrame->UpdateWindow(); ... einfügst. Um das Kindfenster maximiert darzustellen, musst Du die ActivateFrame-Methode Deiner von CMDIChildWnd abgeleiteten Klasse überschreiben: void CChildFrame::ActivateFrame(int nCmdShow) { nCmdShow = SW_MAXIMIZE; CMDIChildWnd::ActivateFrame(nCmdShow); }
  18. Das ist nicht wirklich eine Schleife, weil auf jeden Fall nach dem ersten Lauf return 0 ausgeführt wird. Sollte vielleicht nur der Child-Prozess das return 0 machen, und der Parent-Prozess in der Schleife bleiben?
  19. Die "0" bekommst Du nicht wirklich weg, wenn Dein Eingabefeld mit einer numerischen Variablen verknüpft ist. Die Windows-übliche Vorgehensweise ist aber auch eigentlich die, dass man bei Fehleingaben die falsche Eingabe stehen lässt (damit der dumme User auch sieht, was er falsch gemacht hat ), aber die gesamte Eingabe selektiert. Dann wird bei einer neuen Eingabe die alte ersetzt. CEdit* pEditCtrl = (CEdit*) GetDlgItem( IDC_EDIT ); pEditCtrl->SetFocus(); pEditCtrl->SetSel( 0, -1, TRUE ); // selektiert alles [/code] Dabei musst Du für IDC_EDIT die Control-ID Deines Eingabefelds setzen. Wenn Du schon eine Kontrollvariable für den Eingabefeld hast, dann kannst Du dir den Kram mit GetDlgItem natürlich sparen. Zweite Möglichkeit: Wenn die erlaubten Werte sich durch Minimum und Maximum beschreiben lassen und sich im Laufe des Programms nicht verändern, dann kannst Du sie auch gleich im Klassenassistenten fest eintragen. Das erspart Dir OnKillFocusxyz, und hat den Vorteil, dass Du keinen gültigen Wert eingeben musst, wenn Du das Programm nur beenden willst . <FONT COLOR="#a62a2a" SIZE="1">[ 26. August 2001 11:12: Beitrag 1 mal editiert, zuletzt von Klotzkopp ]</font>
  20. Wenn ein Tray Icon verschwindet, wenn man die Maus darüber bewegt, ist die Ursache in aller Regel, dass der Prozess, der Shell_NotifyIcon(NIM_ADD, &nid) aufgerufen hat, nicht mehr läuft, ohne vor dem Beenden Shell_NotifyIcon(NIM_DELETE, &nid) aufgerufen zu haben. Die TASKBARCREATED-Message brauchst Du nur, wenn die Möglichkeit besteht, dass beim Aufruf von Shell_NotifiIcon der Taskbar-Prozess noch gar nicht läuft, z.B. wenn Du einen Service schreibst, der ohne eingelogten User läuft. Dieser Service muß dann mittels TASKBARCREATED wissen, wann der Tray zur Verfügung steht, um dann das Icon reinzusetzen. Läuft das Programm, das das Icon erzeugt, noch, wenn Du mit der Maus über das Icon fährst und es verschwindet?
  21. Klotzkopp

    Ofstream

    seekp p für put statt g für get.
  22. Zwei kleine Änderungen zu Hasi Xs Vorschlag: Mit Nullen auffüllen (hängt davon ab, wie viele Stellen die ID maximal haben soll), z.B.: sprintf(filename,"c:\\trace-%05d.txt",m_iLid); für fünfstellige IDs. Bewirkt, dass die Dateien besser sortiert werden können. Außerdem deklarierst Du filename besser als: char filename[ 14 + Anzahl ID-Stellen ];
  23. Hi Gruft! Hast Du vielleicht statt einer Konsolenanwendung eine Win32-Anwendung erstellt?

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.

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...