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, 00 );
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], 12))) +
      Integer(StrToInt('$' + Copy(color1[a], 32))) shl 8 +
      Integer(StrToInt('$' + Copy(color1[a], 52))) 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], 12))) +
          Integer(StrToInt('$' + Copy(color1[a], 32))) shl 8 +
          Integer(StrToInt('$' + Copy(color1[a], 52))) 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 :) :

Delphi-Quelltext
1:
end;                    


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 :

Delphi-Quelltext
1:
        if color1[a]='' then                    

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
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  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], 12))) +
          Integer(StrToInt('$' + Copy(color1[a], 32))) shl 8 +
          Integer(StrToInt('$' + Copy(color1[a], 52))) shl 16;

        end;
      end;
    end;
end;


end.