Entwickler-Ecke
Programmierwerkzeuge - Probleme mit der Projektportierung von Delphi 6 zu XE2 !
Hochhaus - Di 29.05.12 17:57
Titel: Probleme mit der Projektportierung von Delphi 6 zu XE2 !
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
jaenicke - 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...
Hochhaus - 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 - Di 29.05.12 21:56
Ich habe den Fehler nun ausformuliert und gemeldet:
http://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. :nixweiss:
Hochhaus - Mi 30.05.12 06:52
Wo sitzt da wohl der Wurm drin ?
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27:
| Procedure TFrmChild.FindX(Sender: TObject);
Var Ft : Pointer; PGroesse : Integer; P : PChar; Puffer : PChar;
Begin With Sender As TFindDialog Do Begin GetMem(Ft, Length(FindText) + 1); StrPCopy(Ft, FindText); PGroesse := RichEdit1.GetTextLen + 1; GetMem(Puffer, PGroesse); RichEdit1.GetTextBuf(Puffer, PGroesse); P := Puffer + RichEdit1.SelStart + RichEdit1.SelLength; P := StrPos(P, Ft); If P = Nil Then MessageBeep(0) Else Begin RichEdit1.SelStart := P - Puffer; RichEdit1.SelLength := Length(FindText); End; FreeMem(Ft, Length(FindText) + 1); FreeMem(Puffer, PGroesse); End;
End; |
Gruss, Hochhaus
P.S. Weiss jemand besseren, korrekten Code ?
bummi - 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; |
Hochhaus - 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 - 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 ...
Hochhaus - 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 ?
Hochhaus - 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 - Fr 01.06.12 19:28
Versuch es mal mit PosEx.
Hochhaus - Sa 02.06.12 08:28
Blawen hat folgendes geschrieben : |
Versuch es mal mit PosEx. |
Danke ! Dies funktioniert !
Gruss,
Hochhaus
Hochhaus - 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
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!