Deutsch
C ++ Forum

GetSaveFileName

 

Georg
Hovenbitzer
Hallo Sebastian,

anhängender Code funktioniert nicht mehr wenn man ihn übersetzt

Das Dateiauswahlfenster wird nicht geöffnet, im Interpreter und als Compilat funktioniert alles bestens.

Ich hoffe du kannst mal wieder helfen
Def Getsavefilename(1) !"COMDLG32.DLL","GetSaveFileNameA"
Def Make256string(1) ((@$(1) + @Chr$(0)) + @Space$(256 - @Len(@$(1))))
Struct Tagofn = Lstructsize&,
Hwndowner&,
Hinstance&,
Lpstrfilter&,
Lpstrcustomfilter&,
Nmaxcustfilter&,
Nfilterindex&,
Lpstrfile&,
Nmaxfile&,
Lpstrfiletitle&,
Nmaxfiletitle&,
Lpstrinitialdir&,
Lpstrtitle&,
Flags&,
Nfileoffset%,
Nfileextension%,
Lpstrdefext&,
Lcustdata&,
Lpfnhook&,
Lptemplatename&,
Pvreserved&,
Dwreserved&,
Flagsex&
Declare Ofn#
Dim Ofn#,Tagofn
Struct _rect = Left&,
Top&,
Right&,
Bottom&
Declare Rect#
Dim Rect#,_rect
Declare Ergebnis&
Declare Icon&

Proc Iconload

    Declare Name$
    Declare Dll&
    Name$ = "#1001" + @Chr$(0)
    Dll& = @Usedll("SHELL32.DLL")
    Icon& = @External("USER32.DLL","LoadImageA",Dll&,@Addr(Name$),1,48,48,0)
    Freedll Dll&

Endproc

