keydown altında Türkçe Uppercase sorunu hakkında

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
adelphiforumz
Üye
Mesajlar: 602
Kayıt: 01 Nis 2008 05:38
Konum: İstanbul

keydown altında Türkçe Uppercase sorunu hakkında

Mesaj gönderen adelphiforumz »

Selamlar

Forumda araştırdığımda türkçe karakter sorunu ve cxgrid türkçe sorunu olarak konular açılmış
fakat hepsi ya componentlerin source codelarına müdahale ile yada if ile yapılmış.

bir edit içerisindeki türkçe karakterleri uppper ettiğimizde "i" ve "ı" harfleri farklılık gösteriyor
fakat keydown altında içerisindeki key alanını upper yapmaya kalktığımızda işler iyice karışıyor
Keydown altında türkçe karakterleri nasıl upper edebiliriz kolay bir yolu varmıdır.

i = İ, ı=I, ö=Ö .... gibi

İyi Çalışmalar
Ehil olmayanlara sabretmek ehil olanları parlatır.
Akıllı birisinden gelen cefa, bilgisizlerin vefasından iyidir.
Bilgiye ulaştı mı ayak, kanat olur
Biz insanı kıyafetiyle ağırlar bilgisiyle uğurlarız.
Mevlana
xxxjedixxx
Üye
Mesajlar: 216
Kayıt: 10 Ara 2013 03:50

Re: keydown altında Türkçe Uppercase sorunu hakkında

Mesaj gönderen xxxjedixxx »

Merhaba,

Büyük harf modunda iken sadece "ı" ve "i" harflerinde sorun olur. Aşağıdaki gibi KeyPress event'inde sorunu çözebilirsin.

Kod: Tümünü seç

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  if TEdit(Sender).CharCase = ecUpperCase then
  begin
    if Key = 'ı' then Key := 'I';
    if Key = 'i' then key := 'İ';
  end;
end;
Kullanıcı avatarı
adelphiforumz
Üye
Mesajlar: 602
Kayıt: 01 Nis 2008 05:38
Konum: İstanbul

Re: keydown altında Türkçe Uppercase sorunu hakkında

Mesaj gönderen adelphiforumz »

xxxjedixxx
zaten daha öncedende bu şekilde yapıyordum başka bir yolu varmı diye sordum
Bu yol her nesnenin altına yada formun altındaki keypress üzerinde bulunan nesne uppercase ise control ediliyor diye
yapmak istemiyordum.
teşekkürler
Ehil olmayanlara sabretmek ehil olanları parlatır.
Akıllı birisinden gelen cefa, bilgisizlerin vefasından iyidir.
Bilgiye ulaştı mı ayak, kanat olur
Biz insanı kıyafetiyle ağırlar bilgisiyle uğurlarız.
Mevlana
Kullanıcı avatarı
xozcanx
Üye
Mesajlar: 362
Kayıt: 05 Oca 2012 12:55

Re: keydown altında Türkçe Uppercase sorunu hakkında

Mesaj gönderen xozcanx »

Kod: Tümünü seç

Function BuyukHarf(Harf: Char): Char;
begin
  case Harf of
    'ı': Result:='I';
    'ğ': Result:='Ğ';
    'ü': Result:='Ü';
    'ş': Result:='Ş';
    'i': Result:='İ';
    'ö': Result:='Ö';
    'ç': Result:='Ç';
    'İ': Result:='İ';
  else
    Result:=UpCase(Harf);
  end;
end;
keydown ile değil fakat keypress için yukarıdaki gibi bir Function ve aşağıdaki gibi bir kullanım ile işini çözebilirsin sanırım. Kolay gelsin.

Kod: Tümünü seç

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  key:=BuyukHarf(key);
end;
Nasibinde varsa, alırsın karıncadan bile ders, Nasibinde yoksa, bütün cihan önüne serilse, sana ters..
Kullanıcı avatarı
adelphiforumz
Üye
Mesajlar: 602
Kayıt: 01 Nis 2008 05:38
Konum: İstanbul

