 |
| |
|
|
 |
Autor |
Nachricht |
 |
| |
| himitsu |
#1| Verfasst am: 28.01.2010, 18:59 Titel: Fehlerhafte CRLF<>CR-Umsetzung im RichEdit (D2009+) |
 |
 |
 |
|
sehr aktives Mitglied Alter: 30 Status: offline Beiträge: 13.895 angemeldet: 11.10.2003 Wohnort: Elbflorenz Delphi 2010 Professional

|
[add] http://qc.embarcadero.com/wc/qcmain.aspx?d=81621 [/add]
Seit D2009 arbeitet SelStart und SelLength falsch.
Das RichEdit arbeitet intern nur mit #13, welches an vielen Stellen ausgeglichen wird, indem man bei Setzen von Text und beim Auslesen dieses gegeneinander austauscht.
.Text und .Lines haben also #13#10 und in .SelText, sowie im Edit-Inneren ist es nur #13.
Durch die Übersetzungen stimmen nun aber die Zeichenindizes absolut nicht mehr.
Heißt, je Zeile verrutscht der Index um eine Stelle
und somit geht ab der 2. Zeile sowas nicht mehr:
| Delphi-Quellcode: | markieren | S := RichEdit1.Text;
RichEdit1.SelStart := Pos(SearchText, S);
RichEdit1.SelLength := Length(SearchText); |
|
Quelle: http://www.delphipraxis.net/topic172657_problem+mit+selstart.html
Was ich mich frage: Wieso ist das noch nicht aufgefallen?
D2009 gibt's ja schon 'ne Weile. |
 an alle schlaflosen Programmierer ... macht ein Upgrade, denn mit neuer Technik passiert sowas nicht > http://xkcd.com/571
www.fnse.de/img.htm
Zuletzt bearbeitet von himitsu am 29.01.2010, 14:33, insgesamt 4-mal bearbeitet. |
 |
|
|
|
| |
| himitsu |
#2| Verfasst am: 28.01.2010, 19:50 Titel: Re: Fehlerhafte CRLF<>CR-Umsetzung im Richedit |
 |
 |
 |
|
sehr aktives Mitglied Alter: 30 Status: offline Beiträge: 13.895 angemeldet: 11.10.2003 Wohnort: Elbflorenz Delphi 2010 Professional

|
Dieses war ein Versuch 'ner Lösung,
leider gibt es noch irgendwo ein Problem, welches ich grad' nicht finde.
| Zitat: | | Im Projekt Project3.exe ist eine Exception der Klasse EOutOfResources mit der Meldung 'Fehler beim Einfügen einer Zeile in RichEdit' aufgetreten. |
Dieses im "interface" vor die Form legen, in welcher ein TRichEdit verwendet wird:
Delphi-Quellcode: | zusammenfalten | markieren | 1 · · · 5 · · · · 10
| Type
TRichEdit = Class(ComCtrls.TRichEdit)
Protected
Function InheritedGetSelText: String;
Function GetSelStart: Integer; Override;
Procedure SetSelStart(Value: Integer); Override;
Function GetSelLength: Integer; Override;
Procedure SetSelLength(Value: Integer); Override;
Function GetSelText: String; Override;
End; |
|
Und das ist die Implementation:
Delphi-Quellcode: | zusammenfalten | markieren | 1 · · · 5 · · · · 10 · · · · 15 · · · · 20 · · · · 25 · · · · 30 · · · · 35 · · · · 40 · · · · 45 · · · · 50 · · · · 55 · · · · 60 · · · · 65 · · · · 70 · · · · 75 · · · · 80 81
| Uses RichEdit;
Function TRichEdit.InheritedGetSelText: String;
Var T: TGetTextEx;
Begin
SetLength(Result, Inherited GetSelLength + 1);
T.cb := Length(Result) * SizeOf(Char);
T.Flags := GT_SELECTION;
T.codepage := 1200;
T.lpDefaultChar := nil;
T.lpUsedDefChar := nil;
SendEMGetTextExMessage(Handle, EM_GETTEXTEX, T, Result);
End;
Function TRichEdit.GetSelStart: Integer;
Var S: String;
i: Integer;
Begin
Result := Inherited GetSelStart;
S := Text;
i := 0;
While i < Result do Begin
If S[i + 1] = #10 Then Inc(Result);
Inc(i);
End;
End;
Procedure TRichEdit.SetSelStart(Value: Integer);
Var S: String;
i: Integer;
Begin
S := Text;
i := 0;
While (i < Value) and (i < Length(S)) do Begin
If S[i + 1] = #13 Then Dec(Value);
Inc(i);
End;
Inherited SetSelStart(Value);
End;
Function TRichEdit.GetSelLength: Integer;
Var S: String;
C: Char;
Begin
Result := Inherited GetSelLength;
S := InheritedGetSelText;
For C in S do
If C = #13 Then Inc(Result);
End;
Procedure TRichEdit.SetSelLength(Value: Integer);
Var S: String;
i, i2: Integer;
Begin
Inherited SetSelLength(Value);
S := Inherited SelText;
i2 := Length(S);
i := 0;
While i < i2 do Begin
If S[i + 1] = #13 Then Begin
Dec(Value);
Dec(i2);
End;
Inc(i);
End;
Inherited SetSelLength(Value);
End;
Function TRichEdit.GetSelText: String;
Var i: Integer;
Begin
Result := InheritedGetSelText;
For i := Length(Result) - 1 downto 0 do
If Result[i + 1] = #13 Then Insert(#10, Result, i + 2);
End; |
|
[edit]
hoffentlich alle Fehler ausgemerzt |
 an alle schlaflosen Programmierer ... macht ein Upgrade, denn mit neuer Technik passiert sowas nicht > http://xkcd.com/571
www.fnse.de/img.htm
Zuletzt bearbeitet von himitsu am 29.01.2010, 10:28, insgesamt 3-mal bearbeitet. |
 |
|
|
|
| |
| himitsu |
#3| Verfasst am: 29.01.2010, 10:26 Titel: Re: Fehlerhafte CRLF<>CR-Umsetzung im RichEdit (D2009+ |
 |
 |
 |
|
sehr aktives Mitglied Alter: 30 Status: offline Beiträge: 13.895 angemeldet: 11.10.2003 Wohnort: Elbflorenz Delphi 2010 Professional

|
Mit viel Glück läuft der obere Code (#2) jetzt.
Wer Aufgrund von Kompatibilitäten zu anderen Codes die Änderungen nicht direkt integrieren will/kann,
der nehme die Variante über den Class Helper. (muß dann allerdings geziehlt z.B. .SelStartX verwenden).
Delphi-Quellcode: | zusammenfalten | markieren | 1 · · · 5 · · · · 10 · · 13
| TRichEditHelper = Class Helper for TRichEdit
Private
Function _GetSelStart: Integer;
Procedure _SetSelStart (Value: Integer);
Function _GetSelLength: Integer;
Procedure _SetSelLength(Value: Integer);
Function _GetSelText: String;
Procedure _SetSelText (Value: String);
Public
Property SelStartX: Integer Read _GetSelStart Write _SetSelStart;
Property SelLengthX: Integer Read _GetSelLength Write _SetSelLength;
Property SelTextX: String Read _GetSelText Write _SetSelText;
End; |
|
Delphi-Quellcode: | zusammenfalten | markieren | 1 · · · 5 · · · · 10 · · · · 15 · · · · 20 · · · · 25 · · · · 30 · · · · 35 · · · · 40 · · · · 45 · · · · 50 · · · · 55 · · · · 60 · · · · 65 · · · · 70 · · · · 75 · 77
| Uses RichEdit;
Function TRichEditHelper._GetSelStart: Integer;
Var S: String;
i: Integer;
Begin
Result := GetSelStart;
S := Text;
i := 0;
While i < Result do Begin
If S[i + 1] = #13 Then Inc(Result);
Inc(i);
End;
End;
Procedure TRichEditHelper._SetSelStart(Value: Integer);
Var S: String;
i: Integer;
Begin
S := Text;
i := 0;
While (i < Value) and (i < Length(S)) do Begin
If S[i + 1] = #10 Then Dec(Value);
Inc(i);
End;
SetSelStart(Value);
End;
Function TRichEditHelper._GetSelLength: Integer;
Var S: String;
C: Char;
Begin
Result := GetSelLength;
S := GetSelText;
For C in S do
If C = #13 Then Inc(Result);
End;
Procedure TRichEditHelper._SetSelLength(Value: Integer);
Var S: String;
i, i2: Integer;
Begin
SetSelLength(Value);
S := SelText;
i2 := Length(S);
i := 0;
While i < i2 do Begin
If S[i + 1] = #13 Then Begin
Dec(Value);
Dec(i2);
End;
Inc(i);
End;
SetSelLength(Value);
End;
Function TRichEditHelper._GetSelText: String;
Var i: Integer;
Begin
Result := GetSelText;
For i := Length(Result) - 1 downto 0 do
If Result[i + 1] = #13 Then Insert(#10, Result, i + 2);
End;
Procedure TRichEditHelper._SetSelText(Value: String);
Var i: Integer;
Begin
For i := Length(Value) - 1 downto 0 do
If Value[i + 1] = #10 Then Delete(Value, i + 1, 1);
SetSelText(Value);
End; |
|
Es wäre mal schön, wenn noch jemand die Codes testen kann.
Ja, es ist nicht unbedingt sehr optimal, wenn es sehr schnell gehn soll, aber das RichEdit war eh noch nie das Schnellste ... vielleicht fällt es ja nicht auf.
Mal sehn, wenn es läuft, dann gibt es eventuell noch ein/zwei Stellen, wo sich etwas optimieren liese.
Diese Codes sind natürlich nur bei einem Unicode-RichEdit ab Delphi 2009 nötig (in ANSI ging ja noch richtig). |
 an alle schlaflosen Programmierer ... macht ein Upgrade, denn mit neuer Technik passiert sowas nicht > http://xkcd.com/571
www.fnse.de/img.htm
Zuletzt bearbeitet von himitsu am 29.01.2010, 10:26, insgesamt 1-mal bearbeitet. |
 |
|
|
|
| |
| Alfi001 |
#4| Verfasst am: 29.01.2010, 10:54 Titel: Re: Fehlerhafte CRLF<>CR-Umsetzung im RichEdit (D2009+ |
 |
 |
 |
|
"Rüsselmops" ;-) Alter: 44 Status: offline Beiträge: 592 angemeldet: 21.03.2005 Wohnort: Wuppertal RAD-Studio 2007 Professional

