Çok Yakında Yeni Bir Arayüzle karşınızdayız! http://yeni.delphican.com/

Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Türkçe karakter
#1
Merhaba;

Delphi 10.02 kullanıyorum; Edit içine sadece sayı ve harf için KeyPress ile kontrol altına alıyorum.
Fakat Ğ, Ü, Ç gibi farklar için ayrıca eklemem lazım bunu nasıl çöze bilirim? bu konuda delphide her versiyonda farklılık oluyor?


procedure TForm4.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  if Not(Key in ['0' .. '9', 'a' .. 'z', 'A' .. 'Z', 'I', #32, #8]) then
    Key := #0;
end;
Cevapla
#2
Sorunuzu tam anlayamadım, yukarıda verdiğiniz aslında cevabı bulmuşsunuz gibi geldi . a..z ye derseniz içerisinde ü, ç gibi harfleri dahil etmiş olursunuz. Bunun yerine ilk akla gelen bir dizi tanımlayın ve içerisine olmasını istediğiniz harfleri ve sayıları yazıp parametre olarak onu verin.
Cevapla
#3
'0' .. '9', 'a' .. 'z', 'A' ile belirmişken neden (Ğ, Ü, İ, Ç) gibi büyük harfleri neden algılamaz onu anlamadım.
Cevapla
#4
A dan Z ye olan diziyi memo gibi bir bileşen içine yazdırıp denermisin, sanırım 'Ü,Ğ' gibi harfler 'U,G' şeklinde basacaktır. Böyle çıkıp çıkmadığından emin ol.
Cevapla
#5
Memo nasıl yazdıracağım 'Ü,Ğ' edit içine girdiğimde zaten yazmıyor ('a' .. 'z', 'A' .. 'Z',)
Cevapla
#6
(10-01-2019, Saat: 01:11)ahmetb Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.Merhaba;

Delphi 10.02 kullanıyorum; Edit içine sadece sayı ve harf için KeyPress ile kontrol altına alıyorum.
Fakat Ğ, Ü, Ç gibi farklar için ayrıca eklemem lazım bunu nasıl çöze bilirim? bu konuda delphide her versiyonda farklılık oluyor?


procedure TForm4.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  if Not(Key in ['0' .. '9', 'a' .. 'z', 'A' .. 'Z', 'I', #32, #8]) then
    Key := #0;
end;

Merhaba,

Kesinlikle bu kodu kullanmamalısınız. Burada 2 tane temel sorun var:

1. ['0'..'9', 'a'..'z', 'A'..'Z', 'I', #32, #8] kümesinde Türkçe karakterler yok, çünkü burada yapılan ASCII kod tablosundaki bazı aralıklar ve bazı özel değerler için bir küme oluşturma (set). 
ASCII kod tablosuna göre 'a'..'z' arasında İngilizce harfler var. 


2. İlk sorunu aşması kolay, çünkü kümeye özel karakterleri de ekleyebilirsiniz. Daha doğrusu bunu deneyebilirsiniz, ama bazı karakterlerde sorun yaşayacaksınız, çünkü Delphi'de SET dediğiniz yapı AnsiChar ile çalışıyor. Daha doğrusu SET yapıları en fazla 255 değerini alabiliyor. Unicode Delphi'de 'Ş', 'Ğ' gibi karakterlerin sayısal değerlerinin 255'den büyük olduğunu tahmin edebilirsiniz. Dolayısıyla sizin bu kontroller için SET yapılarından uzak durmanız gerekiyor.

Peki ne yapacaksınız? Sizin yazdığınız kod için Delphi hemen uyarı vermiştir: "W1050 WideChar reduced to byte char in set expressions.  Consider using 'CharInSet' function in 'SysUtils' unit." Mesajın dediğine göre CharInSet fonksiyonunu kullanmamız gerekiyormuş, çünkü WideChar bir veri tipi Byte Char veri tipine indirgeniyormuş. Bu da sorun çıkarabilirmiş. Peki CharInSet nasıl çalışıyormuş: İlk Parametre Char veya AnsiChar olabilirmiş, ikinci karakter ise TSysCharSet olacakmış. Sorun da burada. TSysCharSet'in ne olduğuna baktığınızda da onun aslında Set of AnsiChar olduğunu görüyorsunuz. Yani 'Ş' gibi karakterler maalesef yine yok. O yüzden burada Delphi'yi dinlemeyeceksiniz. Size bir iki tavsiye:

1. const kısmına bir tanımlama yapın. Örnek aşağıda:

const
  CHAR_LIST = '1234567890ABC...'; 


if Pos(Key, CHAR_LIST) > 0 then
  Key := #0;

 Bunun kötü tarafı maalesef const tanımlamasında bütün karakterleri yazmanız gerekiyor. Yani şu kod çalışmaz: CHAR_LIST = 'A'..'Z' + 'a'..'z'... 

2. İlk tavsiye string üzerine kodlama. Bunu istemeyebilirsiniz. Öyle bir durumda aşağıdaki tanımı kullanabilirsiniz:
CHAR_LIST: array of Char = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'];

Bu ikinci yöntemde karakteri kontrol etmek için daha ciddi bir fonksiyon yazmanız lazım. Dizi elemanlarını tek tek dolaşmanız gerekiyor.

3. Son olarak çok hızlı çalışacak kod istiyorsanız yukarıdaki her iki yöntem de size maliyetli gelebilir (KeyPress'te çok hızlı çalışacak kod ne kadar gerekli tartışılır). O zaman bu listeleri Dictionary'de tutun. Daha fazla kod yazmanız ve kodu karmaşık bir hale getirmeniz gerekebilir, ama arama süreleri ciddi derecede düşecektir. Bence bu kadar abartmaya gerek yok.

İyi çalışmalar
Cevapla
#7
Kısaca şu şekilde bir kod yazabilirsiniz.

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if Not(Key in ['0' .. '9', 'a' .. 'z', 'A' .. 'Z', #32, #8]) and
  Not(Key in ['ş','Ş','ö','Ö','ç','Ç','İ','ğ','Ğ','ü','Ü'])
  Then Key := #0;
end;
Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
WWW
Cevapla
#8
(10-01-2019, Saat: 17:10)esistem Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.Kısaca şu şekilde bir kod yazabilirsiniz.

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if Not(Key in ['0' .. '9', 'a' .. 'z', 'A' .. 'Z', #32, #8]) and
  Not(Key in ['ş','Ş','ö','Ö','ç','Ç','İ','ğ','Ğ','ü','Ü'])
  Then Key := #0;
end;

Merhaba,

Bir önceki yazımda da belirtmiştim. Bu kod unicode destekleyen Delphi sürümlerinde yanlış çalışır, çünkü Delphi'de SET yapıları en fazla 255 değeri alabilir. Yani Ş, ş, Ğ, ğ, İ, ı gibi Türkçe karakterler bu şartları asla sağlamaz. 

İyi çalışmalar
Cevapla
#9
(10-01-2019, Saat: 15:29)Bahadir.Alkac Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
(10-01-2019, Saat: 01:11)ahmetb Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.Merhaba;

Delphi 10.02 kullanıyorum; Edit içine sadece sayı ve harf için KeyPress ile kontrol altına alıyorum.
Fakat Ğ, Ü, Ç gibi farklar için ayrıca eklemem lazım bunu nasıl çöze bilirim? bu konuda delphide her versiyonda farklılık oluyor?


procedure TForm4.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  if Not(Key in ['0' .. '9', 'a' .. 'z', 'A' .. 'Z', 'I', #32, #8]) then
    Key := #0;
end;

Merhaba,

Kesinlikle bu kodu kullanmamalısınız. Burada 2 tane temel sorun var:

1. ['0'..'9', 'a'..'z', 'A'..'Z', 'I', #32, #8] kümesinde Türkçe karakterler yok, çünkü burada yapılan ASCII kod tablosundaki bazı aralıklar ve bazı özel değerler için bir küme oluşturma (set). 
ASCII kod tablosuna göre 'a'..'z' arasında İngilizce harfler var. 


2. İlk sorunu aşması kolay, çünkü kümeye özel karakterleri de ekleyebilirsiniz. Daha doğrusu bunu deneyebilirsiniz, ama bazı karakterlerde sorun yaşayacaksınız, çünkü Delphi'de SET dediğiniz yapı AnsiChar ile çalışıyor. Daha doğrusu SET yapıları en fazla 255 değerini alabiliyor. Unicode Delphi'de 'Ş', 'Ğ' gibi karakterlerin sayısal değerlerinin 255'den büyük olduğunu tahmin edebilirsiniz. Dolayısıyla sizin bu kontroller için SET yapılarından uzak durmanız gerekiyor.

Peki ne yapacaksınız? Sizin yazdığınız kod için Delphi hemen uyarı vermiştir: "W1050 WideChar reduced to byte char in set expressions.  Consider using 'CharInSet' function in 'SysUtils' unit." Mesajın dediğine göre CharInSet fonksiyonunu kullanmamız gerekiyormuş, çünkü WideChar bir veri tipi Byte Char veri tipine indirgeniyormuş. Bu da sorun çıkarabilirmiş. Peki CharInSet nasıl çalışıyormuş: İlk Parametre Char veya AnsiChar olabilirmiş, ikinci karakter ise TSysCharSet olacakmış. Sorun da burada. TSysCharSet'in ne olduğuna baktığınızda da onun aslında Set of AnsiChar olduğunu görüyorsunuz. Yani 'Ş' gibi karakterler maalesef yine yok. O yüzden burada Delphi'yi dinlemeyeceksiniz. Size bir iki tavsiye:

1. const kısmına bir tanımlama yapın. Örnek aşağıda:

const
  CHAR_LIST = '1234567890ABC...'; 


if Pos(Key, CHAR_LIST) > 0 then
  Key := #0;

 Bunun kötü tarafı maalesef const tanımlamasında bütün karakterleri yazmanız gerekiyor. Yani şu kod çalışmaz: CHAR_LIST = 'A'..'Z' + 'a'..'z'... 

2. İlk tavsiye string üzerine kodlama. Bunu istemeyebilirsiniz. Öyle bir durumda aşağıdaki tanımı kullanabilirsiniz:
CHAR_LIST: array of Char = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'];

Bu ikinci yöntemde karakteri kontrol etmek için daha ciddi bir fonksiyon yazmanız lazım. Dizi elemanlarını tek tek dolaşmanız gerekiyor.

3. Son olarak çok hızlı çalışacak kod istiyorsanız yukarıdaki her iki yöntem de size maliyetli gelebilir (KeyPress'te çok hızlı çalışacak kod ne kadar gerekli tartışılır). O zaman bu listeleri Dictionary'de tutun. Daha fazla kod yazmanız ve kodu karmaşık bir hale getirmeniz gerekebilir, ama arama süreleri ciddi derecede düşecektir. Bence bu kadar abartmaya gerek yok.

İyi çalışmalar

Bilgi için teşşekkürer. Çok faydalı odu.
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Quick Reportta Türkçe sorunu boreas 4 161 08-11-2019, Saat: 00:14
Son Yorum: boreas
  Message box karakter sorunu seci20 9 785 24-03-2019, Saat: 13:25
Son Yorum: mrmarman
  Locate ve Lookup TR Karakter sorunu narkotik 2 579 15-01-2019, Saat: 20:04
Son Yorum: narkotik
  clientdataset xml türkçe karakter sorunu osiso 0 525 06-08-2018, Saat: 12:29
Son Yorum: osiso
  Karakter silme serhat 8 2.192 31-07-2018, Saat: 12:05
Son Yorum: Bay_Y



Konuyu Okuyanlar: 1 Ziyaretçi