[Çözüldü] Listbox çoklu dil desteği

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

[Çözüldü] Listbox çoklu dil desteği

Mesaj gönderen Lord_Ares »

Merhaba, mp3 çalar projesinde listboxa eklediğim şarkıların isimleri rusça ise mediaplayer şarkıyı çalmıyor. Hatta genelde listboxta isimler düzgün çıkmıyor(rusça bazı harfler yerine *? gibi ). Listboxtaki bu sorun nedendir nasıl çözebilirim.
En son Lord_Ares tarafından 06 Nis 2017 03:10 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Kullanıcı avatarı
greenegitim
Üye
Mesajlar: 713
Kayıt: 28 Nis 2011 10:33
Konum: İstanbul

Re: Listbox çoklu dil desteği

Mesaj gönderen greenegitim »

Kullandığınız delphi sürümü nedir eğer delphi 2010 altı bir versiyon ise tms nin unicode component paketi vardı onun içinde listbox olması lazım onu kullanabilirsiniz.
Mücadele güzelleştirir!
ertank
Kıdemli Üye
Mesajlar: 1716
Kayıt: 12 Eyl 2015 12:45

Re: Listbox çoklu dil desteği

Mesaj gönderen ertank »

Merhaba,

Sorunun Listbox olduğunu zannetmiyorum. Yüksek ihtimalle disk üzerinden okuduğunuz dosya isimlerini Delphi içinde kullanılabilecek string türüne dönüştürmüyorsunuz. Kontrol etmek için;

- Kullandığınız Delphi sürümünü
- ListBox içine şarkı isimlerini ekleme kodunuzu

paylaşabilir misiniz?
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

Re: Listbox çoklu dil desteği

Mesaj gönderen Lord_Ares »

Delphi Xe8 kullanıyorum. Kodumda aşağıdaki gibi. Sanırım sizin dediğiniz gibi bir sorun olabilir. işletim sisteminden kaynaklı olabilir diye düşündüm (rusça diller eksik gibi ) fakat windowsun media playerı ile test ettiğimde media playerın listboxı hem düzgün gösteriyor hemde çalıyor. Ya dediğiniz gibi kodlamamda bir hata yada listbox bileşeninde

Kod: Tümünü seç

procedure Playlist_yukle(const PathName,FileName: string; const InDir: boolean );
var Rec  : TSearchRec;
    Path,yolu : string;
begin
if Form1.Playlist_ListBox.ItemIndex>-1 then Form1.Playlist_ListBox.Clear;

Path := IncludeTrailingBackslash(PathName);
if FindFirst(Path + FileName, faAnyFile - faDirectory, Rec) = 0 then
 try
   repeat
//
          yolu:=Path+Rec.Name;

         if pos('.mp3',Rec.Name)>0 then System.Delete(rec.Name, Pos('.mp3', rec.Name) , Pos('.mp3', rec.Name) + Length('.mp3')-1 );
         if pos('.mp4',Rec.Name)>0 then System.Delete(rec.Name, Pos('.mp4', rec.Name) , Pos('.mp4', rec.Name) + Length('.mp4')-1 );
          Form1.Playlist_ListBox.Items.AddObject(Rec.Name , TMediaItem.Create(yolu));
   until FindNext(Rec) <> 0;
 finally
   FindClose(Rec);
 end;
If not InDir then Exit;
if FindFirst(Path + '*.*', faDirectory, Rec) = 0 then
 try
   repeat
    if ((Rec.Attr and faDirectory) <> 0)  and (Rec.Name<>'.') and (Rec.Name<>'..') then
         Playlist_yukle( Path + Rec.Name, FileName, True);
   until FindNext(Rec) <> 0;
 finally
   FindClose(Rec);
 end;
end;
ertank
Kıdemli Üye
Mesajlar: 1716
Kayıt: 12 Eyl 2015 12:45

Re: Listbox çoklu dil desteği

Mesaj gönderen ertank »

Delphi 2009 ve sonrasında FindFirst() ve FindNext() fonksiyonlarında Delphi sırası ile FindFirstFileW() ve FindNextFileW() Windows API fonksiyonlarını kullanmakta ve dosya isimlerini Unicode olarak desteklemektedir.

Kendi sistemimde rusça karakterler içeren bir dosya oluşturduğum zaman aşağıdaki kod ile sorunsuz bir şekilde Listbox içinde görebiliyorum. Bu dosya adını dosya sisteminde oluşturabilmek için UTF-8 olarak kopyala yapıştır yapmam gerekti.

Kod: Tümünü seç

procedure Playlist_yukle(const PathName, FileName: string; const InDir: Boolean; out List: TListBox);
var
  Rec: TSearchRec;
  Path, Yolu: string;
