richedit

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

- Mesajımı eksik okudunuz anlaşılan... Mesajımda Türkçe harf araması yaparsanız bulamayacağınızı bildirmiştim...

- İsterseniz deneyin... polis değil de Türk kelimesini aratın bakalım bulabilecek mi ...

- Bulamayacaktır. Sebebini ise uzunca bir mesaj yazdım size bunun sebebini kavrayın diye... Lütfen tekrar okuyunuz...
Resim
Resim ....Resim
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

- Sen cevabı arayadur, RichEdit'in renklerini değiştirmek için sorduğun sorunun cevabını vereyim aslında Delphi'nin help'inde mevcut...

- DBRichEdit üzerinde değişiklik yapmak istersen, kaydı etkiler... Forma başka normal bir RichEdit koyup, DataSource'un DataChange olayında DBRichEdit'in Text'ini aktarırsın... Kullanıcı görsel olarak burada işlemlerini yürütür...

Kod: Tümünü seç

Procedure TForm1.Renklendir(Rich:TRichEdit);
var
  Bulundu, Baslangic, Sonu: Integer;
begin
  With Rich do
  begin
    Text := DBRichEdit1.Text;
    SelectAll;
    SelAttributes.Style := SelAttributes.Style-[fsBold];
    SelAttributes.Color := clBlack;
    SelStart := 0;
    Bulundu := 0;
    Baslangic := 0;

      Sonu := Length(Text) - Baslangic;
      Bulundu := FindText(Edit1.Text, Baslangic, Sonu, [stMatchCase]);
      if Bulundu <> -1 then
      begin
        SetFocus;
        SelStart  := Bulundu;
        SelLength := Length(Edit1.Text);
        SelAttributes.Style := [fsBold];
        SelAttributes.Color := clGreen;
      end;
  end; // With Rich
  DBGrid1.SetFocus;
end;
Resim
Resim ....Resim
Kullanıcı avatarı
mepc
Üye
Mesajlar: 191
Kayıt: 26 Eyl 2003 11:39
Konum: Ankara

Mesaj gönderen mepc »

Arkadaşlar paradoxta memo alanlarda like kullanımı konusu doğrusu bana çok yardımcı oldu. Daha önce denedim ama başaramamıştım.

Bulduğun alanları şöyle renklendirebilirsin

with richedit1 do
begin

if sellength <>0 then
startpos:=selstart+sellength

else

startpos:=selstart;

toend:=length(text)-startpos;

foundat:=findtext('polis',startpos,toend,[]);

if foundat <> -1 then
begin
selstart:=foundAt;
sellength:=length('polis');
selattributes.color:=clred;

end;
Bilgi paylaşıldıkça güzeldir.
hacikisi
Üye
Mesajlar: 64
Kayıt: 24 Şub 2004 07:29
Konum: Gaziantep

Mesaj gönderen hacikisi »

sayın mrmcop:
Procedure TForm1.Renklendir(Rich:TRichEdit);
var
Bulundu, Baslangic, Sonu: Integer;
diye devam eden prosedürü ekleyip run ettiğinde Tform1.renklendir burda hata gösteriyor. Eksik Birşeylermi yaptık acaba
Siz İman Etmedikçe Cennete Giremezsiniz. Birbirinizi Sevmedikçede İman Etmiş Olamazsınız.

Hz.Muhammed (S.A.V.)
Resim
Kullanıcı avatarı
mussimsek
Admin
Mesajlar: 7601
Kayıt: 10 Haz 2003 12:26
Konum: İstanbul
İletişim:

Mesaj gönderen mussimsek »

baş tarafa (interface kısmında) tanımını eklediniz mi?
hacikisi
Üye
Mesajlar: 64
Kayıt: 24 Şub 2004 07:29
Konum: Gaziantep

interface

Mesaj gönderen hacikisi »

interfaceye neyi tanımlayacağım bilmiyorum . daha açık yazabilirmisiniz.
Siz İman Etmedikçe Cennete Giremezsiniz. Birbirinizi Sevmedikçede İman Etmiş Olamazsınız.

Hz.Muhammed (S.A.V.)
Resim
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Mesaj gönderen gkimirti »

