![]() |
LISTBOX: Immer die ersten 10 Zeichen eines eintrags färben?!
hui,
ich hab nen chat gemacht und möchte die uhrzeit durch eine andere schriftart hervorheben! für jede nachricht wird ein neues item in ner listbox angelegt... das sieht wie folg aus: [01:30:25]Benutzer: Hallo kann ich die ersten 10 zeichen also die uhrzeit in ner anderen schriftfarben machen? thx [edit=sakura] [Klammern ersetzt] Mfg, sakura[/edit] |
Re: [LISTBOX]Immer die ersten 10 Zeichen eines eintrags färb
Hallo
Selberzeichnen im ondrawitem. Du kannst den string teilen und den ersten Teil mit fabre xy zeichnen, mit canvas.textwidth die notwendige Länge bestimmen und ab dort den zweiten Teil in Farbe Z zeichnen. Mfg Frank |
Re: [LISTBOX]Immer die ersten 10 Zeichen eines eintrags färb
Entweder:
1, Ownerdraw verwenden um jeden Eintrag selbst zu zeichnen 2, Verwendung von ListView mit 2 Spalten (wieß jedoch nicht ob die Stand-ListView unterschiedliche Einstellungen für jede Spalte unterstützt 3, Verwndung von Controls die eine HTML-Formatierung des Textes unterstützen würden (z.B. die HTML-ListBox vom ElPack |
Re: [LISTBOX]Immer die ersten 10 Zeichen eines eintrags färb
hi
thx für die antworten... ich hab noch wenig erfahrung drum probier ich jetz mal die lösung mit der komponente von ElPack! das andere müsstet ihr mir genauer erklären... thx |
Re: [LISTBOX]Immer die ersten 10 Zeichen eines eintrags färb
als Anregung:
Delphi-Quellcode:
procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState);
Var Textbreite:integer; s:string; begin //style der listbox auf ownerdrawfixed stellen! with control as TListBox do begin //Hintergrund canvas.FillRect(rect); //ersten Teil des strings s:=copy(items[index],1,10); canvas.font.Color:=clred; canvas.Font.Style:=[fsbold]; canvas.TextOut(rect.Left+2,rect.top+2,s); Textbreite:=canvas.TextWidth(s); //zweiter Teil des strings s:=copy(items[index],10,length(items[index])); canvas.font.Color:=clWindowText; canvas.Font.Style:=[]; canvas.TextOut(rect.Left+2+Textbreite,rect.top+2,s); end; end; |
Re: [LISTBOX]Immer die ersten 10 Zeichen eines eintrags färb
morgn!
ich habs jetzt so wie ichs bräuchte:
Delphi-Quellcode:
nur hab ich das jetzt mehr oder weniger durch ausprobieren hinbekommen!
//Hintergrund
canvas.FillRect(rect); //ersten Teil des strings (timestamp) s:=copy(items[index],0,10); canvas.font.Color:=$00E47B07; canvas.Font.Style:=[]; canvas.TextOut(rect.Left+2,rect.top+2,s); Textbreite:=canvas.TextWidth(s); //zweiter Teil des strings (nick) s2:=copy(items[index],11,10); canvas.font.Color:=$00F6AD5B; canvas.Font.Style:=[]; Textbreite:=canvas.TextWidth(s); canvas.TextOut(rect.Left+2+Textbreite,rect.top+2,s2); //dritter Teil des strings (:) s3:=copy(items[index],0,21); s3:=s3[21]; canvas.font.Color:=$00FCD9B1; canvas.Font.Style:=[]; Textbreite:=canvas.TextWidth(s+s2); canvas.TextOut(rect.Left+2+Textbreite,rect.top+2,s3); //vierter Teil des strings (text) s4:=copy(items[index],22,length(items[index])); canvas.font.Color:=$00D0D0D0; canvas.Font.Style:=[]; Textbreite:=canvas.TextWidth(s+s2+s3); canvas.TextOut(rect.Left+2+Textbreite,rect.top+2,s4); könnte mir jemand erklären wie ich es machen kann, dass der 2.teil des strings in einer variablen länge sein kann(so lang wie der text in einem edit!), und eine bestimmte farbe hat und der rest dann wieder ne andere farbe: [08:44:25]Name:TESTETSTETS thX!! |
Re: [LISTBOX]Immer die ersten 10 Zeichen eines eintrags färb
Liste der Anhänge anzeigen (Anzahl: 1)
Hai benniwm,
ich würde das ganze mit einem TListView machen. Das ist dann etwas einfacher finde ich. Im Anhang mal ein kleines Beispiel: |
Re: [LISTBOX]Immer die ersten 10 Zeichen eines eintrags färb
du hast gesagt die ersten 10 Zeichen und nicht so viele unterschiedliche Farben ;) Bei soviel wäre eine Listview vielleicht wirklich besser, allerdings erhäslt du dann immer ein Tabellenform der Ausgabe.
Zitat:
zu deinem Code noch ein paar Anmerkungen: Den font.style brauchst du nicht zusetzen.
Code:
wird dir Probleme bereiten, wenn der String nicht 21 Zeichen hat, solltest du abfragen!
s3:=s3[21];
Code:
besser wäre
Textbreite:=canvas.TextWidth(s+s2);
Delphi-Quellcode:
Du wirst da jetzt keinen Unterschied bemerken, wenn du jedoch unterschiedliche Schriften, größen, font.styles ... einsetzt, wirst du mit deiner Variante Probleme bekommen, da bei dir die Textbreite nur mit einer Einstellung ermittelt wird.
Textbreite:=Textbreite+canvas.TextWidth(s2);
Mfg Frank |
Re: [LISTBOX]Immer die ersten 10 Zeichen eines eintrags färb
danke für die antworten nur habe ich jetzt dass näxte problem:
ich bekomme ne string geschickt und zwar so:
Delphi-Quellcode:
diese procedure ist in einer extra unit drin...
procedure read.Execute;
var instr:string; begin while form1.client.Connected do begin instr := form1.client.Socket.ReadLn; form1.listbox1.items.Add(instr); form1.listbox1.Selected[form1.listbox1.Items.Count-1] := true; end; end; drum müsste ich jetzt wahrscheinlich den erhaltenen string aufspalten und dann in das listview einfügen.oder? |
Re: [LISTBOX]Immer die ersten 10 Zeichen eines eintrags färb
Auch wenn es sich ein bisschen hart anhört:
Nimm statt einer ListBox lieber ein RichEdit. (Register Win32) damit kannst du dann auch mehrzeilige Botschaften darstellen, und rumfärben, wie du willst. |
Re: [LISTBOX]Immer die ersten 10 Zeichen eines eintrags färb
ich bin für jede methode bereit!
nur da müsste ich dann auch wieder die einzelnen stücke markieren und dann färben lassen oder? |
Re: [LISTBOX]Immer die ersten 10 Zeichen eines eintrags färb
Ja, aber es ist deutlich einfacher.
Such mal nach ![]() |
Re: [LISTBOX]Immer die ersten 10 Zeichen eines eintrags färb
glaube ich nicht weil ich ja nen ganzen string habe, und somit ja nicht weiß wann der name aufhört und der text anfängt.
außer ich sende die länge des nicks immer mit: z.b nickname=Peter dann würde die nachrihct so aussehen: 5[11:18:03]Peter:NAchricht.... dann könnte ich das erste zeichen aus dem string entfernen und dann so weiter machen:
Delphi-Quellcode:
nur weiß ich nicht wie ich die Zahl wegnehmen kann...
//Uhrzeit
richedit1.SelStart := 0; richedit1.SelLength := 10; richedit1.SelAttributes.Color := clBLue; //Name richedit1.SelStart := 11; richedit1.SelLength := 11+Die Zahl die vom string entfernt wurde; richedit1.SelAttributes.Color := clRed; //Text richedit1.SelStart := richedit1.SelLength := 11+Die Zahl die vom string entfernt wurde; richedit1.SelLength := Length(RichEdit1.Text); richedit1.SelAttributes.Color := clBLue; thx!! |
Re: [LISTBOX]Immer die ersten 10 Zeichen eines eintrags färb
|
Re: LISTBOX: Immer die ersten 10 Zeichen eines eintrags färb
so ich hab jetzt folgendes heraus gebracht:
Delphi-Quellcode:
wenn aber jetzt eine nachricht hinzugefügt wird kommt das:
procedure TForm1.RichEdit1Change(Sender: TObject);
var Line: string; uhr: integer; name1: integer; begin line := richedit1.Lines[0]; uhr := pos(']' , line); name1:= pos(']', line)+1; richedit1.SelStart := 0; richedit1.SelLength := uhr; richedit1.SelAttributes.Color := clBLue; richedit1.SelStart := uhr+1; richedit1.SelLength := name1; richedit1.SelAttributes.Color := clLime; richedit1.SelStart := uhr+name1; richedit1.SelLength := length(line); richedit1.SelAttributes.Color := clred; end; Zitat:
bitte helft mir! thx |
Re: LISTBOX: Immer die ersten 10 Zeichen eines eintrags färb
Hai benniwm,
Du benutzt das Ereigniss .OnChange um auf eine änderung im RichEdit zu reagieren. In der Methode änderst Du das RichEdit aber wieder. Darum wird wieder das OnChange aufgerufen. ;-) Dies dürfte der Grund für die Fehlermeldung sein. |
Re: LISTBOX: Immer die ersten 10 Zeichen eines eintrags färb
:wall:
hmm stimmt wohl aber ich habe keine andere idee wie ich das andesr machen kann |
Re: LISTBOX: Immer die ersten 10 Zeichen eines eintrags färb
Zitat:
|
Re: LISTBOX: Immer die ersten 10 Zeichen eines eintrags färb
ich bin mir nicht sicher aber dann würde das nur bei einem selebr so aussehen, weil es sollten ja auch erhaltene nachrichten so aussehen..
|
Re: LISTBOX: Immer die ersten 10 Zeichen eines eintrags färb
Irgendwo wirst du doch wohl den Text vom anderen Gesprächspartner empfangen und ins Richedit einfügen. Genau danach rufst du dann deinen Code auf.
|
Re: LISTBOX: Immer die ersten 10 Zeichen eines eintrags färb
ja das schon aber das is ne extra unit..
ich veruschs mal!!! thx |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:11 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz