Form-Verhalten wie ein Ordner

  • VB.NET

Es gibt 20 Antworten in diesem Thema. Der letzte Beitrag () ist von Samus Aran.

    Form-Verhalten wie ein Ordner

    Hallo Zusammen!

    Zuerst einmal: Ich bin VB-Anfänger, bitte geht nicht zu hart mit mir ins Gericht :)

    Ich habe momentan ein Problem mit meinem geplanten Projekt. Dieses sieht folgendermaßen aus:
    Ich möchte ein Formular erstellen, welches sich im Prinzip wie ein Verzeichnis auf dem PC verhält. Wo ich also Dateien (in diesem Falle verknüpfungen) ablegen kann. Am liebsten wäre mir dies per Drag&Drop.
    Der Vorgang wäre also:
    Benutzer packt eine Verknüpfung vom Desktop und legt sie auf die Form. Die Form hält nun wie ein Ordner die Verknüpfung bereit und kann minimiert werden.

    Hintergrundinfo:
    Das fertige Programm soll wie eine Art "Schnellstarter" dienen. Man legt seine wichtigen Verknüpfungen auf der Form ab und minimiert das Programm. mit einem klick auf das Symbol in der Taskbar erscheint wieder das Formular und man kann sein Programm starten. Die Form minimiert sich dann automatisch wieder.

    Mein Problem ist nun:
    Wie zum Teufel kriege ich es hin dass ich Verknüpfungen ablegen kann? Ich habe schon mehrere Steuerelemente probiert und kriege einfach keinen Faden damit ich endlich starten kann.

    Ich bin für jede Hilfe dankbar!
    mit freundlichem Gruß,
    Black_Seraph
    Hallo Black_Sheraph,

    1. Zum ziehen der Verknüpfung auf die Form Drag-Drop verwenden
    2. In einem Fall wie deinem würde ich die Verknüpfungen dann in einer Klasse serialisieren.
    3. Ein Dateiexplorer (wie Windows) besteht aus SplitContainer, ListView und Treeview.

    Anmerkung:

    Wenn das dein erstes Projekt werden soll hast du dir etwas sehr großes vorgenommen.
    In diesem Fall würde ich raten mit etwas kleinerem zu beginnen.

    Die Fettgeschriebenen Begriffe sollen dir die Suche erleichtern.
    Du findest viele Beipsiele hier und im Internet

    Gruss

    mikeb69

    mikeb69 schrieb:

    1. Zum ziehen der Verknüpfung auf die Form Drag-Drop verwenden
    2. In einem Fall wie deinem würde ich die Verknüpfungen dann in einer Klasse serialisieren.
    3. Ein Dateiexplorer (wie Windows) besteht aus SplitContainer, ListView und Treeview.

    ad 1) stimme ich 100% zu
    ad 2) ebenfalls, allerdings wenn Du Dich vor Serialisierung scheust, kannst Du auch My.Settings, Ini, Registry oder andere Form der Speicherung wählen

    Zu 3.: ich denke nicht dass er einen Dateiexplorer nachbauen will /soll , sondern nur eine Anzeige der Verknüpfungen, entweder nacheinander (einfach) oder in Kategorien (mittel). Ich würde an Deiner Stelle zuerst mal mit einer einfachen Auflistung beginnen (Listbox ?) und später evtl auf ein ToolStripmenu, Treeview oder was auch immer erweitern.

    Auf jeden Fall fange mit einer leichten Lösung an und verbessere sie dann nach und nach ...

    Kangaroo schrieb:

    Zu 3.: ich denke nicht dass er einen Dateiexplorer nachbauen will /soll
    Man könnte es ganu einfach so formulieren:
    Ich möchte quasi die Schnellstart-Symbolleiste von Windows XP nachprogrammieren.
    Das ganze würde zwar auch funktionieren wenn ich im Windows einfach eine weitere Symbolleiste an die Taskleiste anhefte (rechtsklick auf die Taskleiste->Symbolleisten->neue Symbolleiste), und den Ordner per Hand fülle, aber der Platz auf der Taskleiste ist doch sehr schnell knapp. Darum möchte ich eine Alternative Programmieren.
    Es ist zwar nicht mein erstes VB-Projekt, aber die anderen waren wesentlich einfacher. Ein wenig Dateien hin- und herschubsen oder eine CSV bearbeiten, also nichts vergleichbares.


    Vielen Dank für die Suchvorschläge, die haben mich schon eine ganze Ecke weiter gebracht. Zumindest kann ich nun in Steuerelemente "Droppen" :thumbsup:
    Heute abend werde ich mich dem Problem noch einmal annehmen.
    Also, ich bin nun schon, wie ich finde, recht weit.
    Probleme bereitet mir eigentlich nur noch die vernünftige Darstellung der Verknüpfungen auf den Formen.

    Vielleicht mag sich das bisherige Ergebnis mal jemand anschauen und mir sagen welches Element ich am besten nehme um die Verknüpfungen abzulegen?
    Ich würde bisher zu dem von mikeb69 vorgeschlagenen Treeview tendieren, aber ich kriege es (verflixt nochmal!) nicht hin...

    Bisher funktionieren nur die Bars 1-3, auf Bar 1 kann man sehen wie ich es einmal in etwa haben möchte.
    Konkret fehlt mir noch folgendes:
    Man packt eine Verknüpfung per Drag&Drop und lässt sie über der gewünschten Fläche fallen. Hier wird sie wie in einem Ordner gespeichert und ist nun als Shortcut verfügbar.
    Beispiel:
    Ich nehme meine Verknüpfung zu notepad.exe und lege Sie auf Bar Nr.2. Möchte ich nun im laufe der Zeit notepad starten, dann öffne ich bar2 und klicke die notepad-Verknüpfung an.

    Ich bin für jede Hilfe dankbar!

    P.S.: Das Simbol wird natürlich später noch ein anderes, brauchte das zu testzwecken und als erstes hab ich nunmal dieses gefunden.
    und BarBara ist mein vorläufiger Name für das Programm.
    Dateien
    • BarBara.exe

      (111,1 kB, 1.965 mal heruntergeladen, zuletzt: )
    Okay, das hab ich auch geschafft. Diese Imagelist hat mich wirklich Nerven gekostet ;)

    Jetzt stehe ich aber erneut wie der Ochse vor dem Berge und kriege etwas nicht hin:

    In einer Listview habe ich nun einige Items. Wie kann ich nun das ausgewählte Item starten?

    VB.NET-Quellcode

    1. Private Sub ListView_Bar1_ItemSelectionChanged(ByVal sender As Object, ByVal e As System.Windows.Forms.ListViewItemSelectionChangedEventArgs) Handles ListView_Bar1.ItemSelectionChanged
    2. Process.Start(ListView_Bar1.SelectedItems)
    3. End Sub


    Fehler 1 Fehler bei der Überladungsauflösung, da keine zugreifbare "Start" mit diesen Argumenten aufgerufen werden kann:
    "Public Shared Function Start(startInfo As System.Diagnostics.ProcessStartInfo) As System.Diagnostics.Process": Der Wert vom Typ "System.Windows.Forms.ListView.SelectedListViewItemCollection" kann nicht in "System.Diagnostics.ProcessStartInfo" konvertiert werden.
    "Public Shared Function Start(fileName As String) As System.Diagnostics.Process": Der Wert vom Typ "System.Windows.Forms.ListView.SelectedListViewItemCollection" kann nicht in "String" konvertiert werden.

    Ich habe nun schon etliche Kombinationen versucht, werde aber einfach nicht schlau daraus. Würde mir da noch einmal jemand helfen?
    process start wird nur zum starten benötigt.
    welches programm oder welche Datei musst du woanders deklarieren

    VB.NET-Quellcode

    1. Dim pr as new Process
    2. pr.StartInfo.Filename = c:\temp\test.txt 'Dateiname
    3. pr.Startinfo.Arguments = 'Parameter falls nötig
    4. pr.StartInfo.WindowStyle = 'wie das fenster beim start ausschaut
    5. pr.start() 'Der start selbst


    musst halt nur auf deinen code dann anpassen ;)

    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten
    Ah, okay, geblickt!

    Aber wie komme ich nun von meinem selektierten Item in der Listview zum Filename?

    pr.StartInfo.Filename = ListView_Bar1.SelectedItems
    nimmt er nicht weil es nicht zu einem string konvertiert werden kann. Ich habe das gefühl ich müsste
    pr.StartInfo.FileName = ListView_Bar1.SelectedItems.Item(X).ToString() benutzen, webei X der Index des gewählten Items ist... aber wie komme ich dann an den Index?
    Vielleicht habe ich meine Frage nicht korrekt gestellt.

    Ich habe eine Listview-Element mit Items darin. Wie komme ich nun wieder an die Daten des Items?

    So ziehe ich mir alle Dateien und die passenden Icons aus einem Verzeichnis in das Listview:

    VB.NET-Quellcode

    1. Dim counter As Integer
    2. Dim Inhalt() As String
    3. Dim Progicon As Icon
    4. Inhalt = System.IO.Directory.GetFiles("c:\Testverzeichnis\")
    5. Do While counter < Inhalt.Count()
    6. ListView_Bar1.Items.Add(Inhalt(counter), (counter))
    7. Progicon = Icon.ExtractAssociatedIcon(Inhalt(counter))
    8. ImageList_Bar1.Images.Add(Progicon)
    9. counter += 1
    10. Loop


    Ich möchte nun bei einem Klick auf eines der Items dass das passende Programm aufgerufen wird. Z.B. gibt es hier eine datei mir dem Namen test.xls und ich möchte dass nun bei einem Klick auf das Item in der Listview dieses Excel-dokument geöffnet wird.
    Okay, ich habs. Für jeden der danach sucht und das hier findet mal die Lösung:

    Das aktuelle aktivierte Item ist immer
    ListView1.SelectedItems(0)

    ausgenommen man hat multiselekt zugelassen, dann gäbe es natürlich z.B.
    ListView_Bar1.SelectedItems(0) für das erste aktivierte Item,
    ListView_Bar1.SelectedItems(1) für das zweite aktivierte Item,
    ListView_Bar1.SelectedItems(2) für das dritte aktivierte Item etc.

    Man kann dann auf die Eigenschaften des ausgewählten Items zugreifen, wie z.B. auf den text mit ListView_Bar1.SelectedItems(0).text

    P.S.:
    Es war so einfach und logisch! Ich habe einfach nicht kapiert dass SelectedItems die ausgewählten Items sind, sondern dachte immer das wären ALLE Items der Listview und war am grübeln wie ich nun den Index des ausgewählten Items rausfinde. Dabei steht es doch da, SELECTEDitems... :cursing:
    Da bin ich wieder und habe wieder eine Frage...

    Mein Programm funktioniert nun schon so wie gewünscht.

    • Ich habe eine Leistenauswahl am linken Bildschirmrand.
    • Ich kann die Größe der Leisten anpassen
    • Ich kann per Drag&Drop Dateien und Verknüpfungen auf die Forms werfen wie bei einer Schnellstartleiste.
    • Ich kann die abgelegten Dateien und Verknüpfungen aus der Leiste heraus starten.
    ABER:

    Ich bräuchte noch eine Art umgekehrtes Drag&Drop.
    Ich möchte die Elemente, welche auf den Forms liegen mit der Maus packen und z.B. auf den desktop ziehen, dort die Maustaste loslassen und so die Datei hierhin verschieben.

    Wer interesse hat kann sich das Programm soweit auch anschauen, ich hänge es diesem Post an. Achtung: Das Programm erstellt im Applikationsverzeichnis 5 Unterordner! Also vielleicht nicht direkt vom Desktop aus starten, sondern von einem Unterordner aus 8-)
    Dateien
    • BarBara1.zip

      (461,79 kB, 111 mal heruntergeladen, zuletzt: )
    Ich bastel derzeit etwas ähnliches. Was mir aber bei deinem Programm aufgefallen ist: Du kopierst die Datei, die in deinen Bar gezogen wirst in die Bar_Elements Ordner? Macht das Sinn, das dann 2 Versionen einer Datei vorhanden sind? Ich speichere mir nur ab, wo die eingetragene Datei zu finden ist.

    Was die Frage zu Drag&Drop angeht, damit muss ich mich selbst erst noch intensiver auseinandersetzen, aktuell verzichte ich in meinem Tool darauf. Aber ist eingeplant und wird eine der nächsten Programmerweiterungen sein.
    Das kopieren in die Unterordner ist gewollt, da ich die Leisten auch als eine Art "Ablage" benutzen möchte.
    Beispiel:
    Ich bin in Ordner A und nehme mir eine Datei, und lege diese auf Bar5 ab.
    Ich arbeite an etwas anderem.
    ich bin in Ordner B und ziehe mir nun die Datei aus der Bar5 in das Verzeichnis.

    Momentan wird noch kopiert, um beim Testen meine Dateien nicht zu verlieren, später werde ich auf ausschneiden umstellen.


    Gerade für diese Funktionalität benötige ich das Ziehen der Elemente aus der Form auf Desktop / Vezreichnis...
    Da das Thema Drag&Drop aus einer Anwendung heraus wohl doch etwas zu schwierig für mich ist habe ich mir nun etwas überlegt:

    Bei einem Rechtsklick auf ein Element soll ein Kontextmenü geöffnet werden in welchem ich auswählen kann das betreffende Element an einen anderen Ort zu verschieben. Das klappt auch alles wunderbar, bis auf eine kleinigkeit:

    Ich lasse die Form ausblenden wenn die Maus sie verlässt. Klicke ich nun einen Eintrag rechts an und gehe mit der Maus über das Menü, dann "schwupps" ist meine Form ausgeblendet, und das betreffende Menü natürlich gleich mit.

    Jemand eine Idee was ich da am besten mache?


    Edit:

    Habs schon :P

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Black_Seraph“ ()

    Das werde ich mit Sicherheit einmal ausprobieren!

    Momentan habe ich das Problem ein wenig umgangen indem ich ein Menü zur Verfügung stelle wenn ein Rechtsklick auf ein Element gemacht wird.
    Dort gibt es dann die Möglichkeit das Element zu entfernen oder in einen Ordner zu verschieben.

    Ich habe auch so einige Sachen hinzugefügt, z.B. kann nun in den Einstellungen gewählt werden ob die Mainbar am rechten, oder am linken Bildschirmrand steht.
    Mit einer Größenänderung der Buttons während des Betriebs habe ich auch etwas hantiert, fand dann aber den Aufwand zu groß und den Nutzen zu klein.


    Aktuell versuche ich auch das einblenden auf einem zweiten Monitor möglich zu machen, was sich aber nicht als ganz so simpel herrausstellt.
    Sicherlich kann ich einfach die Auflösung des zweiten Monitors auslesen und die betreffende Anzahl pixel zur Location auf dem Hauptschirm addieren bzw. subtrahieren.
    Problematisch ist hier aber: ich weiß gar nicht ob der Zweitschirm rechts oder links vom hauptschirm steht. Somit weiß ich nich ob ich die Pixel addieren oder Subtrahieren muss.

    Beispiel:
    Zweitschirm steht rechts vom Hauptschirm:

    VB.NET-Quellcode

    1. frm_mainbar.Location = New Point(((Screen.PrimaryScreen.Bounds.Width + AufLösung_Zweitschirm) - 15), ((Screen.PrimaryScreen.Bounds.Height / 2) - 300))

    zweitschirm steht links vom Haupschirm:

    VB.NET-Quellcode

    1. frm_mainbar.Location = New Point(((Screen.PrimaryScreen.Bounds.Width - AufLösung_Zweitschirm) - 15), ((Screen.PrimaryScreen.Bounds.Height / 2) - 300))


    Es muss da eine Möglichkeit geben, Windows kann es ja auch! Bisher konnte ich sie nur noch nicht finden.

    P.S.: ich habe den aktuellen Stand für Interessierte mal angehängt. Achtung: Diese Version verschiebt nun die Dateien in die Unterordner statt sie zu kopieren! Also nur mit unwichtigen Dateien rumspielen wenn man sich nicht sicher ist was man tut!
    Dateien
    • BarBara1.zip

      (461,79 kB, 107 mal heruntergeladen, zuletzt: )
    Ärgerlicherweise habe ich nur einen Monitor und somit wüsste ich nicht, wie ich meine These testen könnte, aber kannst du die Informationen eventuell in Screen.AllScreens finden?
    Screen[Bounds={X=0,Y=0,Width=1600,Height=900} WorkingArea={X=0,Y=0,Width=1600,Height=870} Primary=True DeviceName=\\.\DISPLAY1
    Setz dir mal eine Listbox in ein Testprojekt und schau mal, ob dort verwertbare Infos zu finden sind.

    VB.NET-Quellcode

    1. For Each elements As Object In Screen.AllScreens
    2. ListBox1.Items.Add(elements)
    3. Next
    Ich habe deinen Tipp mal befolgt, folgenes ist dabei rausgekommen:



    Wie man hier sehen kann arbeite ich an einem Laptop dessen Screen 1440x900 auflöst und einem kleinen Zweitschirm mit 1024x768.
    Interessant ist, dass VB glaubt mein Laptop-Screen wäre NICHT der Primärscreen. Ist er aber, auf diesem ist schließlich auch meine Taskleiste...

    Kann mir nun jemand sagen ob mein Zweitschirm links oder rechts vom Laptop steht?

    (Natürlich weiß ich das selbst, sitze ja davor. Aber solange mein Programm das nicht weiß kann ich nicht damit arbeiten :rolleyes: )

    Ich hätte nie gedacht dass da so viel dran hängt an einer simplen Startleiste für Programme...
    Also anhand des Eintrags "WorkingArea" müsste das doch ermittelbar sein, oder? Demzufolge müsste dein Zweitscreen Links sein. Oder was auch immer. Ich kann es wie gesagt nicht testen, aber da dort unterschiedliche Werte stehen, liegt die Vermutung nahe, dass man auch irgendwie mit diesen arbeiten kann.