begin
  if List.ItemIndex > -1 then List.Items.Clear();

  Path := IncludeTrailingPathDelimiter(PathName);
  if FindFirst(Path + FileName, faAnyFile - faDirectory, Rec) = 0 then
  try
    repeat
      Yolu := Path + Rec.Name;

      if pos('.mp3',Rec.Name)>0 then System.Delete(rec.Name, Pos('.mp3', rec.Name) , Pos('.mp3', rec.Name) + Length('.mp3')-1 );
      if pos('.mp4',Rec.Name)>0 then System.Delete(rec.Name, Pos('.mp4', rec.Name) , Pos('.mp4', rec.Name) + Length('.mp4')-1 );
      List.Items.Add(Rec.Name);
     until FindNext(Rec) <> 0;
  finally
    FindClose(Rec);
  end;

  If not InDir then Exit();
  if FindFirst(Path + '*.*', faDirectory, Rec) = 0 then
  try
    repeat
      if ((Rec.Attr and faDirectory) <> 0)  and (Rec.Name <> '.') and (Rec.Name <> '..') then
           Playlist_yukle( Path + Rec.Name, FileName, True, List);
     until FindNext(Rec) <> 0;
   finally
     FindClose(Rec);
   end;
end;

Sorunu daha iyi tespit edebilmek için aşağıdaki kodu kendi ihtiyaçlarınıza göre düzenleyip deneyebilirsiniz. Şu an için compiler uyarısını gözardı edebilirsiniz

Kod: Tümünü seç

procedure Playlist_yukle(const PathName, FileName: string; const InDir: Boolean; out List: TListBox);
var
  Rec: TSearchRec;
  Path, Yolu: string;
begin
  if List.ItemIndex > -1 then List.Items.Clear();

  Path := IncludeTrailingPathDelimiter(PathName);
  if FindFirst(Path + FileName, faAnyFile - faDirectory, Rec) = 0 then
  try
    repeat
      if Pos('?', Rec.Name) > 0 then
      begin
        Rec.Name := UTF8ToString(Rec.Name);
      end;

      Yolu := Path + Rec.Name;

      if UpperCase(ExtractFileExt(Rec.Name)) = '.MP3' then Rec.Name := ChangeFileExt(Rec.Name, EmptyStr);
      if UpperCase(ExtractFileExt(Rec.Name)) = '.MP4' then Rec.Name := ChangeFileExt(Rec.Name, EmptyStr);
      List.Items.Add(Rec.Name);
     until FindNext(Rec) <> 0;
  finally
    FindClose(Rec);
  end;

  If not InDir then Exit();
  if FindFirst(Path + '*.*', faDirectory, Rec) = 0 then
  try
    repeat
      if ((Rec.Attr and faDirectory) <> 0)  and (Rec.Name <> '.') and (Rec.Name <> '..') then
           Playlist_yukle( Path + Rec.Name, FileName, True, List);
     until FindNext(Rec) <> 0;
   finally
     FindClose(Rec);
   end;
end;
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

Re: Listbox çoklu dil desteği

Mesaj gönderen Lord_Ares »

Arkadaşlar problem şurada ama çözemedim. Şarkının yolunu ve adını tutan yolu : AnsiString; değişkeni normal olarak listboxa eklediğimde yolu doğru ekliyor.

Örnek "D:\Mp3\test.mp3"

Fakat aşağıdaki şekilde Form1.Playlist_ListBox.Items.AddObject(Rec.Name , TMediaItem.Create(yolu)) diyerek eklersem
Örnek "D:\dMp3\???.???.mp3"
UTF8ToString (yolu) şeklinde de denedim sonuç değişmedi.

Resim

Burda TMediaItem.Create(yolu) diyerek şarkının yolunu ve adını listboxın ayrı bir bölümde tutuyorum.
Kullandığım kod şu şekilde

Kod: Tümünü seç

  TMediaItem = class
  private
    fIsAudio : Boolean;
    fFileName : AnsiString;
  public
    constructor Create(const AFileName : AnsiString);
    property IsAudio : Boolean read fIsAudio;
    property FileName :AnsiString read fFileName;
  end;
  
  ///////////////
  constructor TMediaItem.Create(const AFileName: AnsiString);
var
uzantisi:string;
begin
    inherited Create;
    fFileName := AFileName;
    fIsAudio := false;
    uzantisi:=ExtractFileExt(fFileName);
    if  uzantisi='.mp3' then fIsAudio:=true else fIsAudio:=false;
end;
  

Ekte örneği denerseniz hatamı göstermiş olurum
http://s6.dosya.tc/server8/uzpxfq/test.rar.html
ertank
Kıdemli Üye
Mesajlar: 1716
Kayıt: 12 Eyl 2015 12:45

Re: Listbox çoklu dil desteği

Mesaj gönderen ertank »

TMediaItem.Create() için geçtiğiniz "yolu" parametresi ile ilgili Delphi size uyarı veriyor olması gerekli. TMediaItem.FileName AnsiString türünde. Sizin parametre olarak geçtiğiniz yolu ise string türünde. Aşağıdaki şekilde denediğiniz zaman sonuç nasıl oluyor?

Kod: Tümünü seç

Form1.Playlist_ListBox.Items.AddObject(Rec.Name , TMediaItem.Create(AnsiString(yolu)));
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

Re: Listbox çoklu dil desteği

Mesaj gönderen Lord_Ares »

Evet aynen dediğiniz gibiymiş sorun hepsini string yapınca düzeldi. Teşekkürler
Cevapla