form dahilinde procedure olusturmayı biliyorsanız yukarıdakileri rahatlıkla yapabilirsiniz
eger bilmiyorsanız bunu anlatan turkce kitaplardan yada internet uzerinden indirilebilen (mesela delphiye giris isimli bir chm) bir cok ebook tan ogrenebilirsiniz
sanki bana biraz tumdengelim ile problemleri cozuyorsunuz gibi geldi
ÜŞENME,ERTELEME,VAZGEÇME
Kullanıcı avatarı
mussimsek
Admin
Mesajlar: 7601
Kayıt: 10 Haz 2003 12:26
Konum: İstanbul
İletişim:

Mesaj gönderen mussimsek »

hocam izahı uzun, detayını inşallah bir sonraki seminerde Hüseyin anlatır :)

unitin en başında private, public gibi 2 tane kısım var. public kısmına (public kelimesinin altına)

Procedure Renklendir(Rich:TRichEdit);

kodunu ekle.

NOT : Hata alırsanız, hatayı tam olarak yazmanız problemi çözmede çok yardımcı olur. Hatta varsa hata kodunu da belirtin.

Kolay gelsin.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

@Admin ve @gkimirti

- Arkadaşlar benim hatam.. Her zaman dikkat ettiğim şeye bu sefer aynı hassasiyeti göstermemişim...

- @hacikisi'ye yazdığım cevap sırasında, ilgilendiği bu konu ile kendisinin Delphi hakimiyeti konusundaki yanılgımdan dolayı detaya inmemiştim... Artık detay diyorum, Delphi IDE ve programlama kurallarına hakim olduğunu değerlendirmiştim...

@hacikisi

- Delphi programcılığında, kullandığın formun üzerine bir nesne koyduğunda (RichEdit, DBGrid vb.), bu nesneyi kullanabilmek için yazdığın Procedure veya Function'un bu forma bağlı olması (en azından şu bilgi düzeyinde) gerekir. :idea: Sebebi ise Procedure içerisinde RichEdit1 veya DBGrid1 dediğinde hangi formdaki nesneyi belirttiğinizi delphi bilebilsin diye...

- Formunuzun adı (Name) AnaMenu olsaydı, Procedure ve Function kelimelerinden sonra dikkat edin TAnaMenu şeklinde bir tanım ve devamında procedure'ünüzün adını görecektiniz...

- Ben sizin projede forum adını Form1 olarak kabul ettim. Çünkü yeni form koyduğunuzda Form1, sonraki eklenen formlar Form2 vb. otomatik isim alır...

- Bir de bir forma adanmış Procedure veya Function ek olarak mutlaka! en üstte Public veya Private kısmında da tanımlanması gerekir ki Delphi, liste olarak oradan bu tip bir tanımın var olduğunu görebilsin ve Form'a ait olduğundan emin olsun...

- Private ve Public kısımlarındaki tanım ile aşağıdaki kodların yazıldığı tanım arasındaki benzerlik/fark'ı bir inceleyin... Ufak bir fark vardır... Yukardaki kısımlar zaten o formun Type başlığına dahil olduğundan, procedure veya function başına TForm1 vs. gibi ön tanım koymaya gerek olmaz ve de konursa da hata olur...

Kod: Tümünü seç

Procedure TForm1.Renklendir(Rich:TRichEdit);
...Kod satırında, Renklendir isimli procedure tanımımın Form1 isimli forma adandığını bildirmiş oldum...

Şimdi yapmanız gereken şey, yukarda Public veya Private aynı unit içerisinde farketmez, hemen altına yeni bir satır açıp şu satırı eklenemiz gerekiyor...

Kod: Tümünü seç

    procedure Renklendir(Rich:TRichEdit);
:idea: Delphi IDE programcılar için bir kolaylık da düşünmüşler... Yukarda anlattıklarımı kural olarak kavrayın ve aşağıda anlatacağım şey ile bunu tek tuşla nasıl yapabileceğinizi görün...

Kod: Tümünü seç

Procedure TForm1.Renklendir(Rich:TRichEdit);
satırının üzerine gelin...
Ctrl+Shift+C tuş kombinasyonuna basarsanız, Delphi IDE sizin için yukarda Private kısmına yukarda anlattığım tanımı ekler.. :o

- Ekstra bir procedure / function neyse neden ihtiyaç duyuluyor diye bir soru gelebilir aklınıza...
:idea: Programın her yerinden sadece tek bir satır kod yazarak bu procedure'e ulaşabilir ve istediğiniz işlemi yapabilesiniz diye...

- Örneğin burada DataSource'unuzun OnDataChange olayına sadece

Kod: Tümünü seç

  Renklendir(RichEdit1);
satırını yazdığınızda siz, kayıtlar üzerinde gezinirken, o kayda ait RichEdit veri okunarak renklendirilir...

- Bu yazıyı hem sorununuzun çözümü hem de Procedure ve Function tanımı hakkında bilgi edinmeniz için yazdım... :idea:
Resim
Resim ....Resim
hacikisi
Üye
Mesajlar: 64
Kayıt: 24 Şub 2004 07:29
Konum: Gaziantep

Mesaj gönderen hacikisi »

Muharrem Bey yardımlarınızdan dolayı çok teşekkür ederim. İşimi görür. Saygılar Sunuyorum.
Siz İman Etmedikçe Cennete Giremezsiniz. Birbirinizi Sevmedikçede İman Etmiş Olamazsınız.

Hz.Muhammed (S.A.V.)
Resim
hacikisi
Üye
Mesajlar: 64
Kayıt: 24 Şub 2004 07:29
Konum: Gaziantep

sonuç Olarak

Mesaj gönderen hacikisi »

Son Aşama olarak Diğer üyelerinde faydalanması için uniti kopyala yapıştır yapmak isdedim. MrmCop'a Teşekkürler.

Kod: Tümünü seç

