AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi SynEdit: Textfarbe an bestimmter Stelle herausfinden
Thema durchsuchen
Ansicht
Themen-Optionen

SynEdit: Textfarbe an bestimmter Stelle herausfinden

Ein Thema von derpepe · begonnen am 16. Mär 2005 · letzter Beitrag vom 17. Mär 2005
Antwort Antwort
Seite 2 von 3     12 3      
Benutzerbild von Pr0g
Pr0g

Registriert seit: 21. Mai 2004
809 Beiträge
 
Delphi 7 Personal
 
#11

Re: SynEdit: Textfarbe an bestimmter Stelle herausfinden

  Alt 17. Mär 2005, 15:18
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:
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;
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:
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;
  Mit Zitat antworten Zitat
Benutzerbild von derpepe
derpepe

Registriert seit: 16. Mär 2005
Ort: Dotternhausen
164 Beiträge
 
Delphi 2005 Personal
 
#12

Re: SynEdit: Textfarbe an bestimmter Stelle herausfinden

  Alt 17. Mär 2005, 15:45
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:
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
Gesucht wird nach SO (für Südosten).

Jedoch:
GetItem(fData, 'Eingang', 'so') = aus, als ob dort früher ein Durchgang war, aber jetzt ist alles Problem ist klar: Das liegt in einem String. Er findet sowas aber auch wenn es in einem Kommentar /* Kommentar */ liegt.
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?
Peter J. Schneider
http://raketenwerfer.de/programmieren/delphi/index.html
Nes dar in da kev, sed un est a log!
  Mit Zitat antworten Zitat
Benutzerbild von Pr0g
Pr0g

Registriert seit: 21. Mai 2004
809 Beiträge
 
Delphi 7 Personal
 
#13

Re: SynEdit: Textfarbe an bestimmter Stelle herausfinden

  Alt 17. Mär 2005, 15:54
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:
GetItem(fData, 'Pilzraum', 'Besch'); und da kommt dann das bei mir raus:
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.
  Mit Zitat antworten Zitat
Benutzerbild von derpepe
derpepe

Registriert seit: 16. Mär 2005
Ort: Dotternhausen
164 Beiträge
 
Delphi 2005 Personal
 
#14

Re: SynEdit: Textfarbe an bestimmter Stelle herausfinden

  Alt 17. Mär 2005, 15:59
Nicht 'Besch', 'SO'!!!

Hab mich auch vertippt, sollte Pilzraum sein, nicht Eingang.
Peter J. Schneider
http://raketenwerfer.de/programmieren/delphi/index.html
Nes dar in da kev, sed un est a log!
  Mit Zitat antworten Zitat
Benutzerbild von Pr0g
Pr0g

Registriert seit: 21. Mai 2004
809 Beiträge
 
Delphi 7 Personal
 
#15

Re: SynEdit: Textfarbe an bestimmter Stelle herausfinden

  Alt 17. Mär 2005, 16:05
Wo steht denn dort ein Attribut "SO", dort sind doch nur die zwei einzelnen "W" und "O"?
  Mit Zitat antworten Zitat
Benutzerbild von derpepe
derpepe

Registriert seit: 16. Mär 2005
Ort: Dotternhausen
164 Beiträge
 
Delphi 2005 Personal
 
#16

Re: SynEdit: Textfarbe an bestimmter Stelle herausfinden

  Alt 17. Mär 2005, 16:10
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:
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
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.

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).
Angehängte Dateien
Dateityp: zip tagedit_107.zip (1,67 MB, 6x aufgerufen)
Peter J. Schneider
http://raketenwerfer.de/programmieren/delphi/index.html
Nes dar in da kev, sed un est a log!
  Mit Zitat antworten Zitat
Benutzerbild von derpepe
derpepe

Registriert seit: 16. Mär 2005
Ort: Dotternhausen
164 Beiträge
 
Delphi 2005 Personal
 
#17

Re: SynEdit: Textfarbe an bestimmter Stelle herausfinden

  Alt 17. Mär 2005, 16:24
Mal noch kurz die Funktion um die es geht

Delphi-Quellcode:
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;
Ich würde gerne des SynEdit2 durch eine TStringList ersetzen, allerdings wird dann die GetHighlighterAttriAtRowCol unmöglich. Oder doch nicht?
Peter J. Schneider
http://raketenwerfer.de/programmieren/delphi/index.html
Nes dar in da kev, sed un est a log!
  Mit Zitat antworten Zitat
Benutzerbild von Pr0g
Pr0g

Registriert seit: 21. Mai 2004
809 Beiträge
 
Delphi 7 Personal
 
#18

Re: SynEdit: Textfarbe an bestimmter Stelle herausfinden

  Alt 17. Mär 2005, 16:55
GetHighlighterAttriAtRowCol ist vom SynEdit, also kannst du es auch nur mit diesem nutzen.
  Mit Zitat antworten Zitat
Benutzerbild von derpepe
derpepe

Registriert seit: 16. Mär 2005
Ort: Dotternhausen
164 Beiträge
 
Delphi 2005 Personal
 
#19

Re: SynEdit: Textfarbe an bestimmter Stelle herausfinden

  Alt 17. Mär 2005, 16:57
Kann ich den dann nicht wenigstens zur Laufzeit erstellen, also ohne visuelle Komponente?
So à la
SynEdit2:=TSynEdit.Create; Einfach nur Visible auf False setzen find ich blöd.

Warum brauch ich da dann den SynEdit? Reicht nicht der SynHighlighter aus!?
Peter J. Schneider
http://raketenwerfer.de/programmieren/delphi/index.html
Nes dar in da kev, sed un est a log!
  Mit Zitat antworten Zitat
Benutzerbild von Pr0g
Pr0g

Registriert seit: 21. Mai 2004
809 Beiträge
 
Delphi 7 Personal
 
#20

Re: SynEdit: Textfarbe an bestimmter Stelle herausfinden

  Alt 17. Mär 2005, 17:11
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:35 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz