Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Markierung verschiebt sich in jeder Zeile (https://www.delphipraxis.net/192738-markierung-verschiebt-sich-jeder-zeile.html)

Getox 16. Mai 2017 07:54

Delphi-Version: XE3

Markierung verschiebt sich in jeder Zeile
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

heute mal eher eine Grundlagenfrage:
Ich habe ein Richedit. Ich füge mit einer Funktion Zeilen hinzu, welche aus einer "Überschrift" und einem dazu gehörenden Text bestehen. Die Überschrift wird dann Fett formatiert und der andere Text normal.

Code:
procedure TForm1.addZeile(sUeberschrift, sText: String);
begin
  memoMessage.Lines.Add(sUeberschrift + sText);
  if sUeberschrift <> '' then
  begin
    memoMessage.SelStart := Pos (sUeberschrift, memoMessage.Text)-1;
    memoMessage.SelLength := Length (sUeberschrift);
    memoMessage.SelAttributes.Style:=[fsBold];
    memoMessage.SelLength := 0;
  end;

  if sText <> '' then
  begin
    memoMessage.SelStart := Pos (sText, memoMessage.Text)-1;
    memoMessage.SelLength := Length (sText);
    memoMessage.SelAttributes.Style:=[];
    memoMessage.SelLength := 0;
  end;
end;
Jetzt rufe ich die Funktion ein paar mal auf und der bearbeitete Text verschiebt sich in jeder Zeile einen weiter nach rechts (Bild mit dem Resultat im Anhang):

Code:
  Form1.addZeile('erste ', 'Zeile');
  Form1.addZeile('zweite ', 'Zeile');
  Form1.addZeile('dritte ', 'Zeile');
  Form1.addZeile('vierte ', 'Zeile');
  Form1.addZeile('fünfte ', 'Zeile');
Was kann ich tun, um diese Verschiebung zu verhindern?

himitsu 16. Mai 2017 07:57

AW: Markierung verschiebt sich in jeder Zeile
 
Du darfst nicht Pos nehmen, sondern "solltest" die SuchFunktion (Find) des RichEdits verwenden, da sie im internen Speicher sucht, ohne diese fahrlässige Manipulation von Delphi.

Embarcadero war bei deiner Implementation extrem doof und wandelt den intenen Zeilenumbruch #10 des RichEdits in #13#10 um, aber nicht beim Zugriff aus SelStart und SelLength.
Und trotz mehrerer QC-Einträge wird das seit vielen, vielen, vielen Jahren nicht repariert.

Oder du mußt den ausgelesenen Text wieder zurückumwandeln, also #13#10 > #10.

Getox 16. Mai 2017 08:08

AW: Markierung verschiebt sich in jeder Zeile
 
Vielen Dank für die Antwort.

Ich hab dem Form nun eine private Integer Variable gegeben, die ich beim Create auf 0 setze. Jedes mal wenn ich die AddZeile Prozedur aufrufe, erhöhe ich als erstes diesen Wert um 1. und anschließend ziehe ich ihn nun anstelle der 1 vom Pos ab, um die SelStart zu erhalten. Das war wenig Aufwand und klappt :)

DeddyH 16. Mai 2017 08:13

AW: Markierung verschiebt sich in jeder Zeile
 
Vielleicht auch einfach so (schnell heruntergetippelt, Komponenten nicht einmal umbenannt):
Delphi-Quellcode:
procedure TForm6.AddZeile(sHeader, sText: string);
var
  TotalLength: integer;
begin
  TotalLength := Length(sHeader) + Length(sText);
  RichEdit1.Lines.Add(sHeader + sText);
  RichEdit1.SelStart := RichEdit1.SelStart - Succ(TotalLength);
  RichEdit1.SelLength := Length(sHeader);
  RichEdit1.SelAttributes.Style := RichEdit1.SelAttributes.Style + [fsBold];
  RichEdit1.SelStart := RichEdit1.SelStart + TotalLength;
  RichEdit1.SelAttributes.Style := RichEdit1.SelAttributes.Style - [fsBold];
