Richedit-Kelime isaretleme

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Orhan
Üye
Mesajlar: 32
Kayıt: 09 May 2005 03:35
Konum: Almanya

Richedit-Kelime isaretleme

Mesaj gönderen Orhan »

Hayirli Ramazanlar

Web sayfalarinda oldugu gibi. kelimenin uzerine fareyle gidildiginde kelimenin altinin cizilmesi veya renklendirilmesi veya sisirilmesi Richeditte mumkunmu.

Yani cumle icinde herhangi bir kelimeyle kontrol yapmak istiyorum.
ilginizden dolayi simdiden tesekkurler

Selamlar
Kullanıcı avatarı
mucar
Kıdemli Üye
Mesajlar: 247
Kayıt: 17 May 2005 01:14

Mesaj gönderen mucar »

Merhaba size de hayırlı ramazanlar,

İstediğiniz tam olarak nedir onu bilmiyorum ama biraz uğraştım şöyle bir şey çıktı işinize yarar mı bilmiyorum, bir bakarsınız. Burada richeditin içinde bir yazı mevcut. Yazıdaki kelimenin üstüne gelince richeditte bu kelimeyi arayıp bu kelimeden ne kadar varsa hepsini renklendiriyor. Siz isteğinize göre şekillendirirsiniz bunu.

Kod: Tümünü seç

uses Richedit;
...
procedure TForm1.RichEdit1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
  iCharIndex, iLineIndex, iCharOffset, i, j,p: Integer;
  Pt: TPoint;
  s,kelime: string;
begin
with TRichEdit(Sender) do
  begin
    Pt := Point(X, Y);
    // İmlecin altındaki kelimenin karakteri indexi değişkene atanıyor
    iCharIndex := Perform(Messages.EM_CHARFROMPOS, 0, Integer(@Pt));
    if iCharIndex < 0 then Exit;
    // Satır indexi değişkene atanıyor
    iLineIndex  := Perform(EM_EXLINEFROMCHAR, 0, iCharIndex);
    iCharOffset := iCharIndex - Perform(EM_LINEINDEX, iLineIndex, 0);
    if Lines.Count - 1 < iLineIndex then Exit;
    // Mevcut satır değişkene kaydediliyor
    s := Lines[iLineIndex];
    // Kelimenin başlangıcı aranıyor
    i := iCharOffset + 1;
    while (i > 0) and (s[i] <> ' ') do Dec(i);
    // Kelimenin bitişi aranıyor
    j := iCharOffset + 1;
    while (j <= Length(s)) and (s[j] <> ' ') do Inc(j);
    // İmlecin altında bulunan yazı değişkene atanıyor
    kelime:= Copy(s, i, j - i);

    //<----üstüne gelinen kelimeyi renklendirme başlangıcı
    p := RichEdit1.FindText(kelime, 0, Length(RichEdit1.Text),[stMatchCase]);
    while p <> -1 do
      begin
        RichEdit1.selstart := p;
        RichEdit1.SelLength := Length(kelime);
        Richedit1.SelAttributes.Style := [fsBold];
        RichEdit1.SelAttributes.Color:=clPurple;
        p := RichEdit1.FindText(kelime, Richedit1.SelStart+1,Length(RichEdit1.Text), [stMatchCase]);
    end;
    //üstüne gelinen kelimeyi renklendirme bitisi---->
  end;
end;
Kolay gelsin
"Evine bakmaktan aciz olan; ilerici, üç kıtaya hükmeden ecdadın mı gerici?"
Orhan
Üye
Mesajlar: 32
Kayıt: 09 May 2005 03:35
Konum: Almanya

Richedit-Kelime isaretleme

Mesaj gönderen Orhan »

Hayirli Ramazanlar

Elinize kolunuza gonlunuza saglik
Anlatmak istedigim sey bu formun basindaki ""SSS" Arama" Uye Listesi" vs. fareyle uzenine gidildiginde "kirmizi renklenmesi-altinin cizilmesi" idi.
Ayni yontem Richeditte olabilirmi diyeydi.

Kodu denerim insa.
menderes

Mesaj gönderen menderes »

Jedi bileşenlerinde RichEdit url özelliği var(web adresi yazarken köprüyü kuruyor, aynı zamanda eventsinde onurlclick olayı, işinizi görür mü bilmiyorum. Ücretsiz bileşen kurulumu da forumda mevcut, bir bakın isterseniz.Ayrıca forumda da bayağı bahsediliyor bu bileşen..
viewtopic.php?t=7702&highlight=jedi
Orhan
Üye
Mesajlar: 32
Kayıt: 09 May 2005 03:35
Konum: Almanya

Meramimi anlatamadin ozur

Mesaj gönderen Orhan »

Hayirli ramazanlar

Hepinizin ilgisine, elinize, gonlunuze saglik

Meramimi anlatamadim. Soyle diyeyim: Richeditte "Allah muminlerin yardimcisidir" diye bir cumle var. Ben bu cumlenin icinden bir kelimeyle bir olayi kontrol etmek istiyorum.

Ornegin: "Allah"in uzerine fareyle gittigimde burada bir olay meydana gelmesi lazimki yazdigim kodda bir kontrol yapabileyim.

Burada "Allah" isminin uzerindeyken markalamadan ya "Renk" degismesi lazim veya "Allah"in alti cizilmesi"lazimki bir olay meydana gelsin, bu olaydan sonra kontrol yapilabilsin.

Yani cumle icinde (Richedit) tipki bilesenlerin "hint"i gibi bir cok kelimeye aciklama yazilmasi lazim. Bu aciklamalarda kelimenin uzerine fareyle gidildiginde o kelimeyle kontrol edilip bir richeditte goruntulenecek.

Ben bunu selsatart ve sellength ile yapmaya calistim olmadi.

Tesekkurler
menderes

Re: Meramimi anlatamadin ozur

Mesaj gönderen menderes »

Orhan yazdı:Hayirli ramazanlar

Hepinizin ilgisine, elinize, gonlunuze saglik

Meramimi anlatamadim. Soyle diyeyim: Richeditte "Allah muminlerin yardimcisidir" diye bir cumle var. Ben bu cumlenin icinden bir kelimeyle bir olayi kontrol etmek istiyorum.

Ornegin: "Allah"in uzerine fareyle gittigimde burada bir olay meydana gelmesi lazimki yazdigim kodda bir kontrol yapabileyim.

Burada "Allah" isminin uzerindeyken markalamadan ya "Renk" degismesi lazim veya "Allah"in alti cizilmesi"lazimki bir olay meydana gelsin, bu olaydan sonra kontrol yapilabilsin.

Yani cumle icinde (Richedit) tipki bilesenlerin "hint"i gibi bir cok kelimeye aciklama yazilmasi lazim. Bu aciklamalarda kelimenin uzerine fareyle gidildiginde o kelimeyle kontrol edilip bir richeditte goruntulenecek.
Öncelikle RichEdit 'e sen (funksiyon veya procedure) ile belirtmezsen nerden bilecek senin hangi kelime hakkında bilgi ve olay istediğini bu bir,
dediğin olayı bir dini cd içerisinde görmüştüm...
Ama açıklanmasını istediğin kelimelerle ilgili başka bir bilgi deposu olması gerekir. Burada yazdığın prosedure içerisine anılı kelimelerin bu depodan karşılığını çağırmasını ve yine buraya bir başka yerde oluşturacağın procedure yi tetiklemesi için bir olay yazmak gerekir ki bu da o bilgi deposundaki istenen bilgiyi ekrana getirsin.
Tekrar kolay gelsin....
Kullanıcı avatarı
mucar
Kıdemli Üye
Mesajlar: 247
Kayıt: 17 May 2005 01:14

Mesaj gönderen mucar »

Tekrar merhaba,

önce gönderdiğim kod üzerinde biraz değişiklik yaptım. Açıklamayı diğer bir richeditte göstermek istediğinizi söylemişsiniz. Ben de form üzerine iki richedit koydum, birincisinde asıl metin olacak. ikincisi boş olacak, açıklamalar burada gösterilecek. Örnek olsun diye iki kelime için yapmaya çalıştım.

Kod: Tümünü seç

procedure TForm1.RichEdit1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
  iCharIndex, iLineIndex, iCharOffset, i, j,p: Integer;
  Pt: TPoint;
  s,kelime: string;
begin
 with TRichEdit(Sender) do
  begin
    Pt := Point(X, Y);
    // İmlecin altındaki kelimenin karakteri indexi değişkene atanıyor
    iCharIndex := Perform(Messages.EM_CHARFROMPOS, 0, Integer(@Pt));
    if iCharIndex < 0 then Exit;
    // Satır indexi değişkene atanıyor
    iLineIndex  := Perform(EM_EXLINEFROMCHAR, 0, iCharIndex);
    iCharOffset := iCharIndex - Perform(EM_LINEINDEX, iLineIndex, 0);
    if Lines.Count - 1 < iLineIndex then Exit;
    // Mevcut satır değişkene kaydediliyor
    s := Lines[iLineIndex];
    // Kelimenin başlangıcı aranıyor
    i := iCharOffset + 1;
    while (i > 0) and (s[i] <> ' ') do Dec(i);
    // Kelimenin bitişi aranıyor
    j := iCharOffset + 1;
    while (j <= Length(s)) and (s[j] <> ' ') do Inc(j);
    // İmlecin altında bulunan yazı değişkene atanıyor
    kelime:= Copy(s, i, j - i);


    if pos('Allah',kelime)>0 then
    begin
        RichEdit2.Text:='Aciklama1';
        // veya richedit1.showhint:=true;  richedit1.hint:='Aciklama1';
        p := RichEdit1.FindText(kelime, iCharIndex-Length(kelime), iCharIndex+Length(kelime),[stMatchCase]);
        RichEdit1.selstart := p;
        RichEdit1.SelLength := Length(kelime);
        //Richedit1.SelAttributes.Style := [fsBold,fsUnderline];
        //RichEdit1.SelAttributes.Color:=clPurple;
    end
    else if pos('ramazan',kelime)>0 then
    begin
        RichEdit2.Text:='Aciklama2';
        // veya richedit1.showhint:=true;  richedit1.hint:='Aciklama2';
        p := RichEdit1.FindText(kelime, iCharIndex-Length(kelime), iCharIndex+Length(kelime),[stMatchCase]);
        RichEdit1.selstart := p;
        RichEdit1.SelLength := Length(kelime);
        //Richedit1.SelAttributes.Style := [fsBold,fsUnderline];
        //RichEdit1.SelAttributes.Color:=clPurple;
    end
    else
    begin
    RichEdit2.Text:='';
    RichEdit1.selstart := 0;
    RichEdit1.SelLength := 0;
    end;
 end;
end;
Birinci richedite bir text koyun, bu text içerisinde "Allah" ve ramazan kelimeleri geçsin. Bu şekilde bir bakın. Sizin dediğinize yakın işlev görüyor. Yalnız büyük küçük harf duyarlı oluyor. Umarım işinize yarar
"Evine bakmaktan aciz olan; ilerici, üç kıtaya hükmeden ecdadın mı gerici?"
Orhan
Üye
Mesajlar: 32
Kayıt: 09 May 2005 03:35
Konum: Almanya

Kelimeyle kontrol

Mesaj gönderen Orhan »

Hayirli Ramazanlar

Ilgilerinizden dolayi hepinize tesekkurler.

Ayni yontemi bende denemistim, fakat bana cok mantikli gelmedigi icin, cokta kod gerektigi icin vaz gecmistim. Yani mantik asagi yukari ayni. Richeditte bir kelimeyle kontrol edip ayni kelimeye hint yazmak veya aciklama yazmak vs. Baska farkli metotlar deneyecegim olmazsa bu metodu herhalde kullanirim.

Ozellikle ilgilerinizden dolayi tesekkurden baska yapabileck bir seyim yok

Hos ve saglikli kalin
Cevapla