Delphi-PRAXiS
Seite 3 von 4     123 4      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Text in Richedit anklicken (https://www.delphipraxis.net/137004-text-richedit-anklicken.html)

NickelM 13. Jul 2009 14:06

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;

NickelM 13. Jul 2009 14:31

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.

NickelM 13. Jul 2009 18:41

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:
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;
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....

XXcD 13. Jul 2009 19:23

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?

Blackheart 13. Jul 2009 20:28

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.

XXcD 13. Jul 2009 23:47

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

cherry 14. Jul 2009 06:42

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

Blackheart 14. Jul 2009 06:47

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;

XXcD 14. Jul 2009 09:21

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.

Lannes 14. Jul 2009 09:54

Re: Text in Richedit anklicken
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
Zitat:

Zitat von XXcD
Nur brauche ich da zeichen im Text die man nicht sieht.
Wenn das so möglich wäre, wäre das am besten.

das ist möglich.

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 16:33 Uhr.
Seite 3 von 4     123 4      

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