Autor Beitrag
Klaus-B.Schmidt
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 70

WinXP u. Win2000
D6 Enterprise
BeitragVerfasst: Fr 25.06.04 12:24 
hi, ich hab mal wieder ein problem, und zwar mit der JvRichEdit, und zwar möchte ich einen string, z.B. :
ausblenden 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 ):
ausblenden 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(#------))
ausblenden Quelltext
1:
[normal]Hallo, [002200|000000]heute ist [ffffff|000000]freitag [normal] :)					


ich hoffe mir kann da jmd. helfen

MfG
Klaus
Klaus-B.Schmidt Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 70

WinXP u. Win2000
D6 Enterprise
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 70

WinXP u. Win2000
D6 Enterprise
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 70

WinXP u. Win2000
D6 Enterprise
BeitragVerfasst: Fr 25.06.04 17:05 
hab jetzt dies :
ausblenden volle Höhe 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 70

WinXP u. Win2000
D6 Enterprise
BeitragVerfasst: Sa 26.06.04 18:34 
kann mir da nciht doch jmd helfen, ich komm da einfach nciht weiter :((

MfG
Klaus-B.Schmidt Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 70

WinXP u. Win2000
D6 Enterprise
BeitragVerfasst: Mo 28.06.04 12:24 
hab ihc hier irgendwem etwas getan ???

MfG
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 70

WinXP u. Win2000
D6 Enterprise
BeitragVerfasst: 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 :
ausblenden 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 :
ausblenden Delphi-Quelltext
1:
    if Pos('#*',edit1.text)>0 then begin					

nun zerlege ich den string, und lasse für jedes teil mit if laufen :
ausblenden 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*#' :
ausblenden 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 :
ausblenden Delphi-Quelltext
1:
2:
        test:=test+spltstr[a];
      end;

in der shcleife soll er die anzahl durchlaufen, und evtl. farbe setzen :
ausblenden 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 :) :
ausblenden Delphi-Quelltext
1:
end;					
Klaus-B.Schmidt Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 70

WinXP u. Win2000
D6 Enterprise
BeitragVerfasst: Do 01.07.04 16:06 
Kann ich ncoh Hoffnung auf Hilfe haben ?

MfG
Klaus-B.Schmidt Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 70

WinXP u. Win2000
D6 Enterprise
BeitragVerfasst: 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
Hält's aus hier
Beiträge: 10

Win2000, WinXP
D7 Pers
BeitragVerfasst: 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

_________________
Wer lesen kann, ist klar im Vorteil
Klaus-B.Schmidt Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 70

WinXP u. Win2000
D6 Enterprise
BeitragVerfasst: 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
Hält's aus hier
Beiträge: 10

Win2000, WinXP
D7 Pers
BeitragVerfasst: 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

_________________
Wer lesen kann, ist klar im Vorteil
Klaus-B.Schmidt Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 70

WinXP u. Win2000
D6 Enterprise
BeitragVerfasst: So 04.07.04 19:29 
so, komischerweise funzt es jetzt, nur er sagt eine zugriffsverletzung in der zeile :
ausblenden Delphi-Quelltext
1:
        if color1[a]='' then					

bzw.
ausblenden Delphi-Quelltext
1:
if color1[a]<>'' then begin					


MfG

P.S. heir das ganze project(unit1.pas) :
ausblenden volle Höhe 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.