Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Wort unter Memo-Cursor finden. (https://www.delphipraxis.net/134609-wort-unter-memo-cursor-finden.html)

nabbl 25. Mai 2009 22:54


Wort unter Memo-Cursor finden.
 
Nabend, ich hoffe, ihr könnt mir helfen :)

Ich suche eine Möglichkeit das Wort, in dem der blinkende Cursor vom Memo liegt, herauszufinden.
Es soll im Prinzip so funktionieren, wie bei der Delphi IDE: Wenn man mit dem Cursor auf einen Funktions- oder Prozedurnamen klickt und dann F1 drückt, soll mir halt eine Messagebox mit dem Wort entgegenlächeln.

Ich hoffe, ich habe das verständlich genug ausgedrückt :)

Gruß
Nabbl

jaenicke 25. Mai 2009 23:16

Re: Wort unter Memo-Cursor finden.
 
Schau dir SelStart an. ;-)
Dann noch das Leerzeichen / Trennzeichen vorher und nachher per while-Schleife suchen, fertig.

nabbl 26. Mai 2009 00:12

Re: Wort unter Memo-Cursor finden.
 
Habe es probiert, komme aber nicht weiter :(
Hier mein Quellcode bisher. Wäre super, wenn da jemand mal einen Blick drüber werfen würde und mich auf den Fehler hinweisen könnte.

Sourcecode ist mein Memo.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  SelTmp, Row: Integer;
  SelSt, SelEnd: Integer;
  tmp:string;
begin
  // In welcher Zeile vom Memo befinden wir uns?
  Row := SendMessage(SourceCode.Handle, EM_LINEFROMCHAR, SourceCode.SelStart, 0);
  SelTmp := SourceCode.SelStart;
  SelEnd:=SelTmp;
  SelSt:=SelTmp;

  while (SelEnd <= Length(SourceCode.Lines[Row])) do begin
    tmp := Copy(SourceCode.Lines[Row],SelEnd,1);
    if ((tmp = '') or (tmp = ' ')) then begin
      SelEnd:=SelEnd-1;
      Break;
    end;
  end;
  while (SelSt >= 0) do begin
    tmp := Copy(SourceCode.Lines[Row],SelSt-1,1);
    if ((tmp = '') or (tmp = ' ')) then begin
      SelSt:=SelSt-1;
      Break;
    end;
  end;
  ShowMessage(Copy(SourceCode.Lines[Row],SelSt, SelEnd-SelSt+1));
end;
Danke :)

jaenicke 26. Mai 2009 01:05

Re: Wort unter Memo-Cursor finden.
 
Wofür brauchst du denn die Zeile? :gruebel:
Wie wäre es einfach so?
Delphi-Quellcode:
procedure TFormX.memTextClick(Sender: TObject);
var
  MemoText: string;
  TextLen, WordStart, WordEnd: Integer;
begin
  MemoText := memText.Text;

  WordStart := memText.SelStart;
  while (WordStart > 0)
    and (MemoText[WordStart] in ['a'..'z', 'ä', 'ö', 'ü', 'A'..'Z', 'Ä', 'Ö', 'Ü', '0'..'9']) do
    Dec(WordStart);

  TextLen := Length(MemoText);
  WordEnd := memText.SelStart;
  while (WordEnd < TextLen)
    and (MemoText[WordEnd] in ['a'..'z', 'ä', 'ö', 'ü', 'A'..'Z', 'Ä', 'Ö', 'Ü', '0'..'9']) do
    Inc(WordEnd);
  Dec(WordEnd);

  memText.SelStart := WordStart;
  memText.SelLength := WordEnd - WordStart;

  ShowMessage('"' + memText.SelText + '"');
end;
Wobei memText das Memo wäre.

BUG 26. Mai 2009 01:09

Re: Wort unter Memo-Cursor finden.
 
Ich blick bei dir auch nicht durch :stupid:

Warum so kompliziert:
Delphi-Quellcode:
function getSelectedWord(const txt: string; start: integer): string;
const
  blank = [' ', #10, #13]; // <- kann erweitert werden, z.B. Punkte
var
  count: integer;
begin
  if length(txt) > 0 then
  begin
    if start < 1 then start := 1;
    count := 0;
    while ((start-1 >= 1) and (not (txt[start-1] in blank))) do dec(start);
    while ((start+count <= length(txt)) and ((not (txt[start+count] in blank)))) do inc(count);
    result := copy(txt, start, count);
  end else result := '';
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Button1.Caption := '"'+getSelectedWord(memo1.Text, memo1.SelStart)+'"';
end;
Wichtig: Wenn dieser Code verwendet wird muss {$B-} eingestellt sein (ist Standard, unter $B in der Hilfe nachschauen).


MfG,
Bug

@roter Kasten: ich poste meine Lösung trotzdem mal...

EDIT: Standart :roll:

nabbl 26. Mai 2009 06:03

Re: Wort unter Memo-Cursor finden.
 
Super, danke! Werde die Lösungen mal ausprobieren :D


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:27 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