Autor Beitrag
galagher
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2562
Erhaltene Danke: 46

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Fr 11.05.07 16:49 
Hallo!

Wie kann ich in einem RichEdit ermitteln, ob der Text, auf dem der Mauszeiger liegt, unterstrichen ist? Ich stelle mir das so vor: ermittle ausgehend von CaretPos.X nach links, wo das 1. unterstrichene Zeichen beginnt, beginne ab dieser Stelle dann nach rechts zu prüfen, ob die Zeichen fsUnderLine in SelAttributs.Style haben, wenn ja, hänge sie an eine Stringvariable, brich beim ersten nicht unterstrichenen Zeichen ab.

Soweit die Theorie - aber wie setze ich das in die Praxis um?

Ich habe eine Funktion - ScanString - die die Zeile bzw. das Wort, auf dem der Mauszeiger liegt, ermittelt. Trotzdem komme ich nicht zurecht. In meinem RichEdit1 folgt das Caret dem Mauszeiger, und so, wie es jetzt funktioniert, werden zwar alle unterstrichenen Zeichen korrekt ermittelt, aber aus ABCdefGHI wird ABCGHI und nicht ABC oder GHI - je nachdem , wo der Mauszeiger liegt.

Zur Erklärung: Unterstrichener Text, mit oder ohne Leerzeichen, soll einen Hyperlink darstellen, den ich auslesen will, um so an die unterstrichenen Zeichen zu kommen.

Die Lösung, dass pro Zeile nur 1 Hyperlink (= das einmalige Vorkommen unterstrichenen Textes) zulässig ist, ist nicht wirklich zufriedenstellend!

Kann mir jemand einen Tipp geben?

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2562
Erhaltene Danke: 46

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Sa 12.05.07 09:21 
user profile icongalagher hat folgendes geschrieben:
ermittle ausgehend von CaretPos.X nach links, wo das 1. unterstrichene Zeichen beginnt, beginne ab dieser Stelle dann nach rechts zu prüfen, ob die Zeichen fsUnderLine in SelAttributs.Style haben, wenn ja, hänge sie an eine Stringvariable, brich beim ersten nicht unterstrichenen Zeichen ab.

... und genau so habe ich es auch gemacht!

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
Agawain
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 460

win xp
D5, MySQL, devxpress
BeitragVerfasst: Sa 12.05.07 14:44 
hi

Trotzdem muß da ja noch irgendwo ne Macke sein und wenn Du uns den Text von der ScannerFunktion vorenthältst, wird das nix.

Das von Dir beschriebene Ergebis zeigt ja, daß der Break schon richtig gesetzt ist.

Vielleicht liegt das Problem auch noch dadrüber...k.A.

cu

aga
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2562
Erhaltene Danke: 46

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: So 13.05.07 12:22 
Wenn die 1. Zeile unterstrichenen Text enthält, klappt es noch, der Text wird korrekt erkannt. Fügt man oben eine Leerzeile ein, funktioniert gar nichts mehr! Ich brauche irgendwie die absolute X-Position des Carets, unabhängig davon, welche Zeile. :(

Und SelStart funktioniert ebenfalls nicht!

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2562
Erhaltene Danke: 46

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: So 13.05.07 17:23 
Falls es jemand brauchen (oder verbessern) kann: hier die korrigierte und funktionierende Funktion:
ausblenden volle Höhe Delphi-Quelltext
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:
51:
52:
53:
54:
55:
56:
function ScanString(RichEdit: TRichEdit; X, Y: Integer): String;
var
  iCharIndex, iLineIndex, iCharOffset, lc, n, c: Integer;
  Pt: TPoint;
begin
 with RichEdit do
 begin
  Pt := Point(X, Y+2);

  iCharIndex := Perform(Messages.EM_CHARFROMPOS, 0, Integer(@Pt));
  if iCharIndex < 0 then Exit;

  iLineIndex  := Perform(EM_EXLINEFROMCHAR, 0, iCharIndex);
  iCharOffset := iCharIndex - Perform(EM_LINEINDEX, iLineIndex, 0);

  if (Lines.Count - 1 < iLineIndex) or (Length(Lines[iLineIndex]) = 0) then exit;

  Result := '';

  {Länge der Zeilen vor der aktuellen Zeile ermitteln, zB. wenn die 4. Zeile die}
  {aktuelle ist, dann die Längen der Zeilen 1-3 ermitteln, + jeweils 2 für #13#10}
  lc := 0;
  for n := 0 to Lines.Count-1 do
  begin
   if Lines[iLineIndex] = Lines[n] then break;
   lc := lc+Length(Lines[n])+2;
  end;

  {Anfang des Hyperlinks ermitteln}
  for c := iCharOffset downto 1 do
  begin
   SelStart := lc+c;
   if not (fsUnderLine in SelAttributes.Style) then break;
  end;

  {Nur noch die unterstrichenen Zeichen ermitteln}
  for n := c+1 to Length(Lines[iLineIndex]) do
  begin
   SelStart := lc+n;
   if fsUnderLine in SelAttributes.Style then
   begin
    Result := Result+Lines[iLineIndex][n];
    RichEdit.Cursor := crHandPoint;
   end
   else break;
  end;

  {Das Caret folgt dem Mauscursor}
  if Y >= iLineIndex then SelStart := iCharIndex;

//DestroyCaret;

  if not (fsUnderLine in SelAttributes.Style) or (iCharOffset = Length(Lines[iLineIndex])) then
   RichEdit.Cursor := crArrow;
 end;
end;

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!