Re: keydown altında Türkçe Uppercase sorunu hakkında

Mesaj gönderen adelphiforumz »

xozcanx
Daha öncedende belirttiğim gibi dediğiniz yöntem yada benzeri yöntemlerle zaten sonuca ulaşıyorum.
Amaç butarz bir fonksiyon yazmadan delphinin ayarlarında yada nebileyim
ilk initialize kısmında birşeyler yazarak projenin genelinde çözebilirmiyiz diye öğrenmek istemiştim
ilginiz için tekrardan teşekkürler
Ehil olmayanlara sabretmek ehil olanları parlatır.
Akıllı birisinden gelen cefa, bilgisizlerin vefasından iyidir.
Bilgiye ulaştı mı ayak, kanat olur
Biz insanı kıyafetiyle ağırlar bilgisiyle uğurlarız.
Mevlana
Kullanıcı avatarı
fesiharslan
Üye
Mesajlar: 591
Kayıt: 20 Eki 2006 11:37
Konum: Erzurum
İletişim:

Re: keydown altında Türkçe Uppercase sorunu hakkında

Mesaj gönderen fesiharslan »

Merhaba;
Delphi XE3 ve daha sonraki sürümlerde .ToUpper string helper'ı (ı İ de dahil olmak üzere) tüm Türkçe karakterleri desteklemektedir.

Örnek kullanımı;

Kod: Tümünü seç

ShowMessage(string(Edit1.Text).ToUpper);
Kullanıcı avatarı
fesiharslan
Üye
Mesajlar: 591
Kayıt: 20 Eki 2006 11:37
Konum: Erzurum
İletişim:

Re: keydown altında Türkçe Uppercase sorunu hakkında

Mesaj gönderen fesiharslan »

TEdit nesnesinin OnKeyPress olayında aşağıdaki gibi kullanabilirsiniz.

Kod: Tümünü seç

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  ShowMessage(string(Key).ToUpper);
end;
ikra
Üye
Mesajlar: 900
Kayıt: 28 Nis 2005 01:26
Konum: Simdilik Topragin Üstü

Re: keydown altında Türkçe Uppercase sorunu hakkında

Mesaj gönderen ikra »

Bi tane record olustur. Iki adet isaretci olsun icinde.

Kod: Tümünü seç

Teventrec = record
  Sender: tobject;
  event: tkeypressevent;
end
Bir adet class olustur. Tlist'den türesin. Icine bir adet function yaz.

Kod: Tümünü seç

function geteventbysender(asender: tobject): tkeypressevent;
bu function icinde bir döngü olustur. Listenin icindeki recordlari tek tek dolasip senderi bulsun ve result olarak bu senderin eventini döndürsün

Kod: Tümünü seç

if teventrec(items[i]).sender = asender then
begin
  Result := teventrec(items[i]).event;
  break;
end;
simdi windows'un mesajlarini yakalayip create'de olusturulan nesnelerin property'lerine bak. Onkeypress isminde published bir eventi var ise yeni bir teventrec olusturup sender'i create olan nesne ve event'i de onkeypress eventi olarak isaretle ve olusturdugun tlist'e add yap. Akabinde setpropinfo ile nesnenin onkeypress eventini kendi yazdigin prosedür ile degistir.
Kendi yazdigin prosedürün icerisinde parametre olarak gelen key ile ilgili islemlerini yap ve listendeki geteventbysender functionu ile eventi bulup

Kod: Tümünü seç

if assigned(event) then
  Event(sender, key)
yaparak orjinal eventi tetikle.
Her olusan nesne otomatik olarak senin prosedürünü tetikleyecek ve akabinde kendine ait olan orjinal eventini tetikleyecektir.
kıdemsiz üye
xxxjedixxx
Üye
Mesajlar: 216
Kayıt: 10 Ara 2013 03:50

Re: keydown altında Türkçe Uppercase sorunu hakkında

Mesaj gönderen xxxjedixxx »

adelphiforumz,

Sizi çok iyi anlıyorum. Edit nesnelerine herhangi ilave bir kod yazmadan düzgün bir büyük harf kullanımı olmuyor. XE8 de bile sorun devam etmekte. Hatırladığım kadarıyla başka programlama dillerinde de bu sorun var. Ben, büyük harf ihtiyacı olan Edit nesneleri için size verdiğim kod gibi bir tane procedure yazıp bütün Edit nesnelerinin keypress eventlerini bu koda bağlıyordum. Sadece tek procedure ile çözüm sağlamış oluyorum. Muhtemelen siz de bu şekilde çözüm bulmuşsunuzdur.

Edit:
TCustomEdit nesnesinin kodunu incelerseniz, büyük/küçük harf yönetimini Delphi'nin değil Windows'un yaptığını göreceksiniz. Yani sorun Windows'dan kaynaklanıyor.

Kod: Tümünü seç

procedure TCustomEdit.CreateParams(var Params: TCreateParams);
const
  Alignments: array[Boolean, TAlignment] of DWORD =
    ((ES_LEFT, ES_RIGHT, ES_CENTER),(ES_RIGHT, ES_LEFT, ES_CENTER));
  Passwords: array[Boolean] of DWORD = (0, ES_PASSWORD);
  ReadOnlys: array[Boolean] of DWORD = (0, ES_READONLY);
  CharCases: array[TEditCharCase] of DWORD = (0, ES_UPPERCASE, ES_LOWERCASE);
  HideSelections: array[Boolean] of DWORD = (ES_NOHIDESEL, 0);
  OEMConverts: array[Boolean] of DWORD = (0, ES_OEMCONVERT);
  NumbersOnlyStyle: array[Boolean] of DWORD = (0, ES_NUMBER);
begin
  inherited CreateParams(Params);
  CreateSubClass(Params, 'EDIT');
  with Params do
  begin
    Style := Style or (ES_AUTOHSCROLL or ES_AUTOVSCROLL) or
      Alignments[UseRightToLeftAlignment, FAlignment] or
      BorderStyles[FBorderStyle] or Passwords[FPasswordChar <> #0] or
      NumbersOnlyStyle[FNumbersOnly] or
      ReadOnlys[FReadOnly] or CharCases[FCharCase] or
      HideSelections[FHideSelection] or OEMConverts[FOEMConvert];
    if NewStyleControls and Ctl3D and (FBorderStyle = bsSingle) then
    begin
      Style := Style and not WS_BORDER;
      ExStyle := ExStyle or WS_EX_CLIENTEDGE;
    end;
  end;
end;
Kullanıcı avatarı
fesiharslan
Üye
Mesajlar: 591
Kayıt: 20 Eki 2006 11:37
Konum: Erzurum
İletişim:

Re: keydown altında Türkçe Uppercase sorunu hakkında

Mesaj gönderen fesiharslan »

fesiharslan yazdı:TEdit nesnesinin OnKeyPress olayında aşağıdaki gibi kullanabilirsiniz.

Kod: Tümünü seç

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  ShowMessage(string(Key).ToUpper);
end;
Bu kodu deneyen olmadı galiba? :cry:
Kullanıcı avatarı
badkursat
Üye
Mesajlar: 84
Kayıt: 03 Mar 2014 08:58

Re: keydown altında Türkçe Uppercase sorunu hakkında

Mesaj gönderen badkursat »

fesiharslan yazdı:
fesiharslan yazdı:TEdit nesnesinin OnKeyPress olayında aşağıdaki gibi kullanabilirsiniz.

Kod: Tümünü seç

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  ShowMessage(string(Key).ToUpper);
end;
Bu kodu deneyen olmadı galiba? :cry:
Delphi 7 de yazığınız kod kesinlikle çalışmıyor
Kullanıcı avatarı
fesiharslan
Üye
Mesajlar: 591
Kayıt: 20 Eki 2006 11:37
Konum: Erzurum
İletişim:

Re: keydown altında Türkçe Uppercase sorunu hakkında

Mesaj gönderen fesiharslan »

Haklısınız. String Helper yapısı Delphi XE3 ve daha üst sürümleri içindir.
Cevapla