|
Vielleicht sollte Emba das "class helper for Txxx" in "bug fixer for Txxx" umbenennen... |
 Des Kaisers neue Kleider neues Blog - emperortools.de
Zuletzt bearbeitet von Alfi001 am 29.01.2010, 10:55, insgesamt 2-mal bearbeitet. |
 |
|
|
|
| |
| Assertor |
#5| Verfasst am: 29.01.2010, 12:07 Titel: Re: Fehlerhafte CRLF<>CR-Umsetzung im RichEdit (D2009+ |
 |
 |
 |
|
aktives Mitglied Alter: 31 Beiträge: 1.184 angemeldet: 04.02.2006 Wohnort: Hamburg RAD-Studio 2010 Arc

|
Hallo himi,
kannst Du mal prüfen, ob das in Zusammenhang mit dem QC Report #73849 steht?
http://qc.embarcadero.com/wc/qcmain.aspx?d=73849
Falls nicht, machst Du einen QC Report dafür auf?
Gruß,
Assertor |
 Assertor Delphi Blog (englisch)
Embarcadero Technology Partner
Indy Mercury & Core Team // Indy OpenSSL Maintainer |
 |
|
|
|
| |
| himitsu |
#6| Verfasst am: 29.01.2010, 12:21 Titel: Re: Fehlerhafte CRLF<>CR-Umsetzung im RichEdit (D2009+ |
 |
 |
 |
|
sehr aktives Mitglied Alter: 30 Status: offline Beiträge: 13.895 angemeldet: 11.10.2003 Wohnort: Elbflorenz Delphi 2010 Professional

|
Puhhhhhh, bin mir nicht ganz sicher, ob es den selben Ursprung hat.
Die Fehler aus Beitrag #2 ist durch eine fehlerhafte Implementation meinerseids entstanden.
> An 'ner Stelle INC und DEC vertauscht, womit die Indize womöglich außerhalb eines gültigen Bereichs rutschten.
[add] Man sehn ob ich ein halbwegs verständliches Englisch zusammenbekomm. |
 an alle schlaflosen Programmierer ... macht ein Upgrade, denn mit neuer Technik passiert sowas nicht > http://xkcd.com/571
www.fnse.de/img.htm
Zuletzt bearbeitet von himitsu am 29.01.2010, 12:28, insgesamt 1-mal bearbeitet. |
 |
|
|
|
| |
| himitsu |
#7| Verfasst am: 29.01.2010, 13:11 Titel: Re: Fehlerhafte CRLF<>CR-Umsetzung im RichEdit (D2009+ |
 |
 |
 |
|
sehr aktives Mitglied Alter: 30 Status: offline Beiträge: 13.895 angemeldet: 11.10.2003 Wohnort: Elbflorenz Delphi 2010 Professional

|
Toll, wenn man dort zu lange schreibt und zwischendurch wieder ausgeloggt wird, dann ist alles Geschriebene weg.
Selbst wenn man sich in der, beim Sendeversuch eingeblendeten Seite, anmeldet.
http://qc.embarcadero.com/wc/qcmain.aspx?d=81621
Ich hoff das ist soweit OK. |
 an alle schlaflosen Programmierer ... macht ein Upgrade, denn mit neuer Technik passiert sowas nicht > http://xkcd.com/571
www.fnse.de/img.htm
Zuletzt bearbeitet von himitsu am 29.01.2010, 13:16, insgesamt 1-mal bearbeitet. |
 |
|
|
|
| |
| Assertor |
#8| Verfasst am: 29.01.2010, 13:16 Titel: Re: Fehlerhafte CRLF<>CR-Umsetzung im RichEdit (D2009+ |
 |
 |
 |
|
aktives Mitglied Alter: 31 Beiträge: 1.184 angemeldet: 04.02.2006 Wohnort: Hamburg RAD-Studio 2010 Arc

|
Hi,
| himitsu hat folgendes geschrieben: | Toll, wenn man zu lange schreibt und zwischendurch wieder ausgeloggt wird, dann ist alles geschriebene weg.
Selbst wenn man sich in der, beim Sendeversuch eingeblendeten Seite, anmeldet.
|
Nimm doch den QC Client von Delphi (Menü Tools > Quality Central) oder noch besser imo QC Plus von Jeremy:
http://www.jed-software.com/qc_download.htm
| himitsu hat folgendes geschrieben: | http://qc.embarcadero.com/wc/qcmain.aspx?d=81621
Ich hoff das ist soweit OK.  |
Sieht gut aus Soweit ich es eben in Erfahrung bringen konnte betrifft das alle Version ab D2009, da hier auf die neuere RichEdit dll gewechselt wurde.
Gruß,
Assertor |
 Assertor Delphi Blog (englisch)
Embarcadero Technology Partner
Indy Mercury & Core Team // Indy OpenSSL Maintainer |
 |
|
|
|
| |
| himitsu |
#9| Verfasst am: 29.01.2010, 13:23 Titel: Re: Fehlerhafte CRLF<>CR-Umsetzung im RichEdit (D2009+ |
 |
 |
 |
|
sehr aktives Mitglied Alter: 30 Status: offline Beiträge: 13.895 angemeldet: 11.10.2003 Wohnort: Elbflorenz Delphi 2010 Professional

|
| Assertor hat folgendes geschrieben: | | Soweit ich es eben in Erfahrung bringen konnte betrifft das alle Version ab D2009, da hier auf die neuere RichEdit dll gewechselt wurde. |
Jupp, soweit ich mitbekommen und getestet hab, tritt dieses seit D2009 auf.
| Assertor hat folgendes geschrieben: | | Nimm doch ... |
jetzt isses zu spät
| Assertor hat folgendes geschrieben: | Sieht gut aus  |
|
 an alle schlaflosen Programmierer ... macht ein Upgrade, denn mit neuer Technik passiert sowas nicht > http://xkcd.com/571
www.fnse.de/img.htm |
 |
|
|
|
| |
| Hazebukelar |
#10| Verfasst am: 29.01.2010, 16:11 Titel: Re: Fehlerhafte CRLF<>CR-Umsetzung im RichEdit (D2009+ |
 |
 |
 |
|
Mitglied Alter: 45 Status: offline Beiträge: 18 angemeldet: 28.09.2009 Wohnort: Nähe Bodensee

|
Danke - ich habe Deinen Code#2 mal geprüft.
Läuft prima wenn man im Memo von oben nach unten sucht.
Bei Suchrichtung von unten nach oben wird der erste Suchbegriff gefunden und
auch richtig markiert, aber nicht nach dem nächsten SearchString weitergesucht...
Nochmals ich.
Habe noch etwas weiter getestet und noch etwas entdeckt (siehe Srceenshots):
Die Vorkommen von "die" welche im Text stehen werden sauber gefunden,
am Zeilenanfang gibt es noch ein Problem.
Hat vermutlich auch noch was mit dem Zeilenvorschub zu tun.
Ich schau's mir auch noch einmal an. |
| [ An diesen Beitrag wurden eine oder mehrere Dateien angehängt. Zum Herunterladen bitte anmelden. ] |
Zuletzt bearbeitet von Hazebukelar am 29.01.2010, 17:31, insgesamt 1-mal bearbeitet. |
 |
|
|
|
| |
| himitsu |
#11| Verfasst am: 30.01.2010, 22:38 Titel: Re: Fehlerhafte CRLF<>CR-Umsetzung im RichEdit (D2009+ |
 |
 |
 |
|
sehr aktives Mitglied Alter: 30 Status: offline Beiträge: 13.895 angemeldet: 11.10.2003 Wohnort: Elbflorenz Delphi 2010 Professional

|
Ich versuch grad über ein Testprojekt einiges auszuprobieren.
SelStart schein ich erstmal hinbekommen zu haben.
Wenn man versucht SelStart in das CRLF, also zwischen #13 und das nicht vorhandene #10 zu setzen, dann wird dieses dahinterverschoben.
Ich denk mir, das ist so die beste Lösung.
Mit SelLength und SelText kämpfe ich noch etwas.
Auch gibt es ein anderes Problem, aber ich hab den Grund noch nicht gefunden.
Wenn über die DFM ein Text definert ist oder einer zugewiesen wird, bevor die Komponente (das Handle) existiert, dann verschwindet dieser Text auf ominöse Weise.
Dieses geht im OnCreate der Form,
aber dieses nicht.
[add]
Ach ja, am Anfang wurde mein Eintrag im EDN als Duplikat angesehn, aber inzwischen hab ich 'nen ganz eigenen Privatfehler.
[edit]
Anhang entfernt ... Neuer siehe #16 |
 an alle schlaflosen Programmierer ... macht ein Upgrade, denn mit neuer Technik passiert sowas nicht > http://xkcd.com/571
www.fnse.de/img.htm
Zuletzt bearbeitet von himitsu am 31.01.2010, 12:43, insgesamt 3-mal bearbeitet. |
 |
|
|
|
| |
| toms |
#12| Verfasst am: 31.01.2010, 09:10 Titel: Re: Fehlerhafte CRLF<>CR-Umsetzung im RichEdit (D2009+ |
 |
 |
 |
|
CodeLib-Manager Alter: 31 Status: offline Beiträge: 4.451 angemeldet: 10.06.2002 Delphi 6 Professional

|
RichEdit auf eine Form gesetzt, dann
der Text verschwindet nicht...oder was hast du genau gemacht, dass der Text verschwindet? |
|
 |
