Autor |
Beitrag |
Hochhaus
      
Beiträge: 662
Erhaltene Danke: 8
Windows 7
Delphi XE2
|
Verfasst: Di 29.05.12 17:57
Hallo allerseits !
erstmals ein herzliches Dankeschön für all die Hilfe, die ich hier schon erhalten habe !
Ich habe mir inzwischen die Trial-Version von Delphi XE2 geholt. Als erstes wollte ich einen Text-Editor, der unter Delphi 6 problemlos lief, unter XE2 kompilieren. Fazit: Es gibt einen Haufen Probleme. Wenn ich eine neue, leere Datei öffne, kommen chinesische Schriftzeichen daher. Die Suchen & Ersetzen-Funktion läuft nicht mehr. Der Font bei bestehenden Dateien ist schlecht usw. usw. In der Beilage poste ich die alte Version (FEDOLD.ZIP) und die abgeänderte Version unter XE2 (FEDNEW.ZIP)
Vielen Dank im Voraus für die Hilfe !
Hochhaus Moderiert von Narses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Di 29.05.2012 um 22:11
Einloggen, um Attachments anzusehen!
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 29.05.12 18:29
// EDIT:
Ich habe die Ursache gefunden:
Du hast PlainText im Objektinspektor auf True gesetzt gehabt. Das mag das RichEdit nicht, wenn der Text leer ist, frag mich nicht warum.
Workarounds:
Setze den Text in FormCreate oder einem Konstruktor für dein Kindfenster auf einen leeren String. (Theoretisch kannst du auch in Lines deines RichEdit1 eine Leerzeile einfügen, aber wenn du dir mal löschst, ginge es nicht mehr.)
Oder setze PlainText im Objektinspektor auf False und erst zur Laufzeit wieder auf True, falls gewünscht. Das Plaintext auf True könnte aber auch dein Schriftartproblem erklären.
Suchen und ersetzen funktioniert bei mir problemlos.
// EDIT2:
Ich weiß jetzt warum das passiert... das liegt letzten Endes an HideScrollBars.
Mehr dazu später... das wird wohl ein Fall für die QC...
Für diesen Beitrag haben gedankt: Hochhaus
|
|
Hochhaus 
      
Beiträge: 662
Erhaltene Danke: 8
Windows 7
Delphi XE2
|
Verfasst: Di 29.05.12 19:02
jaenicke hat folgendes geschrieben : | // EDIT:
Ich weiß jetzt warum das passiert... das liegt letzten Endes an HideScrollBars.
Mehr dazu später... das wird wohl ein Fall für die QC... |
Danke !!
Dieses Problem ist nun gelöst ! Aber: Das Suchen und Ersetzen führt bei mir zu einem Absturz des Programmes - im besten Fall findet er die falsche Stelle !
Gruss,
Hochhaus
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 29.05.12 21:56
Ich habe den Fehler nun ausformuliert und gemeldet:
qc.embarcadero.com/wc/qcmain.aspx?d=105991
Die Fehler beim Suchen und Ersetzen kann ich aber weder mit deiner Exe noch mit einer von mir erstellten reproduzieren. 
|
|
Hochhaus 
      
Beiträge: 662
Erhaltene Danke: 8
Windows 7
Delphi XE2
|
Verfasst: Mi 30.05.12 06:52
|
|
bummi
      
Beiträge: 1248
Erhaltene Danke: 187
XP - Server 2008R2
D2 - Delphi XE
|
Verfasst: Mi 30.05.12 07:56
Warum jonglierst Du mit Pointern herum, seit Delphi 2009 werden UnicodeStrings verwendet.
Mit
Zitat: |
GetMem(Puffer, PGroesse); // wenn dann GetMem(Puffer, PGroesse*SizeOf(Char));
RichEdit1.GetTextBuf(Puffer, PGroesse);
|
allokierst Du die Hälfte des benötigten Speichers ...
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| var posi:Integer; begin posi := Pos(FindText,Richedit1.Text); if posi>0 then begin RichEdit1.selstart := posi - 1; Richedit1.SelLength := Length(FindText); Richedit1.SetFocus; end; end; |
_________________ Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
Für diesen Beitrag haben gedankt: Hochhaus
|
|
Hochhaus 
      
