Zum Inhalt springen

Common Dialog


Empfohlene Beiträge

Hi ihr!

ich möchte einen ganz normalen Common Dialog ("Datei öffnen") haben wenn ich auf den kleinen Button mit den "..." drauf klick, was in anderen Proggis dem "Durchsuchen" entspricht. Habs auch hinbekommen jedoch möchte ich ja auch ein File öffnen:

ich klick es an und es passiert nichts. Per Zufall hab ich eben gesehen, dass er in "zuletzt verwendete Dokumente" die versuchsweise geöffneten Dateien aber erkannt und weggeschrieben hat. :rolleyes:

wie krieg ich es hin, dass er die datei öffnet, z.B. eine Exceldatei öffnet? :confused:

Thx

SF

P.S.: ich versuche mich immer noch in Visual Basic ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Jo find ich auch...n bissl Code waer nicht schlecht :OD

Dieser DateiDialog ist halt wirklilch nur ein Dialog zur Dateiauswahl. Der oeffnet oder schliesst gar nix, sondern kann nur zurueckgeben, was angewaehlt wurde.

Oeffnen mussts dann schon noch selbst :)

Goos

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ihr seid sehr hilfreich *pfff* logisch dass man programmieren muss! Hab ich ja auch programmiert! nur das "OpenFile" funzt nicht, es steht zwar überall, dass noch was geschrieben werden muss, damit er auch tatsächlich öffnet, jedoch nicht WAS. Und das Öffnen muss nun mal mit dem Dialog zusammenhängen, weil man sich ja dort die Datei aussucht.

Ich bitte hier um fachliche Hilfe und nicht um Sachen, die jeder normale Mensch sich denken kann!

Cu

SF

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi,

also im Großen und Ganzen müsste Dein Code so aussehen:

'Öffnen- Dialog anzeigen

dlg.DialogTitle = "Import"

dlg.FileName = "*.*"

dlg.Filter = "Alle Dateien (*.*)|*.*"

dlg.Flags = cdlOFNFileMustExist

dlg.ShowOpen

If dlg.FileName = "*.*" Then

GoTo Exit_Import

End If

'EXE-Dateien öffnen

Shell dlg.FileName, vbNormalFocus

Exit_Import:

Exit Sub

Allerdings kann man mit Shell nur EXE-Dateien öffnen. Wenn Du eine XLS öffnen willst, dann musst du mit ActiveX arbeiten.

Das habe ich aber auch noch nicht gemacht und kann Die daher keinen Code zur Verfügung stellen, aber viellleicht hilft Dir der Tipp ja trozdem weiter.

Gruß, Tiana

Link zu diesem Kommentar
Auf anderen Seiten teilen

danke tiana, funzt leider bei mir immernoch nicht. bin ich mit OpenFile (cdl.FileName) derart verkehrt?

Option Explicit

Private Sub cdl_ShowOpen()

With cdl

.CancelError = True

.InitDir = "c:\windows"

.Flags = cdlOFNFileMustExist Or cdlOFNHideReadOnly

.Filter = "Alle Dateien (*.*)|*.*"

.FilterIndex = 1

.ShowOpen

OpenFile (cdl.FileName)

End With

End Sub

:confused:

Greetz

Flocke

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi,

mhhh, an sich nicht, allerdings wird jetzt die Dati nicht mit Excel geöffnet, sondern er stellt Sie nur für eine interne Verarbeitung zur verfügung. D.h. Du könntest jetzt den Zelleninhalt mittels FileSystemObject auslesen.

Du musst, wie schon gesagt mit ActiveX arbeiten und mit eigenen dll`s. Näheres zu ActiveX kannst Du jedem guten VB- Buch entnehmen,

Link zu diesem Kommentar
Auf anderen Seiten teilen

Original geschrieben von Schneeflocke

~~ÖFFNEN??

Das ist weder so trivial noch so eindeutig, wie Du offenbar glaubst.

Dein Dateiname ist zunächst einmal nichts weiter als ein Verweis auf eine Menge Daten auf einem Datenträger. Diese Datei kannst Du in Deinem Programm öffnen, und die Daten lesen, aber Du wirst mit den Daten nicht viel anfangen können. Ich vermute mal, dass Du möchtest, dass Excel die Datei öffnet. Da stehen ganz andere Betriebsystemfunktionen dahinter, immerhin muss u.U. Excel erst mal gestartet werden.

Das ganze ließe sich mit ActiveX lösen. Aber auch ShellExecute sollte tun, was Du willst.

Link zu diesem Kommentar
Auf anderen Seiten teilen

@Tiana!

Als ich deinen Code-Beispiel gelesen habe viel mir nur eines ein: Uuuuaaaaahhh! Wer hat DIR denn das Programmieren beigebracht?

1. Um Himmelswillen! GOTO verwendet man heutzutage auch in Visual Basic NICHT mehr, so etwas wird nur im NOTFALL (und in Assembler) eingesetzt.

2. Filename besetzt man meist überhaupt nicht vor, es sei denn man will eine bekannte Daten öffnen, z.B. "setup.ini" Um "*.*"-Dateien anzeigen zu lassen gibt es den Filter.

3. Dein ShowOpen wird nicht abgefangen. Wenn der Benutzer auf Cancel drückt kann man dies abfragen und dann kannst du dir auch dein GOTO schenken.

4. Der Ansatz mit Shell war schon nicht schlecht. Wenn er die Excel-Dateien wirklich mit Excel öffnen will, sollte man aber "shell start dlg.FileName" benutzen

5. Ich glaube kaum dass er es schafft _direkt_ auf die EXCEL-Dateien zugreifen zu können. Mehr als Öffnen oder Schließen wird wohl nicht drin sein. CSVs wird er schon noch schaffen, aber XLS-Dateien... nö, das schafft er nie.

Gruß,

StarLord

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi,

also erstens mal, mangels Zeit meiner Ausbilder und weil ein Lehrgang zu teuer war musste ich mir das Programieren anhand von Unterlagen selber beibringen und dafür finde ich mache ich das ganz gut.

zu 2. Wenn Du meinen Code gelesen hast ist Dir sicher aufgefallen, dass ich den Filter benutzt habe, um die Dateierweiterung einzugeben.

Die zu öffnende Datei wurde ja vorher im Öffnen-Dialog übergeben, so das ich mit der Eigenschaft FileName eigentlich nur den Pfad und Namen der ausgewählten Datei übergeben habe- ich verstehe da dein Problem nicht.

Mit ShowOpen wird übrigens nur angezeigt, welchen Dialog ich anzeige nämlich den ÖffnenDialog und das brau auch gar nicht abgefangen werden.

zu 1. Mir ist schon klar, dass man nach Möglichkeit kein GOTO verwenden sollte, aber was machst Du, wenn der Anwender keine Datei auswählt und Trozdem auf OK klickt???? Da es sich bei dem angeführten Code eigentlich um eine Importschnittstelle handelt hätte das eine Interessante Fehlermeldung gegeben und die muss eben abgefangen werden. Ich hätte auc ganz am Anfang schrieben können On err GOTO, aber das wäre auf das selbe rausgekommen. Manchmal ist das Benuzten von GOTO eben doch erlaubt und sinnvoll.

zu 4. Gib doch mal in einem VB-Prog Shell start <File> ein. Ich wette mit Dir, das es nicht funktioniert, weil er den Parameter Start nicht kennt.

zu 5. wie auch VB-scripte zeigen ist es kein Problem mit Hilfe des Filesystemobjects auf xls-Dateien zuzugreifen (OpenFile()) und sie auszulesen und auch zu überschreiben. Das dürfte zeimlich genau auf VB zu übertragen sein, das es sich hier um Methoden des FSO handelt.

Excel Datein nicht nur zum Bearbeiten zu öffnen (mit FSO), sondern auch anzuzeigen (was 2 verschiedene Dinger sind) ist eine andere Sache, hierfür muss man wirklich mit ActiveX arbeiten.

Ich habe eher das Gefühl, dass Du meinen kleinen Codeauszug, der nur als Anregung gedacht war) weder richtig gelesen, noch verstanden hast. Aber wenn Du so schlau bist kannst Du sicher ein Code-Beispiel für die Lösung mit ActiveX angegeben???

Gruß, Tiana

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi,

du bekommst den Dateinamen und Pfad der im Öffnen-Dialog ausgewählten Datei, indem Du folgende Eigenschaft abfragst:

CommonDialog.FileName

(CommonDialog=name deines CommonDialogs)

Zum Test kannst Du Dir das Ergebnis mit Hilfe einer MsgBox anzeigen lassen:

Msgbox commondialog.FileName

Du kannst den Pfad natürlich auch an eine Stringvariable übergeben und weiterverarbeiten.

Gruß, Tiana

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi !

zum letzten Beitrag hätte ich auch eine Frage, da komme ich nämlich gerade nicht weiter.

Den Pfad habe ich mit der FileName-Methode zurückbekommen

(z.B. "C:\Programme\Zubehör\wordpad.exe"), den Wert habe ich in eine Stringvariable hinterlegt.

Aber wenn ich jetzt versuche mit Shell die Datei zu öffnen, bekomme ich trotzdem einen Laufzeitfehler "Datei nicht gefunden". Laut MSDN gibt Filename nur den Dateinamen zurück, also ohne Verzeichnis.

Aber in der Variable steht doch der Pfad mit drin ???:confused:???

Das gleiche Problem hab ich mit der Fileexistens-Methode, da bekomme ich permanent False zurück, obwohl sich die Datei bei einer manuellen Eingabe des Pfades + Datei (+Erweiterung) ohne Probleme starten läßt.

@Tiana

Die Lösung mit dem Goto ist übrigens aus meiner Sicht gar nicht mal so verkehrt, aber ein "Exit Sub" in der IF-Bedingung reicht auch. ;)

Gruß

Feivel

Link zu diesem Kommentar
Auf anderen Seiten teilen

Mhhh,

also ich habe kein Problem mit dem FileExist und dem FileName.

Allerdings musst du daran denken, dass man mit schell nur exe- Dateien ausführen kann.

Kannst Du mal das Stück Code einstellen, vielleicht finde ich ja den Haken?

Gruß, Tiana

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi,

ich hab das so gemacht.

dann kann man auch mehrere Dateien gleichzeitig auswählen, und der Cancel-Fehler wird abgefangen.


  Dim Flag As Boolean, aa$, bb$, Path$, Mem As Boolean, Pos&, x&

  Dim PosChr As Integer

  Dim OldPosChr As Integer

  PosChr = 0

  OldPosChr = 0


  On Error GoTo Break


    With CommonDialog1

      .filename = ""

      .CancelError = True

      .Flags = cdlOFNAllowMultiselect Or cdlOFNExplorer

      .ShowOpen

      If Flag Then

        MsgBox "Es wurde 'Abbrechen' gewählt!"

      Else



        'Schauen ob evt. nur eine Datei ausgewählt wurde

        If InStr(.filename, Chr$(0)) <> 0 Then

          aa = .filename & Chr$(0)

          Pos = 1

          Do

            'Chr$(0) ist Trennzeichen

            x = InStr(Pos, aa, Chr$(0))

            If x = 0 Then Exit Do

            bb = Mid$(aa, Pos, x - Pos)

            If Not Mem Then

              'Im ersten Teil befindet sich immer der Pfad

              Path = bb

              Mem = True

            Else

              'Pfad ist bereits bekannt, es folgen Dateinamen

              FileSize = FileLen(Path & "\" & bb)

              MsgBox Path & "\" & bb

            End If

            Pos = x + 1

          Loop

        Else

          'Es wurde nur eine Datei ausgewählt

           MsgBox .filename

        End If

      End If

    End With

    Exit Sub


Break:

    If Err.Number = 32755 Then

      Flag = True

      Resume Next

    ElseIf Err.Number = 20476 Then Flag = True

      MsgBox ("Es wurden zu viele Dateien ausgewählt!")

    End If


Und zum öffnen von Dateien, in ihrem Standardprogramm, hab ich immer das hier verwendet.

Private Declare Function ShellExecute Lib "Shell32.dll" Alias "ShellExecuteA" _

(ByVal hWnd As Long, ByVal lpOperation As String, ByVal lpFile As String, _

ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long



Private Sub Command1_Click()

Dim File2Open As String

File2Open = "C:\autoexec.bat"

intret = ShellExecute(Me.hWnd, "open", File2Open, "", "", 5)

End Sub

Vielleicht hilft's wem...

MfG

KarlBerg

PS: <Toll> Beim rauskopieren und umändern zum posten, hab ich mir gerade ein Programm zerschossen, weil ich ausversehen gespeichert hab</toll>

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi Tiana !

danke erstmal. Das könnte der Fehler schon sein, ich habe als letztes versucht eine Textdatei zu öffnen, da ich Parameterwerte in einer .txt bzw. .ini Datei habe, und die für den Programmstart notwendig sind. Das erklärt den Fehler in der Shell-Methode. Wenn ich "nur" ausführbare Dateien öffnen kann ist der Fehler eigentlich klar, dann werd ich versuchen den Laufzeitfehler abzufangen.

Aber gilt dass den auch für File-Existens ? Zumindest die Existenz des der Textdatei muss sich doch prüfen lassen, oder ?

Ich werde den Code heute abend mal posten, da ich nicht am Arbeitsplatz bin.

Hab gerad mal in meine Bücher geschaut, stimmt, da steht auch dass es "exe"-Dateien sein düfen. Wer lesen kann ist manchmal doch im Vorteil.

:rolleyes:

Bis dann !

Feivel

Link zu diesem Kommentar
Auf anderen Seiten teilen

Original geschrieben von Tiana zu 2. Wenn Du meinen Code gelesen hast ist Dir sicher aufgefallen, dass ich den Filter benutzt habe, um die Dateierweiterung einzugeben.

Richtig, und deshalb ist es nicht Sinnvoll den Dateinamen mit "*.*" vorzubesetzen. Das hatte ich aber schon geschrieben... du hattest anscheinend auch keine Zeit mein Posting mal durchzulesen. :(

Original geschrieben von Tiana Die zu öffnende Datei wurde ja vorher im Öffnen-Dialog übergeben, so das ich mit der Eigenschaft FileName eigentlich nur den Pfad und Namen der ausgewählten Datei übergeben habe- ich verstehe da dein Problem nicht.

Siehe nächster Absatz

Original geschrieben von Tiana Mit ShowOpen wird übrigens nur angezeigt, welchen Dialog ich anzeige nämlich den ÖffnenDialog und das brau auch gar nicht abgefangen werden.

Du brauchst mir nicht erklären was ShowOpen macht, ich programmiere in VB schon länger. Allerdings scheinst du nicht zu verstehen dass ShowOpen einen modalen Dialog mit Rückgabewert aufruft. Diesen Rückgabewert kann man dann abfangen, z.B.:


dlg.CancelError = TRUE ' Aktiviert die Cancel-Benachrichtigung

if dlg.ShowOpen = cdlCance then exit sub/function 'User hat auf Abbrechen gedrückt => Funktion  bzw Prozedur beenden

...

Original geschrieben von Tiana zu 1. Mir ist schon klar, dass man nach Möglichkeit kein GOTO verwenden sollte, aber was machst Du, wenn der Anwender keine Datei auswählt und Trozdem auf OK klickt????
Richtig, wenn der Anwender einfach auf OK klickt steht immer noch dein "*.*" drin. Deshalb sollte man es mit einem leerem String besetzen und dann einfach auf strlen <> 0 überprüfen. Ob die Datei existiert wirst du später sowieso noch einmal prüfen müssen. Allerdings wird deine Variante versagen wenn der Benutzer eine Datei auswählt und danach auf Abbrechen klickt. Deshalb solltest du auch das Abbrechen abfangen, wie das geht hatte ich ja schon erklärt.
Original geschrieben von Tiana Da es sich bei dem angeführten Code eigentlich um eine Importschnittstelle handelt hätte das eine Interessante Fehlermeldung gegeben und die muss eben abgefangen werden. Ich hätte auc ganz am Anfang schrieben können On err GOTO, aber das wäre auf das selbe rausgekommen. Manchmal ist das Benuzten von GOTO eben doch erlaubt und sinnvoll.
Man kann es auch umständlich machen wenn es einfach geht. In deinem Fall braucht man kein einziges Goto und ein OnError Resume ... wäre wohl eher angebracht.
Original geschrieben von Tiana zu 4. Gib doch mal in einem VB-Prog Shell start <File> ein. Ich wette mit Dir, das es nicht funktioniert, weil er den Parameter Start nicht kennt.
Seltsam, bei mir funktioniert
Shell "start C:\Windows\Tips.txt", vbHide

einwandfrei... es mag sein dass es unter WinNT, 2K oder XP nicht funktioniert. Aber unter Win98 klappt es ohne Probleme. Es gäbe auch noch eine andere Möglichkeit eine Datei ohne "start" aufzurufen... aber das wäre zu kompliziert und ich will euch (eher gesagt DICH) damit nicht überfordern.

Original geschrieben von Tiana

zu 5. wie auch VB-scripte zeigen ist es kein Problem mit Hilfe des Filesystemobjects auf xls-Dateien zuzugreifen (OpenFile()) und sie auszulesen und auch zu überschreiben. Das dürfte zeimlich genau auf VB zu übertragen sein, das es sich hier um Methoden des FSO handelt.

Excel Datein nicht nur zum Bearbeiten zu öffnen (mit FSO), sondern auch anzuzeigen (was 2 verschiedene Dinger sind) ist eine andere Sache, hierfür muss man wirklich mit ActiveX arbeiten.

Ehrlich gesagt verstehe ich nicht was du ständig mit "Filesytemobjects" meinst... falls du die Standard APIs für Dateizugriffe meinst kann ich dir nur recht geben.

Original geschrieben von Tiana Ich habe eher das Gefühl, dass Du meinen kleinen Codeauszug, der nur als Anregung gedacht war) weder richtig gelesen, noch verstanden hast. Aber wenn Du so schlau bist kannst Du sicher ein Code-Beispiel für die Lösung mit ActiveX angegeben???

Wenn du schon so Ignorrant bist kannst du dir deinen Code selbst schreiben. Denn DU bist diejenige die nicht richtig gelesen hat oder MEINE Kritik nicht verstanden hat. Du kannst programmieren wie du willst. Früher oder später wirst du aber bei komplexeren Programmen auf die Nase fallen. Und da du keine Kritik verträgst und auch auf Vorschläge nicht einmal eingehen willst wird dies wahrscheinlich schon früher geschehen als dir lieb ist. Hochmut kommt vor dem Falle.

EOD,

StarLord

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi,

also Dein FLAG Problem scheint mir ziemlich simpel. Du deklarierst eine Variabel FLAG als Boolean, weist Ihr aber keinen Wert zu. Damit ist Sie automatisch immer true (Standardwert). Du fragst zwar die Eigenschaft dlg.FLAGS ab und die wird auch ausgewerter (Rückgabewert ist eine Zahl) aber die hat hier keine Auswirkungen auf dein IF.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Original geschrieben von Feivel

Zumindest die Existenz des der Textdatei muss sich doch prüfen lassen, oder ?

Natürlich geht das. Hier ein simples Beispiel:


Private Sub Command1_Click()

  If Dir("C:\Windows\Tips.txt2", vbNormal) <> "" Then

    MsgBox "Datei gefunden.", vbOKOnly

  Else

    MsgBox "Datei nicht gefunden!", vbOKOnly

  End If

End Sub

Gruß,

StarLord

Link zu diesem Kommentar
Auf anderen Seiten teilen

Original geschrieben von Schneeflocke

wenn ich dir(.filename) eingebe krieg ich nur den Dateinamen, wie krieg ich den Pfad? wo kann ich "Path" verwenden oder is das verkeht?

Natürlich bekommst du bei dir nur den Dateinamen zurück. Dir überprüft auch nur ob die angegebene Datei existiert. Wenn du den Pfad willst reicht es doch wenn du von dlg.filename ab dem letzten Backslash ("\") den String abschneidest. Wo ist denn da das Problem?

Hier mal eine Funktion die ich mal geschrieben habe:


Function SeperatePath(SearchPath As String) As String

  Dim PathSeperatorPos, LastPathSeperatorPos As Integer


  PathSeperatorPos = 1

  Do Until PathSeperatorPos = 0

    LastPathSeperatorPos = PathSeperatorPos

    PathSeperatorPos = InStr(PathSeperatorPos + 1, SearchPath, "\")

  Loop

  SeperatePath = Left(SearchPath, LastPathSeperatorPos)

End Function

Wenn du den abschließenden Backslash nicht brauchst:

SeperatePath = Left(SearchPath, LastPathSeperatorPos - 1)

Gruß,

StarLord

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...