![]() |
Re: SynEdit: Textfarbe an bestimmter Stelle herausfinden
Die aktuelle Zeile kannst du farbig markieren, in dem du die Eigenschaft "ActiveLineColor" des SynEdit änderst.
Die roten Markierungen zeichnen ich selber auf das Canvas. Zu dem Auslesen der Werte, hier mal eine Funktion, wird zwar nicht die beste sein, aber als Denksanstoss bestimmt geignet:
Delphi-Quellcode:
Hier noch ein Beispiel zur Verwendung. Anstatt die Datei zu laden, kannst du als AData auch bspw. die Lines eines Memos oder so angeben, je nach dem was da auf dem Screenshot ist, weiß ja nicht wo du es brauchst:
function GetItem(const AData: TStrings; const ARoom, AItem: String): String;
var i, j, k, fPos, fOpenStart: Integer; fLine: String; fFinish, fOpen: Boolean; begin Result := ''; //nach der Position des Raums suchen for i := 0 to AData.Count - 1 do begin if Pos(ARoom, AData[i]) > 0 then if Pos('Raum', AData[i]) = 1 then begin fPos := i; Break; end; end; //Attribut auslesen fFinish := False; fOpen := False; for i := fPos to AData.Count - 1 do begin if Pos(AItem, AData[i]) = 1 then begin fLine := AData[i]; //Wert abtrennen for j := Pos(' ', fLine) to Length(fLine) do begin if fLine[j] <> ' ' then begin for k := j to Length(fLine) do Result := Result + fLine[k]; Break; end; end; //prüfen, ob der String vollständig ist if Result[1] = '''' then begin fOpen := True; fOpenStart := i; //Anführungszeichen entfernen Delete(Result, 1, 1); end else fFinish := True; end; if fOpen then begin if fOpenStart = i then Continue; fLine := AData[i]; if fLine = '' then Continue; //Wert abtrennen for j := Pos(' ', fLine) to Length(fLine) do begin if fLine[j] <> ' ' then begin for k := j to Length(fLine) do Result := Result + fLine[k]; Break; end; end; if Result[Length(Result)] = '''' then begin fOpen := False; fFinish := True; Delete(Result, Length(Result), 1); end; end; if fFinish then Break; end;
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var //Stringliste zum speichern der Daten fData: TStrings; begin //Instanz anlegen fData := TStringList.Create; try //Liste laden fData.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'Karn.adv.txt'); //Wert "Std" von "Eingang" auslesen Edit1.Text := GetItem(fData, 'Eingang', 'Std'); //wert "Besch" von Eingang" auslesen Memo1.Text := GetItem(fData, 'Eingang', 'Besch'); finally //Liste wieder freigeben fData.Free; end; end; |
Re: SynEdit: Textfarbe an bestimmter Stelle herausfinden
Das mit dem SynEdit.ActiveLineColor war ein guter Tipp, hatte ich nicht gesehen.
Hab sowas ähnliches jetzt programmiert. Nur gibt es noch Fehler. Beispielsweise wird folgendes analysiert:
Delphi-Quellcode:
Gesucht wird nach SO (für Südosten).
Raum Pilzraum
Name 'Pilzraum' Std Felsen W Achteck O durch_Pilze Attr Dunkel Innen Besch 'Dies ist eine feuchte, aber recht geräumige Höhle. Die gesamte Ostwand ist von einer schleimigen, gelblichen Pilzmasse bedeckt, aus der tausende von kleinen braunen Hutpilzen wachsen. Es sieht so aus, als ob dort früher ein Durchgang war, aber jetzt ist alles zugewachsen. Im Westen geht es zurück in den achteckigen Raum.' NachAusf (Lage) Wenn (Pilze_weg) dann Text 'Ein großer Teil der Pilze ist verfault, so daß ein häßliches Loch in der Wand klafft, durch das ich gehen kann.' Ende EndeAusf Jedoch:
Delphi-Quellcode:
Problem ist klar: Das liegt in einem String. Er findet sowas aber auch wenn es in einem Kommentar /* Kommentar */ liegt.
GetItem(fData, 'Eingang', 'so') = aus, als ob dort früher ein Durchgang war, aber jetzt ist alles
Bisher hab ich das mit dem SynEdit gemacht, da der das korrekt highlighted. Also: Abfrage an aktueller Stelle ob das ein Kommentar oder String ist... Hast Du einen besseren Vorschlag? |
Re: SynEdit: Textfarbe an bestimmter Stelle herausfinden
Ich verstehe das Problem nicht ganz, oder habe was falsch verstanden, der Text, den du da hast ist ja von "Pilzraum", also müsste der Aufruf so aussehen:
Delphi-Quellcode:
und da kommt dann das bei mir raus:
GetItem(fData, 'Pilzraum', 'Besch');
Dies ist eine feuchte, aber recht geräumige Höhle. Die gesamteOstwand ist von einer schleimigen, gelblichen Pilzmasse bedeckt,aus der tausende von kleinen braunen Hutpilzen wachsen. Es siehtso aus, als ob dort früher ein Durchgang war, aber jetzt ist alleszugewachsen. Im Westen geht es zurück in den achteckigen Raum. |
Re: SynEdit: Textfarbe an bestimmter Stelle herausfinden
Nicht 'Besch', 'SO'!!!
Hab mich auch vertippt, sollte Pilzraum sein, nicht Eingang. |
Re: SynEdit: Textfarbe an bestimmter Stelle herausfinden
Wo steht denn dort ein Attribut "SO", dort sind doch nur die zwei einzelnen "W" und "O"?
|
Re: SynEdit: Textfarbe an bestimmter Stelle herausfinden
Liste der Anhänge anzeigen (Anzahl: 1)
Ich häng jetzt meinen TagEdit mal an.
Tut zwar das meiste noch nicht, aber dann kannst Du wenigstens mal ausprobieren was ich hier die ganze Zeit laber. Das "so" steht in dem String drin! Deine Prozedur kann das mit Strings, nur mit Kommentaren funktionerts dann nicht.
Delphi-Quellcode:
Ich will jetzt nicht im Programm Strings und Kommentare einprogrammieren, ich hab ja schon über den SynEdit (mittels Highlighting) definiert was String und was Kommentar ist.
Raum Pilzraum
Name 'Pilzraum' Std Felsen W Achteck O durch_Pilze Attr Dunkel Innen Besch 'Die Beschreibung' /* Beginn des mehrzeiligen Kommentars So wird diese Zeile jetzt gefunden weil "so" am Anfang steht. Sie ist aber innerhalb eines Kommentars und sollte deshalb nicht gefunden werden */ NachAusf (Lage) Wenn (Pilze_weg) dann Text 'Ein großer Teil der Pilze ist verfault, so daß ein häßliches Loch in der Wand klafft, durch das ich gehen kann.' Ende EndeAusf In der angehängten Version funktioniert das ganze, jedoch mach ich einen Umweg über SynEdit2. Gucks Dir doch mal an und sag mir wie ich den SynEdit2 loswerden kann!! (SynEdit2 wird sonst für nichts gebraucht). |
Re: SynEdit: Textfarbe an bestimmter Stelle herausfinden
Mal noch kurz die Funktion um die es geht :-)
Delphi-Quellcode:
Ich würde gerne des SynEdit2 durch eine TStringList ersetzen, allerdings wird dann die GetHighlighterAttriAtRowCol unmöglich. Oder doch nicht?
function THauptfenster.GetItemPart(identifier,name,pname,part:string):string;
var position,line:integer; found:boolean; aname,s,temp:string; xy:tbuffercoord; attribute:tsynhighlighterattributes; begin SynEdit2.Lines.Text:=getitem(identifier,name,pname); line:=0; found:=false; while (line<=SynEdit2.lines.count-1) do begin temp:=cutby(synedit2.lines[line]); xy.Char:=pos(lowercase(part),lowercase(Synedit2.lines[line]))+length(part); xy.Line:=line; if SynEdit2.GetHighlighterAttriAtRowCol(xy,s,attribute) then aname:=attribute.name else aname:=''; if (lowercase(copy(temp,1,length(part)+1))=lowercase(part)+' ') and (aname<>commentAttr) and (aname<>stringAttr) then begin found:=true; break; end; inc(line); end; if found then begin position:=pos(lowercase(part),lowercase(synedit2.lines[line])); getitempart:=cutby(copy(synedit2.lines[line],position+length(part),length(synedit2.lines[line])-position-length(part)+1)); end else getitempart:=''; end; |
Re: SynEdit: Textfarbe an bestimmter Stelle herausfinden
GetHighlighterAttriAtRowCol ist vom SynEdit, also kannst du es auch nur mit diesem nutzen.
|
Re: SynEdit: Textfarbe an bestimmter Stelle herausfinden
Kann ich den dann nicht wenigstens zur Laufzeit erstellen, also ohne visuelle Komponente?
So à la
Delphi-Quellcode:
Einfach nur Visible auf False setzen find ich blöd.
SynEdit2:=TSynEdit.Create;
Warum brauch ich da dann den SynEdit? Reicht nicht der SynHighlighter aus!? |
Re: SynEdit: Textfarbe an bestimmter Stelle herausfinden
Ob du es zur Laufzeit erstellst, oder mit Visbile ausblendest macht keinen großen Unterschied. Es bleibt eine versteckte, visuelle Komponente.
Das SynEdit wird benötigt, da die Highlighter alleine nicht arbeiten können. Daher brauchst du ja bspw. auch eine Exporter um Text (wie vorhin mit dem RichEdit) kopieren zu können. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:18 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz