| |
VB.NET - Ein- und UmsteigerRahmenfarbe für Alle TextBoxen und Labels | | | Autor: spatzimatzi | Datum: 17.12.18 18:31 |
| Hallo,
brauche Eure Hilfe für ein Problem.
Wie der Titel schon sagt, soll der Rahmen von TextBoxen unterschiedliche Farben annehmen.
Da dies nicht durch Anpassen von Eigenschaften möglich ist, muss ich dies selber zeichnen.
Und hier brauche ich Hilfe.
Folgende Situation liegt vor:
Habe viele Forms mit den entsprechenden Objekten.
Beim Laden der Form rufe ich eine Routine auf, die alle Objekte der Form nach meinen Regeln anpasst. Dabei werden aber nur die möglichen Eigenschaften angepasst. Nicht nur das Aussehen ist dann immer gleich, sondern es wird auch gesteuert, ob der Anwender in den TextBoxen Änderungen vornehmen kann.
Dies funktioniert nach meinen Vorstellung sehr gut.
Jetzt möchte ich aber auch die Rahmenfarbe anpassen. Dabei sollen bestimmten TextBoxen auch entsprechende Rahmenfarben zugewiesen bekommen.
Wenn ich die Zuweisung der Farben jetzt direkt in dieser Routine durchführe, dann wird der Rahmen gesetzt, aber wieder überschrieben.
Meine Frage:
Wie muss ich vorgehen, damit die Farbanpassung nicht nachträglich vom System geändert werden.
Hoffe, ich habe die Situation vernünftig beschrieben.
Bei Fragen stehe ich natürlich jederzeit zur Verfügung.
Vielen Dank für Eure Unterstützung
spatzimatzi | |
Re: Rahmenfarbe für Alle TextBoxen und Labels | | | Autor: Manfred X | Datum: 18.12.18 09:48 |
| Hallo!
Windows.Forms?
Du könntest jede Textbox jeweils auf einem Panel platzieren,
das in alle Rchtungen 1 bis 2 Pixel größer als die Abmessung
der Box ist und die Hintergrundfarbe des Panel setzen.
Public Class frmFrameDemo
Dim pl As New Panel With {.Parent = Me,
.Top = 50, .Left = 100, .BorderStyle = BorderStyle.None, .BackColor = _
Color.Red}
Dim txt As New TextBox With {.Parent = pl, .Multiline = True,
.Width = 200, .Height = 200, .BorderStyle = BorderStyle.None}
Private Sub frmTest3_Load(sender As Object, e As EventArgs) Handles _
MyBase.Load
Dim framewidth As Integer = 2 'Rahmenbreite
'Positionierung und Größenanpassung der Controls
pl.Width = txt.Width + framewidth * 2
pl.Height = txt.Height + framewidth * 2
txt.Left = framewidth : txt.Top = framewidth
End Sub
End Class | |
Re: Rahmenfarbe für Alle TextBoxen und Labels | | | Autor: spatzimatzi | Datum: 18.12.18 10:52 |
| Hallo ManfredX,
die jeweiligen TextBoxen mit einem Panel zu hinterlegen geht leider nicht mehr, da die Forms bereits fertig sind. Und es ist ein grundsätzliches Problem in den vielen Forms. Die Idee, die Rahmen einzufärben, ist mir auch erst jetzt gekommen.
Da das Ändern der Rahmenfarbe grundsätzlich klappt und nur vom System überschrieben wird, stellt sich die Frage, wie kann ich dieses Überschreiben unterbinden. Oder es stellt sich die Frage, ob das Anpassen der Rahmenfarbe in einem anderen Ereignis stattfinden muss.
Vielen Dank
spatzimatz | |
Re: Rahmenfarbe für Alle TextBoxen und Labels | | | Autor: Manfred X | Datum: 18.12.18 11:17 |
| Ich weiß nicht, ob es in Deinen "bereits fertigen Formularen"
einfacher ist, im Paint-Event der Formulare einen Rahmen auf
die Form um die rahmenlosen Textboxen zu zeichnen.
Hier ein Beispiel für beide Versionen:
Public Class frmFrameDemo
Dim pl As New Panel With {.Parent = Me,
.Top = 50, .Left = 100,
.BorderStyle = BorderStyle.None, .BackColor = Color.Red}
Dim txt As New TextBox With {.Parent = pl, .Multiline = True,
.Width = 200, .Height = 200, .BorderStyle = BorderStyle.None}
Dim txt2 As New TextBox With {.Parent = Me, .Top = 300,
.Left = 100, .Width = 200, .Height = 150,
.Multiline = True, .BorderStyle = BorderStyle.None}
Private Sub frm_Load(sender As Object,
e As EventArgs) Handles MyBase.Load
Dim framewidth As Integer = 1 'Rahmenbreite
'Positionierung und Größenanpassung der Controls
pl.Width = txt.Width + framewidth * 2
pl.Height = txt.Height + framewidth * 2
txt.Left = framewidth : txt.Top = framewidth
End Sub
Private Sub frm_Paint(sender As Object,
e As PaintEventArgs) Handles Me.Paint
'Rahmen um die Textbox auf das Formular zeichnen
Dim framewidth As Integer = 1
Using pn As New Pen(Color.Red, framewidth)
Dim rect As New Rectangle(txt2.Left - framewidth,
txt2.Top - framewidth,
txt2.Width + 2 * framewidth,
txt2.Height + 2 * framewidth)
e.Graphics.DrawRectangle(pn, rect)
End Using
End Sub
End Class
Beitrag wurde zuletzt am 18.12.18 um 11:19:52 editiert. | |
Re: Rahmenfarbe für Alle TextBoxen und Labels | | | Autor: spatzimatzi | Datum: 19.12.18 14:45 |
| Hallo Manfred x,
konnte mich erst jetzt mit dem Problem befassen.
Die Variante mit den Textboxen auf den Panels habe ich nicht getestet, weil bei mir nicht durchführbar. Trotzdem ein Dankeschön für das Beispiel.
Nun zu dem Vorgehen in Deinem Beispiel:
In meinen Anwendungs-Forms muss ich in Me.Paint in einer Schleife alle TextBoxen lesen und die Rahmenfarbe anpassen. In einer Test-Form hat das auch grundsätzlich funktioniert. Auch bei der Ermittlung der Controls.
Gehe ich jedoch in eine Anwendungs-Form, dann reagiert Paint nicht oder verspätet und es werden auch nicht alle Controls ermittelt.
Woran das liegt? Keine Ahnung!
Werde mich wohl in kleinen Schritten herantasten müssen. Deshalb möchte ich Dich bitten, meine Subs zum Lesen der Controls anzuschauen.
Ziel ist es, alle Controls zu lesen. Liegt ein Container vor, dann soll rekursiv gelesen werden.
Syntax in Me.Paint
subLoopCtrl(Me) Sub subLoopCtrl(ByVal Ctrl As Control)
For Each myCtrl As Control In Ctrl.Controls
If myCtrl.Controls.Count > 1 Then
subSetControlStyle(myCtrl)
subLoopCtrl(myCtrl)
Else
subSetControlStyle(myCtrl)
End If
Next
End Sub Sub subSetControlStyle(ByVal ctrl As Control)
Select Case TypeName(ctrl)
Case "TextBox" ', Andere Typen später
... Setzen der Rahmenfarbe
End Select
End Sub Diese Routinen sollen alle Controls ausgeben. Selektion findet später statt.
Wenn das Lesen der Controls richtig verläuft, dann bin ich einen Schritt weiter.
Danke
spatzimatzi | |
Re: Rahmenfarbe für Alle TextBoxen und Labels | | | Autor: Manfred X | Datum: 19.12.18 20:03 |
| Es besteht die Möglichkeit, durch eine rekursive
Methode alle Controls im Paint-Event zu durchlaufen
und die erforderlichen Rahmen darum zu zeichnen.
Das setzt aber - wie erwähnt - voraus, daß die Container
einen Überhang bieten, auf dem ein Rechteck gezeichnet werden
kann.
Ich bezweifle aber, daß diese Technik zweckmäßig ist.
Vermutlich lassen sich die Controls in geeignete Gruppen
zusammenfassen.
Jeweils in einer generischen Dictionary oder einer Liste (List of Control)
könnten Referenzen für alle Controls mit einer gemeinsamen "Rahmen"-Logik
zusammengefaßt werden. Im Paint-Event werden diese Listen durchlaufen
und die Rahmen gezeichnet (z.B. auf der jeweiligen Parent-Oberfläche).
Für genauere Hinweise sind aber detaillierte Angaben zum Aufbau und zur
Funktionalität der Formulare erforderlich. | |
| Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
sevGraph (VB/VBA)
Grafische Auswertungen
Präsentieren Sie Ihre Daten mit wenig Aufwand in grafischer Form. sevGraph unterstützt hierbei Balken-, Linien- und Stapel-Diagramme (Stacked Bars), sowie 2D- und 3D-Tortendiagramme und arbeitet vollständig datenbankunabhängig! Weitere InfosTipp des Monats März 2024 Dieter OtterUTF-8 Konvertierung von Dateien und StringsVB6 selbst verfügt über keine Funktionen zur UTF-8 Konvertierung von Daten. Mit Hilfe des ADODB.Stream-Objekts lassen sich diese fehlenden Funktionen aber schnell nachrüsten. Access-Tools Vol.1
Über 400 MByte Inhalt
Mehr als 250 Access-Beispiele, 25 Add-Ins und ActiveX-Komponenten, 16 VB-Projekt inkl. Source, mehr als 320 Tipps & Tricks für Access und VB
Nur 24,95 EURWeitere Infos
|