Hallo,
gibt es eine einfache und elegante Möglichkeit, ein Steuerelement (z.B. Textfeld) zweifarbig zu gestalten, also z.B. linke Hälfte gelb, rechte Hälfte grün?
Könnte man das mit api-Calls machen und wenn ja wie?
Mein Formular hat jetzt schon knapp 450 Felder, die Aufteilung in je zwei angrenzende Felder scheidet daher wohl aus (ein Kommentar zu dieser Anzahl ist nicht erforderlich ::) ).
Kann man mit Access-2010-Bordmitteln eigene Steuerelemente kreieren, die sowas könnten? Oder z.B. das Textfeld-Element als Klasse ableiten in ein neues Steuerelement mit neuen Properties?
Bei VB geht sowas, soweit ich mich erinnere.
Gruß,
c.
Alle Fragen kann ich mit nein beantworten. Abgesehen von Steuerelementen, die man nicht in den Detailbereich eines Endlosformulars packen kann, existiert immer nur ein (1) echtes Windows-Control im Formular und das ist jenes, welches den Fokus besitzt und somit auch ein Handle (hWnd) hat.
Mit entsprechender Grafik-Bibliothek könnte man jedoch seine Controls selbst in ein Bild einmalen und der Picture-Eigenschaft des Formulars bzw. anderer Controls zuweisen und jeweils deren Mouse-Ereignisse auswerten - die Geometrie ist ja vorgegeben und müsste nur bei Größenänderung des Formulars neu berechnet werden.
@Lachtaube
Danke für deine schnelle Antwort. Hätte auch gleich an dich schreiben können, den API-Profi...
Da nun das aktive Control einen Handle hat, könnte man doch vielleicht auf die Drawing-Area zugreifen (links, oben, rechts, unten) und durch einfache Berechnungen die linke Hälfte gelb und die rechte grün einfärben, oder?
Es geht nicht darum, ein Control einer beliebigen Form anzupassen, sondern darum, einem exakten Rechteck (Textfeld) zwei verschiedene Farben (links/rechts oder oben/unten oder sogar diagonal getrennt) zu verpassen.
Irgendwas ist da ja wohl möglich, wenn auch nur für Buttons, denen man einen Farbverlauf geben kann (leider kann man nur eine Farbe auswählen, die dann als Verlauf aufgehellt wird. Ein Farbverlauf von gelb nach grün ist nicht möglich.).
@Crystal,
selbst wenn Deine erste Annahme gelänge, würde spätestens, wenn in der Message-Loop von Access ein Paint-Ereignis ansteht, alles wieder übermalt werden.
Aber wie gesagt, mit einer Grafik-Bibliothek (z. Bsp. gdi+ oder dem vbRichClient-Framwork, was ich im Beispiel verwende) kann man schon einiges machen. (Natürlich auch Rechtecke mehrfarbig, mit Verlauf, Alpha-Blend beschriftet malen.)
Neue Idee:
wie wäre es mit richtext-Feldern? Die kann man ja html-ähnlich farblich und anderweitig gestalten.
Frage ist nur: wie bekomme ich ungebundene richtext-Felder in mein Formular bzw. wie kann ich vorhandene Textfelder in richtext-Felder umwandeln?
Das wäre ein Experiment wert. Es handelt sich ja um normale Textfeldsteuerelemente, in denen die TextFormat Eigenschaft auf Richtext festgelegt ist.
@Lachtaube
Ja, ich glaube richtext könnte eine Lösung sein.
Wie wäre der minimale richtext-text, um z.B. ein dreizeiliges Feld in den Jamaica-Farben darzustellen, also z.B.
1. Zeile schwarz auf grün,
2. Zeile schwarz auf gelb,
3. Zeile weiß auf schwarz
oder
linke Hälfte gelb, rechte Hälfte grün und als Text
ABC
DEF
GHI
Ist es möglich, ein richtext-Feld unabhängig vom Inhalt zweifarbig zu gestalten, also erst den Hintergrund zu definieren und dann den Text zu schreiben (zuerst Hintergrund gelb/grün, dann Text drüber)?
Ist es also möglich, mit einer rtf-Definition das Ausgabefeld in seiner Gänze farblich zu gestalten, ohne Rücksicht auf den Text, der dann dargestellt werden soll?
Vielleicht kennst du dich ja mit dem richtext-Format schon etwas besser aus als ich und könntest ein kleines Codeschnipsel beisteuern. Das wäre toll.
Danke,
c.
PS: wie ich ein Textfeld in ein Richtext-Feld umwandle, habe ich inzwischen gelernt. Geht ja ganz einfach über Eigenschaften->Textformat->Richtext. Das Feld muss zuvor nur vom Typ "Textfeld" sein und nicht "Bezeichnungsfeld", wie in meinem Test-Formular... Dann klappt's auch mit ungebundenen Feldern.
Nur mal eingeworfen: Ich würde in diesem Zusammenhang mal kritisch hinterfragen, ob Access hier noch das Mittel der Wahl ist. Anspruchsvolle visuelle Gestaltung von komplexen Sachverhalten ist nicht unbedingt die Stärke von Access.
Ich vermute es geht um das Kalenderformular, das du kürzlich bereits hier vorgestellt hattest. Ich hatte vor einigen Jahren eine ähnliche Anforderung und mich damals entschieden, diese nicht direkt in Access umzusetzen, sondern mit einem .Net-Steuerelement, dass in ein Access-Formular eingebunden wird. Rückblickend auf die ganzen Erweiterungen, die nach der ursprünglichen Anforderungsdefinition noch hinzugekommen sind, war das eine sehr gute Entscheidung.
Was vielleicht ebenfalls eine gute Lösung für deine Anforderungen sein könnte, ist die visuelle Darstellung in HTML. Diese wird dann in einem Webbrowser-Control in dem Access-Form eingebunden. Ich selbst habe damit nur begrenzte Erfahrung, aber Jack Leach hat ein visuell sehr ansprechendes Beispiel für embedded HTML in Access (https://dymeng.com/resources/browse-embed/) veröffentlicht.
@PhilS
Danke für deine Stellungnahme und den HTML-Tipp.
Ich habe auch schon an HTML gedacht, aber dann müsste ich mein Kalender-Formular komplett neu aufsetzen und mich noch zusätzlich mit HTML, JS usw. beschäftigen. Angesichts der Tatsache, dass es sich bei meinem Projekt um eine freiwillige Bastellösung handelt, erschien mir der Aufwand, mich in HTML und JS einzuarbeiten, bisher zu hoch.
Auch den Aufwand, mich in VisualBasic oder Csharp einzuarbeiten halte ich für zu hoch. Ich hatte auch die Idee, in VB ein Textfeld zu bauen und dann als ActiveX in Access einzubinden. Aber mangels Erfahrung habe ich das auch nicht weiter verfolgt.
Für ein anderes Projekt, das ich wegen längerer Krankheit einstellen musste, hatte ich mittels Richtext ein Ufo realisiert, das in der Lage war, in jeder Zeile 32 verschiedene Farben in Textfeldern darzustellen. Das sah schon beeindruckend aus, wenn 20 Datensätze mit je 32 völlig unterschiedlichen Farben angezeigt wurden. Daran habe ich mich jetzt erinnert und werde mit diesem Ansatz experimentieren.
Ansonsten gebe ich dir völlig Recht: was visuelle Gestaltungs-Möglichkeiten angeht, ist Access sehr bescheiden und nicht mehr zeitgemäß. Mal sehn, was die nächste Version bringt, vielleicht in 2020...
Im Anhang ein Screen meines damaligen Kalender-Formulars. Die farbigen UFos (noch nicht fertig und an die Tage des Kalenders angepasst) klappen auf und zu, wenn man auf die blaue Monats-Nummer klickt, die dann grün wird. Alles mit Access-Bordmitteln.
Gruß,
c.
Nachtrag:
Inzwischen habe ich gelernt, dass Access auch HTML in Richtext-Feldern "versteht", wohl sogar besser als RTF.
Es ist daher nicht erforderlich, ein Richtext-Feld in Richtext-Syntax zu besetzen, HTML funktioniert ebenso oder sogar direkter; es scheint so, dass "echter" rtf-Code von Access in HTML übersetzt und dann vom HTML-Parser interpretiert/dargestellt wird.
Damit steht die ganze HTML-Welt zur Gestaltung eines Textfelds offen.
Beispiel:
<span style="background-color: #ff6600">AA</span><span style="background-color: #00ff00">BB</span>
als Text einem Richtext-Textfeld zugewiesen ergibt
AABB
(hier allerdings falsch als Font-Farbe statt als Hintergrund-Farbe dargestellt).
Habe noch nicht herausgefunden, wie ich z.B. den Text "ABC" genau zur Hälfte mit zwei Hintergrunds-Farben darstellen kann, also das "B" halb grün und halb rot.
Muss nun doch HTML lernen, jedenfalls etwas.
Es ergeben sich ungeahnte Möglichkeiten für mein komplexes Kalender-Formular und vielleicht für andere Anwendungen... Und alles mit einfachen VBA-Zuweisungen, was ja in meinem Kalender-Formular mit seinen ungebundenen Feldern, die sowieso schon per VBA gefüllt werden, kein Problem darstellt.
Ich betrachte das Problem also als gelöst, aber vielleicht hat jemand doch noch Tipps.
Gruß,
c.
Zitat von: crystal am Februar 13, 2018, 16:16:27Damit steht die ganze HTML-Welt zur Gestaltung eines Textfelds offen.
Nur ganz kurz: Nein! Leider nicht. Der Umfang von HTML, den Access in "RichText"-Feldern versteht, ist leider sehr, sehr eingeschränkt und auch manche Details, die es eigentlich verstehen sollte, werden falsch gerendert.
(Ich ärgere ich mich in einem Projekt gerade aktuell und konkret über Aufzählungen mit Bullet-Points.)
@PhilS
Danke für den Hinweis.
Irgendwie ist schon klar, dass Microsoft hier bei der Implementierung gespart hat. Schließlich könnte man statt des Richtext-Feldes mit eingeschränktem "HTML-Verständnis" ja auch ein Browser-Steuerelement benutzen. Leider ist die Dokumentation beider recht dürftig - auch ein grundsätzliches Problem bei MS. Da ist man schon auf google angewiesen und gute Beiträge in Foren wie diesem...
Ich denke aber, dass die beschränkte HTML-Funktionalität für meine Zwecke ausreicht, auch wenn ich es vermutlich nicht mit angemessenem Aufwand schaffen werde, ein Feld genau mittig zweifarbig zu gestalten. Da meine Felder genau 3 Zeichen breit und 3 Zeilen hoch sind (nicht-propertionale Schrift), hätte ich prinzipiell die Möglichkeit, 9 verschiedene Farben je Feld darzustellen. Das sollte reichen. Mal probieren, wie das performt.
Übrigens: Kennst du evtl. einen Stringbuilder für VBA?
Gruß,
c.
Hallo Crystal,
Ich habe irgendwann mal Folgendes aus dem Netz kopiert, allerdings dann
irgendwie nie verwendet. Ist also ungetestet.
Private Sub cmdSql2Vba_Click()
'Author: Allen Browne
'Purpose: Convert a SQL statement into a string to paste into VBA code.
Dim strSql As String
Const strcLineEnd = " "" & vbCrLf & _" & vbCrLf & """"
If IsNull(Me.txtSQL) Then
Beep
Else
strSql = Me.txtSQL
strSql = Replace(strSql, """", """""") 'Double up any quotes.
strSql = Replace(strSql, vbCrLf, strcLineEnd)
strSql = "strSql = """ & strSql & """"
Me.txtVBA = strSql
Me.txtVBA.SetFocus
End If
End Sub
gruss ekkehard
Die VB6-Klasse StrBldr (http://vb.mvps.org/samples/StrBldr/) von Karl E. Peterson funktioniert auch unter VBA, wenn die API-Deklarationen etwas angepasst werden.#If VBA7 Then
Private Declare PtrSafe Function VarPtrArray Lib "VBE7" Alias "VarPtr" ( _
Var() As Any) As LongPtr
Private Declare PtrSafe Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" ( _
Destination As Any, Source As Any, ByVal Length As Long)
#Else
Private Declare Function VarPtrArray Lib "VBE6" Alias "VarPtr" ( _
Var() As Any) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" ( _
Destination As Any, Source As Any, ByVal Length As Long)
#End If
Danke Beaker s.a. und Lachtaube für eure Infos!