| Autor |
Nachricht |
delphi10
        
Beiträge: 394 Dabei seit: 10.09.2007 Wohnort: Salzgitter
W2K, XP, Vista64, Win7 64 RAD-Studio 2010
|
Hallo
Für die farbige Textausgabe aus Listboxen etc. steht ja die Möglichkeit ListBox1DrawItem() zur Verfügung um einzelne Zeilen unterschiedlich einzufärben. Die Variante, ein einzelnes Wort aus einem String zu beeinflussen, ist damit aber nicht möglich.
Das wollte ich aber realisieren, habe aber nichts einschlägiges gefunden. Also habe ich ListBox1DrawItem() etwas abgeändert. Statt den gesamten String auszugeben, löse ich ihn in einzelne Worte auf und gebe die nacheinander aus. Durch voranstellen eines Steuerzeichens kann das einzelne Wort jetzt fast beliebig formatiert werden. Gewählt habe ich § für Farbe und Fett, das # für Farbe, Fett und kursiv. Die Auswahl der Steuerzeichen ist etwas eingeschränkt, man will sie ja vielleicht auch im normalen Text verwenden können.
Ein Beispiel habe ich mal angehängt. Vielleicht kann's ja jemand gebrauchen. Feedback ist willkommen.
Gruß Delphi10
Edit: Groben Fehler (With TListBox(Control) do....) korrigiert. 16.02.2009
Moderiert von Christian S.: Topic aus Algorithmen, Optimierung und Assembler verschoben am Do 26.06.2008 um 12:42
Moderiert von Christian S.: Topic aus VCL (Visual Component Library) verschoben am Do 26.06.2008 um 12:43
Einloggen, um Attachments anzusehen!
_________________ Salus populi suprema lex esto
Zuletzt bearbeitet von delphi10 am Mo 16.02.09 21:36, insgesamt 2-mal bearbeitet
|

|
|
delphi10
        
(Threadstarter)
Beiträge: 394 Dabei seit: 10.09.2007 Wohnort: Salzgitter
W2K, XP, Vista64, Win7 64 RAD-Studio 2010
|
Interessiert das hier wirklich niemand? Erstaunlich.
cu delphi10
_________________ Salus populi suprema lex esto
|

|
|
Marc.
       
Beiträge: 1571 Erhaltene Danke: 4 Dabei seit: 09.11.2005
Win 7, VM
|
delphi10 hat folgendes geschrieben: | | Interessiert das hier wirklich niemand? Erstaunlich. |
Hi! Klar gibt es Interessenten. Das ganze gefällt mir recht gut, hab allerdings noch eine paar kleine Verbesserungsvorschläge.
Denn markiere ich Items einer Listbox mit angepassten OnDrawItem tauchen plötzlich schwarze Linien unter diesen auf. (s.A.)
Ein Canvas.FillRect(Rect); am Anfang der Procedure eliminiert diese aber.
Zudem wird der letzte Buchstabe eines formatierten Wortes nur fragmentiert angezeigt. (s.A.)
l := Canvas.TextWidth(tAst)+1; schafft da aber Abhilfe.
Desweiteren beginnt ein String bei mir bei eins und daher verstehe ich nicht ganz, weshalb Du hier (m >= length(Ast)+1) über die Länge des Strings hinausgehst.
Letztendlich wäre nun zu erwähnen, dass der Listbox-Style auf lbOwnerDrawVariable zustehen hat, damit es funktioniert.
Ansonsten vielen Dank!
Grüße,
Marc.
Einloggen, um Attachments anzusehen!
_________________ Nothing Is Real
|

|
|
delphi10
        
(Threadstarter)
Beiträge: 394 Dabei seit: 10.09.2007 Wohnort: Salzgitter
W2K, XP, Vista64, Win7 64 RAD-Studio 2010
|
| Zitat: | Letztendlich wäre nun zu erwähnen, dass der Listbox-Style auf lbOwnerDrawVariable zustehen hat, damit es funktioniert.
|
Hmmm, es gibt viele Wege nach Rom....
Innerhalb einer INIT-Procedur wird die ListBox auf
gesetzt. Im Ereignis der ListBox OnDrawItem wird jetzt die Procedure
eingesetzt. Und schon läufts - jedenfalls bei mir (Delphi10). Das werd ich aber noch mal genau verifizieren und dann berichten.
Ja, mit den Spaces am Anfang und Ende eines markierten Wortes mußte ich auch ein wenig experimentieren.
cu delphi
Moderiert von Narses: Link entfernt
_________________ Salus populi suprema lex esto
|

|
|
Narses
        

