Oeffnen-Dialog erscheint nicht



  • DrakoXP schrieb:

    ähm, vielleicht hast du übersehen, dass es keine bool-Ausdrücke sind,
    sondern BOOL-Ausdrücke, und BOOL ist von Microsoft als int definiert.

    Nein, das habe ich nicht übersehen.

    deshalb kann man BOOL auch nich einfach zu bool casten.
    jedenfalls nicht ohne den Hinweis auf einen Datenverlust...

    Die Verwendung eines int-Ausdrucks in einer if-Anweisung erzeugt bei keinem mir bekannten Compiler einen "Hinweis auf einen Datenverlust". Hast du ein Beispiel?



  • ja, in diesem Fall geht es^^

    der Hinweis sollte kommen bei bei

    BOOL x = TRUE;
    bool y = (bool)x;
    

    im Endeffekt geht das trotzdem, aber halt Warnung...


  • Mod

    Nein! Auch in diesem Fall kommt keine Warnung. Denn Du führst einen cast aus. Un der cast von int auf bool ürt nichts anderes aus als ein das Ergebnis von x!=0 zu setzen.

    Eine Warnung kommt nur, wenn Du du Zuweisung ohne cast ausführst.



  • Martin Richter schrieb:

    Eine Warnung kommt nur, wenn Du du Zuweisung ohne cast ausführst.

    C4800 kommt auch bei einem Cast:

    MSDN Library schrieb:

    Casting the expression to type bool will not disable the warning, which is by design.


  • Mod

    Upps...
    Ja es kommt eine Warnung, aberist ist keine Warnung über Datenverlust! Es ist eine Performance Warnung!

    Aber Ok! Ganz korrekt war meine Antwort nicht.

    Dann ist der korrekte Weg einzig und alleine

    BOOL x = TRUE;
    bool y = x!=0;
    


  • Jedenfalls funktioniert es bei mir nun ordentlich; wegen der Prüfung, müsste mal jedes Szenario ausprobieren.
    Gibt es eine andere Möglichkeit auf den Dateinamen zuzugreifen als ofn.lpstrFile ?

    Vielen Dank


  • Mod

    Was meinst Du mit andere Möglichkeiten?



  • Anstelle z.B. MessageBox (ofn.lp..... ...) den namen in einem normalen Char oder string zu haben


  • Mod

    lpstrFile ist ein normaler TCHAR*, was möchtest Du mehr?



  • Ja ein Zeiger oder irre ich mich da? Den Wert in einrm "normalen" char, nicht als Zeiger



  • APIAnfaenger schrieb:

    Ja ein Zeiger oder irre ich mich da? Den Wert in einrm "normalen" char, nicht als Zeiger

    Es ist ein Zeiger! TCHAR ist entweder char oder wchar_t je nach Zeichensatz.
    BTW:

    DrakoXP schrieb:

    TRUE ist jedoch != 0 und damit undefiniert.

    Natürlich ist TRUE definiert und zwar als 1 -sinnigerweise.

    DrakoXP schrieb:

    Es ist somit dem Compilerhersteller, oder bei der WinAPI Microsoft überlassen, welchen Wert TRUE hat.

    Ein Compilerhersteller hat damit wenig zu tun, da diese nicht im Compiler (bzw. in der entsprechenden Sprache) verankert sind, im Gegensatz zu (bspw.) true oder false. Damit ist es also nur Microsoft überlassen, welchen Wert diese Konstanten wirklich haben, und der steht in den Headern.
    q.e.d.:

    windef.h [WinApi-Standardheader] schrieb:

    // ...

    #ifndef FALSE
    #define FALSE               0
    #endif
    
    #ifndef TRUE
    #define TRUE                1
    #endif
    

    // ...


  • Mod

    Soweit ich den Standard im Kopf habe ist das Ergebnis von 1==1 definiert als true, 1!=0 als false. Weißt man ein boolsches Ergebnis einer int Variable zu ist dies definiert als 1 oder 0.

    Richtig ist, dass die interne Darstellung eines bool Datatypes dem Compilerhersteller überlassen ist.
    Die Zuweisung in einen int ist keineswegs undefiniert.
    Insofern ist es nur zu logisch 0 als FALSE und 1 als TRUE zu definieren.

    Unterscheiden muss man dennoch die Nutzung des Datentypes BOOL in der WinAPI. Hier gilt nur folgendes hat ein BOOL Typ den Wert 0, heißt dies false. !=0 bedeutet false. Man kann aber eben nicht mit Sicherheit sagen, dass TRUE returniert wird. Die Ergebnisse 5, 1234 und so weiter würden ebenfalls true signalisieren.
    Der Vergleich eines BOOL Wertes mit TRUE führt also nicht unbedingt zum gewünschten Ergebnis. Der Vergleich eines BOOL Wertes mit FALSE dagegen schon...

    Ich hoffe das ist verständlich.



  • Martin Richter schrieb:

    [...]
    Ich hoffe das ist verständlich.

    Joar klaro 😉 . Damit sollte man damit doch auf der richtigen Seite sein:

    BOOL bSuccess = IrgendEineFunktionDieBOOLZurueckGibt();
    if(bSuccess)
      // Erfolgreich...
    else
      // Aua...
    

    (Bereits von MFK gepostet; diese Prüfung bevorzuge ich nämlich auch.)


  • Mod

    Und man kann es auch wirklich wörtlich einfach lesen...

    if (bSuccess) // Wenn erfolgreich
    ...
    if (!bSuccess) // Wenn nicht erfolgreich
    ...
    

    alle != und == Operatoren an dieser Stelle empfinde ich persönlich als verwirrend.


Anmelden zum Antworten