Function RtfYap(Yazi:String):String;
begin
  Yazi := StringReplace( Yazi, 'Ç', '\''c7', [rfReplaceAll] );
  Yazi := StringReplace( Yazi, 'İ', '\''dd', [rfReplaceAll] );
  Yazi := StringReplace( Yazi, 'Ö', '\''d6', [rfReplaceAll] );
  Yazi := StringReplace( Yazi, 'Ş', '\''de', [rfReplaceAll] );
  Yazi := StringReplace( Yazi, 'Ü', '\''dc', [rfReplaceAll] );
  Yazi := StringReplace( Yazi, 'Ğ', '\''d0', [rfReplaceAll] );
  
  Yazi := StringReplace( Yazi, 'ç', '\''e7', [rfReplaceAll] );
  Yazi := StringReplace( Yazi, 'ı', '\''fd', [rfReplaceAll] );
  Yazi := StringReplace( Yazi, 'ö', '\''f6', [rfReplaceAll] );
  Yazi := StringReplace( Yazi, 'ş', '\''fe', [rfReplaceAll] );
  Yazi := StringReplace( Yazi, 'ü', '\''fc', [rfReplaceAll] );
  Yazi := StringReplace( Yazi, 'ğ', '\''f0', [rfReplaceAll] );
  Result := Yazi;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Table1.Active := True;
end;

procedure TForm1.DBMemo1DblClick(Sender: TObject);
begin
    DBMemo1.Lines.SaveToFile(ExtractFilePath(Application.ExeName)+'ARA.TXT');
end;

procedure TForm1.Button3Click(Sender: TObject);
Var
  Bulundu : TStringList;
  Sayac   : Integer;
  Adi,
  Soyadi  : String;
begin
  With Query1 do
  begin
    Active := False;
    SQL.Clear;
    SQL.Add('Select * from "c:\richedit\data\data.db"');
    Active := True;
    Bulundu := TStringList.Create;
    Repeat
      If DBRichEdit1.FindText(Edit1.Text, 0, Length(DBRichEdit1.Text), [stMatchCase]) <> -1
         then Bulundu.Add(FieldByName('Adi').AsString+'|'+FieldByName('Soyadi').AsString);
      Next;
    Until EOF;

    If Bulundu.Count > 0 then
    begin
      Active := False;
      SQL.Clear;
      SQL.Add('Select * from "c:\richedit\data\data.db"');
      For Sayac := 0 to Bulundu.Count-1 do
      begin
        Soyadi := Bulundu[Sayac];
        Adi    := QuotedStr(Copy(Soyadi, 1, Pos('|', Soyadi)-1));
        Soyadi := QuotedStr(Copy(Soyadi, Pos('|', Soyadi)+1, 999));
        If Sayac > 0
          then SQL.Add(Format('OR    (Adi = %s and Soyadi = %s)', [Adi, Soyadi]))
          else SQL.Add(Format('WHERE (Adi = %s and Soyadi = %s)', [Adi, Soyadi]));
      end; // For Sayac
      Active := True;
    end // If Bulundu
    else
    begin
      ShowMessage('Aradığınız kelime kayıtlarda mevcut değil');
      Active := False;
    end;
    Bulundu.Free;
  end; // Query1
end;

Procedure TForm1.Renklendir(Rich:TRichEdit);
var
  Bulundu, Baslangic, Sonu: Integer;
begin
  With Rich do
  begin
    Text := DBRichEdit1.Text;
    SelectAll;
    SelAttributes.Style := SelAttributes.Style-[fsBold];
    SelAttributes.Color := clBlack;
    SelStart  := 0;
    Baslangic := 0;

      Sonu := Length(Text) - Baslangic;
      Bulundu := FindText(Edit1.Text, Baslangic, Sonu, [stMatchCase]);
      if Bulundu <> -1 then
      begin
        SetFocus;
        SelStart  := Bulundu;
        SelLength := Length(Edit1.Text);
        SelAttributes.Style := [fsBold];
        SelAttributes.Color := clGreen;
    end;
  end; // With RichEdit1
  DBGrid1.SetFocus;
end;

procedure TForm1.DataSource1DataChange(Sender: TObject; Field: TField);
begin
  Renklendir(RichEdit1);
end;

end.
Siz İman Etmedikçe Cennete Giremezsiniz. Birbirinizi Sevmedikçede İman Etmiş Olamazsınız.

Hz.Muhammed (S.A.V.)
Resim
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Buradan da yayınlamak istedim...

- RichEdit içerisinde bulunan aynı kelimelerin hepsini renklendiren Procedure aşağıdaki şekildedir...

Kod: Tümünü seç

Procedure TForm1.Renklendir(Rich:TRichEdit);
var
  Bulundu: LongInt;
  Baslangic, Sonu: Integer;
begin
  With Rich do
  begin
    Text := DBRichEdit1.Text;
    SelectAll;
    SelAttributes.Style := SelAttributes.Style-[fsBold];
    SelAttributes.Color := clBlack;
    SelStart := 0;
    Bulundu := 0;
    While Bulundu <> -1 do // Arka arkaya, bulamayana kadar arasın diye
    begin
      if SelLength <> 0
      then Baslangic := SelStart + SelLength
      else Baslangic := 0;

      Sonu := Length(Text) - Baslangic;
      Bulundu := FindText(Edit1.Text, Baslangic, Sonu, [stMatchCase]);
      if Bulundu <> -1 then
      begin
        SetFocus;
        SelStart  := Bulundu;
        SelLength := Length(Edit1.Text);
        SelAttributes.Style := [fsBold];
        SelAttributes.Color := clGreen;
      end;
    end;
  end; // With RichEdit2
  DBGrid1.SetFocus;
end;
- Çalışmalarında başarılar...
Resim
Resim ....Resim
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2248
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Mesaj gönderen Kuri_YJ »

Herkese Selamlar,

Öncelikle verdiğim bilginin, yanıltıcı bir şekilde bilgi anlatıldığı için herkesten, herkes adına özür diliyorum. Kasdettiğim şey, eğer yazdığım yanıt tam olarak okuyunca anlaşılabiliyor.
Kuri_TLJ anlatmaya çalışmış ama sanırım tam ifade edemeden yazdı:
Merhaba,

Bildiğim ve denediğim kadarı ile paradox'ta Memo field'lar için LIKE kullanımı sözkonusu değil. Bunun yerine farklı bir metod uygulayıp yapabilirsin. Memo Field'ı kelimlere parçalayıp bir yardımcı table'a sıra ile bu memofielddaki kelimleri Insert edersin ve her insert ettiğin kelimenin hangi record'taki memofielddan alındığını belirtmek için bir Key alan tutarsın.

Örneğin,
Kod:


TABLO1

Tablo1.MakaleID AUTOINC
Tablo1.MakaleAdi ALPHA 30
Tablo1.MakaleYazari ALPHA 25
Tablo1.Makale MEMO 10

TABLO2

Tablo2.Tablo1MakaleID INTEGER
Tablo2.Kelime ALPHA 30




şeklinde tablo yapılarını oluştur. MemoField'ın içinde geçen her kelimeyi tek tek TABLO2'ye insert et ve arama yapılırken, eğer arama MemoField üzerinde olacaksa, sen dönüp tablo2'de aramanı gerçekleştir.

Uyarı : Like kullanımı ağır olur (Paradox için)

Ayrıca Türkçe Karakterlerde arama yaparken Küçük/Büyük Harf ayrımı yapacaksan nazaran daha hızlı olur ama yapmayacaksan hepsini Büyük harfe çevirip yazman gerekir aks takdirde UPPER() komutunu kullanırsın, bunu da kullandığında bu da ekstra bir yavaşlama getirir. Kayıt sayısı çok ise (onbinlerle ifade ediliyorsa,) paradoxtan vazgeç bu iş için uygun değil !... Verimli olmaz başka bir DB seç ve özellikle SQL Based bir DB olsun FireBird veya Interbase gibi. :

Kolay Gelsin
Aslında LIKE'ın kullanılabildiğini ancak istenilen sonucun alınamayacağını kasdediyordum. Yani Türkçe Karakterlerde sorun yaşanacağı ve UPCASE yada UPPER gibi SQL fonksiyonlarının Local SQL'de (Capability Not Supported gibi) hata alınacağını ve desteklenmediğini, bu sebeple aramaların tam randımanlı çalışmayacağını kasdetmiştim.

Şöyle örneklendirerek izah etmeye çalışayım,
Bir makalenin kopyasının oluşturulduğu (RTF olabilir, Memo TEXT olabilir) bu şekilde bir kayıtta küçük harf ve büyük harf yazılışının belirsiz olduğu kayıtlarda LIKE ile sorgulama yaparken sorun yaşanıyor. Aslında benim kasdettiğim bu idi.

Yaklaşık 3-4 ay önce buna benzer bir proje (Türk Kardiyoloji Derneği Bildirileri) üzerine bir proje hazırlamıştık. Hazırladığımız bu projede (benimle beraber benzeri bir işi Türk Kardiyoloji Derneği Makaleleri, İsmail KOKTAY arkadaşımız) hazırladı.

Her ikimizde uygulamalarımızda bu tarz aramaların Yani makalenin içinde veya başlığında herhangi bir şekilde yazılmış olan kelimeleri aratacaktık ve bulduklarını insanlara listeleyip göstermesi istendi.

Bu çalışmalar sırasında karşılaştığımız sorunlar neticesinde, Paradox'ta LIKE kullanımının Türkçe ve Case Insensitive şekilde olmadığını gördük. İşte kasdettiğim şey bu idi ama sanırım yanlış ifade etmişim. Bu yanlış anlatımdan dolayı herkesten özür diliyorum. İsteyen arkadaşlara bu projeyi sourceları ile birlikte gönderebilirim. İçinde bahsedilen (Yani texte işaretlemeler dahil) her şey var. Yani Exact Match, Case Insensitive Match gibi.

Herkese Kolay Gelsin.
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2248
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Mesaj gönderen Kuri_YJ »

Haaa unutmadan, eğer Paradox'ta Türkçe bir table'da case insensitive şekilde LIKE ile sorgulama yapılabildiği konusunda (yada bunu başarmış arkadaşlar var ise) bu bilgilerini bizimle paylaşırsa biz de çok seviniriz. Bilmediğimiz yada ulaşamadığımız bir bilgiyi bize öğretise ve bizlerle paylaşırsa Duacısı oluruz. :wink:

Kolay gelsin.
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

@Kuri_TLJ
Selam...
Kuri_TLJ yazdı:Haaa unutmadan, eğer Paradox'ta Türkçe bir table'da case insensitive şekilde LIKE ile sorgulama yapılabildiği konusunda (yada bunu başarmış arkadaşlar var ise) ...
- Paradox, Excel vb. ne olursa olsun, veritabanına ADO ile bağlandığında bunu zaten yapabilirsin...
Resim
Resim ....Resim
Cevapla