Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - RichEdit -> JvRichEdit
Klaus-B.Schmidt - Fr 25.06.04 12:24
Titel: RichEdit -> JvRichEdit
hi, ich hab mal wieder ein problem, und zwar mit der JvRichEdit, und zwar möchte ich einen string, z.B. :
Quelltext
1:
| Hallo, #*002200|000000*#huete ist #*ffffff*#freitag #**# :) |
umwandeln, und farbig in der Richedit anzeigen lassen, ganze zeilen kann cih so umwandeln (beispiel für zeile 0 ):
Delphi-Quelltext
1: 2: 3: 4: 5:
| rtbStatus.Lines.Add('Dies ist ein testsatz'); rtbStatus.SelStart := Perform( EM_LINEINDEX, 0, 0 ); rtbStatus.SelLength:=Length(rtbStatus.Lines[0]); rtbStatus.SelAttributes.Color:=clRed; rtbStatus.SelAttributes.BackColor:=clBlack; |
nun soll der obrige string in der RichEdit so aussehen (in [] stehen die farben, schriftfarbe|hintergrundfarbe [normal] ist die standart schriftfarbe/hintergrund)
Schrift- und hintergrundfarbe in der form von html farben angegeben(#------))
Quelltext
1:
| [normal]Hallo, [002200|000000]heute ist [ffffff|000000]freitag [normal] :) |
ich hoffe mir kann da jmd. helfen
MfG
Klaus
Klaus-B.Schmidt - Fr 25.06.04 14:10
sry, wenn ich jetzt nen bissel dränge, aber ich muß das prog heut abend fertig haben, und es wär schön, wenn mir bis dahin jmd helfen könnet :)
MfG
Udontknow - Fr 25.06.04 15:01
Hmmm, na wenigstens weisst du, daß Drängeln eigentlich nicht erwünscht ist. :)
Du musst dir eben die entsprechenden Worte selektieren, also Anpassung der Werte SelStart und SelLength. Hilfreich sind da auch dann dementsprechend die Funktionen Length und Pos.
Cu,
Udontknow
Klaus-B.Schmidt - Fr 25.06.04 15:30
so ähnlich hab ich mir das auch gedacht, nur mit den verschiedenen farbwerten, da gibt es ja ne menge von #0000000 bis #ffffff also muß ich den anfang aufspüren, die pos. speichern, länge von # zu # speichern und löschen( #* und *#), die farben raus speichern( ob 1 oder 2 sieht man aus der länge von # zu #) und dann ebenfalls löschen, nun hab ich die startpostition und die schriftfarbe ... nur wie mach ich das mit den anderen im string ?
MfG
Klaus-B.Schmidt - Fr 25.06.04 17:05
hab jetzt dies :
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54:
| type TStrArray= Array Of String; function Split(S: String; Delimiter: string): TStrArray; var C: Integer;
begin Repeat SetLength(Result, Length(Result)+ 1); C:= Pos(Delimiter, S); If C= 0 Then C:= Length(S)+ 1; Result[Length(Result)- 1]:= Copy(S, 1, C- 1); Delete(S, 1, C+Length(Delimiter)-1); Until Length(S)= 0; end;
procedure TForm1.Button1Click(Sender: TObject); var test:String; spltstr:TStrArray; a:integer; color1:array of string; color2:array of string; text:array of string; begin spltstr:=Split(edit1.text,'#*'); for a:=0 to high(spltstr) do begin if pos('*#',spltstr[a])=13 then begin color1[a]:=copy(spltstr[a],0,6); delete(spltstr[a],0,7); color2[a]:=copy(spltstr[a],0,6); delete(spltstr[a],0,8); end; if pos('*#',spltstr[a])=6 then begin color1[a]:=copy(spltstr[a],0,6); delete(spltstr[a],0,8); end; test:=test+spltstr[a]; end; for a:=0 to high(spltstr) do begin if color1[a]='' then test:=test else begin if a>0 then JvRichEdit1.SelStart:=JvRichEdit1.GetLineIndex(JvRichEdit1.Lines.Count-1)+Length(text[a-1])-1 else JvRichEdit1.SelStart:=JvRichEdit1.GetLineIndex(JvRichEdit1.Lines.Count-1);
JvRichEdit1.SelLength:=Length(text[a]); JvRichEdit1.SelAttributes.Color:= Integer(StrToInt('$' + Copy(color1[a], 1, 2))) + Integer(StrToInt('$' + Copy(color1[a], 3, 2))) shl 8 + Integer(StrToInt('$' + Copy(color1[a], 5, 2))) shl 16;
end; end; |
1. es funktioniert nicht :((
2. is mir das ein wenig zu lang!
MfG
Klaus-B.Schmidt - Sa 26.06.04 18:34
kann mir da nciht doch jmd helfen, ich komm da einfach nciht weiter :((
MfG
Klaus-B.Schmidt - Mo 28.06.04 12:24
hab ihc hier irgendwem etwas getan ???
MfG
Udontknow - Mo 28.06.04 13:02
Na, vielleicht liegt es daran, daß du a) sehr viel Code gepostet hast (hast du ja selber auch schon erkannt), der b) schlecht lesbar ist durch falsches/nicht vorhandenes Einrücken, und c) einfach nicht eine genaue Fehlerbeschreibung lieferst.
Versuche doch mal, dein Problem in Teilprobleme zu zerlegen:
a) Feststellen, ob ein Farbbefehl in der Zeile vorhanden ist.
b) Feststellen, an welcher Position er beginnt.
c) Den Farbbefehl aus der Zeile herausschneiden.
d) Die Farbe des Farbbefehls interpretieren.
e) Den beschnittenen String ab Position X (siehe b) einfärben.
Zu den Code-Konventionen:
Nach jedem begin 2 Zeichen einrücken. Begin sollte immer alleine in der Zeile stehen.
Cu,
Udontknow
Klaus-B.Schmidt - Mo 28.06.04 19:48
so, habs formatiert, nur bin immer ncoh nciht weiter, ich zerleg euch die mal :
Variablendeklination dürfte jedem klar sein :
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure TForm1.Button1Click(Sender: TObject); var test:String; spltstr:TStrArray; a:integer; color1:array of string; color2:array of string; text:array of string; begin |
nun lass ich überprüfen, ob '#*' überhaupt vorkommt :
Delphi-Quelltext
1:
| if Pos('#*',edit1.text)>0 then begin |
nun zerlege ich den string, und lasse für jedes teil mit if laufen :
Delphi-Quelltext
1: 2:
| spltstr:=Split(edit1.text,'#*'); for a:=0 to high(spltstr) do begin |
hier wird überprüft, wie lag die farbanweisung ist,
also '#*000000|ffffff*#' oder nur '#*000000*#' :
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| if pos('*#',spltstr[a])=13 then begin color1[a]:=copy(spltstr[a],0,6); delete(spltstr[a],0,7); color2[a]:=copy(spltstr[a],0,6); delete(spltstr[a],0,8); end; if pos('*#',spltstr[a])=6 then begin color1[a]:=copy(spltstr[a],0,6); delete(spltstr[a],0,8); end; |
ende der schleife, und zusammenfügen des textes zu einem string :
Delphi-Quelltext
1: 2:
| test:=test+spltstr[a]; end; |
in der shcleife soll er die anzahl durchlaufen, und evtl. farbe setzen :
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| for a:=0 to high(spltstr) do begin if color1[a]='' then test:=test else begin if a>0 then JvRichEdit1.SelStart:=JvRichEdit1.GetLineIndex(JvRichEdit1.Lines.Count-1)+Length(text[a-1])-1 else JvRichEdit1.SelStart:=JvRichEdit1.GetLineIndex(JvRichEdit1.Lines.Count-1);
JvRichEdit1.SelLength:=Length(text[a]); JvRichEdit1.SelAttributes.Color:= Integer(StrToInt('$' + Copy(color1[a], 1, 2))) + Integer(StrToInt('$' + Copy(color1[a], 3, 2))) shl 8 + Integer(StrToInt('$' + Copy(color1[a], 5, 2))) shl 16;
end; end; end; |
dort kommt immer folgende fehler :
Zitat: |
[Warnung] Unit1.pas(): Variable 'spltstr' ist möglicherweise nicht initialisiert worden
[Warnung] Unit1.pas(): Variable 'color1' ist möglicherweise nicht initialisiert worden
[Warnung] Unit1.pas(): Variable 'text' ist möglicherweise nicht initialisiert worden
[Warnung] Unit1.pas(): Variable 'color2' ist möglicherweise nicht initialisiert worden
|
und das ende :) :
Klaus-B.Schmidt - Do 01.07.04 16:06
Kann ich ncoh Hoffnung auf Hilfe haben ?
MfG
Klaus-B.Schmidt - Fr 02.07.04 22:16
da es hier anscheinend nichts wird, muß ich mal shen, ob ich mir wo anders 8anderen forum) mir hilfe beschaffen kann *hoffdasdasnichtderfallwird* .
*hoffaufantwort*
MfG
Klaus
P.S. is nicht bös gemeint ;)
fkerber - Sa 03.07.04 13:34
Hi!
Das sind auf jeden Fall mal keine Fehler im eigentlichen Sinne, sondern eben nur Warnungen, die darüber auskunft geben, dass in manchen Variablen eben **** drin stehen könnte.
Diese Warnungen kannst du umgehen indem du die Variablen einfach initalisierst.
Macht der Code ansonsten, was er soll?
Ciao fkerber
Klaus-B.Schmidt - So 04.07.04 18:44
ich konnte nicht feststellen, ob das funktioniert, da er das programm gar nicht compilliert, sondern schreibt nur die warnungen .
MfG
fkerber - So 04.07.04 19:05
Hi!
Dann sind bestimmt noch andere Sachen in der Ausgabe außer Warnungen.
Häng am besten mal das gesamte Projekt an.
Ciao fkerber
Klaus-B.Schmidt - So 04.07.04 19:29
so, komischerweise funzt es jetzt, nur er sagt eine zugriffsverletzung in der zeile :
bzw.
Delphi-Quelltext
1:
| if color1[a]<>'' then begin |
MfG
P.S. heir das ganze project(unit1.pas) :
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, JvExStdCtrls, JvRichEdit, ExtCtrls;
type TForm1 = class(TForm) Button1: TButton; JvRichEdit1: TJvRichEdit; Edit1: TEdit; procedure Button1Click(Sender: TObject); private public end;
var Form1: TForm1;
implementation
{$R *.dfm} type TStrArray= Array Of String; function Split(S: String; Delimiter: string): TStrArray; var C: Integer;
begin Repeat SetLength(Result, Length(Result)+ 1); C:= Pos(Delimiter, S); If C= 0 Then C:= Length(S)+ 1; Result[Length(Result)- 1]:= Copy(S, 1, C- 1); Delete(S, 1, C+Length(Delimiter)-1); Until Length(S)= 0; end; procedure TForm1.Button1Click(Sender: TObject); var test:String; spltstr:TStrArray; a:integer; color1:array of string; color2:array of string; text:array of string; begin if Pos('#*',edit1.text)>0 then begin spltstr:=Split(edit1.text,'#*'); for a:=0 to high(spltstr) do begin if pos('*#',spltstr[a])=13 then begin color1[a]:=copy(spltstr[a],0,6); delete(spltstr[a],0,7); color2[a]:=copy(spltstr[a],0,6); delete(spltstr[a],0,8); end; if pos('*#',spltstr[a])=6 then begin color1[a]:=copy(spltstr[a],0,6); delete(spltstr[a],0,8); end; test:=test+spltstr[a]; end; for a:=0 to high(spltstr) do begin if color1[a]<>'' then begin if a>0 then JvRichEdit1.SelStart:=JvRichEdit1.GetLineIndex(JvRichEdit1.Lines.Count-1)+Length(text[a-1])-1 else JvRichEdit1.SelStart:=JvRichEdit1.GetLineIndex(JvRichEdit1.Lines.Count-1);
JvRichEdit1.SelLength:=Length(text[a]); JvRichEdit1.SelAttributes.Color:= Integer(StrToInt('$' + Copy(color1[a], 1, 2))) + Integer(StrToInt('$' + Copy(color1[a], 3, 2))) shl 8 + Integer(StrToInt('$' + Copy(color1[a], 5, 2))) shl 16;
end; end; end; end;
end. |
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!