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 user profile iconNarses: 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

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
// 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

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
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:


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{* FindX *}


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

user profile iconbummi hat folgendes geschrieben Zum zitierten Posting springen:
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{* FindX *}


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

user profile iconbummi hat folgendes geschrieben Zum zitierten Posting springen:


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{* FindX *}


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

user profile iconHochhaus hat folgendes geschrieben Zum zitierten Posting springen:



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

user profile iconBlawen hat folgendes geschrieben Zum zitierten Posting springen:
Versuch es mal mit PosEx.


Danke ! Dies funktioniert !

Gruss,


Hochhaus


Hochhaus - Mo 04.06.12 13:02

user profile iconbummi hat folgendes geschrieben Zum zitierten Posting springen:
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