Autor |
Beitrag |
SweeT_C
      
Beiträge: 32
|
Verfasst: Mi 21.03.07 17:59
Moin,
kann man einzelne abschnitte aus einem Text zB mit strings farblich hervorheben ?
Mfg n Thx
|
|
ZeitGeist87
      
Beiträge: 1593
Erhaltene Danke: 20
Win95-Win10
Delphi 10 Seattle, Rad Studio 2007, Delphi 7 Prof., C++, WSH, Turbo Pascal, PHP, Delphi X2
|
Verfasst: Mi 21.03.07 18:29
Hallo! Mit einem Richedit (Palette Win32): Delphi-Quelltext 1: 2: 3:
| richedit1.selattributes.color:= clred; richedit1.selattributes.style:= [fsbold]; richedit1.selText:= 'Dieser Text wird rot und fett dargestellt'; | Über richedit1.selStart und richedit1.SelLength kannst du bestenden Text markieren und dann wie oben über Delphi-Quelltext 1: 2:
| richedit1.selattributes.color:= clred; richedit1.selattributes.style:= [fsbold]; | diesen "gestalten". Hoffe ich hab dir einen kleinen Denkanstoss geben können! LG Stefan //Edit: Ich denk ich programmier dir mal schnell n Beispiel
_________________ Wer Provokationen, Ironie, Sarkasmus oder Zynismus herauslesen kann soll sie ignorieren um den Inhalt meiner Beiträge ungetrübt erfassen zu können.
|
|
SweeT_C 
      
Beiträge: 32
|
Verfasst: Mi 21.03.07 18:39
ZeitGeist87 hat folgendes geschrieben: |
//Edit: Ich denk ich programmier dir mal schnell n Beispiel |
Danke! Mit ein BEispiel wirds für mich sicherlich etwas verständlicher.
Kann ich mit richedit1 auch direkt einen string auswählen und nicht einen bestimmten bereich eingeben ? Zum Beispiel hab ich einen Text und möchte immer das wort "tiefkühlpizza" hervorheben ohne zu kennen, wo es ist.
|
|
ZeitGeist87
      
Beiträge: 1593
Erhaltene Danke: 20
Win95-Win10
Delphi 10 Seattle, Rad Studio 2007, Delphi 7 Prof., C++, WSH, Turbo Pascal, PHP, Delphi X2
|
Verfasst: Mi 21.03.07 18:57
Genau das Problem mit dem irgendwo im Text hat ich heut in der Arbeit, habs aber nicht gelöst, hab Feierabend gemacht
Aber da ich jetzt daheim bin, werd ich mir dran machen, etwas zu entwickeln!
Dazu kann ich glaub ich gut die FUnktion PosEx() gebrauchen und eine Rekursion...
LG
Stefan
_________________ Wer Provokationen, Ironie, Sarkasmus oder Zynismus herauslesen kann soll sie ignorieren um den Inhalt meiner Beiträge ungetrübt erfassen zu können.
|
|
GTA-Place
      

Beiträge: 5248
Erhaltene Danke: 2
WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
|
Verfasst: Mi 21.03.07 18:58
Delphi-Quelltext 1: 2:
| RichEdit1.SelStart := Pos('Tiefkühlpizza', RichEdit1.Text) - 1; RichEdit1.SelLength := Length('Tiefkühlpizza'); |
Geht dann aber nur beim 1. Vorkommen von Tieflkühlpizza.
_________________ "Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
Zuletzt bearbeitet von GTA-Place am Mi 21.03.07 19:02, insgesamt 1-mal bearbeitet
|
|
ZeitGeist87
      
Beiträge: 1593
Erhaltene Danke: 20
Win95-Win10
Delphi 10 Seattle, Rad Studio 2007, Delphi 7 Prof., C++, WSH, Turbo Pascal, PHP, Delphi X2
|
Verfasst: Mi 21.03.07 19:01
Tja Fabian :) Die Idee hat ich heut auch schon, allerdings wird da nur das erste Vorkommen "bearbeitet" 
_________________ Wer Provokationen, Ironie, Sarkasmus oder Zynismus herauslesen kann soll sie ignorieren um den Inhalt meiner Beiträge ungetrübt erfassen zu können.
|
|
GTA-Place
      

