Buchempfehlung
Visual Basic 6 Kochbuch
Visual Basic 6 Kochbuch
Viele praktische Tipps zum Programmieren mit Visual Basic 6, die sich oft auch auf FB übertragen lassen. [Mehr Infos...]
FreeBASIC-Chat
Es sind Benutzer im FreeBASIC-Chat online.
(Stand:  )
FreeBASIC bei Twitter
Twitter FreeBASIC-Nachrichten jetzt auch über Twitter erhalten. Follow us!

Code-Beispiel

Code-Beispiele » Dateien und Laufwerke

Dateidialog

Lizenz:Erster Autor:Letzte Bearbeitung:
LGPLRedakteurVolta 16.06.2007

Nach jeder neuen FB-Version .....
... eine neue version des LoadSaveDialogs. :D

Bei den älteren Versionen war der Einsatz des Dateidialogs bei fbgfx-Windows sehr schwer möglich, entweder er verschwand irgendwo in den Hintergrund oder das fbgfx-Windows erhielt nicht mehr den Focus zurück. Daher hatte ich den Dateidialog auf die Konsoleanwendungen beschränkt.
Mit den "Neuen" FB-Versionen dachte ich leichter an die notwendigen Parameter zu gelangen, leider nicht.
Die Funktion LoadSaveDialog ist eigentlich die gleiche geblieben (zumindest der Teil für Konsoleanwendung). Um an die nötigen Parameter des fbgfx-Window zu kommen mußte ich einige Definitionen hinzufügen.
Die neue Version habe ich in eine Include-Datei (LoadSaveDialog.inc) und eine Testdatei aufgeteilt.

'-----------LoadSaveDialog.inc
'Nutzt den komfortablen Window-Dialog zur Auswahl des Laufwerk/Pfad/Dateinamens
'zum öffnen oder speichern einer Datei.
'13.03.2006 - WIN32 console application - by Volta
'21.08.2006 - FB 0.16b - für XP Bugs entfernt, einige Verbesserungen - by Volta
'15.06.2007 - FB 0.17b(FB 0.18) - erweitert auf fbgfx-Window - by Volta
'hat unter ME Probleme im Fullscreen-Modus (teilweise wird Print nicht ausgeführt?)

#Include once "windows.bi"
#Include once "win\commdlg.bi"
#ifdef __fbgfx_bi__
  ' Some defines and typedefs for the Win32Driver structure
  #define WINDOW_TITLE_SIZE   128
  #define WINDOW_CLASS_PREFIX "fbgfxclass_"
  ' Structure containing GfxLib's internal Windows info FB 0.18
  Type WIN32DRIVER
      Version             As Integer
      hInstance           As HINSTANCE
      WndClass            As WNDCLASS
      Wnd                 As HWND
      Palette(0 To 255)   As PaletteEntry
      Blitter             As Sub(Byval As Ubyte Ptr, Byval As Integer)
      Is_Running          As Integer
      Is_Palette_Changed  As Integer
      Is_Active           As Integer
      w                   As Integer
      h                   As Integer
      Depth               As Integer
      flags               As Integer
      Refresh_Rate        As Integer
      Window_Title        As Ubyte Ptr
      WindowClass(0 To WINDOW_TITLE_SIZE + sizeof(WINDOW_CLASS_PREFIX)-1) As Ubyte
      Init As Function()  As Integer
      Exit As Function()  As Integer
      Paint As Function() As Integer
      Thread              As Sub(Byval Running_Event As HANDLE)
      mouse_clip          As Integer
  End Type
  Extern FB_Win32 Alias "fb_win32" As WIN32DRIVER
#endif

Declare Function LoadSaveDialog (_
           Byval savedlog As Integer = 0,_
           Byval filter As string = "",_
           Byval fltrindex As Integer = 1,_
           Byval initdir As String = ".",_
           Byval strDefExt As String = "") As String
'Voreinstellungen: LoadSaveDialog(0, "", 1, ".", "")
' savedlog = 0 -> Datei Öffnen, 1(<>0) -> Datei Speichern
'   filter = "" -> Alle Dateien, sonst siehe lsd_fil
'fltrindex = 1,  sonst welcher Eintrag, der bei filter angegebenen Auswahl, aktiv ist
'  initdir = "" = "." aktueller Pfad, sonst Pfad angeben
'strDefExt = "" keine Vorgabe, sonst z.B. "bak" als Vorgabe der Endung zum Speichern

