![]() |
Pos und Zeilenumbrüche???
Servus DP,
Ich suche so nach einem Wort in einem Memofeld und markiere es.
Delphi-Quellcode:
Das Problem ist nun:
Memo1.SetFocus;
Memo1.SelStart := Pos(UpperCase(Edit2.Text),UpperCase(Memo1.Text)); Memo1.SelLength := Length(Edit2.Text); Steht das Wort in der ersten Zeile, so wird so markiert (unterstrichen = markierung): Test. Steht das Wort in der zweiten Zeile, so wird so markiert: Test. Und wenn das Wort in der dritten Zeile steht wird so markiert: Test. Wie kann ich das umgehen??? Bzw.: Wie kann ich es immer richtig markieren??? |
Re: Pos und Zeilenumbrüche???
Pos liefert einen 1-basierenden StringIndex und SelStart verlangt nach einem 0-basierendem Index.
Lösung: entsprechend umrechen, bzw. ein gewisses Offset dazurechnen Aber das mit der Verschiebung: Nicht daß wir hier nochmal soein Problem haben ![]() Prüfe mal bitte bei dir die Zeilenumbrüche, welche in deinem Programm so vorkommen. (bin grad mit 'ner RegEx-Komponente ausgelastet ... könnte aber später mal da reinsehn) |
Re: Pos und Zeilenumbrüche???
Wie müsste ich des umrechnen???
|
Re: Pos und Zeilenumbrüche???
Wenn es wirklich nur der Zeilenumbruch ist, dann
Memo1.SelStart := Pos() + (GetLineFeedLength(Memo1.Text) - GetLineFeedLength(Memo1_intern)) * ZeileVon(Pos()); Memo1.SelStart := Pos(...) + ZähleZeilenumbrüche(Copy(Memo1.Text, 1, Pos(...) - 1); |
Re: Pos und Zeilenumbrüche???
oder so:
Delphi-Quellcode:
oder (für eine generelle Verwendung):
mTmp := StringReplace( Memo1.Text, #13#10, #13, [ rfReplaceAll ] );
Memo1.SelStart := Pos( UpperCase( Edit2.Text ), UpperCase( mTmp ) ) - 1; Memo1.SelLength := Length( Edit2.Text );
Delphi-Quellcode:
edit: SelStart korrigiert ... und jetzt als function mit Rückgabewert True, wenn der Suchtext gefunden wurde :mrgreen:
function SelectTextInMemo( AText : string; AMemo : TMemo ) : boolean;
var mTmp : string; tTmp : string; mPos : integer; begin Result := False; // CRLF ersetzen mit CR mTmp := UpperCase( StringReplace( AMemo.Text, #13#10, #13, [ rfReplaceAll ] ) ); // Falls im Suchtext auch ein CRLF auftaucht ;-) tTmp := UpperCase( StringReplace( AText, #13#10, #13, [ rfReplaceAll ] ) ); mPos := Pos( tTmp, mTmp ); if mPos > 0 then begin AMemo.SelStart := mPos - 1; // Sel startet bei 0 ;-) AMemo.SelLength := Length( tTmp ); Result := True; end; end; |
Re: Pos und Zeilenumbrüche???
Hab die Lösung von Sir Rufo genommen.
Funktioniert (man muss halt noch 1 bei Selstart abziehen :wink: ) |
Re: Pos und Zeilenumbrüche???
Aber ganz sicher, daß es sich um ein TMemo handelt?
Konnte diesen Fehler es mit diesem nicht bestätigen. Hab also nur Probleme mit einem TRichEdit. |
Re: Pos und Zeilenumbrüche???
Ich hatte zuerst ein Memo.
Dann hab ich auf RichEdit umgestellt und wollte nicht alle Namen ändern, dann hab ich einfach Memo1 als Name gesetzt. :feuerchen: :stupid: |
Re: Pos und Zeilenumbrüche???
Dann ist es klar.
Eine Lösung und der Grund steht dann im anderem Thread. ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:46 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz