Autor |
Beitrag |
Hochhaus
      
Beiträge: 662
Erhaltene Danke: 8
Windows 7
Delphi XE2
|
Verfasst: So 11.11.12 18:01
Hallo allerseits !
im folgenden Code finde ich den Fehler nicht. Ich bitte um Hilfe ! Manchmal sieht man den Wald vor lauter Bäumen nicht mehr.
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: 28: 29: 30: 31: 32: 33: 34: 35:
| Procedure TFrmChild.FindX(Sender: TObject); var FoundAt: LongInt; StartPos, ToEnd: Integer; mySearchTypes : TSearchTypes; myFindOptions : TFindOptions; begin With Sender as TFindDialog Do Begin mySearchTypes := []; with Memo1 do begin if frMatchCase in Options then mySearchTypes := mySearchTypes + [stMatchCase]; if frWholeWord in Options then mySearchTypes := mySearchTypes + [stWholeWord]; if SelLength <> 0 then StartPos := SelStart + SelLength else StartPos := 0; ToEnd := Length(Text) - StartPos; FoundAt := FindText(FindText, StartPos, ToEnd, mySearchTypes); <------ if FoundAt <> -1 then begin SetFocus; SelStart := FoundAt; SelLength := Length(FindText); end else Beep; end; End; End; |
Fehlermeldung des Compilers:
[DCC Fehler] CHILD.PAS(283): E2066 Operator oder Semikolon fehlt
[DCC Fehler] CHILD.PAS(283): E2010 Inkompatible Typen: 'Integer' und 'string'
[DCC Fataler Fehler] MAINX.PAS(124): F2063 Verwendete Unit 'CHILD.PAS' kann nicht compiliert werden
Vielen Dank für die Hilfe !
Hochhaus
|
|
Mathematiker
      
Beiträge: 2622
Erhaltene Danke: 1448
Win 7, 8.1, 10
Delphi 5, 7, 10.1
|
Verfasst: So 11.11.12 18:13
Hallo,
Delphi-Quelltext 1:
| FoundAt := FindText(FindText, StartPos, ToEnd, mySearchTypes); <------ |
Soll FindText ein rekursiver Aufruf sein? Oder meinst Du
Delphi-Quelltext 1:
| FindText(FindDialog1.FindText, StartPos, ToEnd, mySearchTypes); |
Beste Grüße
Mathematiker
_________________ Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
|
|
Hochhaus 
      
Beiträge: 662
Erhaltene Danke: 8
Windows 7
Delphi XE2
|
Verfasst: So 11.11.12 18:27
Hallo,
ich habe den Text aus der Delphi-Hilfe kopiert und an mein Projekt adaptiert. Es sollte der Zeile
-->
Delphi-Quelltext 1:
| FoundAt := FindText(FindDialog1.FindText, StartPos, ToEnd, mySearchTypes); |
entsprechen.
Gruss,
Hochhaus
|
|
Mathematiker
      
Beiträge: 2622
Erhaltene Danke: 1448
Win 7, 8.1, 10
Delphi 5, 7, 10.1
|
Verfasst: So 11.11.12 18:37
Hallo,
nach meiner Kenntnis hat die Komponente memo keine Methode findtext, dagegen die Komponente richedit, d.h. mit
Delphi-Quelltext 1:
| FoundAt := richedit1.FindText((Sender as TFindDialog).FindText, StartPos, ToEnd, mySearchTypes); |
dürfte es keine Probleme geben.
Beste Grüße
Mathematiker
_________________ Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
Für diesen Beitrag haben gedankt: 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: So 11.11.12 18:38
Mach erstmal das dämliche with weg, dann siehst du auch den Fehler...
Es gibt einmal die Funktion FindText (aber nur beim RichEdit, nicht bei einem Memo, falls Memo1 ein Memo ist) und einmal die Eigenschaft FindText des Dialogs. Das ist dann nun einmal nicht eindeutig, wenn du mit with herumspielst.
Nicht umsonst ist with in diversen Firmen verboten und wurde mit XE3 auch endlich aus den Delphiquelltexten entfernt.
Für diesen Beitrag haben gedankt: Hochhaus
|
|
Hochhaus 
      
Beiträge: 662
Erhaltene Danke: 8
Windows 7
Delphi XE2
|
Verfasst: So 11.11.12 18:46
Moderiert von Narses: Komplett-Zitat des letzten Beitrags entfernt.
Ich verwende tatsächlich ein Memo und nicht ein Richedit. Das Richedit brachte andere Probleme mit sich - siehe andere Themen von mir. Der Code ist also so oder so nicht lauffähig, selbst wenn ich das "With .. Do Begin " weglassen würde.
Gruss,
Hochhaus
|
|
Hochhaus 
      
Beiträge: 662
Erhaltene Danke: 8
Windows 7
Delphi XE2
|
Verfasst: Mo 12.11.12 10:01
Hallo !
Ich habe nun doch wieder ein Richedit verwendet. Der Suchen-Dialog läuft nun korrekt (Ein Dankeschön an Mathematiker), der Ersetzen - Dialog jedoch nicht. Solange ein Suchbegriff durch einen total neuen ersetzt wird, funktioniert es prima. Sobald ich aber "XYZ" ersetze durch "XYZ!!", wird beim Alles ersetzen der erste Begriff unendlich oft mit !!!! wiederholt. Sieht jemand, warum ? Und was man tun kann ?
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: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50:
| Procedure TFrmChild.FindX(Sender: TObject); var FoundAt: LongInt; StartPos, ToEnd: Integer; mySearchTypes : TSearchTypes; myFindOptions : TFindOptions; begin With Sender as TFindDialog Do Begin mySearchTypes := []; with RichEdit1 Do Begin If frMatchCase in Options then mySearchTypes := mySearchTypes + [stMatchCase]; If frWholeWord in Options then mySearchTypes := mySearchTypes + [stWholeWord]; If SelLength <> 0 then StartPos := SelStart + SelLength Else StartPos := 0; ToEnd := Length(Text) - StartPos; FoundAt := RichEdit1.FindText((Sender as TFindDialog).FindText, StartPos, ToEnd, mySearchTypes); If FoundAt <> -1 then Begin SetFocus; SelStart := FoundAt; SelLength := Length((Sender as TFindDialog).FindText); End Else Beep; End; End; End;
Procedure TFrmChild.ReplaceX(Sender: TObject); Begin With Sender As TReplaceDialog Do Begin While True Do Begin If RichEdit1.SelText <> FindText Then FindX(Sender); If RichEdit1.SelLength = 0 Then Break; RichEdit1.SelText := ReplaceText; If Not(frReplaceAll In Options) Then Break; End; End; End; |
Danke und Gruss
Hochhaus
|
|
Mathematiker
      
Beiträge: 2622
Erhaltene Danke: 1448
Win 7, 8.1, 10
Delphi 5, 7, 10.1
|
Verfasst: Mo 12.11.12 10:43
Hallo Hochhaus,
warum verwendest Du nicht eine leicht modifizierte Variante der Delphi-Hilfe-Lösung:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| procedure TForm1.ReplaceDialog1Replace(Sender: TObject); var SelPos: Integer; begin with TReplaceDialog(Sender) do begin repeat SelPos := Pos((Sender As TReplaceDialog).FindText, richedit1.Lines.Text); if SelPos > 0 then begin richedit1.SelStart := SelPos - 1; richedit1.SelLength := Length(FindText); richedit1.SelText := ReplaceText; end; until selpos=0; end; end; |
Das müsste, meiner Meinung nach, funktionieren. Ein Problem wird noch die Berücksichtung der Groß- und Kleinschreibung werden, aber das lässt sich auch lösen.
@Jaenicke: Bevor Du wegen with meckerst (Du hast ja recht!). So, wie von mir angegeben, steht es in der Delphi-Hilfe.
Beste Grüße
Mathematiker
_________________ Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
|
|
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: Mo 12.11.12 10:52
Es funktioniert auch wie er es hatte, nur ist die Markierung nach dem Setzen von SelText weg. Dementsprechend muss man die wieder setzen, wenn man daran festmacht, ob man von Beginn des Textes an sucht: 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: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50:
| function FindInRichEdit(const AFindDialog: TFindDialog; const ATargetRichEdit: TRichEdit): Boolean; var FoundAt: LongInt; StartPos, ToEnd: Integer; mySearchTypes: TSearchTypes; begin mySearchTypes := []; if frMatchCase in AFindDialog.Options then mySearchTypes := mySearchTypes + [stMatchCase]; if frWholeWord in AFindDialog.Options then mySearchTypes := mySearchTypes + [stWholeWord]; if ATargetRichEdit.SelLength <> 0 then StartPos := ATargetRichEdit.SelStart + ATargetRichEdit.SelLength else StartPos := 0; ToEnd := Length(ATargetRichEdit.Text) - StartPos; FoundAt := ATargetRichEdit.FindText(AFindDialog.FindText, StartPos, ToEnd, mySearchTypes); Result := FoundAt <> -1; if Result then begin ATargetRichEdit.SetFocus; ATargetRichEdit.SelStart := FoundAt; ATargetRichEdit.SelLength := Length(AFindDialog.FindText); end; end;
procedure TForm408.FindX(Sender: TObject); begin if not FindInRichEdit(Sender as TFindDialog, RichEdit1) then Beep; end;
procedure TForm408.ReplaceX(Sender: TObject); var ReplaceDlg: TReplaceDialog; begin ReplaceDlg := Sender As TReplaceDialog; while FindInRichEdit(ReplaceDlg, RichEdit1) Do begin RichEdit1.SelText := ReplaceDlg.ReplaceText; RichEdit1.SelStart := RichEdit1.SelStart - Length(ReplaceDlg.ReplaceText); RichEdit1.SelLength := Length(ReplaceDlg.ReplaceText); if not(frReplaceAll in ReplaceDlg.Options) then Break; end; end; |
// EDIT: Mathematiker hat folgendes geschrieben : | @Jaenicke: Bevor Du wegen with meckerst (Du hast ja recht!). So, wie von mir angegeben, steht es in der Delphi-Hilfe. |
Schlimm genug, das wurde in den VCL-/RTL-Quelltexten aber mit XE3 wohl endlich geändert...
Für diesen Beitrag haben gedankt: Hochhaus
|
|
Hochhaus 
      
Beiträge: 662
Erhaltene Danke: 8
Windows 7
Delphi XE2
|
Verfasst: Mo 12.11.12 10:58
Super ! Du bist ein Super-Progrmmiierer ! Es geht auf Anhieb, fehlerfrei !
Danke !!!
Hochhaus
Für diesen Beitrag haben gedankt: jaenicke
|
|
|