Speichern mit ausgewählten Dateityp

  • Hallo zusammen,

    ich versuche eine Funktion so zu schreiben, wenn jemand ein bestimmten Dateityp/format auswählt, das es auch mit diesen abspeichert. Der Benutzer hat mehrere Dateitypen zur auswahl und deshalb weiß ich nicht wie ich es schreiben soll, mit einer Dateityp weiß ich es, siehe Code. Ich hoffe es kann mir einer helfen?!

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    #include <WindowsConstants.au3>
    #NoTrayIcon

    [/autoit] [autoit][/autoit] [autoit]

    ; Hauptfenster
    GUICreate("Speichern", 500, 400)

    [/autoit] [autoit][/autoit] [autoit]

    ; Menüleiste
    $menu = GUICtrlCreateMenu("Datei")
    $item_oeffnen = GUICtrlCreateMenuItem("Öffnen...", $menu)
    $item_save_as = GUICtrlCreateMenuItem("Speichern unter...", $menu)
    GUICtrlCreateMenuItem("", $menu, -1) ; Hier wird ein Linie durchgezogen
    $item_beenden = GUICtrlCreateMenuItem("Beenden", $menu)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; Schrift
    $font = "Comic Sans MS"
    $label = GUICtrlCreateLabel("Quelle", 10, 10, 50, 25)
    GUICtrlSetFont($label, 12, 100, 1, $font)
    GUICtrlSetColor($label, 0xfb00500)

    [/autoit] [autoit][/autoit] [autoit]

    ; Edit
    $edit = GUICtrlCreateEdit("", 10, 40, 480, 330, $WS_VSCROLL)

    [/autoit] [autoit][/autoit] [autoit]

    ; Damit das Hauptfenster angezeigt wird
    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $Msg = GUIGetMsg()

    Switch $Msg
    Case $GUI_EVENT_CLOSE, $item_beenden
    Exit
    Case $item_oeffnen
    $open = FileOpenDialog("Öffnen...", @DesktopDir, "Textdokument (*.txt)|CFG-Dateien (*.cfg)")
    $read = FileRead($open)
    GUICtrlSetData($edit, $read)
    Case $item_save_as
    $save = FileSaveDialog ( "Speichern unter...", @DesktopDir, "Textdokument (*.txt)|CFG-Dateien (*.cfg)")
    If $save Then $save &=".txt" ; Hier wird garantiert, das die Datei mit dieser Endung abgespeichert wird.
    FileWrite($save, (GUICtrlRead($edit)))
    EndSwitch

    [/autoit] [autoit][/autoit] [autoit]

    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    #cs
    Die zweite Variante:
    ======================

    [/autoit] [autoit][/autoit] [autoit]

    If StringRight($save, 4) <> ".txt" Then $save = $save & ".txt"
    #ce

    [/autoit]
  • Meinst du so?

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    #include <WindowsConstants.au3>
    #NoTrayIcon

    [/autoit] [autoit][/autoit] [autoit]

    ; Hauptfenster
    GUICreate("Speichern", 500, 400)

    [/autoit] [autoit][/autoit] [autoit]

    ; Menüleiste
    $menu = GUICtrlCreateMenu("Datei")
    $item_oeffnen = GUICtrlCreateMenuItem("Öffnen...", $menu)
    $item_save_as = GUICtrlCreateMenuItem("Speichern unter...", $menu)
    GUICtrlCreateMenuItem("", $menu, -1) ; Hier wird ein Linie durchgezogen
    $item_beenden = GUICtrlCreateMenuItem("Beenden", $menu)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; Schrift
    $font = "Comic Sans MS"
    $label = GUICtrlCreateLabel("Quelle", 10, 10, 50, 25)
    GUICtrlSetFont($label, 12, 100, 1, $font)
    GUICtrlSetColor($label, 0xfb00500)

    [/autoit] [autoit][/autoit] [autoit]

    ; Edit
    $edit = GUICtrlCreateEdit("", 10, 40, 480, 330, $WS_VSCROLL)

    [/autoit] [autoit][/autoit] [autoit]

    ; Damit das Hauptfenster angezeigt wird
    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $Msg = GUIGetMsg()

    Switch $Msg
    Case $GUI_EVENT_CLOSE, $item_beenden
    Exit
    Case $item_oeffnen
    $open = FileOpenDialog("Öffnen...", @DesktopDir, "Alle (*.txt)(*.cfg)|Textdokument (*.txt)|CFG-Dateien (*.cfg)")
    $read = FileRead($open)
    GUICtrlSetData($edit, $read)
    Case $item_save_as
    $save = FileSaveDialog ( "Speichern unter...", @DesktopDir, "Alle (*.txt)(*.cfg)|Textdokument (*.txt)|CFG-Dateien (*.cfg)")
    If $save Then $save &=".txt" ; Hier wird garantiert, das die Datei mit dieser Endung abgespeichert wird.
    FileWrite($save, (GUICtrlRead($edit)))
    EndSwitch

    [/autoit] [autoit][/autoit] [autoit]

    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    #cs
    Die zweite Variante:
    ======================

    [/autoit] [autoit][/autoit] [autoit]

    If StringRight($save, 4) <> ".txt" Then $save = $save & ".txt"
    #ce

    [/autoit]
  • krass ich habe lange gesucht, aber keinen Unterschied bei Commanders script entdeckt :thumbup:

    Edit: Oh hab ihn... glaube aber das war damit nicht gemeint =p

  • Hab eigl. nur jeweils Alle (*.txt)(*.cfg)| davor gesetzt, so werden mehrere Dateitypen gleichzeig angezeigt.
    Habs aber auch nur durch ausprobiern rausbekomm ^^

  • @Commander21

    Nein das meine ich nicht. Außerdem meines wissens nach schreibt man das so "Alle Dateien (*.txt; *.cfg)". Das habe ich jetzt bloß nicht in diesen Beispiel mit rein geschrieben, ABER DANKE für die Hilfe.

    Ich meine wenn der Benutzer z.B. "CFG-Dateien (*.cfg)" auswählt beim speichern, dann soll das Programm die Datei auch mit der Dateiendung *.cfg abgespeichert werden.

  • Nene Mehmex will, dass wenn man zum beispiel *.cfg dateien auswählt und der user zu dumm ist um cfg hinter sein filenamen zu schreiben dieser autmotisch ersetzt wird.. hmm muss ma n bisl suchn, meine ich hatte mal sowas ähnliches..

    Edit: Och mann immer postet jeder immer genau das gleiche aber 10ms früher als ich :D

  • Ja genau, das meine ich. Ich hoffe das mir einer dabei helfen kann. Danke schon mal im Vorraus.

    HiHi, war schneller :D

  • aah hier ham wars... wusste doch ich kann mein chaos im autoit ordner noch überblicken =)

    Spoiler anzeigen
    [autoit]

    $hWnd = WinGetHandle("")
    $sFilter = "Text File (*.txt)|*.txt|AutoIt v3 Script (*.au3)|*.au3|All (*.*)|*.*"

    [/autoit] [autoit][/autoit] [autoit]

    $Ret = _FileSaveDialog("Save as", "C:\", $sFilter, 18, "New Script", 2, $hWnd)

    [/autoit] [autoit][/autoit] [autoit]

    If Not @error Then MsgBox(64, "Results", StringFormat("Saved as: %s\n\nSelected Filter Index: %d", $Ret, @extended))

    [/autoit] [autoit][/autoit] [autoit]

    Func _FileSaveDialog($sTitle, $sInitDir, $sFilter = 'All (*.*)', $iOpt = 0, $sDefFile = '', $iDefFilter = 1, $hWnd = 0)
    Local $iFileLen = 65536 ; Max chars in returned string

    ; API flags prepare
    Local $iFlag = BitOR(BitShift(BitAND($iOpt, 2), -10), BitShift(BitAND($iOpt, 16), 3))

    ; Filter string to array convertion
    If Not StringInStr($sFilter, '|') Then $sFilter &= '|*.*'
    $sFilter = StringRegExpReplace($sFilter, '|+', '|')

    Local $asFLines = StringSplit($sFilter, '|')
    Local $i, $suFilter = ''

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 1 To $asFLines[0] Step 2
    If $i < $asFLines[0] Then _
    $suFilter &= 'byte[' & StringLen($asFLines[$i]) + 1 & '];char[' & StringLen($asFLines[$i + 1]) + 1 & '];'
    Next

    ; Create API structures
    Local $uOFN = DllStructCreate('dword;int;int;ptr;ptr;dword;dword;ptr;dword' & _
    ';ptr;int;ptr;ptr;dword;short;short;ptr;ptr;ptr;ptr;ptr;dword;dword')
    Local $usTitle = DllStructCreate('char[' & StringLen($sTitle) + 1 & ']')
    Local $usInitDir = DllStructCreate('char[' & StringLen($sInitDir) + 1 & ']')
    Local $usFilter = DllStructCreate($suFilter & 'byte')
    Local $usFile = DllStructCreate('char[' & $iFileLen & ']')
    Local $usExtn = DllStructCreate('char[1]')

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 1 To $asFLines[0]
    DllStructSetData($usFilter, $i, $asFLines[$i])
    Next

    ; Set Data of API structures
    DllStructSetData($usTitle, 1, $sTitle)
    DllStructSetData($usInitDir, 1, $sInitDir)
    DllStructSetData($usFile, 1, $sDefFile)
    DllStructSetData($usExtn, 1, "")
    DllStructSetData($uOFN, 1, DllStructGetSize($uOFN))
    DllStructSetData($uOFN, 2, $hWnd)
    DllStructSetData($uOFN, 4, DllStructGetPtr($usFilter))
    DllStructSetData($uOFN, 7, $iDefFilter)
    DllStructSetData($uOFN, 8, DllStructGetPtr($usFile))
    DllStructSetData($uOFN, 9, $iFileLen)
    DllStructSetData($uOFN, 12, DllStructGetPtr($usInitDir))
    DllStructSetData($uOFN, 13, DllStructGetPtr($usTitle))
    DllStructSetData($uOFN, 14, $iFlag)
    DllStructSetData($uOFN, 17, DllStructGetPtr($usExtn))
    DllStructSetData($uOFN, 23, BitShift(BitAND($iOpt, 32), 5))

    ;Set Timer to check FileName Input for file extension
    Local $hCallBack = DllCallbackRegister("_Check_FSD_Input", "none", "hwnd;int;int;dword")
    Local $ahTimer = DllCall("user32.dll", "int", "SetTimer", "hwnd", 0, _
    "int", TimerInit(), "int", 100, "ptr", DllCallbackGetPtr($hCallBack))

    ; Call API function
    Local $aRet = DllCall('comdlg32.dll', 'int', 'GetSaveFileName', 'ptr', DllStructGetPtr($uOFN))

    ;Free CallBack and kill the timer
    DllCallBackFree($hCallBack)
    DllCall("user32.dll", "int", "KillTimer", "hwnd", 0, "int", $ahTimer)

    If Not IsArray($aRet) Or Not $aRet[0] Then Return SetError(1, 0, "")

    ;Return Results
    Local $sRet = StringStripWS(DllStructGetData($usFile, 1), 3)
    Return SetExtended(DllStructGetData($uOFN, 7), $sRet) ;@extended is the 1-based index of selected filter
    EndFunc ;==>_FileSaveDialog

    [/autoit] [autoit][/autoit] [autoit]

    Func _Check_FSD_Input($hWndGUI, $MsgID, $WParam, $LParam)
    Local $sSaveAs_hWnd = _WinGetHandleEx(@AutoItPID, "#32770", "", "FolderView")

    If ControlGetFocus($sSaveAs_hWnd) = "Edit1" Then Return

    Local $sEdit_Data = ControlGetText($sSaveAs_hWnd, "", "Edit1")
    Local $sFilter_Ext = ControlCommand($sSaveAs_hWnd, "", "ComboBox3", "GetCurrentSelection")
    $sFilter_Ext = StringRegExpReplace($sFilter_Ext, ".*\(\*(.*?)\)$", "\1")

    If $sFilter_Ext = ".*" Then
    $sFilter_Ext = ""
    ElseIf Not StringInStr($sFilter_Ext, ".") Then
    Return
    EndIf

    Local $sEdit_Ext = StringRegExpReplace($sEdit_Data, "^.*\.", ".")

    If $sEdit_Ext <> $sFilter_Ext And ($sEdit_Ext <> $sEdit_Data Or $sFilter_Ext <> "") Then
    $sEdit_Data = StringRegExpReplace($sEdit_Data, "\.[^.]*$", "")
    ControlSetText($sSaveAs_hWnd, "", "Edit1", $sEdit_Data & $sFilter_Ext)
    EndIf
    EndFunc ;==>_Check_FSD_Input

    [/autoit] [autoit][/autoit] [autoit]

    Func _WinGetHandleEx($iPID, $sClassNN="", $sPartTitle="", $sText="", $iVisibleOnly=1)
    If IsString($iPID) Then $iPID = ProcessExists($iPID)

    Local $aWList = WinList("[CLASS:" & $sClassNN & ";REGEXPTITLE:(?i).*" & $sPartTitle & ".*]", $sText)
    If @error Then Return SetError(1, 0, "")

    For $i = 1 To $aWList[0][0]
    If WinGetProcess($aWList[$i][1]) = $iPID And (Not $iVisibleOnly Or _
    ($iVisibleOnly And BitAND(WinGetState($aWList[$i][1]), 2))) Then Return $aWList[$i][1]
    Next

    Return SetError(2, 0, "")
    EndFunc ;==>_WinGetHandleEx

    [/autoit]

    Ist glaub ich ursprünglich von wem ausm englischem forum..

  • da gibts ne altanative, die is nur ein paar zeilen groß, muss mal gucken, hab das noch i.wo.

    EDIR: Hier ich glaub du meinst sowas:

    [autoit]

    $save = FileSaveDialog("Speichern...", @ScriptDir, "CFG-Dateien (*.cfg)")
    If $save <> "" Then
    If Not (StringRight($save, 4) = ".cfg") Then $save &= ".cfg"
    EndIf

    [/autoit]

    Hier wird geguckt, ob man hinter dem Dateiname einen Dateityp angegeben hat oder nicht, wenn nicht, wird dieser hinzugefügt.

  • OK, danke für deine Hilfe, ChaosKeks.
    Wenn jemand noch eine Alternative hat, dann bitte posten. DANKE!

  • mhh, ok ich achte eigl. net so auf die ; .... Texte.

    Aber wenn MehmeX die Variante schon hat, dann kapier ich net ganz, wo das problem is :pinch:

  • AAAAAAAH weil das nicht das Problem ist!!! xD

    In deinem Fall gehstu doch davon aus das der Dateiname cfg sein soll... Mehmex will aber unter einem unbestimmten Dateitypen speichern... und das kann man nicht einfach in 2 zeilen code herausfinden (glaube ich)... zeig mir ne wesentlich kürzere variante die alles kann wie _saveFileDialog und ich schick dir nen Keks :D

  • @Commander21 & BugFix

    Ihr sagt bzw. schreibt ja das man es Prüfen lassen kann, aber es geht ja auch nicht nur um eine Dateityp sondern um mehrere Dateitypen.Deshalb kommt es darauf an, welche Dateityp der Benutzer gerade haben bzw. speichern möchte. Falls es mit "If..." gehen sollte, wäre es natürlich sehr gut.
    Das wäre echt SUPER, wenn Ihr mir dabei helfen könntet.

    • Offizieller Beitrag

    Meinst Du so:

    Spoiler anzeigen
    [autoit]


    #include <ComboConstants.au3>
    #include <GUIConstantsEx.au3>
    Opt('GUIOnEventMode', 1)

    [/autoit] [autoit][/autoit] [autoit]

    $hGui = GUICreate('', 320, 350)
    GUISetOnEvent($GUI_EVENT_CLOSE, '_End')
    $hEdit = GUICtrlCreateEdit('', 10, 10, 300, 300)
    GUICtrlCreateLabel('Save as...', 10, 324, 50, 22)
    $hSaveExt = GUICtrlCreateCombo('.txt', 60, 320, 50, 22, $CBS_DROPDOWNLIST)
    GUICtrlSetData(-1, '.ini|.cfg|.log|.nfo')
    $hSave = GUICtrlCreateButton('Save', 250, 320, 60, 22)
    GUICtrlSetOnEvent(-1, '_Save')
    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    While True
    Sleep(50)
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func _End()
    Exit
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _Save()
    Local $sExt = GUICtrlRead($hSaveExt)
    Local $sFile = FileSaveDialog('Save to file...', @ScriptDir, 'Text files (*' & $sExt & ')', 2)
    If Not @error Then
    If StringRight($sFile, StringLen($sExt)) <> $sExt Then $sFile &= $sExt
    Local $hFile = FileOpen($sFile, 2)
    If $hFile <> -1 Then
    FileWrite($hFile, GUICtrlRead($hEdit))
    FileClose($hFile)
    EndIf
    EndIf
    EndFunc

    [/autoit]