Klickbarer Bereich mit Ausgrenzungen

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 19 Antworten in diesem Thema. Der letzte Beitrag () ist von SpecialUser.

    Klickbarer Bereich mit Ausgrenzungen

    Hallo an Alle,

    habe eine Frage:
    Ich habe eine Form mit mehreren TextBoxes. Nun möchte ich, dass eine Aktion ausgeführt wird, wenn eine der TextBoxes sichtbar und mit der Maus irgendwo innerhalb der Form geklickt wird, NICHT JEDOCH wenn der Klick innerhalb der geraden sichtbaren TextBox stattfindet.
    Wie kann ich nun genau den Bereich der aktuell sichtbaren TextBox vom klickbaren Bereich ausgrenzen?

    Hoffe ihr könnt mir hier weiterhelfen.

    Danke

    VB.NET-Quellcode

    1. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles btnShow.Click
    2. TextBox1.Visible = True 'Macht TextBox1 unsichtbar
    3. End Sub
    4. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles btnHide.Click
    5. TextBox1.Visible = False 'Macht TextBox1 sichtbar
    6. End Sub
    7. Private Sub Form1_Click(sender As Object, e As EventArgs) Handles MyBase.Click 'Das Clickevent hört nicht drauf, wenn du in ein Control klickst, also würde ich das nehmen
    8. If TextBox1.Visible Or TextBox2.Visible = True Then 'Falls TextBox1 oder TextBox2 sichtbar ist
    9. MsgBox("Aktion") 'Dann Aktion ausführen
    10. End If
    11. End Sub



    xored


    Meine Website:
    www.renebischof.de

    Meine erste App (Android):
    PartyPalooza
    @xored What????
    1. hat das nicht im entferntesten etwas mit der Fragestellung des TE zu tun
    2. ist das Option Strict off UND alter VB6 Ranz

    Nur am Rande, ein Control sichtbar/unsichtbar schalten kann man in einem machen -> TextBox1.Visible = Not TextBox1.Visible

    @SpecialUser
    was genau hast Du vor, eventuell gibt es da einfachere Möglichkeiten.
    btw. ich würde prüfen ob die Maus über der Textbox ist und dann eben klicken nicht zulassen...
    "Hier könnte Ihre Werbung stehen..."

    MichaHo schrieb:

    @xored What????
    1. hat das nicht im entferntesten etwas mit der Fragestellung des TE zu tun


    ​Ich habe eine Form mit mehreren TextBoxes. Nun möchte ich, dass eine Aktion ausgeführt wird, wenn eine der TextBoxes sichtbar und mit der Maus irgendwo innerhalb der Form geklickt wird, NICHT JEDOCH wenn der Klick innerhalb der geraden sichtbaren TextBox stattfindet.


    Hab ich getan. Also was ist?


    Meine Website:
    www.renebischof.de

    Meine erste App (Android):
    PartyPalooza
    @xored : Ich muss MichaHo leider recht geben. Das was du gesagt hast ist einfaches einblenden und ausblenden der TextBox. Das ist aber nicht mein Problem. Lies die Fragestellung bitte nochmal GENAU durch.

    @MichaHo : Anbei ein Bild meiner aktuellen Situation. Wenn nu auf "Screenshots" geklickt wird, wird das Label ausgeblendet und eine TextBox eingeblendet um den Text zu ändern. Wenn der User nun mit der Maus an irgend eine Stelle in der Form klickt, soll die TextBox wieder ausgeblendet werden. Nicht jedoch, wenn der User innerhalb der TextBox irgendwo klickt (es kann ja sein, dass er mit dem Cursor zwischen "Screen" und "shots" klickt um dort einen "-" zu machen.)

    Hoffe ich konnte es verständlich formulieren.
    Bilder
    • TitelÄnderung.JPG

      14,03 kB, 406×126, 80 mal angesehen

    VB.NET-Quellcode

    1. Private Sub Form1_Click(sender As Object, e As EventArgs) Handles MyBase.Click 'Das Clickevent hört nicht drauf, wenn du in ein Control klickst, also würde ich das nehmen
    2. If TextBox1.Visible Or TextBox2.Visible = True Then 'Falls TextBox1 oder TextBox2 sichtbar ist
    3. MsgBox("Aktion") 'Dann Aktion ausführen
    4. End If



    Das beschreibt es doch?
    Wenn eine der Textboxen sichtbar ist und man IRGENDWO in die Form klickt passiert etwas. Es passiert beim Clickevent jedoch nichts, wenn man in eine Textbox klickt. Das ist doch das,
    was gewollt ist, oder nicht?

    Statt msgbox machste dann die textbox wieder unsichtbar. Und falls dieser Container da ebenfalls ein Control ist, kannst du da auch das Clickevent nutzen


    Meine Website:
    www.renebischof.de

    Meine erste App (Android):
    PartyPalooza

    SpecialUser schrieb:

    Hoffe ich konnte es verständlich formulieren.
    Noch nicht ganz. Welche Punkte sind korrekt, welche nicht:
    1. Das Bild, die Labels (?) mit »selbstdefiniertes Verzeichnis« und »Keine Größenangabe« spielen für das hiesige Problem keine Rolle.
    2. Du klickst auf das Label, welches mit »Screenshots« beschriftet ist.
    3. Dieses Label verschwindet, an dessen Stelle erscheint eine TextBox.
    4. Diese ist … tja, wofür eigentlich gedacht? Soll da ein Verzeichnis eingetragen werden? Das legt Dein Screenhot zumindest nahe, aber bitte klären, was man in die TextBox eintragen soll.
    5. Man klickt auf das Form, die TextBox verschwindet und das Label taucht wieder auf. Da verstünde ich aber nicht, wo dann der TextBox-Inhalt zu sehen ist.
    Der Ansatz von xored ist wegen VB6-MsgBox und Or (Der Unterschied zwischen And und AndAlso/Or und OrElse) nicht optimal. Auch ist der Passus If TextBox1.Visible Or TextBox2.Visible = True Then inkonsequent (besser ist summa summarum If TextBox1.Visible OrElse TextBox2.Visible Then), aber es ist der korrekte EventHandler: »Klick auf das Form und mach was« - Vorgabe des TE. Weiter ginge es mit: »Und dann lass die TextBox verschwinden und das Label wieder anzeigen.«
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed

    zu 1.) Genau. Diese spielen keine Rolle. Nur das Label mit der Beschriftung "Screenshots".
    zu 2.) Richtig. Auf dieses wird per Click bzw. Doppelklick geklickt.
    zu 3.) Das Label verschwindet, die TextBox erscheint (um die Beschriftung - in diesem Fall "Screenshots" zu ändern, da ein Label ja nicht während der Laufzeit direkt geändert werden kann)
    zu 4.) Die TextBox wird automatisch mit dem Text des Labels (also "Screenshots") gefüllt. Nun kann man den Text ändern.

    Jetzt hat der User aber entschieden die Beschriftung doch nicht zu ändern und "Screenshots" soll stehen bleiben. Die meisten User klicken nun reflexartig irgendwo außerhalb der TextBox hin um den Vorgang zu beenden.
    Und genau hier ist das Problem. Wenn irgendwo außerhalb der Text, jedoch innerhalb der Form geklickt wird, soll die TextBox wieder ausgeblendet werden und das Label mit der Beschriftung "Screenshots" wieder angezeigt werden.

    Im Grunde ist es ein Abbruch des Vorgangs zur Umbenennung einer Datei/Verzeichnisses.
    Dann wie es xored angefangen hat. Hab's probiert und läuft:

    VB.NET-Quellcode

    1. Dim CurrentText = Label1.Text
    2. Private Sub Label1_Click(sender As Object, e As EventArgs) Handles Label1.Click
    3. Label1.Visible = False
    4. TextBox1.Text = CurrentText
    5. TextBox1.Visible = True
    6. End Sub
    7. Private Sub Form1_Click(sender As Object, e As EventArgs) Handles Me.Click 'quasi Abbruch
    8. Label1.Visible = True
    9. TextBox1.Text = CurrentText
    10. TextBox1.Visible = False
    11. End Sub

    Aber: Wie wird der TextBox-Inhalt als bestätigt akzeptiert? Denn nach dem Bearbeiten der TextBox muss man ja irgendwie weitermachen. Da muss man ziemlich aufpassen, dass man als User nicht versehentlich auf das Form klickt und die Eingabe rückgängig macht. Tricky GUI.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    SpecialUser schrieb:

    Wenn irgendwo außerhalb der Text, jedoch innerhalb der Form geklickt wird, soll die TextBox wieder ausgeblendet werden und das Label mit der Beschriftung "Screenshots" wieder angezeigt werden.

    Im Grunde ist es ein Abbruch des Vorgangs zur Umbenennung einer Datei/Verzeichnisses.



    Dann mach doch einfach im ClickEvent (z.B. Form1, oder andere ContainerElemente) wie beschrieben das Label wieder sichtbar und die TextBox unsichtbar, oder nicht? :D


    Meine Website:
    www.renebischof.de

    Meine erste App (Android):
    PartyPalooza
    Das Click-Event funktioniert aber nur wenn ich auch direkt auf dieses Control klicke. Sei es in der Form oder auch auf ein Panel.
    Sobald aber noch ein anderes Control (z.b. Panele in meinem Fall) darauf liegt, funktioniert das alles nicht mehr.
    Genau deshalb habe ich am Anfang angegeben, dass das Click-Event in der gesamten Form, außer IN der aktuell sichtbaren TextBox aktiv werden soll.
    Bilder
    • Übersicht_Titel.JPG

      32,36 kB, 826×535, 69 mal angesehen
    Naja, ist eher eine große Sache, da aktuell wie auf dem Bild ersichtlich 8 Felder vorhanden sind. Alle könne gefüllt werden und sehen dann aus wie auf dem ersten Bild. D.h. es kommen einige Controls zusammen. Außerdem kann das ganze noch erweitert werden auf bis zu 20 Felder. Deshalb wollte ich wissen, ob man irgendwie auf den ganzen Bereich der Form (außer auf die aktuell sichtbare TextBox) mit dem Click-Event zugreifen kann.
    @SpecialUser Du musst jedem Control einen Click-Handler zuweisen (es kann für alle derselbe sein, wenn die Logik darin übereinstimmt).
    Alles andere fällt dann in den Form-Click-Handler.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @SpecialUser Woher soll die Parent-Form wissen, was die Maus in einem Client-Control macht?
    Das ist halt OOP (objekt-orientierte Programmierung).
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hm ... man könnte alles über einen Kamm scheren:

    VB.NET-Quellcode

    1. Public Class FrmMain
    2. Private Sub FrmMain_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    3. RegisterMeAndMyChildren(Me, Sub(x, y) Any_Click(x, y), {Label1, TextBox1})
    4. End Sub
    5. Private Sub RegisterMeAndMyChildren(Control As Control, EventHandler As EventHandler, ExceptControls As Control())
    6. If Not ExceptControls.Contains(Control) Then AddHandler Control.Click, EventHandler
    7. For Each ChildControl In Control.Controls.Cast(Of Control)
    8. RegisterMeAndMyChildren(ChildControl, EventHandler, ExceptControls)
    9. Next
    10. End Sub
    11. Private Sub Any_Click(sender As Object, e As EventArgs)
    12. Label1.Visible = True
    13. TextBox1.Text = Label1.Text
    14. TextBox1.Visible = False
    15. End Sub
    16. Private Sub Label1_Click() Handles Label1.Click
    17. Label1.Visible = False
    18. TextBox1.Text = Label1.Text
    19. TextBox1.Visible = True
    20. End Sub
    21. End Class

    Aber meine Post#9-Fragen bleiben leider unbeantwortet ;(
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Dann noch aus Post#9 die Zeilen mit CurrentText übernehmen und im z.B. Keydown-EventHandler der TextBox bei Drücken der Entertaste den eingegebenen Text der Variable CurrentText zuornen. Fertig.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.