Beiträge: 662
Erhaltene Danke: 8
Windows 7
Delphi XE2
|
Verfasst: Mi 30.05.12 11:51
bummi hat folgendes geschrieben : | Warum jonglierst Du mit Pointern herum, seit Delphi 2009 werden UnicodeStrings verwendet.
Mit
Zitat: |
GetMem(Puffer, PGroesse); // wenn dann GetMem(Puffer, PGroesse*SizeOf(Char));
RichEdit1.GetTextBuf(Puffer, PGroesse);
|
allokierst Du die Hälfte des benötigten Speichers ...
|
Ok. Ich habe Deine Suchroutine für mein Programm angepasst. Leider wird die falsche Stelle in meinen Dateien markiert - nicht dort, wo der Suchbegriff tatsächlich sitzt. Pro Zeile wird die markierte Stelle um eins nach rechts verschoben ...
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| Procedure TFrmChild.FindX(Sender: TObject);
Var Posi: LongInt; Begin With Sender As TFindDialog Do Begin Posi := Pos(FindText, Richedit1.Text); If Posi > 0 then Begin RichEdit1.Selstart := Posi - 1; Richedit1.SelLength := Length(FindText); Richedit1.SetFocus; End; End; End; |
Mit bestem Dank für die weitere Hilfe.
Hochhaus
Wie ich inzwischen herausgefunden habe,funktioniert die Suche in der ersten Zeile des Editors. In der zweiten Zeile ist die markierte Fundstelle ein Zeichen nach rechts verschoben. In der dritten Zeile ist die markierte Fundstelle um zwei Zeichen nach rechts verschoben usw. Ist das nicht komisch ?
|
|
bummi
      
Beiträge: 1248
Erhaltene Danke: 187
XP - Server 2008R2
D2 - Delphi XE
|
Verfasst: Mi 30.05.12 23:33
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| var posi:Integer; begin posi := pos(Edit1.Text,StringReplace(Richedit1.Text,#10,'',[rfReplaceAll])); Richedit1.SelStart := posi - 1; Richedit1.SelLength := Length(Edit1.Text); Richedit1.SetFocus end; |
oder besser #13#10 durch #13 ersetzen ...
_________________ Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
|
|
Hochhaus 
      
Beiträge: 662
Erhaltene Danke: 8
Windows 7
Delphi XE2
|
Verfasst: Do 31.05.12 12:44
bummi hat folgendes geschrieben : |
oder besser #13#10 durch #13 ersetzen ... |
Tatsächlich: Jetzt funktioniert das Auffinden eines ersten Vorkommens eines Strings mit der Suchfunktion. Wenn ich aber denselben String weitersuchen will, geht es nicht. (Manchmal sieht man den Wald vor lauter Bäumen nicht)
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| Procedure TFrmChild.FindX(Sender: TObject);
Var Posi: LongInt; Begin With Sender As TFindDialog Do Begin Posi := Pos(FindText,StringReplace(Richedit1.Text,#10,'',[rfReplaceAll])); If Posi > 0 Then Begin RichEdit1.Selstart := Posi - 1; Richedit1.SelLength := Length(FindText); Richedit1.SetFocus; End Else MessageBeep(0); End; End; |
Gruss,
Hochhaus
Achja, ist ja logisch ! Die Funktion Pos liefert nur das erste Vorkommen des SubStrings ! Wie komme ich an das zweite, dritte etc. Vorkommen des SubStrings heran, ohne ihn - den Originalstring - zu ändern ?
Einloggen, um Attachments anzusehen!
|
|
Hochhaus 
      
Beiträge: 662
Erhaltene Danke: 8
Windows 7
Delphi XE2
|
Verfasst: Fr 01.06.12 18:17
Hochhaus hat folgendes geschrieben : |
Achja, ist ja logisch ! Die Funktion Pos liefert nur das erste Vorkommen des SubStrings ! Wie komme ich an das zweite, dritte etc. Vorkommen des SubStrings heran, ohne ihn - den Originalstring - zu ändern ? |
Die Delphi-Hilfe liefert mir leider keine Antwort auf dieses Problem.
Hochhaus
|
|
Blawen
      
Beiträge: 616
Erhaltene Danke: 33
Win XP, Vista, 7
Delphi 5 Prof., BDS 2006 Prof. RAD Studio XE
|
Verfasst: Fr 01.06.12 19:28
Versuch es mal mit PosEx.
_________________ Es kompilert, wir können ausliefern.
Und es kompiliert wieder - das Update ist fertig - bitte 100 Euro
Für diesen Beitrag haben gedankt: Hochhaus
|
|
Hochhaus 
      
Beiträge: 662
Erhaltene Danke: 8
Windows 7
Delphi XE2
|
Verfasst: Sa 02.06.12 08:28
Blawen hat folgendes geschrieben : | Versuch es mal mit PosEx. |
Danke ! Dies funktioniert !
Gruss,
Hochhaus
|
|
Hochhaus 
      
Beiträge: 662
Erhaltene Danke: 8
Windows 7
Delphi XE2
|
Verfasst: Mo 04.06.12 13:02
bummi hat folgendes geschrieben : | Warum jonglierst Du mit Pointern herum, seit Delphi 2009 werden UnicodeStrings verwendet. |
Weil es mit Pointern schneller geht. (Grosse Dateien)
Hochhaus
Eine letzte Frage zu diesem Thema: Wie kann ich die Standardfunktion
Delphi-Quelltext 1:
| RichEdit1.Lines.LoadFromFile(S); |
so ändern, dass alle Characters des Typs Char(10) übersprungen werden beim Einlesen ? Dies würde mir einen Haufen Probleme ersparen. Das Ändern mit StringReplace kostet einen Haufen Zeit !
Hochhaus
|
|