Proc Savedateihook

    Parameters Hdlg&,Umsg&,Wparam&,Lparam&
    Clear Rect#
    Declare Parent&
    Declare Fenster&
    Declare Text&
    Declare Weiter&
    Declare Neu&
    Declare Abbruch&
    Declare Static&
    Declare Raus&

    If Umsg& = 49265

        If @Fileexists(@String$(Ofn#.Lpstrfile&,0)) = 1

            Parent& = @External("USER32","GetParent",Hdlg&)
            @External("USER32","GetWindowRect",Parent&,Rect#)
            Fenster& = @Create("Dialog",%Hwnd,"Datei existiert",-1,-1,-1,0)
            Setwindowpos Fenster& = (Rect#.Left& + (((Rect#.Right& - Rect#.Left&) / 2) - 160)),(Rect#.Top& + (((Rect#.Bottom& - Rect#.Top&) / 2) - 75))- 320,150
            Text& = @Create("Text",Fenster&,"Folgende Aktion ausführen:",80,30,200,40)
            Usefont "Curier New",14,0,0,0,0
            Setdialogfont 1
            Weiter& = @Create("DefButton",Fenster&,"Anhängen",25,75,82,26)
            Neu& = @Create("Button",Fenster&,"Überschreiben",115,75,82,26)
            Abbruch& = @Create("Button",Fenster&,"Abbruch",205,75,82,26)
            Static& = @Control("Static","",$54000103,10,10,48,48,Fenster&,0,%Hinstance,$0)
            @Sendmessage(Static&,$170,Icon&,0)
            Setdialogfont 0
            Raus& = 0

            Whilenot Raus& = 1

                Waitinput

                If @Clicked(Weiter&)

                    Ergebnis& = 1
                    Raus& = 1

                Elseif @Clicked(Neu&)

                    Ergebnis& = 2
                    Raus& = 1

                Elseif (@Clicked(Abbruch&) Or (%Key = 2))

                    Ergebnis& = 0
                    Raus& = 1

                Endif

            Endwhile

            @Destroywindow(Fenster&)
            Return 1

        Endif

    Endif

    Return 0

Endproc

Proc Savedatei

    Parameters Hwnd&,Titel$,Filespec$,Initialdir$,Filter$,Defext$
    Declare Customfilter$
    Declare Filetitle$
    Declare Rcode&
    Declare Auswahl$
    Clear Ofn#
    Titel$ = Make256string(Titel$)
    Filespec$ = Make256string(Filespec$)
    Initialdir$ = Make256string(Initialdir$)
    Filter$ = @Translate$(Filter$,"|",@Chr$(0)) + @Chr$(0)
    Filter$ = Make256string(Filter$)
    Defext$ = Make256string(Defext$)

    With Ofn#

        .Lstructsize&       = @Sizeof(Ofn#)
        .Hwndowner&         = Hwnd&
        .Hinstance&         = %Hinstance
        .Lpstrfilter&       = @Addr(Filter$)
        .Lpstrcustomfilter& = @Addr(Customfilter$)
        .Nmaxcustfilter&    = 0
        .Nfilterindex&      = 1
        .Lpstrfile&         = @Addr(Filespec$)
        .Nmaxfile&          = 256
        .Lpstrfiletitle&    = @Addr(Filetitle$)
        .Nmaxfiletitle&     = 256
        .Lpstrinitialdir&   = @Addr(Initialdir$)
        .Lpstrtitle&        = @Addr(Titel$)
        .Flags&             = ($4 | $20 | $80000 | $800)
        .Nfileoffset% = 0
        .Nfileextension% = 0
        .Lpstrdefext&       = @Addr(Defext$)
        .Lcustdata& = 0
        .Lpfnhook& = @Procaddr(Savedateihook,4)
        .Lptemplatename& = 0
        .Pvreserved& = 0
        .Dwreserved& = 0
        .Flagsex& = 0

    Endwith

    Ergebnis& = 2
    Rcode& = Getsavefilename(Ofn#)

    If Rcode& = 1

        If Ergebnis& <> 0

            Auswahl$ = @Str$(Ergebnis&) + "|" + @String$(Ofn#.Lpstrfile&,0)

        Elseif Ergebnis& = 0

            Auswahl$ = ""

        Endif

    Else

        Auswahl$ = ""

    Endif

    @Procaddr(Savedateihook,-4)
    Return Auswahl$

Endproc

#######################
Windowstyle 8 + 16 + 512 + 1024
Window 100,100-300,300
Declare Ende&
Declare Button&
Button& = @Create("Button",%Hwnd,"Button",10,10,100,40)
Iconload

Whilenot Ende& = 1

    Waitinput

    If %Key = 2

        Ende& = 1

    Elseif @Clicked(Button&)

        Savedatei(%Hwnd,"Ausgabe der Ergebnisse nach:","DLQueue",$Progdir,"DAT File (*.dat)|*.dat|Textfile (*.txt)|*.txt","*.dat")

    Endif

Endwhile

Dispose Rect#
Dispose Ofn#
@External("USER32.DLL","DestroyIcon",Icon&)
End
 
Viele Grüsse, Georg Hovenbitzer(Windows XP Pro, XProfan 11.2, Profan2Cpp 1.6a)
06.07.2006  
 




Sebastian
König
Hallo Georg,

erstmal kann ich das Problem bestätigen - tritt sogar auch noch mit der aktuellen Beta-Version auf....

Die Ursache konnte ich allerdings noch nicht finden - mein erster Verdacht, dass es mit dem Hook zusammenhängen könnte, hat sich nicht bestätigt... CommDlgExtendedError() liefert einfach CDERR_INITIALIZATION.

Leider bin ich im Moment ein bischen im Stress (morgen eine Klausur, Montag gleich die nächste ), sodass ich wahrscheinlich erst Montag Abend intensiver nach der Ursache suchen kann. Sorry, dass Du ein bischen warten musst! Ich werde mich natürlich sofort darum kümmern, wenn ich wieder genug Zeit habe.

MfG

Sebastian
 
Windows XP, XProfan/Profan² 4.5 bis 11
Profan2Cpp-Homepage:  [...] 
Alte Profan²-Seite:  [...] 
06.07.2006  
 




Georg
Hovenbitzer
Hallo Sebastian,

laß dir bitte Zeit und ganz viel Glück für die Prüfung !!
 
Viele Grüsse, Georg Hovenbitzer(Windows XP Pro, XProfan 11.2, Profan2Cpp 1.6a)
07.07.2006  
 




Sebastian
König
Hallo Georg,

so - ich denke, ich habs . Der entscheidende Punkt ist diese Zeile:

.Lpstrcustomfilter& = @Addr(Customfilter$)

Nachdem ich einfach mal statt der Adresse eine Null angegeben habe, funktionierte es plötzlich auch mit Profan2Cpp. Erst konnte ich mir das gar nicht erklären, bis ich folgendes bemerkte: In (X)Profan gibt @Addr() bei Leerstrings (und darum handelt es sich bei Customfilter$, da kein Wert zugewiesen wird) immer 0 zurück. Das war mir bisher nie aufgefallen...

Eine Anpassung war aber zum Glück recht einfach möglich. Ich habe gerade eine neue Beta-Version hochgeladen, in der der Fehler korrigiert ist. Außerdem gab es noch ein Problem durch die Benutzung von WAITINPUT in der Hook-Prozedur, das ich ebenfalls behoben habe.

Die aktuelle Beta (1.5.9c) findest Du auf der Profan2Cpp-Homepage. Wenn es damit auch bei Dir problemlos funktioniert, kann ich mich aufmachen, die Korrekturen auf Version 1.5a zurückzuportieren.

Nochmals danke für die Geduld!

MfG

Sebastian
 
Windows XP, XProfan/Profan² 4.5 bis 11
Profan2Cpp-Homepage:  [...] 
Alte Profan²-Seite:  [...] 
10.07.2006  
 




Michael
Dell
Ähm,

das war eher ein Eingabefehler man braucht nur .Nmaxcustfilter& auf 255 zu setzen dann gehts ausgezeichnet!
 
Salu Michael...

Hab zwar krumme Fieß awer dofir e' ecklich Gsicht! 
10.07.2006  
 




Sebastian
König
Hallo Michael,

stimmt - das hilft auch . Allerdings funktioniert es ja in der ursprünglichen Version in XProfan selbst, was wohl an dem Verhalten von @Addr() liegt. Hier ein kurzer Testcode dazu:
declare text$
print Addr(text$)
let text$ = "Hallo"
print Addr(text$)
let text$ = ""
print Addr(text$)
waitkey

MfG

Sebastian
 
Windows XP, XProfan/Profan² 4.5 bis 11
Profan2Cpp-Homepage:  [...] 
Alte Profan²-Seite:  [...] 
11.07.2006  
 




Michael
Dell
Ja, ist deutlich zu erkennen!

Intressant ist die Anzeige wenn Du das Test- Programm mit Prf2Cpp (v1.5a-new3) übersetzt hast!!!
 
Salu Michael...

Hab zwar krumme Fieß awer dofir e' ecklich Gsicht! 
11.07.2006  
 




Sebastian
König
Ja, stimmt. Hier wird von Addr() auch bei Leerstrings eine Adresse zurückgegeben. (Was daran liegt, dass auch die Leerstrings einen kurzen Puffer mit einer 0 direkt am Anfang benutzen....). Wenn Du den Code mit der aktuellen Beta (1.5.9c) übersetzt, sollte das Verhalten genau dem von (X)Profan entsprechen

MfG

Sebastian
 
Windows XP, XProfan/Profan² 4.5 bis 11
Profan2Cpp-Homepage:  [...] 
Alte Profan²-Seite:  [...] 
11.07.2006  
 




Sebastian
König
Was mir gerade noch einfällt: In der Beta-Version ist natürlich auch die [...]  diskutierte Möglichkeit zur Steuerung der Übersetzung von @Call() und @External() integriert. Dokumentiert habe ich das ganze in der Hilfe unter der neuen Rubrik Sonstige Features...
 
Windows XP, XProfan/Profan² 4.5 bis 11
Profan2Cpp-Homepage:  [...] 
Alte Profan²-Seite:  [...] 
11.07.2006  
 




Michael
Dell
Dachte mir schon das jede Variable/String eine Adresse hat ganz gleich ob leer oder nicht ist doch eh alles nur ein addressierter Speicherbereich. Es ist also eher ein, na sagen wir mal unerwartetes Verhalten von XProfan oder?
 
Salu Michael...

Hab zwar krumme Fieß awer dofir e' ecklich Gsicht! 
11.07.2006  
 




Sebastian
König
Unerwartet - in der Tat . Hat ganz schön gedauert, bis mir das endlich aufgefallen ist... direkt bin ich gar nicht auf die Idee gekommen - bemerkt habe ich es erst, als ich die komplette OFN-Struktur mit BlockWrite in eine Datei geschrieben und dann die Ergebnisse mit XProfan und Profan2Cpp verglichen habe...

Meinen Tests zufolge ist es auch erst seit Profan² 7.0 so - mit 6.6 noch wird auch bei Leerstrings immer eine Adresse zurückgegeben. Wahrscheinlich ist es einfach eine von Delphi vorgegebene Eigenschaft der in Version 7.0 eingeführten langen Strings....

Wie auch immer - es ließ sich zum Glück mit einer kleinen Änderung in der Datei pstring.h auch in Profan2Cpp sehr einfach umsetzen .

MfG

Sebastian
 
Windows XP, XProfan/Profan² 4.5 bis 11
Profan2Cpp-Homepage:  [...] 
Alte Profan²-Seite:  [...] 
11.07.2006  
 




Georg
Hovenbitzer
Hallo Sebastian,

ich hoffe die Prüfungen sind gut verlaufen

Nun zu meinem Problem.
Die neue Version von Profan2Cpp funktioniert sehr gut mit dem Demo Code hier.
Wende ich diese Version aber auf das ganze Projekt an, stürzt die exe direkt nach dem Start mit einer Schutzverletzung ab, mit der Version 1.5a läuft alles sauber bis auf das hier genannte Problem.
Wenn ich den Source Code vergleiche gibt es eine Menge Unterschiede, ich werde dir diese mal als private Mail hier zukommen lassen.

Aber sonst mal wieder super Arbeit
 
Viele Grüsse, Georg Hovenbitzer(Windows XP Pro, XProfan 11.2, Profan2Cpp 1.6a)
13.07.2006  
 




Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

5.218 Betrachtungen

Unbenanntvor 0 min.
liveFamilie28.03.2012
Andreas Koch02.12.2011

Themeninformationen



Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie