Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi SelAttributes im RichEdit (https://www.delphipraxis.net/45739-selattributes-im-richedit.html)

Hügel 11. Mai 2005 17:30


SelAttributes im RichEdit
 
Hallo, ich habe ein Problem mit der Textart (Größe, Farbe, Style etc) in einem Richedit:
Aus einem normalen Memo wird ein Text gelesen, in dem auch solche Textstyle-Infos ahnlich dem BBCode enthalten sind. Diese Infos werden in einer Prozedur ausgelesen und in Variablen gespeichert. anschließend wird das entsprechende Zeichen markiert und ihm werden per SelAttributes die Variablen zugewiesen. Das ganze geschieht in einer Schleife, die immer zeichenweise vorgeht und das nächste Zeichen an den Text im Richedit anhängt.


Delphi-Quellcode:
      RichEdit1.SelStart := Length(RichEdit1.Text) - 1;
      RichEdit1.SelLength := 1;
      with RichEdit1.SelAttributes do
        begin
        Name := TextSchrift;
        Color := TextFarbe;
        Size := TextGroesse;
        Style := TextStyle;
        end;


Das Problem ist nun, dass nur die aller ersten Textstyle-Infos auch angewendet werden, sobald einmal der normale Text angefangen hat, werden in Infos zwar ausgelesen und in den Variablen gespeichert (per Breakpoints geprüft) aber nicht mehr auf den darauf folgenden Text angewendet.

Woran kann das liegen??? :gruebel:
Help me plz

TStringlist 11. Mai 2005 19:26

Re: SelAttributes im RichEdit
 
poste doch mal etwas mehr Code. Interessant wäre da diesbezüglich z.B. der Schleifenformalismus selbst und das voranschreitende Pointen (auf den dann jeweils immer als nächstes zu formatierenden Char) mittels SelStart.

Hügel 14. Mai 2005 18:09

Re: SelAttributes im RichEdit
 
Hier is im Grunde die ganze Proz, den Befehl-Auswerten-Teil hab ich mal als externe Proz nur reingeschrieben, der funktioniert problemlos.

Delphi-Quellcode:
var ganzertext: Ansistring;
    i: integer;

    tbefehl: String; // ließt erstmal generell den Befehl aus
    tgroesse: integer;
    tschrift: string;
    tstyle:  tfontstyles;
    tstyle2: string;
    tfarbe:  tcolor;
    tAlign:  TAlignment;


Prozedure Entschluesseln;
begin
 GanzerText := Memo1.Text;

 for i := 1 to Length(GanzerText) do
    begin
      if Befehl = true then
        Befehl auswerten
    else
      begin
      TextFeld.Text := TextFeld.Text + Copy(GanzerText,1,1);

      Textfeld.SelStart := Length(Textfeld.Text);
      Textfeld.SelLength := -1;



      with TextFeld.SelAttributes do
        begin
        Name := tSchrift;
        Color := tFarbe;
        Size := tGroesse;
        Style := tStyle;
        end;        

      Delete(GanzerText, 1, 1);              // löscht letztes bearbeitetes Zeichen
      end; // end if kein Befehl, Text formatieren
    if Length(GanzerText) = 0 then Exit;  
    end; // Schleife
end;

TStringlist 14. Mai 2005 19:38

Re: SelAttributes im RichEdit
 
also auf den ersten Blick würde ich sagen:

1. Dein SelStart pointet immer genau hinter den letzten, eben gerade addierten, Char. RichEdit-intern hat der erste RichEdit-Text-Char nämlich den Index=0 ...ergo musst du mit Length(Textfeld.Text)-1 pointen

2. SelLength := +1;


Außerdem: Auf deine Weise wirst du auch die Cr- u. Lf-Bytes (Bytes durch die jede Memo- o. RichEdit-Zeile terminiert ist) mitformatieren, ...was dann aber ggf. durchaus auch nochmal zu gewissen (unvorhersehbaren) Fehlereffekten führen könnte.

edit: also normalerweise werden diese CrLf-Bytes natürlich immer mitformatiert, allerdings nur nicht extra ...als wären es ganz normale Chars, denen ich jetzt auch noch ein ganz spezielles Format verpassen möchte.

marabu 14. Mai 2005 21:09

Re: SelAttributes im RichEdit
 
Hallo Hügel,

wenn du SelLength auf einen negativen Wert setzen willst, dann musst du dich etwas mehr anstrengen - intern wird nur mit dem Betrag gearbeitet. Das Abschneiden, Löschen und Formatieren jeweils eines einzelnen Zeichens ist auch nicht gerade der Hit. Hier ein kleiner Ausschnitt aus einem Programm, mit dem ich selbst solche Style-Infos zeilenweise verarbeite. Vielleicht hilft dir das ja bei der Verbesserung deines Codes. Die Funktion Strip() zerlegt einen String beim ersten Auftreten eines Delimiters und StripStyle() extrahiert die Style-Codes und merkt sie sich in CurrentStyle.

Delphi-Quellcode:
procedure TMainForm.ProcessLine(line: string);
var
  s: string;
begin
  RichEdit.Lines.Add('');
  while line <> '' do begin
    s := Strip(line, '[', pmSingle);
    RichEdit.SelStart := Length(RichEdit.Text) - 2;
    RichEdit.SelAttributes.Style := CurrentStyle;
    RichEdit.SelText := s;
    if line <> '' then
      StripStyle(line);
  end;
end;
Grüße vom marabu

Hügel 17. Mai 2005 14:11

Re: SelAttributes im RichEdit
 
Hallo, danke erst mal für eure Hilfestellungen!!!

@ TStringlist: ich habs jetzt in
Delphi-Quellcode:
      Textfeld.SelStart := Length(Textfeld.Text) - 1;
      Textfeld.SelLength := 1;
geändert, allerdings leider ohne Erfolg.

@ Marabu: du gehst die Formatierung auf ne etwas andere Sache an, so hatte ich das auch schon mal überlegt... deine Version könnte mir also noch hilfreich sein, Danke also.

@ alle anderen: vllt hat ja noch jemand eine Idee, da es bisher leider noch nicht funktioniert hat :(...

TStringlist 17. Mai 2005 22:22

Re: SelAttributes im RichEdit
 
Der Hauptfehler liegt darin, dass du den Text des RichEdit-Controls nicht immer wieder über dessen Text-Property neu laden darfst!!! Warum? Weil du bei einer jeden solchen Zuweisung dann nämlich auch immer wieder von neuem den gesamten bisherigen RichEdit-Inhalt 100%ig überschreibst. Also gleichzeitig auch immer wieder sämtliche Format-Anweisungen, die du in diesen Text bis dato (theoretisch) schon eingebracht hattest. Auf der rechten Seite der Zuweisung hast du zwar auch wieder das Textfeld.Text stehen, aber das stellt dort nur noch mehr einen ganz normalen einfachen String dar, ohne jegliche Format-Anweisungen.

Lannes 18. Mai 2005 07:06

Re: SelAttributes im RichEdit
 
Hallo,
Zitat:

Zitat von Hügel
...
@ alle anderen: vllt hat ja noch jemand eine Idee, da es bisher leider noch nicht funktioniert hat :(...

in dem Thread(Delphi-Forum)Formatierten Text an Richedit übergeben? habe ich eine Alternative beschrieben, vielleicht ist das ja ein Ansatz für Dich.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:22 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