Autor |
Beitrag |
Klaus-B.Schmidt
Beiträge: 70
WinXP u. Win2000
D6 Enterprise
|
Verfasst: 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. :
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
Beiträge: 70
WinXP u. Win2000
D6 Enterprise
|
Verfasst: 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
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: 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
Beiträge: 70
WinXP u. Win2000
D6 Enterprise
|
Verfasst: 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
Beiträge: 70
WinXP u. Win2000
D6 Enterprise
|
Verfasst: Fr 25.06.04 17:05
hab jetzt dies :
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
Beiträge: 70
WinXP u. Win2000
D6 Enterprise
|
Verfasst: Sa 26.06.04 18:34
kann mir da nciht doch jmd helfen, ich komm da einfach nciht weiter (
MfG
|
|
Klaus-B.Schmidt
Beiträge: 70
WinXP u. Win2000
D6 Enterprise
|
Verfasst: Mo 28.06.04 12:24
hab ihc hier irgendwem etwas getan ???
MfG
|
|
Udontknow
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: 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
Beiträge: 70
WinXP u. Win2000
D6 Enterprise
|
Verfasst: 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 :
Delphi-Quelltext
|
|
Klaus-B.Schmidt
Beiträge: 70
WinXP u. Win2000
D6 Enterprise
|
Verfasst: Do 01.07.04 16:06
Kann ich ncoh Hoffnung auf Hilfe haben ?
MfG
|
|
Klaus-B.Schmidt
Beiträge: 70
WinXP u. Win2000
D6 Enterprise
|
Verfasst: 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
|
Verfasst: 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
Beiträge: 70
WinXP u. Win2000
D6 Enterprise
|
Verfasst: 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
|
Verfasst: 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
Beiträge: 70
WinXP u. Win2000
D6 Enterprise
|
Verfasst: So 04.07.04 19:29
so, komischerweise funzt es jetzt, nur er sagt eine zugriffsverletzung in der zeile : Delphi-Quelltext
bzw.
Delphi-Quelltext 1:
| if color1[a]<>'' then begin |
MfG
P.S. heir das ganze project(unit1.pas) :
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. |
|
|
|