|
|
|
| |
| himitsu |
#13| Verfasst am: 31.01.2010, 09:28 Titel: Re: Fehlerhafte CRLF<>CR-Umsetzung im RichEdit (D2009+ |
 |
 |
 |
|
sehr aktives Mitglied Alter: 30 Status: offline Beiträge: 13.895 angemeldet: 11.10.2003 Wohnort: Elbflorenz Delphi 2010 Professional

|
| toms hat folgendes geschrieben: | | der Text verschwindet nicht...oder was hast du genau gemacht, dass der Text verschwindet? |
ist auch noch eingebuden.
Dann greif ich im RE.OnChange, wärend des Form.OnCreate, lesend auf RE.SelStart zu,
dabei wird das RE-Control erstellt und der Text ist weg ...
PS: Du hast es aber auch mit D2009+ probiert?
[add]
hatte grade im gesamten Testprojekt alles, bis auf RE.Text:='...' auskommentiert und den selben Behler bekommen, selbst alle anderen Komponenten hab ich entfernt, aber erst nachdem ich da RichEdit gegen ein Neues getauscht hab, ging das Zuweisen wieder ... jetzt muß ich nur noch den Unterschied finden.
[edit]
setze mal .HideSelection auf False?
[edit2]
nee, liegt doch nicht nur daran
[edit3]
Es scheint wohl irgendeine Kombination aus ScrollBars, WordWrap und HideSelection zu sein?
HideSelection = False
ScrollBars = ssBoth
WordWrap = False
Lines = leer |
 an alle schlaflosen Programmierer ... macht ein Upgrade, denn mit neuer Technik passiert sowas nicht > http://xkcd.com/571
www.fnse.de/img.htm
Zuletzt bearbeitet von himitsu am 31.01.2010, 10:00, insgesamt 4-mal bearbeitet. |
 |
|
|
|
| |
| toms |
#14| Verfasst am: 31.01.2010, 10:07 Titel: Re: Fehlerhafte CRLF<>CR-Umsetzung im RichEdit (D2009+ |
 |
 |
 |
|
CodeLib-Manager Alter: 31 Status: offline Beiträge: 4.451 angemeldet: 10.06.2002 Delphi 6 Professional

|
| Zitat: | HideSelection = False
ScrollBars = ssBoth
WordWrap = False
Lines = leer |
Habe ich so gesetzt. Das Verhalten, dass der Text verschwindet, kann ich nun bei deinem Beispiel reproduzieren (D2009) |
|
 |
|
|
|
| |
| himitsu |
#15| Verfasst am: 31.01.2010, 10:14 Titel: Re: Fehlerhafte CRLF<>CR-Umsetzung im RichEdit (D2009+ |
 |
 |
 |
|
sehr aktives Mitglied Alter: 30 Status: offline Beiträge: 13.895 angemeldet: 11.10.2003 Wohnort: Elbflorenz Delphi 2010 Professional

|
| toms hat folgendes geschrieben: | | Habe ich so gesetzt. Das Verhalten, dass der Text verschwindet, kann ich nun bei deinem Beispiel reproduzieren (D2009) |
Hab es eben sowohl in D2009, D2010 und sogar in D7
und je in einem neuem/leeren Projekt reproduzieren können.
Richedit auf Form, im OI dieses eingestellt
| Zitat: | HideSelection = False
ScrollBars = ssBoth
WordWrap = False
Lines = leer |
und in Form.OnCreate noch ein
|
 an alle schlaflosen Programmierer ... macht ein Upgrade, denn mit neuer Technik passiert sowas nicht > http://xkcd.com/571
www.fnse.de/img.htm |
 |
|
|
|
 |
|
 |
| |
|
|
| |
 
|
|
| |
|
Du darfst keine Beiträge in dieses Forum schreiben. Du darfst auf Beiträge in diesem Forum nicht antworten. Du darfst Deine Beiträge in diesem Forum nicht bearbeiten. Du darfst Deine Beiträge in diesem Forum nicht löschen. Du darfst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum nicht posten. Du kannst Dateien in diesem Forum nicht herunterladen.
|
|
 |