![]() |
TMemo; Wort an aktueller Cursorposition auslesen
Hi,
wie kann ich in Delphi XE auslesen, welches Wort an der aktuellen Position im TMemo sich befindet. Ich möchte das Wort nicht vorher selektieren. Beispiel: Ich klicke mitten im Wort "Hausrat" und ich bekomme in einem Hinweisdialog "Hausrat". Gruß Alfonso |
AW: TMemo; Wort an aktueller Cursorposition auslesen
Erstmal mußt du definieren "Was ist ein Wort?",
dann liest du den Text aus dem Memo in eine Variable aus, liest die Cursor-Position aus und nun mußt du nur noch von der aktuellen Stelle ausgehend nach vorne und zurück das Ende/Anfang des "Wortes" suchen. Und schon hast du zwei Positionen, zwischen denen man den Text rauskopieren kann. |
AW: TMemo; Wort an aktueller Cursorposition auslesen
Wenn ich es nicht zufällig gerade schon fertig vorliegen hätte...
Das müsste auch noch mit älteren Delphi-Versionen laufen. Die Delimiter sind sicher überarbeitungsbedürftig. Bei einem aktuellen Delphi käme hier vielleicht eher System.Character zur Anwendung.
Delphi-Quellcode:
function TForm1.GetWordAtCursor(Memo: TMemo): string;
var curLine: string; row: Integer; col: Integer; wordLength: Integer; wordStart: Integer; function IsDelimiter(const Line: string; Index: Integer): Boolean; const cWordDelimiters = ' ,./?;:`"<>[]{}-=\+|()%@&^$#!~*'; begin result := (Index < 1) or (Index > Length(Line)) or (Pos(Line[Index], cWordDelimiters) > 0); end; begin row := Memo.CaretPos.Y; col := Memo.CaretPos.X; curLine := Memo.Lines[row]; wordStart := col; { falls der Cursor auf einem Delimiter steht, wollen wir das Wort vorher } if IsDelimiter(curLine, wordStart) and (wordStart > 1) then begin Dec(wordStart); end; { Suche Anfang des Wortes } wordLength := 0; while not IsDelimiter(curLine, wordStart) do begin Dec(wordStart); Inc(wordLength); end; { Suche Ende des Wortes } col := wordStart + wordLength + 1; while not IsDelimiter(curLine, col) do begin Inc(col); Inc(wordLength); end; if wordLength > 0 then begin result := Copy(curLine, wordStart + 1, wordLength); end; end; |
AW: TMemo; Wort an aktueller Cursorposition auslesen
Wobei natürlich eine Klasse dafür wesentlich universeller geeignet wäre:
Delphi-Quellcode:
Der Aufruf wäre dann
IWordFinder = interface
['{GUID}'] function GetWordAt( const AStr : string; const APos : integer ): string; overload; function GetWordAt( const AStrings : TStrings; APos, ARow : integer ): string; overload; end; TWordFinder = class( TInterfacedObject, IWordFinder ) public constructor Create( AWhiteSpace : array of char ); // WhiteSpace festlegen function GetWordAt( const AStr : string; const APos : integer ): string; overload; function GetWordAt( const AStrings : TStrings; APos, ARow : integer ): string; overload; end; function TWordFinder.GetWordAt( const AStrings : TStrings; APos, ARow : integer ): string; begin Result := GetWordAt( AStrings[ARow], APos ); end;
Delphi-Quellcode:
Zudem man diese Klasse dann auch gleich noch um so sinnvolle Methoden wie
function GetWordFromMemoCaretPos( AMemo : TMemo; AWordFinder : IWordFinder ): string;
begin Result := AWordFinder.GetWordAt( AMemo.Lines, AMemo.CaretPosX, AMemo.CaretPosY ); end;
Delphi-Quellcode:
und
GetAllWords
Delphi-Quellcode:
erweitert :stupid:
CountWords
|
AW: TMemo; Wort an aktueller Cursorposition auslesen
Vielen Dank.
@Sir Rufo: Fehlt da nicht die Implementierung der Klasse, oder woltest du nur grundsätzlich sagen, dass es so besser ist? |
AW: TMemo; Wort an aktueller Cursorposition auslesen
Zitat:
Falls der gefundene Krempel auch noch markiert werden soll:
Delphi-Quellcode:
Recht nützlich für Autotext-Funktionen, bei denen eine gefundene "Abkürzung" (das gefundene Wort) durch Textbausteine ersetzt werden soll.
if wordLength > 0 then
begin result := Copy(curLine, wordStart + 1, wordLength); // Memo.SetCaret(row, wordStart); //Cursor an den Wortanfang // Memo.SelLength := wordLength; //Wort markieren // Memo.SetFocus; //für focusverlierende Buttons end; Bisher parste ich nur rückwärts vom Abkürzungsende zum Wortanfang, ab jetzt kann ich auch mitten in ein beliebiges Wort klicken lassen. Latürnich über ein böses, globales Boolean umschaltbar...:twisted: MfG |
AW: TMemo; Wort an aktueller Cursorposition auslesen
Zitat:
Gruß Alfonso |
AW: TMemo; Wort an aktueller Cursorposition auslesen
Wenn das Wort eh schon markiert ist, musst Du doch nur SelText neu setzen, wenn ich jetzt keinen Denkfehler mache.
|
AW: TMemo; Wort an aktueller Cursorposition auslesen
Delphi-Quellcode:
:wink:
memo.SelText := 'Kein Denkfehler!';
|
AW: TMemo; Wort an aktueller Cursorposition auslesen
Vielen Dank für alle Infos. Es funktioniert.
@Pelzig: Wie hast du visuell im Form dein Autotext realisiert? Dropdownbox wie in Delphi? Oder separate Liste (TListbox)? Gruß Alfonso |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:21 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