Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Pos und Zeilenumbrüche??? (https://www.delphipraxis.net/147399-pos-und-zeilenumbrueche.html)

Muellermilchtrinker 7. Feb 2010 17:22


Pos und Zeilenumbrüche???
 
Servus DP,

Ich suche so nach einem Wort in einem Memofeld und markiere es.
Delphi-Quellcode:
Memo1.SetFocus;
Memo1.SelStart := Pos(UpperCase(Edit2.Text),UpperCase(Memo1.Text));
Memo1.SelLength := Length(Edit2.Text);
Das Problem ist nun:
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???

himitsu 7. Feb 2010 17:25

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
http://www.delphipraxis.net/internal...t.php?t=172659

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)

Muellermilchtrinker 8. Feb 2010 16:27

Re: Pos und Zeilenumbrüche???
 
Wie müsste ich des umrechnen???

himitsu 8. Feb 2010 16:35

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);

Sir Rufo 8. Feb 2010 16:49

Re: Pos und Zeilenumbrüche???
 
oder so:
Delphi-Quellcode:
mTmp := StringReplace( Memo1.Text, #13#10, #13, [ rfReplaceAll ] );
Memo1.SelStart := Pos( UpperCase( Edit2.Text ), UpperCase( mTmp ) ) - 1;
Memo1.SelLength := Length( Edit2.Text );
oder (für eine generelle Verwendung):
Delphi-Quellcode:
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;
edit: SelStart korrigiert ... und jetzt als function mit Rückgabewert True, wenn der Suchtext gefunden wurde :mrgreen:

Muellermilchtrinker 8. Feb 2010 16:57

Re: Pos und Zeilenumbrüche???
 
Hab die Lösung von Sir Rufo genommen.
Funktioniert (man muss halt noch 1 bei Selstart abziehen :wink: )

himitsu 8. Feb 2010 17:10

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.

Muellermilchtrinker 8. Feb 2010 17:19

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:

himitsu 8. Feb 2010 18:37

Re: Pos und Zeilenumbrüche???
 
Dann ist es klar.

Eine Lösung und der Grund steht dann im anderem Thread.
http://www.delphipraxis.net/internal...t.php?t=172659


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:57 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz