Getfocus in Funktion einbauen | Anfänger

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Getfocus in Funktion einbauen | Anfänger

    Hallo,

    Bräuchte als Anfänger mal einen Denkanstoß... Ich habe in meinem Programm viele Textboxen... diese will ich wenn der Focus auf der Textbox liegt Farblich kenntlich machen. So wie ich es bis jetzt Praktiziert habe funktioniert das nur so:

    Private Sub TEXT_ADRESS_001_TextChanged1(sender As Object, e As EventArgs) Handles TEXT_ADRESS_001.GotFocus
    TEXT_ADRESS_001.BackColor = Color.LightBlue
    End Sub

    Private Sub TEXT_ADRESS_001_TextChanged2(sender As Object, e As EventArgs) Handles TEXT_ADRESS_001.LostFocus
    TEXT_ADRESS_001.BackColor = Color.Empty
    End Sub

    Mein Ziel bzw. mein bestreben ist es dieses in einer Funktion unterzubringen?

    So wie ich mir das gedacht habe geht es natürlich nicht:

    Function FOKUS_AUF_TEXT(ByRef TEXT_FOCUS As TextBox)
    If TEXT_FOCUS.getfocus then
    Text_focus = Color.LightBlue
    else
    Text_focus = Color.Empty
    End If
    End Function

    Bitte bei der Frage berücksichtigen das ich Anfänger bin was Visual Basic angeht.
    Für jeden Denkanstoß wäre ich sehr dankbar.

    Diese Funktion wollte ich dann in der Sub aufrufen.

    Private Sub TEXT_ADRESS_001_TextChanged1(sender As Object, e As EventArgs) Handles TEXT_ADRESS_001.GotFocus, TEXT_ADRESS_001.LostFocus
    Call FOKUS_AUF_TEXT (Text_Adress_001)

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

    Willkommen im Forum.

    Ich fand auf die Schnelle (leider nur) eine Holzhammermethode, da wohl .Net keine Erfassung des fokussierten CEs anbietet. ActiveControl funktionierte bei mir nicht.

    VB.NET-Quellcode

    1. Imports System.Drawing
    2. Imports System.Runtime.InteropServices
    3. Public Class Form1
    4. <DllImport("user32.dll", CharSet:=CharSet.Auto, CallingConvention:=CallingConvention.Winapi)> Private Shared Function GetFocus() As IntPtr : End Function
    5. Private Sub ToggleBackColorOf(TextBox As TextBox)
    6. Dim FocusedHandle = GetFocus()
    7. If FocusedHandle = IntPtr.Zero Then Return
    8. Dim FocusedControl = FromHandle(FocusedHandle)
    9. If FocusedControl Is Nothing Then Return
    10. If FocusedControl Is TextBox Then
    11. TextBox.BackColor = Color.LightBlue
    12. Else
    13. TextBox.BackColor = Color.Empty
    14. End If
    15. End Sub
    16. Private Sub TEXT_ADRESS_001_TextChanged(sender As Object, e As EventArgs) Handles TEXT_ADRESS_001.GotFocus, TEXT_ADRESS_001.LostFocus
    17. ToggleBackColorOf(TEXT_ADRESS_001)
    18. End Sub
    19. End Class


    btw: bitte CodeTags verwenden
    Bevor Du weitermachst, bitte die empfohlenen VS-Einstellungen verwenden, da Functions immer einen Wert zurückgeben müssen.
    Das Schlüsselwort Call ist (in fast allen Fällen) obsolet.
    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.
    Ich fand dieses Problem interessant und dachte mir, wie ich es lösen würde, unter Berücksichtigung, dass die Anzahl und Namen der TextBoxen egal ist.
    Natürlich mit der bitte an alle Profis hier im Forum, dass falls es die falsche Herangehensweise ist, sofort zu schreien. :)

    Form: Form1
    Button: Button1
    TextBoxen: Namen und Anzahl sind egal

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Public Sub New()
    3. InitializeComponent()
    4. For Each txt As TextBox In Me.Controls.OfType(Of TextBox)
    5. AddHandler txt.TextChanged, AddressOf TextBox_TextChangedandGotFocus
    6. AddHandler txt.GotFocus, AddressOf TextBox_TextChangedandGotFocus
    7. Next
    8. End Sub
    9. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    10. Button1.Select()
    11. End Sub
    12. Private Sub TextBox_TextChangedandGotFocus(sender As Object, e As EventArgs)
    13. For Each txt As TextBox In Me.Controls.OfType(Of TextBox)
    14. If txt IsNot sender Then
    15. txt.BackColor = Color.Empty
    16. Else
    17. txt.BackColor = Color.LightBlue
    18. End If
    19. Next
    20. End Sub
    21. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles _
    22. Button1.Click,
    23. Button1.GotFocus
    24. For Each txt As TextBox In Me.Controls.OfType(Of TextBox)
    25. txt.BackColor = Color.Empty
    26. Next
    27. End Sub
    28. End Class


    LG Maffi
    @VaporiZed

    Danke für die Lösung. Dies geht auch wunderbar...
    Nicht als Kritik verstehen, weil es gut Funktioniert... dachte aber an eine einfache Umsetzungsmöglichkeit. Leider bin ich noch Anfänger mit der Sache...
    Was in diesem Teil passiert übersteigt grade mein Wissen:

    VaporiZed schrieb:


    Imports System.Drawing
    Imports System.Runtime.InteropServices

    Public Class Form1

    <DllImport("user32.dll", CharSet:=CharSet.Auto, CallingConvention:=CallingConvention.Winapi)> Private Shared Function GetFocus() As IntPtr : End Function

    Wäre nett für eine Erklärung...

    Aber noch mal vielen Dank an euch.
    @J.BORGER Willkommen im Forum. :thumbup:
    Bau Dir eine von TextBox abgeleitete Klasse, in der Du das Enter- und das Leave-Event abonierst und dort Deine Farben setzt.
    Kompilieren, auf das GUI ziehen, feddich.

    VB.NET-Quellcode

    1. Public Class MyTextBox
    2. Inherits TextBox
    3. Protected Overrides Sub OnEnter(e As EventArgs)
    4. MyBase.OnEnter(e)
    5. Me.BackColor = Color.LightBlue
    6. End Sub
    7. Protected Overrides Sub OnLeave(e As EventArgs)
    8. MyBase.OnLeave(e)
    9. Me.BackColor = System.Drawing.SystemColors.Window
    10. End Sub
    11. End Class


    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!

    VB.NET-Quellcode

    1. Imports System.Drawing
    2. Imports System.Runtime.InteropServices
    3. Public Class Form1
    4. <DllImport("user32.dll", CharSet:=CharSet.Auto, CallingConvention:=CallingConvention.Winapi)> Private Shared Function GetFocus() As IntPtr : End Function

    Die ersten beiden Zeilen sind quasi nur Abkürzungen, damit man z.B. nicht immer schreiben muss System.Drawing.Color.Red, sondern später nur kurz Color.Red, Stichwort »importierte Namespaces«. Die zweite Zeile ist demnach auch eine Abkürzung, in dem Fall für das »komplizierte« Konstrukt mit dem DLL-Import. Es gibt unzählige Funktionen, die quasi tief versteckt in irgendwelchen Windows-Bibliotheken stecken. Um an die zu kommen, muss man eben solche Geschichten verweden. Man muss sagen, in welcher DLL die stecken, wie die Funktion heißt, welche Parameter sie nimmt. Eine erste Auflistung findest Du bei PInvoke. Ansonsten in diversen Problemlösungsthreads.
    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.
    @J.BORGER Die eleganteste Lösung (Post #5) hast Du offensichtlich ignoriert oder nicht verstanden, obwohl sie vollständig gepostet und erklärt wurde. ;(
    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!

    RodFromGermany schrieb:

    @J.BORGER Die eleganteste Lösung (Post #5) hast Du offensichtlich ignoriert oder nicht verstanden, obwohl sie vollständig gepostet und erklärt wurde. ;(


    Hallo, doch als beste Lösung habe ich die Möglichkeit direkt interpretiert. Hatte aber schon angefangen den oberen Vorschlag in mein Programm zu übernehmen. Dies hatte auch den gewünschten Erfolg. Die Möglichkeit aus Post 5# sehe ich auch als die bessere Möglichkeit. Nächste Wochenende werde ich diesen Vorschlag zu mindestens mal durchteste... bzw... versuche ich dieses mach ins Programm so einzubinden um festzustellen wie ich aus einer anderen Class diese Funktion in meiner Form anwenden kann... Wie gesagt befinde ich mich in der Lernphase sehr am Anfang und glaube mache genug Fehler über die andere bestimmt lachen würden... aber ich bleib dran :)

    J.BORGER schrieb:

    wie ich aus einer anderen Class diese Funktion in meiner Form anwenden kann
    Hab ich Dir doch geschrieben.
    Fühe Deinem Projekt diese Klasse hinzu.
    Nach dem Compilieren wird Dir das UserControl in der Toolbox angeboten.
    Zieh es auf die GUI und feddich.
    Du müsstest dann jede Deiner TextBoxen durch die neue TextBox ersetzen.
    Wenn Du ein wenig mehr Erfahrung hast, kannst Du das mit Suchen und Ersetzen in der Datei FormX.Designer.vb machen.
    Wenn Du das doch tun willst, übe das zunächst an einem separaten Testprojekt.
    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!