AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein TRichedit auf Printer zeichnen XE(4) Problem zu D6
Thema durchsuchen
Ansicht
Themen-Optionen

TRichedit auf Printer zeichnen XE(4) Problem zu D6

Ein Thema von stalkingwolf · begonnen am 23. Nov 2016 · letzter Beitrag vom 23. Nov 2016
Antwort Antwort
stalkingwolf

Registriert seit: 6. Mai 2011
518 Beiträge
 
#1

TRichedit auf Printer zeichnen XE(4) Problem zu D6

  Alt 23. Nov 2016, 15:30
Hallo,

ich habe ein Projekt von D6 auf XE4 konvertiert und dieses druckt RTF Dateien.

Ich habe nun das Problem das mir
Code:
LastChar := SendMessage(NewRichEdit.Handle, EM_FORMATRANGE, 0, Longint(@Range));
showmessagefmt('<%d><%d>',[LastChar,NewRichEdit.GetTextLen]);
Erg XE4 : <172><178>
Erg D6 : <180><178>
Unter XE4 Zeichen unterschlägt. Bei einem Test mit einer RTF Datei gibt mir die Funktion unter D6 180 und unter XE4 172 Zeichen zurück.
Das Problem ist, dass drumherum eine Schleife läuft bis alle Zeichen gedruckt sind und dadurch eine Endlosschleife entsteht, weil das Richedit wirklich 178 Zeichen ist.

Dabei ist es auch egal ob TFormatRange chrg.cpMax auf -1 oder auf NewRichEdit.GetTextLen sitzt.

Nachtrag:
Interessant ist, füge ich 3 Leerzeilen hinzu, steigt die Länge um 6, aber der Befehl oben nur um 3.
D.h ich habe nun 1 Zeile mit einem Zeichen.
Resultat 1 -1
Füge ich noch eine Zeile dazu mit einem Zeichen.
dann ist es 3-4. D.h Return wird als 2 gezählt mit GetTextLen aber nur mit einem mit SendMessage()

Nachtrag 2 Lösung
Sorry

Ich habe das Problem gefunden .getTextLen von TRichedit zählt in XE wohl wirklich 2 Zeichen für ein Return.
SendMessage(NewRichEdit.Handle, EM_GETTEXTLENGTHEX, WParam(@TextLenEx), 0); gibt die korrekte Anzahl der Zeichen zurück.

Geändert von stalkingwolf (23. Nov 2016 um 16:15 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

AW: TRichedit auf Printer zeichnen XE(4) Problem zu D6

  Alt 23. Nov 2016, 16:19
Delphi ist irgendwann dazwischen von RichEdit v1 auf RichEdit v3 umgestiegen, also bei dem gekapselten Windows-Control.

Erstmal hat sich da an den APIs bissl was geändert und intern arbeitet das RichEdit auch teilweise etwas Anderes.
In V1 werden #13#10 als Zeilenumbruch verwendet und nun halt nur noch #13 , aber Delphi pfuscht da teilweise (die haben das nie komplett umgesetzt, obwohl ich das schon vor Ewigkeiten gemeldet hatte) an den Strings rum und ersetzt beim Auslesen die #13 durch #13#10.

GetTextLen gibt also die Länge mit den "verpfuschten" #13#10 aus, aber die direkten API-Zugriffe, sowie SelStart und SelLength (das haben die Trottel vergessen), geben die Positionen/Längen/Texte mit #13 aus.

v4.1 welche oftmals auch v5 genannt wird, ist es auch schon wieder viele Jahre alt, aber da ist Delphi zum Glück sehr langsam, mit dem Upgrade.
https://msdn.microsoft.com/en-us/lib.../bb787873.aspx
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (23. Nov 2016 um 16:26 Uhr)
  Mit Zitat antworten Zitat
stalkingwolf

Registriert seit: 6. Mai 2011
518 Beiträge
 
#3

AW: TRichedit auf Printer zeichnen XE(4) Problem zu D6

  Alt 23. Nov 2016, 16:34
d.h das ganze war bekannt. Super.

Ich hoffe ich hab nicht noch mehr Tretminen im Quellcode.
Der Code ist die GMPrintsuite welche wir nutzen. Da wird relativ viel mit RTF handtiert. IMO teilweise viel zu kompliziert.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

AW: TRichedit auf Printer zeichnen XE(4) Problem zu D6

  Alt 23. Nov 2016, 16:37
"Bekannt" ja, auch wenn Codegear/Embarcadero das nie igendwo offiziell erwähnt hat.

Ich war damals drüber gestoplert, als irgendjemand Text färben wollte ... mit Pos in RichEdit.Text was gesucht und sich dann gewundert, warum SelStart/SelLength das verfehlen.
Nach jedem Zeilenwechsel um jeweils nochmal ein Zeichen mehr nach rechts, wie mir dann auffiel.
* einfache Lösung: raus mit dem Dreck, also dem Rumpfuschen am Zeilenwechsel
* schrierigere Lösung: die Indize umrechnen (und das hatte ich sogar schon fertig gebaut und denen gegeben)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (23. Nov 2016 um 16:42 Uhr)
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: TRichedit auf Printer zeichnen XE(4) Problem zu D6

  Alt 23. Nov 2016, 17:11
Welche Lösung gibt es denn dann wenn das nicht gefixt wird? Ich wollte auch demnächst das TRichEdit benutzen um diverse Texte färben zu können. Auf Fremdkomponenten wollte ich nicht unbedingt zurückgreifen.

Ich hatte mir vor Monaten/Jahren mal einen kleinen Texteditor geschrieben in dem ich so etwas mit den Standard Controls getestet hatte. Da ist mir allerdings nichts aufgefallen. Vielleicht habe ich da aber nur die genannten Funktionen genutzt.

Wobei: Ich hatte auch Text markiert und dann mit einer Farbpalette eine neue Farbe zugewiesen. Das hat meines Wissens nach funktioniert.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

AW: TRichedit auf Printer zeichnen XE(4) Problem zu D6

  Alt 23. Nov 2016, 20:40
Selber per WinAPI auf das Richedit zugreifen und nicht über die Property/Methoden des TRichEdit

oder selber umrechnen.
Im Prinzip mußt du nur die Zeilen/Zeilenumbrüche vor der Position im Richedit zählen und dann diese Zahl nochmal auf die Position draufrechnen.


ZähleZeilenmbrüche(Start bis SelStart-1) = Offset für SelStart
ZähleZeilenmbrüche(SelStart bis SelStart+SelLength) = Offset für SelLength
Das ist für Position im im RichEdit auf Position Delphi-Text umrechnen.

Nur Andersrum ist es schwerer, also für Position Delphi-Text auf Position im im RichEdit umrechnen.
Da man dort vorausschauen rechnen muß. Wenn der berechnete Offset weitere Zeilenumbrüche trifft, muß man die ebenfalls wieder mit einberechnen usw.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort


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 13:48 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