Beiträge: 7363 Erhaltene Danke: 10 Dabei seit: 25.07.2004 Wohnort: Gelsenkirchen
W2k, WXPpro D6pe, D7pro
|
Moin!
Ich habe noch einige Anmerkungen zu deinem Code-Vorschlag: - Du hast
Marc.s Vorschläge und Anmerkungen bisher nur kommentiert, aber offenbar nicht in den ersten Beitrag/Code einfließen lassen, oder? (siehe Anhang)
- Wenn man die Eigenschaften der Listbox nicht korrekt einstellt, funktioniert der Code nicht, da er ja nie aufgerufen wird. Du solltest diese erhebliche "Stolperfalle" besser deutlich im ersten Beitrag hervorheben!
- Du verwendest hier With TListBox(Control) do den übergebenen Parameter, um auf die entsprechende Listbox zuzugreifen, warum dann aber ein paar Zeilen später Form10.Listbox1.Font.Name := 'Arial'; Direktreferenzen? So kann man die Methode ja nur für eine spezielle Listbox verwenden...
- Wo wir gerade dabei sind: was ist, wenn ich den Font "Arial" nicht verwenden möchte? Oder eine andere Größe? Oder wenn der Benutzer zur Laufzeit selbst den Zeichensatz aussuchen können soll?
- Es wäre schön, wenn man die verwendeten Steuerzeichen einstellen könnte, um diese Zeichen auch verwenden zu können; Alternativ wäre auch Escaping ein Ansatz
- Du zerlegst in jedem OnDraw-Aufruf den darzustellenden String. Das ist ein potentieller Performance-Killer, noch dazu verwendest du String-by-Char-Concatenation, was ein Speicher-Killer ist. Deutlich optimaler wäre es, eine eigene Komponente von der Basisklasse abzuleiten und dieser ein internes String-Array/Liste zuzuordnen, das die zerlegten Elemente vorhält, damit das nicht jedes mal beim Zeichnen wieder gemacht werden muss. In der aktuellen Form ist dein Ansatz nur für wenige Einträge geeignet
cu
Narses
Einloggen, um Attachments anzusehen!
_________________ There are 10 types of people - those who understand binary and those who don´t.
|

|
|
Christian S.
        

Beiträge: 17543 Erhaltene Danke: 105 Dabei seit: 07.07.2002 Wohnort: Server-Souterrain
Win 7 Delphi Prism, C# (VS 2010)
|
Hallo!
Könntest Du etwas zu Narses' Anregungen sagen oder sie umsetzen? Danke!
Grüße
Christian
_________________ I am of peace. Always.
Vom 9.9. bis 13.9. in Urlaub
|

|
|
delphi10
        
(Threadstarter)
Beiträge: 394 Dabei seit: 10.09.2007 Wohnort: Salzgitter
W2K, XP, Vista64, Win7 64 RAD-Studio 2010
|
Narses hat folgendes geschrieben : | Moin!
Ich habe noch einige Anmerkungen zu deinem Code-Vorschlag:- Du hast
Marc.s Vorschläge und Anmerkungen bisher nur kommentiert, aber offenbar nicht in den ersten Beitrag/Code einfließen lassen, oder? (siehe Anhang)
[*1]Wenn man die Eigenschaften der Listbox nicht korrekt einstellt, funktioniert der Code nicht, da er ja nie aufgerufen wird. Du solltest diese erhebliche "Stolperfalle" besser deutlich im ersten Beitrag hervorheben!
[*2]Du verwendest hier With TListBox(Control) do den übergebenen Parameter, um auf die entsprechende Listbox zuzugreifen, warum dann aber ein paar Zeilen später Form10.Listbox1.Font.Name := 'Arial'; Direktreferenzen? So kann man die Methode ja nur für eine spezielle Listbox verwenden...
[*3]Wo wir gerade dabei sind: was ist, wenn ich den Font "Arial" nicht verwenden möchte? Oder eine andere Größe? Oder wenn der Benutzer zur Laufzeit selbst den Zeichensatz aussuchen können soll?
[*4]Es wäre schön, wenn man die verwendeten Steuerzeichen einstellen könnte, um diese Zeichen auch verwenden zu können; Alternativ wäre auch Escaping ein Ansatz
[*5]Du zerlegst in jedem OnDraw-Aufruf den darzustellenden String. Das ist ein potentieller Performance-Killer, noch dazu verwendest du String-by-Char-Concatenation, was ein Speicher-Killer ist. Deutlich optimaler wäre es, eine eigene Komponente von der Basisklasse abzuleiten und dieser ein internes String-Array/Liste zuzuordnen, das die zerlegten Elemente vorhält, damit das nicht jedes mal beim Zeichnen wieder gemacht werden muss. In der aktuellen Form ist dein Ansatz nur für wenige Einträge geeignet cu
Narses |
Hallo Narses
Ich habe diese Methode so verstanden, dass, sollte sie jemand in sein Projekt einbauen wollen, er sie sowieso anfassen muss. Deinen Ansprüchen - wie z.Bsp. ändern des Fonts während der Laufzeit kann und sollte sie nicht genügen. Das würde ich eher im Rahmen eines Projektes akzeptieren - Ich wollte diese Methode als Idee, als Denkvorlage verstanden wissen, nicht als blind übernehmbaren Quellcode.
Zweifellos richtig ist, dass es trotzdem fehlerfrei (im Sinne von: Stürzt nicht gleich ab) sein sollte. Den ListBox-Fehler habe ich oben korrigiert, war ein Überbleibsel aus einem Test. Da hätte ich noch 27mal drüberlesen können....
Dein Vorschlag mit dem String-Array ist genial, das werde ich auf jeden Fall noch nachreichen. Brauchs ja selber *g*
Soweit erstmal
Gruß Delphi10
_________________ Salus populi suprema lex esto
|

|
|
Christian S.
        

Beiträge: 17543 Erhaltene Danke: 105 Dabei seit: 07.07.2002 Wohnort: Server-Souterrain
Win 7 Delphi Prism, C# (VS 2010)
|
Schön wäre es, wenn Du noch im Beitrag verewigst, welche Einstellungen man bei der Listbox machen muss, damit die Methode richtig arbeitet. Also im Prinzip das, was Du hier beschrieben hast, nur irgendwie in den ersten Beitrag eingearbeitet.
_________________ I am of peace. Always.
Vom 9.9. bis 13.9. in Urlaub
|

|
|
Werbung ausblenden? Dann registriere Dich kostenlos.
Weitere Gründe für eine Registrierung.
Werbung ausblenden? Dann registriere Dich kostenlos.
Weitere Gründe für eine Registrierung.
|
|
|
|
|