AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Markierung verschiebt sich in jeder Zeile

Markierung verschiebt sich in jeder Zeile

Ein Thema von Getox · begonnen am 16. Mai 2017 · letzter Beitrag vom 17. Mai 2017
Antwort Antwort
Seite 1 von 2  1 2   
Getox

Registriert seit: 28. Dez 2012
155 Beiträge
 
Delphi XE3 Professional
 
#1

Markierung verschiebt sich in jeder Zeile

  Alt 16. Mai 2017, 08:54
Delphi-Version: XE3
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?
Miniaturansicht angehängter Grafiken
verschoben.jpg  
Ist ein Nilpferd ein Pferd, das nicht vorhanden ist?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.017 Beiträge
 
Delphi 12 Athens
 
#2

AW: Markierung verschiebt sich in jeder Zeile

  Alt 16. Mai 2017, 08:57
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (16. Mai 2017 um 08:59 Uhr)
  Mit Zitat antworten Zitat
Getox

Registriert seit: 28. Dez 2012
155 Beiträge
 
Delphi XE3 Professional
 
#3

AW: Markierung verschiebt sich in jeder Zeile

  Alt 16. Mai 2017, 09:08
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
Ist ein Nilpferd ein Pferd, das nicht vorhanden ist?
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.534 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Markierung verschiebt sich in jeder Zeile

  Alt 16. Mai 2017, 09:13
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;
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
TBx
(Administrator)

Registriert seit: 13. Jul 2005
Ort: Stadthagen
1.874 Beiträge
 
Delphi 12 Athens
 
#5

AW: Markierung verschiebt sich in jeder Zeile

  Alt 16. Mai 2017, 09:55
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;
Thomas Breitkreuz
Gruß Thomas
- Admin DelphiPRAXIS
- Admin Delphi-Treff
- Embarcadero MVP
  Mit Zitat antworten Zitat
Getox

Registriert seit: 28. Dez 2012
155 Beiträge
 
Delphi XE3 Professional
 
#6

AW: Markierung verschiebt sich in jeder Zeile

  Alt 16. Mai 2017, 14:20
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
Ist ein Nilpferd ein Pferd, das nicht vorhanden ist?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.017 Beiträge
 
Delphi 12 Athens
 
#7

AW: Markierung verschiebt sich in jeder Zeile

  Alt 16. Mai 2017, 15:13
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#8

AW: Markierung verschiebt sich in jeder Zeile

  Alt 16. Mai 2017, 15:20
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.017 Beiträge
 
Delphi 12 Athens
 
#9

AW: Markierung verschiebt sich in jeder Zeile

  Alt 16. Mai 2017, 17:18
Jupp, WENN SelText vorher leer ist

und beim Zuweisen von sText ist SelText nicht leer, da dort ja noch sUeberschrift selektiert ist.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
10.934 Beiträge
 
Delphi 12 Athens
 
#10

AW: Markierung verschiebt sich in jeder Zeile

  Alt 16. Mai 2017, 17:24
Jupp, WENN SelText vorher leer ist
Die Bedingung lautet ja auch SelLength = 0 und nicht SelText = <leer>...
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 02:27 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