So, da mir diese "Frickellösung" nicht wirklich gefallen hat und ich ja auch damit arbeiten muss und dem Cliché des "faulen Programmierer" nachkommen muss, habe ich das ganze mal in eine einfach zu nutzende Komponente gegossen.
Es verhält sich vollständig wie das bekannte JvRichEdit, unterstützt aber das einfügen von Text mit Links. Dazu müssen die Eigenschaften "OpenTag" und "CloseTag" gesetzt werden, z.B. auf "[" und "]". Alles zwischen den Klammern wird als Link erkannt.
Text wird dem RichEdit über die neue Funktion
procedure InsertText(FilterText: string; Bookmarks: array of String; BookmarkIDs: array of Integer);
zugewiesen. Filtertext ist der Text mit den kodierten Links, Bookmarks ein Array von Werten, die als Linktexte eingesetzt werden sollen und BookmarkIDs sind Zahlenwerte, die beim Klick auf den jeweiligen Link zurückgegeben werden. DAmit kann man sehr leicht ermitteln, welcher Link angeklickt worden ist und ebenso einfach auf mehrere Links identisch reagieren.
Ein einfaches Beispiel
Delphi-Quellcode:
const
RULE_Switch_if_temp_Below = 'Schalte [Schalter] [Status], wenn Temperatur [Grenzwert] [Wechsel]';
// Das ist der Text als Beispiel mit eckigen Klammern
Der Text wird mit
ParamList.InsertText(RULE_Switch_if_temp_Below,['Schalter2','an','25°','überschreitet'],[10,20,50,80]);
zugewiesen.
Bei einem Klick auf den Link "25°" wird dann eine 50 zurückgegeben. Dies kann über das neue Ereignis "OnLinkClicked" ausgewertet werden und es kann der Linktext geändert werden.
Delphi-Quellcode:
procedure TForm1.RuleEditLinkClicked(BookmarkID, Position: Integer;
var Text: string);
begin
ShowMessage(IntToStr(BookmarkID));
InputQuery('Text ändern','Text:',Text);
end;
Hier wird zuerst die Zahl (im Beispiel: 50) angezeigt und danach kann der Text nach belieben geändert werden. Der Einfachheit halber, habe ich ein Abbrechen der InputBox im Beispiel ignoriert.
Hoffe es nützt jemanden - bin für Fragen, Anregungen und Kritik immer zu haben.
Grüße aus dem Westen,
Thomas
EDIT: Für alle, die lieber interaktiv sind, habe ich eine kompilierte Demo angehangen