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 THTMLViewer genommen, damit lässt sich alles was du willst sehr einfach realisieren! Hier noch mein Beispiel: UDP Secure LAN Chat |
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. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:43 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