| |
|
|
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 |
|
|
| |
|
|
|
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 |
|
|
| |
|
|
|
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:
MfG
Sebastian |
|
|
| |
|
|
|
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 |
|
|
| |
|
|
|
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... |
|
|
| |
|
|
|
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 |
|
|
| |
|
|
|
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 ▲ |
|
|
|