Function LoadSaveDialog (Byval savedlog As Integer, Byval filter As string, _
                         Byval fltrindex As Integer, Byval initdir As String, _
                         Byval strDefExt As String) As String
  Dim As Zstring *MAX_PATH Titel = ""
  Dim FB_OFN AS OPENFILENAME
   FB_OFN.lStructSize = sizeof(FB_OFN)
  #ifdef __fbgfx_bi__
     FB_OFN.hwndOwner = FB_Win32.Wnd
     FB_OFN.hInstance = FB_Win32.hInstance
  #endif
  #ifndef __fbgfx_bi__
     GetConsoleTitle (@Titel, MAX_PATH)
     FB_OFN.hwndOwner = FindWindow( 0, Titel )
     FB_OFN.hInstance = 0
  #endif

   Dim strFilter As String = "Alle Dateien (*.*)" + Chr(0) +"*.*" + Chr(0, 0) 'Vorgabe
   If filter = "" Then
      FB_OFN.lpstrFilter = StrPtr(strFilter)
   Else
      FB_OFN.lpstrFilter = StrPtr(filter)
   End If

   FB_OFN.nFilterIndex = fltrindex

   Dim As String *1024 strFile = Space(1023)+ chr(0)
   FB_OFN.lpstrFile = StrPtr(strFile)
   FB_OFN.nMaxFile = sizeof(strFile)

   Dim As String *1024 strFileTitle = String(1023,Chr(0))
   FB_OFN.lpstrFileTitle = StrPtr(strFileTitle)
   FB_OFN.nMaxFileTitle = Len(strFileTitle)

   If initdir = "" Then
      initdir = "."     ' Vorgabe aktueller Pfad
   End If
   FB_OFN.lpstrInitialDir = StrPtr(initdir)

   Dim As String strcapt = "Datei Öffnen"
   If savedlog Then
      strcapt = "Datei Speichern"
      FB_OFN.lpstrTitle = StrPtr(strcapt)
      FB_OFN.lpstrDefExt = StrPtr(strDefExt)
      FB_OFN.flags = OFN_EXPLORER Or OFN_LONGNAMES Or _
                     OFN_OVERWRITEPROMPT Or OFN_HIDEREADONLY
      If GetSaveFileName(@FB_OFN) Then LoadSaveDialog = Trim(strFile)
   Else
      FB_OFN.lpstrTitle = StrPtr(strcapt)
      FB_OFN.flags = OFN_EXPLORER Or OFN_LONGNAMES Or OFN_CREATEPROMPT Or _
                     OFN_NODEREFERENCELINKS Or OFN_HIDEREADONLY
      If GetOpenFileName(@FB_OFN) Then LoadSaveDialog = Trim(strFile)
   End If
End Function
'-Ende----------LoadSaveDialog.inc

Auch der Aufruf der Funktion LoadSaveDialog ist gleich geblieben, ebenso die Voreinstellungen. Sie sind in der Testdatei ausführlich erklärt.
Die Aufrufe des LoadSaveDialogs sind allerdings für Konsole- oder fbgfx-Fenster unterschiedlich.
Bei Konsolefenster einfach nur:

#Include once "LoadSaveDialog.inc"
...

Das Testlisting zeigt den Aufruf bei fbgfx-Fenster.
Wichtig ist hier zuerst den Screen oder Screenres und dann LoadSaveDialog.inc anzugeben, da die benötigten Parameter erst nach dem screen-Befehl verfügbar sind.

'--------Test_LSDialog.bas---by Volta

#Include once "fbgfx.bi" 'für den Screenmod nötig, für Console nicht
screen 18,32
''Wichtig: zuerst Screen oder Screenres dann LoadSaveDialog.inc
#Include once "LoadSaveDialog.inc"

Dim As String DateiName
'Dies ist ein Vorschlag/Muster, kann nach eigenem Bedarf geändert werden
Dim As String lsd_fil _
   = "Basic Dateien (*.BAS)" + Chr(0) + "*.BAS" + Chr(0) _
   + "Text Dateien (*.TXT)" + Chr(0) + "*.TXT" + Chr(0)_
   + "BMP Dateien (*.BMP)" + Chr(0) + "*.BMP" + Chr(0)_
   + "EXE Dateien (*.EXE)" + Chr(0) + "*.EXE" + Chr(0)_
   + "Alle Dateien (*.*)" + Chr(0) + "*.*"+ Chr(0, 0)

'Voreinstellungen: LoadSaveDialog(0, "", 1, ".", "")
'savedlog = 0 -> Datei Öffnen, 1(<>0) -> Datei Speichern
'filter = "" -> Alle Dateien, sonst siehe lsd_fil
'fltrindex = 1,  sonst welcher Eintrag, der bei filter angegebenen Auswahl, aktiv ist
'initdir = "" = "." aktueller Pfad, sonst Pfad angeben
'strDefExt = "" keine Vorgabe, sonst z.B. "bak" als Vorgabe der Endung zum Speichern
''Beispiele:
''einfachster Aufruf "Datei Öffnen", alle Vorgaben werden übernommen.
DateiName = LoadSaveDialog
Print DateiName
''Aufruf "Datei Öffnen" mit Filter, alle anderen = Vorgaben.
DateiName = LoadSaveDialog (,lsd_fil)
Print DateiName
''Aufruf "Datei Öffnen" mit Filter Index 2 (TXT), alle anderen = Vorgaben.
DateiName = LoadSaveDialog (,lsd_fil,2)
Print DateiName
''Aufruf "Datei Öffnen" im Pfad "c:\", alle anderen = Vorgaben.
DateiName = LoadSaveDialog (,,,"c:\")
Print DateiName

''Aufruf "Datei Speichern", alle Vorgaben werden übernommen.
'DateiName = LoadSaveDialog (1)

''Aufruf "Datei Speichern" wenn keine Dateiendung angegeben wird, "bak" als
''Endung benutzen,  alle anderen = Vorgaben.
'DateiName = LoadSaveDialog (1,,,,"bak")

Print "Verdisch.."
Sleep
End'--------Test_LSDialog.bas---by Volta

Download gibts auf meiner HP ..
Viel Spass damit
Volta


Zusätzliche Informationen und Funktionen
  • Das Code-Beispiel wurde am 16.06.2007 von RedakteurVolta angelegt.
  • Die aktuellste Version wurde am 16.06.2007 von RedakteurVolta gespeichert.
  Bearbeiten Bearbeiten  

  Versionen Versionen