end;

TBx 16. Mai 2017 08:55

AW: Markierung verschiebt sich in jeder Zeile
 
Davon ausgehend, das Selstart genau den Punkt zeigt, an dem man in ein RichEdit einfügt, kann man ohne große Rechnerei auch folgendes machen:

Delphi-Quellcode:
procedure TForm1.addZeile(sUeberschrift, sText: String);
begin
  memoMessage.SelAttributes.Style := [fsBold];
  memoMessage.SelText := sUeberschrift + ' ';
  memoMessage.SelAttributes.Style := [];
  memoMessage.SelText := sText + #13;
end;

Getox 16. Mai 2017 13:20

AW: Markierung verschiebt sich in jeder Zeile
 
Zitat:

Zitat von TBx (Beitrag 1371565)
Davon ausgehend, das Selstart genau den Punkt zeigt, an dem man in ein RichEdit einfügt, kann man ohne große Rechnerei auch folgendes machen:

Delphi-Quellcode:
procedure TForm1.addZeile(sUeberschrift, sText: String);
begin
  memoMessage.SelAttributes.Style := [fsBold];
  memoMessage.SelText := sUeberschrift + ' ';
  memoMessage.SelAttributes.Style := [];
  memoMessage.SelText := sText + #13;
end;

Die Lösung finde ich super. Schön kurz und tut was es soll :) danke

himitsu 16. Mai 2017 14:13

AW: Markierung verschiebt sich in jeder Zeile
 
Zitat:

Zitat von TBx (Beitrag 1371565)
Delphi-Quellcode:
procedure TForm1.addZeile(sUeberschrift, sText: String);
begin
  memoMessage.SelAttributes.Style := [fsBold];
  memoMessage.SelText := sUeberschrift + ' ';
  memoMessage.SelAttributes.Style := [];
  memoMessage.SelText := sText + #13;
end;

Ich hätte aber erwartet, dass noch wenigenst zwei SelStart/SelLength dort drin fehlen.

Meinem Versändis nach wird alles aktuell Markierte so durch die sUeberschrift überschreiben
und der sText überschreibt/löscht danach auch nochmal die sUeberschrift.

nahpets 16. Mai 2017 14:20

AW: Markierung verschiebt sich in jeder Zeile
 
Bin mir nicht sicher, aber wenn SelText leer ist, so gilt das gemachte quasi ab Cursorposition.

Also ungefähr so:
Delphi-Quellcode:
procedure TForm1.addZeile(sUeberschrift, sText: String);
begin
  // ab der aktuellen Curosrposition wird alles Fett.
  memoMessage.SelAttributes.Style := [fsBold];
  // sUeberschrift an der Cursorposition einfügen,
  // der Cursor wandert entsprechend weiter.
  memoMessage.SelText := sUeberschrift + ' ';
  // ab der aktuellen Cursorposition, die sich nun hinter
  // dem sUeberschrift folgenden Leerzeichen befindet,
  // Text ohne besondere Formatierung.
  memoMessage.SelAttributes.Style := [];
  // Und nun hinter o. g. Leerzeichen sText einfügen und
  // 'nen Zeilenumbruch dranhängen.
  memoMessage.SelText := sText + #13;
end;
Ist SelText nicht leer, ergibt sich ein vollkommen anderes Verhalten.

himitsu 16. Mai 2017 16:18

AW: Markierung verschiebt sich in jeder Zeile
 
Jupp, WENN SelText vorher leer ist

und beim Zuweisen von sText ist SelText nicht leer, da dort ja noch sUeberschrift selektiert ist.

Uwe Raabe 16. Mai 2017 16:24

AW: Markierung verschiebt sich in jeder Zeile
 
Zitat:

Zitat von himitsu (Beitrag 1371635)
Jupp, WENN SelText vorher leer ist

Die Bedingung lautet ja auch SelLength = 0 und nicht SelText = <leer>...


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:57 Uhr.
Seite 1 von 2  1 2      

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