Beiträge: 5248
Erhaltene Danke: 2
WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
|
Verfasst: Mi 21.03.07 19:04
Er hat ja auch nicht gesagt, dass es häufiger vorkommt. Außerdem: Siehe Edit.
_________________ "Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
|
|
ZeitGeist87
      
Beiträge: 1593
Erhaltene Danke: 20
Win95-Win10
Delphi 10 Seattle, Rad Studio 2007, Delphi 7 Prof., C++, WSH, Turbo Pascal, PHP, Delphi X2
|
Verfasst: Mi 21.03.07 19:08
Zitat: | immer das wort "tiefkühlpizza" hervorheben ohne zu kennen, wo es ist. |
Ist für mich mehr als einmal
Und ok..ich schau aufs Edit 
_________________ Wer Provokationen, Ironie, Sarkasmus oder Zynismus herauslesen kann soll sie ignorieren um den Inhalt meiner Beiträge ungetrübt erfassen zu können.
|
|
ZeitGeist87
      
Beiträge: 1593
Erhaltene Danke: 20
Win95-Win10
Delphi 10 Seattle, Rad Studio 2007, Delphi 7 Prof., C++, WSH, Turbo Pascal, PHP, Delphi X2
|
Verfasst: Mi 21.03.07 19:23
Beispiel wie versprochen im Anhang!
Allerdings wird nur das erste Vorkommen markiert.
Ich entwickel schnell noch die Funktion über den gesamten Text und update dann.
LG
Stefan
Einloggen, um Attachments anzusehen!
_________________ Wer Provokationen, Ironie, Sarkasmus oder Zynismus herauslesen kann soll sie ignorieren um den Inhalt meiner Beiträge ungetrübt erfassen zu können.
|
|
SweeT_C 
      
Beiträge: 32
|
Verfasst: Mi 21.03.07 19:41
ZeitGeist87 hat folgendes geschrieben: | Beispiel wie versprochen im Anhang!
Allerdings wird nur das erste Vorkommen markiert.
Ich entwickel schnell noch die Funktion über den gesamten Text und update dann.
LG
Stefan |
Danke für das Programm. Ich verstehe, was du gemacht hast und Farbauswahl usw sind praktische Ideen *thumsup*
Ich hätt vielleicht ne Idee, wie man das "nur einmal" PRoblem lösen könnte, weiß aber nicht, wie ich es umsetzen kann. Was ist mit einer "while" schleife ? von der ersten Zeile des memofeldes bis zur letzen durchlaufen lassen ?
|
|
ZeitGeist87
      
Beiträge: 1593
Erhaltene Danke: 20
Win95-Win10
Delphi 10 Seattle, Rad Studio 2007, Delphi 7 Prof., C++, WSH, Turbo Pascal, PHP, Delphi X2
|
Verfasst: Mi 21.03.07 19:42
Die Idee ist nicht schlecht..nur dann brauchst du 3 schleifen  und das dauert ewigkeiten!
Ich hab schon herausgefunden wie es funktionieren muss
PosEx ist die Lösung...
LG
Stefan
_________________ Wer Provokationen, Ironie, Sarkasmus oder Zynismus herauslesen kann soll sie ignorieren um den Inhalt meiner Beiträge ungetrübt erfassen zu können.
|
|
SweeT_C 
      
Beiträge: 32
|
Verfasst: Mi 21.03.07 20:04
hmm, ich weiß nicht genau, wie ich das mit PosEx machen soll. Hab heute erst mit strings angefangen  In dem Tut, das ich benutze wird das zweite vorkommen eines zeichens gefunden indem das erste plus 1 gerechnet wird. wenn ich das hier genauso machen wollte, müsste ich doch auch die Anzahl des vorkommens kennen ?
Über einen Denkanstoß wäre ich dankbar ;]
|
|
Blackheart666
      
Beiträge: 2195
XP
D3Prof, D6Pers.
|
Verfasst: Mi 21.03.07 20:29
Vieleicht kannst Du mit dem hier was anfangen.
www.delphi-forum.de/...67521&highlight=
_________________ Blackheart666
Der Irrsinn ist bei Einzelnen etwas Seltenes, - aber bei Gruppen, Parteien, Völkern, Zeiten die Regel. (Friedrich Nietzsche)
|
|
ZeitGeist87
      
Beiträge: 1593
Erhaltene Danke: 20
Win95-Win10
Delphi 10 Seattle, Rad Studio 2007, Delphi 7 Prof., C++, WSH, Turbo Pascal, PHP, Delphi X2
|
Verfasst: Mi 21.03.07 21:04
Hab grad ne Lösung für mein eigenes Syntaxhighlighting-Problem entwickelt! Funktioniert sogar wunderbar :) Hier die neue Unit: 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: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147:
| unit hauptprogramm;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, ComCtrls, Spin, StrUtils;
type RSyntax = record Begriff: String; Farbe: TColor; Style: TFontStyles; end;
type TForm1 = class(TForm) databox: TRichEdit; Label1: TLabel; such_text: TEdit; GroupBox1: TGroupBox; schrift_farbe: TColorBox; Label2: TLabel; Label3: TLabel; schrift_size: TSpinEdit; check_fett: TCheckBox; check_kursiv: TCheckBox; check_unterstrichen: TCheckBox; Button1: TButton; Button2: TButton; function durchsuche(Suchbegriff: String; Textbaustein: TRichEdit; Offset: integer): integer; function doSyntax(Syntax: array of RSyntax; RichEdit: TRichEdit): Boolean; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private tempoffset: integer; public end;
var Form1: TForm1; mySyntax: array of RSyntax;
implementation
{$R *.dfm}
function TForm1.doSyntax(Syntax: array of RSyntax; RichEdit: TRichEdit): Boolean;
var position: integer; i: integer; begin;
for i:= low(Syntax) to high(Syntax) do begin REPEAT position:= durchsuche(Syntax[i].Begriff, richedit, tempoffset); if position > 0 then begin RichEdit.SelStart:= position-1; RichEdit.SelLength:= length(Syntax[i].Begriff); RichEdit.SelAttributes.Color:= Syntax[i].Farbe; RichEdit.SelAttributes.Style:= Syntax[i].Style; end; UNTIL (position = 0); end; end;
function TForm1.durchsuche(suchbegriff: string; Textbaustein: TRichEdit; Offset: Integer): Integer;
begin; tempoffset:= PosEx(suchbegriff, Textbaustein.text, offset+1); durchsuche:= tempoffset; end;
procedure TForm1.Button1Click(Sender: TObject); var posmerker: integer; Stil: TFontStyles; begin posmerker:= 0;
Stil:= [];
posmerker:= pos(such_text.Text, databox.text); if posmerker > 0 then begin databox.SelStart:= posmerker-1;
databox.SelLength:= length(such_text.text);
databox.SelAttributes.Color:= schrift_farbe.Selected;
databox.SelAttributes.Size:= schrift_size.Value;
if check_fett.checked = true then Stil:= Stil + [fsbold];
if check_kursiv.Checked = true then Stil:= Stil + [fsitalic];
if check_unterstrichen.checked = true then Stil:= Stil + [fsunderline];
databox.SelAttributes.Style:= Stil;
databox.SelStart:= databox.SelStart + databox.SelLength; end else messagebox(application.handle, 'Textpassage wurde nicht gefunden', 'Kein Treffer', MB_IconWARNING); end;
procedure TForm1.Button2Click(Sender: TObject); begin setlength(mySyntax, 2);
mySyntax[0].Begriff:= 'Demo'; mySyntax[0].Farbe:= clred; mySyntax[0].Style:= [fsbold];
mySyntax[1].Begriff:= 'die'; mySyntax[1].Farbe:= clgreen; mySyntax[1].Style:= [fsitalic];
doSyntax(mySyntax, databox); end;
end. | Sucht noch Case-SensitiveLG Stefan
_________________ Wer Provokationen, Ironie, Sarkasmus oder Zynismus herauslesen kann soll sie ignorieren um den Inhalt meiner Beiträge ungetrübt erfassen zu können.
|
|
ZeitGeist87
      
Beiträge: 1593
Erhaltene Danke: 20
Win95-Win10
Delphi 10 Seattle, Rad Studio 2007, Delphi 7 Prof., C++, WSH, Turbo Pascal, PHP, Delphi X2
|
Verfasst: Do 22.03.07 14:50
Ist für Highlighting On-the-Fly allerdings nicht zu gebrauchen
Noch nicht!
Denk ich stell heute abend die neue Version online.
Allerdings:
Hat vielleicht schon mal einer von euch sowas ähnliches gemacht?
Hinweise auf SynEdit bitte ersparen
Mich interessieren nur eure eigenen Entwicklungen/Ideen.
Danke!
LG
Stefan
_________________ Wer Provokationen, Ironie, Sarkasmus oder Zynismus herauslesen kann soll sie ignorieren um den Inhalt meiner Beiträge ungetrübt erfassen zu können.
|
|
Blackheart666
      
Beiträge: 2195
XP
D3Prof, D6Pers.
|
Verfasst: Do 22.03.07 15:17
Vieleicht ist das ganz Interessant, hab die Seite nicht mehr gefunden deswegen als Anhang zip(PDF)
Einloggen, um Attachments anzusehen!
|
|
SweeT_C 
      
Beiträge: 32
|
Verfasst: Sa 24.03.07 21:45
Ich hab mich mal selbst auf die Suche einer Lösung gemacht und, glaube ich, eine gefunden. Allerdings funzt die Umsetzung nicht *ratlos guck*
Mein Gedanke war, den string zum einfärben zu suchenm und position und länge in einem dynamischen array zu speichern. Das ganze in einer Schleife solange bis der STring nciht mehr auftaucht. Darauf soll eine zweite SChleife aufgerufen werden, die die Daten aus dem Array ausliest, die Strings an den entsprechenden stellen wieder wieder einfügt und dann einfärbt.
Allerdings scheiterts bei mir schon daran, dass sich mein Programm nciht mehr reagiert, wenn ich die prozedur aufrufe. Ich denk mal, die Schleife wird nciht beendet.
Hier der Text, den ich nehme:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| <Nasse> ich schreib dich in den nächsten tagen mal an und frag ich über physik aus <Nasse> hab aber kjetz keine lust mehr <SweeT_C> -.- <Nasse> *JOKINGLY* <Nasse> wäste mal früher gekommen <SweeT_C> dann ? |
und die PRozedur
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:
| procedure TForm1.Button8Click(Sender: TObject); var s, name1, name2:string; var pp, ll, i, o:integer; var hallo:array of integer; begin name1:='<'+edit3.text+'>'; name2:='<'+edit4.text+'>'; s:=richedit2.text; i:=0; Setlength(hallo, 0); begin while Pos(name1, s)<>0 do Setlength(hallo,i+2); o:=i+1; hallo[i]:=Pos(name1, s); hallo[o]:=Length(name1); Delete(s, pp, ll); i:=i+2; end; showmessage('completed');
end; |
|
|
ZeitGeist87
      
Beiträge: 1593
Erhaltene Danke: 20
Win95-Win10
Delphi 10 Seattle, Rad Studio 2007, Delphi 7 Prof., C++, WSH, Turbo Pascal, PHP, Delphi X2
|
Verfasst: Sa 24.03.07 22:04
SweeT_C hat folgendes geschrieben: |
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| procedure TForm1.Button8Click(Sender: TObject); var s, name1, name2:string; pp, ll, i, o:integer; hallo:array of integer; begin name1:='<'+edit3.text+'>'; name2:='<'+edit4.text+'>'; s:=richedit2.text; i:=0; Setlength(hallo, 0); while Pos(name1, s)<>0 do begin Setlength(hallo,i+2); o:=i+1; hallo[i]:=Pos(name1, s); hallo[o]:=Length(name1); Delete(s, pp, ll); i:=i+2; end; showmessage('completed'); end; | |
LG
Stefan
_________________ Wer Provokationen, Ironie, Sarkasmus oder Zynismus herauslesen kann soll sie ignorieren um den Inhalt meiner Beiträge ungetrübt erfassen zu können.
|
|
SweeT_C 
      
Beiträge: 32
|
Verfasst: So 25.03.07 00:05
Habs korriegiert, aber das Programm hängt sich immernoch auf 
|
|
GTA-Place
      

Beiträge: 5248
Erhaltene Danke: 2
WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
|
Verfasst: So 25.03.07 00:10
pp ist undefiniert. Es wird demnach nichts/falsches gelöscht.
_________________ "Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
|
|
|