Richedit hakkında sorularim.

Mikro Step

Kıdemli Üye
Katılım
25 Eylül 2022
Mesajlar
3,681
Richedit nesnesinin icinde uzunca bir text var.
Bu text icindeki bir kelimeyi ararttiriyor ve kelimenin text icinde 0. adresinden itibaren kacinci bytte oldugunu buluyorum.
Bu kelimeyi renklendirebiliyorum.

Fakat bu kelime ekranin disinda kaldiysa gorebilmek icin scroll bar ile asagilara inmem gerekiyor.

Halbuki bu kelimnin bulundugu satir ve devami ekranin en tepesine otomatik gelsin istiyorum.

* Elimdeki tek bilgi, kelimenin text icinde 0. adresinden itibaren kacinci bytte oldugu.

Kelimenin adresinden yararlanarak kacinci satirda oldugunu veren hazirda bir fonksyon varmidir?

Bytelari tek tek inceletmek istemiyorum.

Kullandigim dil delphi. Ama C ornek de isimi gorebilir.

Edit: Arama rutinini hazir kutuphane fonksiyonlarindan kurtarip kendim yazdim. Bytelerla tek tek ugrastim.
Hiz duser korkum yersiz olmus.
 
Son düzenleme:
Metin byte dizisine çevrilirken, satır sonlraı NL veya NL+CR karakterleriyle kodlanır. Bazı editörler (eskiden işletim sistemine göre değişiyordu) her satır sonuna sadece NL (New Line), bazıları da önce CR (Cariage Return) sonra NL koyar.

Aradığınız kelimenin indeksini biliyorsunuz. Tüm metin üzerinde o indekse kadar kaç tane NL olduğunu bulursanız 1 ekleyerek (ilk satıra 1. satır diyeceğinizi var sayarak) o kelimenin kaçıncı satırda olduğunu da bulursunuz.


NL karakterinin ASCI kodu ve tüm encoding sistemlerindeki byte değeri 10'dur. Metin içerisinde ifade ederken de genellikle \n kullanılır. Örnek:

C-like:
String s = "Bu ilk satır.\nBu da ikinci satır.";
System.out.println(s);

Yukarıdaki kod aşağıdaki gibi bir konsol çıktısı üretir.

Bu ilk satır.
Bu da ikinci satır.

Dollayısıyla kelimenin indeksine kadar metin içerisinde kaç tane '\n' olduğunu bulmanız gerekiyor. Delphi kullanmıyorum. Java ile örnek vereyim:


Java:
public static int getLineNumber(String txt, int indexOfWord){
  int cnt=0;
  int ind = txt.indexOf('\n');
  while (ind>=0 && ind<indexOfWord){
    cnt++;
    ind++;
    txt.indexOf('\n', ind);
  }
  return cnt +1;
}


\
 
Son düzenleme:
Aranan metni hazir fonksiyona bulduruyordum. Fonksiyon bana aranan kelimenin bastan itibaren kacinci bytte oldugunu soyluyor.
Bufferin basinda bu yana kac tane Cr/Lf var ben tek tek arayacaksam aradigim kelimeyi de ararim diyerek buffer icinde byte byte islem yapip hazir fonksiyonu terk ettim.
 
Evet bu da bir seçenek. Daha da performanslı çalışacaktır ikisini beraber aramak. Ancak kelime aramak tek karakter aramaya göre daha zahmetli kod yazmak açısından. Derleyip denemedim ama Java karşılığı şöyle birşey olmalı:

Java:
static int[] indexAndLineOf(char[] source,  char[] target) {
    int[] result = {-1,1};    // birinci eleman kelimenin yeri, ikinci eleman bulunduğu satır
    

    char first = target[0];
    int max = source.length - target.length;

    for (int i = 0; i <= max; i++) {
        /* ilk karakteri bul, ararken bulduğun '\n' karakterlernde result[1]'i arttır */
        if (source[i] != first) {
            while (++i <= max && source[i] != first || source[i]=='\n' ){
                if(source[i]=='\n')
                    result[1]++;
                
            }
        }

        /* ilk karakter bulundu. kelimenin devamını kontrol et. */
        if (i <= max) {
            int j = i + 1;
            int end = j + target.length - 1;
            for (int k = 1; j < end && source[j] == target[k]; j++, k++){
                if(source[j]=='\n')
                    result[1]++;    
            }

            if (j == end) {
                /* Found whole string. */
                result[0] = i;
                return result;
            }
        }
    }
    return result;
}
 
Ancak PC'de çalışacağına göre performans farkı hissedilmez. Ben olsam okunabilirlik ve bakım kolaylığı açısından kelimenin yeri için hazır fonksiyonu kullanmaya devam ederdim.

Java:
public static int[] indexAndLineOf(String txt, String key){
  int[] result = {-1,1};
  result[0] = txt.indexOf(key);

  if(result[0] >= 0){  
    int ind = txt.indexOf('\n');
    while (ind>=0 && ind<indexOfWord){
      result[1]++;
      ind++;
      txt.indexOf('\n',ind);
    } 
  }
  return result;
}
 
Son düzenleme:
RichEdit (RE) ile ilgili bir baska sorum olacak.

Program calistirildiginda RE fontunu degistirince RE de gorulebilen satir sayisi da degismis olur.

(Scrol Barla oynamadan) Ekranda gosterilebilcek max satir sayisini ogrenmek istiyorum.

Bu sorumun cevabini veren hazirda fonksiyon varmidir? Yoksa benim mi hesaplamam gerekir?
 
Son düzenleme:
RichEdit kullanmadım, ancak, Java için FontMetrics, C# için FontFamily sınıfları üzerinden ilgili font ve punto için satır yüksekliğini hesaplayabilirsiniz.
 
Ancak bir satıra sığacak harf sayısı da gerekirse o çok değişken çünkü bir kaç font dışında diğer fontlarda her harfin genişliği farklıdır.
 

Forum istatistikleri

Konular
5,789
Mesajlar
99,014
Üyeler
2,464
Son üye
s4met

Son kaynaklar

Son profil mesajları

cemalettin keçeci wrote on HaydarBaris's profile.
barış kardeşim bende bu sene akıllı denizaltı projesine girdim ve sensörleri arastırıyorum tam olarak hangi sensör ve markaları kullandınız yardımcı olabilir misin?
m.white wrote on Altair's profile.
İyi akşamlar.Arabanız ne marka ve sorunu nedir.Ben araba tamircisi değilim ama tamirden anlarım.
* En mühim ve feyizli vazifelerimiz millî eğitim işleridir. Millî eğitim işlerinde mutlaka muzaffer olmak lâzımdır. Bir milletin hakikî kurtuluşu ancak bu suretle olur. (1922)
Kesici/Spindle hızı hesaplamak için SpreadSheet UDF'leri kullanın, hesap makinesi çok eski kalan bir yöntem :)
Dr. Bülent Başaran,
Elektrik ve Elektronik Mühendisi
Yonga Tasarım Özdevinimcisi
Üç güzel "çocuk" babası
Ortahisar/Ürgüp/Konya/Ankara/Pittsburgh/San Francisco/Atlanta/Alaçatı/Taşucu...

Back
Top