![]() |
Text in Richedit anklicken
Hallo,
ich schreibe gerade an einem kleinen Chat. Ich verwende zum Anzeigen des Textes ein TJvRichEdit. Der Text ist so formatiert: Name: Text Jetzt möchte ich den Namen gerne anklickbar machen so wie bei URLs. Wie könnte ich das am besten anstellen? |
Re: Text in Richedit anklicken
Einer ne Ahnung wie ich das machen könnte?
|
Re: Text in Richedit anklicken
Nur so eine Idee..
Du könntenst anhand deiner Cursor Position das wort bestimmen. Und bei einem DbClick Event dann eben schauen was das für ein Wort ist das du makiert hast.. Gruß, Real-TTX |
Re: Text in Richedit anklicken
Hi!
Zu Richedit und Links solltest du mit der Suche hier einiges finden können! Grüße, Frederic |
Re: Text in Richedit anklicken
Ja ich will aber keine Links highlighten sondern die Namen.
|
Re: Text in Richedit anklicken
Das ist mir schon klar - aber du kannst die Namen ja als Link kennzeichnen.
|
Re: Text in Richedit anklicken
Ok soweit funktioniert das, aber wie kann ich einen Text manuell als Link markieren?
Und ich bin noch dabei den ersten Teil des Textes zu färben. Also ungefähr so: Mustermann: Hallo Aber wie kann ich das in dem Richedit machen? Ich habs zum testen einmal so versucht funtzt aber nicht:
Delphi-Quellcode:
Leider wird dadurch der gesamte Text grün
procedure AddColoredLine(ARichEdit: TTransparentRichEdit; AText: string);
begin with ARichEdit do begin ARichEdit.SelStart := 0; ARichEdit.SelLength := 3; SelAttributes.Color := clred; ARichEdit.SelStart := 4; ARichEdit.SelLength := 7; SelAttributes.Color := clgreen; Lines.Add(AText); end; end; |
Re: Text in Richedit anklicken
So also ich hab jetzt das was du willst mal mit einem normalen RichEdit versucht und habs hinbekommen das wenn die Mouse über dem Text ist er es anders darstellt
Delphi-Quellcode:
Ich hoffe ich konnte dir helfen, hab mich schnell daran gesetzt :coder: , weil es mal eine kleine herausforderung für mich war dies rauszufinden. Ich hoffe es klappt.
var Test : TSize;
Rect1 : TRect; TextHöhe : Integer; Zeile : Integer; Text1 : String; begin Zeile := 1; //Zeile in der der Text steht (Index der Linesliste +1 des RichEdits) Text1 := 'Hi' //Text, der angeklickt werden soll GetTextExtentPoint32(GetDC(RichEdit1.Handle), Text1, Length(Text1), Test); //WinApi Funktion, welche die Höhe und die Breite des Textes ausgibt TextHöhe := -RichEdit1.Font.Height; //Höhe der Schrift allgemein Rect1 := Rect(0,(Zeile-1)*TextHöhe,Test.cx,Zeile*TextHöhe + Test.cy); //Bereich festlegen, wo der Text ist, dabei sit vorausgesetz das der Text immer vorne steht if (y >= Rect1.Top) and (y+TextHöhe <= Rect1.Bottom) and (x <= Rect1.Right) then //Überprüfung ob die Mouse in Rect (speicher am besten x,y von MouseMove und setze //die Variable für X und Y ein, wenn du die Anweisung hier in DbClick einfügst begin //hier der Code, wenn die Mouse auf dem Text ist. //z.b. RichEdit1.SelStart := 0; RichEdit1.SelLength := Length(Text1); RichEdit1.SelAttributes.Style := RichEdit1.SelAttributes.Style + [fsUnderline];} end else begin //und hier schreibste rein wie er normal aussehen soll. //z.b. {RichEdit1.SelStart := 0; RichEdit1.SelLength := 4; RichEdit1.SelAttributes.Style := RichEdit1.SelAttributes.Style - [fsUnderline];} end; Bei mir klappte es, als ich 2 Zeilen hatte und der Text in der ersten Zeile war. Und hatte den Code bei MouseMove drin. Gruß NickelM |
Re: Text in Richedit anklicken
Hallo,
Zitat:
-> Selstart auf das Ende des Textes -> SelAttributes setzen -> add(..) |
Re: Text in Richedit anklicken
Ok das funktioniert schon ganz gut hab das noch ein wenig abgeändert da es sonst am flackern ist:
Delphi-Quellcode:
Jetzt muss ich nur rausfinden wie ich die namen einmalig kennzeichnen kann.
var Test : TSize;
Rect1 : TRect; TextHöhe : Integer; Zeile : Integer; Text1 : String; begin Zeile := 1; //Zeile in der der Text steht (Index der Linesliste +1 des RichEdits) Text1 := 'Hi'; //Text, der angeklickt werden soll GetTextExtentPoint32(GetDC(JvRichEdit1.Handle), Text1, Length(Text1), Test); //WinApi Funktion, welche die Höhe und die Breite des Textes ausgibt TextHöhe := -JvRichEdit1.Font.Height; //Höhe der Schrift allgemein Rect1 := Rect(0,(Zeile-1)*TextHöhe,Test.cx,Zeile*TextHöhe + Test.cy); //Bereich festlegen, wo der Text ist, dabei sit vorausgesetz das der Text immer vorne steht if (y >= Rect1.Top) and (y+TextHöhe <= Rect1.Bottom) and (x <= Rect1.Right) then //Überprüfung ob die Mouse in Rect (speicher am besten x,y von MouseMove und setze //die Variable für X und Y ein, wenn du die Anweisung hier in DbClick einfügst begin //hier der Code, wenn die Mouse auf dem Text ist. //z.b. JvRichEdit1.SelStart := 0; JvRichEdit1.SelLength := Length(Text1); if not (fsUnderline in JvRichEdit1.SelAttributes.Style) then begin JvRichEdit1.SelAttributes.Style := JvRichEdit1.SelAttributes.Style + [fsUnderline]; end; JvRichEdit1.Cursor:=crHandpoint; end else begin //und hier schreibste rein wie er normal aussehen soll. //z.b. JvRichEdit1.SelStart := 0; JvRichEdit1.SelLength := Length(Text1); if fsUnderline in JvRichEdit1.SelAttributes.Style then begin JvRichEdit1.SelAttributes.Style := JvRichEdit1.SelAttributes.Style - [fsUnderline]; JvRichEdit1.Cursor:=crDefault; end; end; end; Ich habe mir gedacht, dass ich so ne art dummyzeichen vor und hinter dem namen setzte. Ungefähr so: #13+Username+#13 Nur was kann ich da für zeichen nehmen, da #13 ja ein zeilenumbruch macht kann ich das nicht nehmen. Und noch ein Problem ich müsste jetzt noch verhinden, dass man den Text markieren kann, da es sonst zu fehlern kommt. |
Re: Text in Richedit anklicken
Hi,
Wenn dein String so aussieht "Mustermann: test text bla bla" dann prüfe doch mit Pos(':', String) wo der erste Doppelpunkt ist und alles von 1 bis dahin ist dann der Name. Dazu solltest du dann nur vermeiden das man im Namen auch Doppelpunkte verwenden kann aber das sollte ja kein Problem sein. Gruß Stormy |
Re: Text in Richedit anklicken
Jo gute Idee dann mache ich das so.
Kann ich denn auch irgendwie rausfinden mir mousemove in welcher Zeile die maus gerade ist? |
Re: Text in Richedit anklicken
Wenn du den String hast über dem deine Maus ist dann kannst du mit
Delphi-Quellcode:
feststellen welcher Zeilenindex das ist.
JvRichEdit1.Lines.IndexOf(DEIN_STRING)
Gruß Stormy |
Re: Text in Richedit anklicken
Ich habe ein Problem damit rauszufinden in welcher Zeile die Mausgerade ist.
Habs so probiert geht aber nur wenn ich geklickt habe: Zeile := JvRichEdit1.CaretPos.y; Ich brauche das aber bei move. |
Re: Text in Richedit anklicken
Ja habe ich dir doch in meinem vorherigen Post schon beantowrtet wie du das machen kannst.
Gruß Stormy |
Re: Text in Richedit anklicken
Hallo,
Zitat:
![]() |
Re: Text in Richedit anklicken
Keine Ahnung ob es geht oder ob es das ist was du wolltest aber hab deinen Code mal etwas abgeändert.
Delphi-Quellcode:
Edit: man könnte den auch mal etwas anschaulicher Formatieren (Styleguide) :roll:
var Test : TSize;
Rect1 : TRect; TextHoehe : Integer; Zeile : Integer; Text1 : String; begin for Zeile := 1 to JvRichEdit1.Lines.Count do begin //Zeile in der der Text steht (Index der Linesliste +1 des RichEdits) Text1 := 'Hi'; //Text, der angeklickt werden soll GetTextExtentPoint32(GetDC(JvRichEdit1.Handle), PChar(Text1), Length(Text1), Test); //WinApi Funktion, welche die Höhe und die Breite des Textes ausgibt TextHoehe := -JvRichEdit1.Font.Height; //Höhe der Schrift allgemein Rect1 := Rect(0,(Zeile-1)*TextHoehe,Test.cx,Zeile*TextHoehe + Test.cy); //Bereich festlegen, wo der Text ist, dabei sit vorausgesetz das der Text immer vorne steht if (y >= Rect1.Top) and (y+TextHoehe <= Rect1.Bottom) and (x <= Rect1.Right) then //Überprüfung ob die Mouse in Rect (speicher am besten x,y von MouseMove und setze //die Variable für X und Y ein, wenn du die Anweisung hier in DbClick einfügst begin //hier der Code, wenn die Mouse auf dem Text ist. //z.b. JvRichEdit1.SelStart := 0; JvRichEdit1.SelLength := Length(Text1); if not (fsUnderline in JvRichEdit1.SelAttributes.Style) then begin JvRichEdit1.SelAttributes.Style := JvRichEdit1.SelAttributes.Style + [fsUnderline]; end; JvRichEdit1.Cursor:=crHandpoint; Caption := IntToStr(Zeile); // die Zeile über der die Maus ist break; end else begin //und hier schreibste rein wie er normal aussehen soll. //z.b. JvRichEdit1.SelStart := 0; JvRichEdit1.SelLength := Length(Text1); if fsUnderline in JvRichEdit1.SelAttributes.Style then begin JvRichEdit1.SelAttributes.Style := JvRichEdit1.SelAttributes.Style - [fsUnderline]; JvRichEdit1.Cursor:=crDefault; end; end; end; end; Gruß Stormy |
Re: Text in Richedit anklicken
Ja aber das ist wieder das problem dafür müsste ich wissen was in der zeile steht das weiß ich ja nicht.
|
Re: Text in Richedit anklicken
Was genau geht denn jetzt nicht? Ich kann dir gerade nicht folgen und im Code steht doch alles drinne
was du brauchst oder verstehe ich was falsch? :roll: |
Re: Text in Richedit anklicken
Das Problem ist ich schreibe einen Chat und in jeder Zeile steht ein Name davor.
Natürlich nicht in jeder Zeile der selbe. In Jeder Zeile soll der Name gehighlightet werden. Wenn das erstmal geschafft ist kann man ja auch ganz einfach einen Code darauf setzen, also beim anklicken. Und das ist das Problem ich muss ja individiuell herausfinden was der Name ist und dann herausfinden wenn man mit der Maus darüber ist. |
Re: Text in Richedit anklicken
Hmmm also über den Code würde ich sagen solltest du den folgendermasen ändern
Delphi-Quellcode:
var Test : TSize;
Rect1 : TRect; TextHoehe : Integer; Zeile : Integer; Text1 : String; begin for Zeile := 1 to JvRichEdit1.Lines.Count do begin //Zeile in der der Text steht (Index der Linesliste +1 des RichEdits) Text1 := Copy(JvRichEdit1.Lines[Zeile-1],1,Pos(':',JvRichEdit1.Lines[Zeile-1])-2); //Text in der Zeile der Vorne steht; GetTextExtentPoint32(GetDC(JvRichEdit1.Handle), PChar(Text1), Length(Text1), Test); //WinApi Funktion, welche die Höhe und die Breite des Textes ausgibt TextHoehe := -JvRichEdit1.Font.Height; //Höhe der Schrift allgemein Rect1 := Rect(0,(Zeile-1)*TextHoehe,Test.cx,Zeile*TextHoehe + Test.cy); //Bereich festlegen, wo der Text ist, dabei sit vorausgesetz das der Text immer vorne steht if (y >= Rect1.Top) and (y+TextHoehe <= Rect1.Bottom) and (x <= Rect1.Right) then //Überprüfung ob die Mouse in Rect (speicher am besten x,y von MouseMove und setze //die Variable für X und Y ein, wenn du die Anweisung hier in DbClick einfügst begin //hier der Code, wenn die Mouse auf dem Text ist. //z.b. JvRichEdit1.SelStart := 0; JvRichEdit1.SelLength := Length(Text1); if not (fsUnderline in JvRichEdit1.SelAttributes.Style) then begin JvRichEdit1.SelAttributes.Style := JvRichEdit1.SelAttributes.Style + [fsUnderline]; end; JvRichEdit1.Cursor:=crHandpoint; Caption := IntToStr(Zeile); // die Zeile über der die Maus ist break; end else begin //und hier schreibste rein wie er normal aussehen soll. //z.b. JvRichEdit1.SelStart := 0; JvRichEdit1.SelLength := Length(Text1); if fsUnderline in JvRichEdit1.SelAttributes.Style then begin JvRichEdit1.SelAttributes.Style := JvRichEdit1.SelAttributes.Style - [fsUnderline]; JvRichEdit1.Cursor:=crDefault; end; end; end; end; |
Re: Text in Richedit anklicken
Ich habe gemerkt es gibt ein prob mit dem SelStart, da er immer von der Ersten Buchstaben in der Liste ausgeht. Mann mus irgendwie die ganzen Zeilen die davor waren deren ihre Länge zum SelStart dazuzählen....Aber nun ja ich kümmer mich drum muss nur jetzt weg.
|
Re: Text in Richedit anklicken
So hmmm also nach langem hin und her hab ich es hinbekommen das er den Text unterstreichst aber der Cursor will net ändern....hm :gruebel:
Und wenn man auf das Memo klickt, wird ja SelStart und SelLenght gesetz welches ja beim MouseMove geändert wird wiederum, deshalb entsteht ein flackern Vll bekommst du den Fehler raus.. hier der Code
Delphi-Quellcode:
So hoffe ich konnte dir ein wenig Helfen..bin mit meinem Latein echt am ende.. Am Besten due Schreibst dir eine eigene Kompo, die den Normalen SelStart und SelLenght überschreibt....
var Test : TSize;
Rect1 : TRect; TextHoehe : Integer; Zeile : Integer; Text1 : String; SelStart1,SelLenght1 : Integer; begin for Zeile := 0 to RichEdit1.Lines.Count -1 do begin //Zeile in der der Text steht (Index der Linesliste +1 des RichEdits) Text1 := Copy(RichEdit1.Lines[Zeile],1,Pos(':',RichEdit1.Lines[Zeile])-2); //Text in der Zeile der Vorne steht; GetTextExtentPoint32(GetDC(RichEdit1.Handle), PChar(Text1), Length(Text1), Test); //WinApi Funktion, welche die Höhe und die Breite des Textes ausgibt TextHoehe := -RichEdit1.Font.Height; //Höhe der Schrift allgemein Rect1 := Rect(0,Zeile*TextHoehe,Test.cx,Zeile*TextHoehe + TextHoehe); //Bereich festlegen, wo der Text ist, dabei sit vorausgesetz das der Text immer vorne steht if (y >= Rect1.Top) and (y <= Rect1.Bottom) and (X <= Rect1.Right) then //Überprüfung ob die Mouse in Rect (speicher am besten x,y von MouseMove und setze //die Variable für X und Y ein, wenn du die Anweisung hier in DbClick einfügst begin if (SelectRect.Top <> Rect1.Top) and (SelectRect.Bottom <> Rect1.Bottom) then begin SelectRect.Top := Rect1.Top; SelectRect.Bottom := Rect1.Bottom; SelStart1 := RichEdit1.SelStart; SelLenght1 := RichEdit1.SelLength; RichEdit1.SelStart := SendMessage(RichEdit1.Handle, EM_LINEINDEX, Zeile, 0);; RichEdit1.SelLength := Length(Text1); if not (fsUnderline in RichEdit1.SelAttributes.Style) then RichEdit1.SelAttributes.Style := RichEdit1.SelAttributes.Style + [fsUnderline]; RichEdit1.Cursor:=crHandpoint; RichEdit1.SelStart := SelStart1; RichEdit1.SelLength := SelLenght1; end; end else begin SelStart1 := RichEdit1.SelStart; SelLenght1 := RichEdit1.SelLength; RichEdit1.SelStart := SendMessage(RichEdit1.Handle, EM_LINEINDEX, Zeile, 0);; RichEdit1.SelLength := Length(Text1); if fsUnderline in RichEdit1.SelAttributes.Style then RichEdit1.SelAttributes.Style := RichEdit1.SelAttributes.Style - [fsUnderline]; RichEdit1.Cursor:=crDefault; RichEdit1.SelStart := SelStart1; RichEdit1.SelLength := SelLenght1; end; end; end; |
Re: Text in Richedit anklicken
Also ich glaube am besten wäre das mit so ne art dummyzeichen die man vor und nach dem namen setzt.
Aber gibt es irgendwelche dummyzeichen die man nicht sieht und auch keinen effekt haben? |
Re: Text in Richedit anklicken
Vieleicht solltest du dein Problem noch einmal besser schildern.
Wenn du einen Chat aufbaust und jetzt jemand schreibt oder antwortet wird zum Anfang der Name gesetzt den du ganz einfach mit Pos, Copy etc. herrausfinden kannst ist ja der erste String in der Zeile. |
Re: Text in Richedit anklicken
Ja es ist folgendermaßen ich möchte gerne in meinem Chat, dass der Benutzernamen anklickbar ist damit ich z.b. Eine Private Nachricht schicken kann.
Dies sollte möglichst universell sein damit ich auch mitten im Text Wörter benutzen kann die anklickbar sind. Also wäre glaube ich die beste methode wenn ich zeichen vor und nach dem Namen setze die nicht sichtbar sind. Also beispielsweise $Mustermann$ dann könnte ich ja herausfinden was name und was text ist. Nur brauche ich da zeichen im Text die man nicht sieht. Wenn das so möglich wäre, wäre das am besten. Ich hoffe ich hab das so erklärt, dass man das versteht :-D |
Re: Text in Richedit anklicken
Hi
Ich hätte dir noch eine Alternative. Ich hab erst neulich auch ein kleines Chatprogramm realisiert und da habe ich auch ein wenig angestanden bei der Textformatierung. Ich hab dann einfach ![]() Hier noch mein Beispiel: ![]() |
Re: Text in Richedit anklicken
Hier ein Beispiel wie du wörter unter dem Cursor erkennen kannst, vieleicht hilft dir das ja schon etwas weiter.
Delphi-Quellcode:
procedure TForm1.RichEdit1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer); Var pt:tpoint; i,iAnfang,iEnde:integer; s:string; begin pt:= point(x,y); //wo steht der Cursor im memo? i := RichEdit1.Selstart; //anfang und ende suchen iAnfang := i; iEnde := i; while (iAnfang>0) and (not (RichEdit1.Text[iAnfang] in [' ','.',',',';',#13,#10]) ) do dec(ianfang); while (iEnde<length(RichEdit1.Text)) and (not (RichEdit1.Text[iEnde] in [' ','.',',',';',#13,#10]) ) do inc(iEnde); s:=copy(RichEdit1.Text,iAnfang+1,iEnde-iAnfang-1); Label.Caption := s; end; |
Re: Text in Richedit anklicken
Ok ich werde mir das beides mal anschauen aber mit dem HTMLViewer das ist ne geniale idee.
Ich wußte garnicht, dass es so ne Kompo gibt, vielen Dank. |
Re: Text in Richedit anklicken
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
Zitat:
Dazu muss man die Unit RichEdit einbinden und TCharFormat2 verwenden. Hier die zwei Routinen die Du dafür benötigst:
Delphi-Quellcode:
//selektierten Text verbergen
procedure SetHidden(RE: TRichEdit); var CharFormat : TCharFormat2; begin FillChar(CharFormat, SizeOf(CharFormat),0); CharFormat.cbSize := SizeOf(CharFormat); CharFormat.dwMask := CFM_HIDDEN; CharFormat.dwEffects := CFM_HIDDEN; SendMessage(RE.Handle, EM_SETCHARFORMAT,SCF_SELECTION,lparam(@CharFormat)); end; //ist selektiertes Zeichen verborgen? function GetHidden(RE: TRichEdit): Boolean; var CharFormat : TCharFormat2; begin FillChar(CharFormat, SizeOf(CharFormat),0); CharFormat.cbSize := SizeOf(CharFormat); CharFormat.dwMask := CFM_HIDDEN; SendMessage(RE.Handle, EM_GETCHARFORMAT,SCF_SELECTION,lparam(@CharFormat)); Result := CharFormat.dwEffects and CFM_HIDDEN <> 0; end; Das Demo(Delphi 3) im Anhang zeigt das Verbergen von '#' und das Erkennen der verborgenen Zeichen. |
Re: Text in Richedit anklicken
Ich bräuchte nur noch hilfe dabei wie ich den Text in den HTML Viewer bekomme.
Ich könnte zwar bei jeder nachricht die HTML Datei bearbeiten und dann nen Reload ausführen. Das ist aber glaube ich nicht so das ressourcen schonenste. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:10 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