[Çözüldü] Listbox çoklu dil desteği
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
[Çözüldü] Listbox çoklu dil desteği
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.
- greenegitim
- Üye
- Mesajlar: 713
- Kayıt: 28 Nis 2011 10:33
- Konum: İstanbul
Re: Listbox çoklu dil desteği
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!
Re: Listbox çoklu dil desteği
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?
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?
Re: Listbox çoklu dil desteği
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;
Re: Listbox çoklu dil desteği
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.
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
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;
Re: Listbox çoklu dil desteği
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.

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
Ekte örneği denerseniz hatamı göstermiş olurum
http://s6.dosya.tc/server8/uzpxfq/test.rar.html
Ö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.

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
Re: Listbox çoklu dil desteği
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)));
Re: Listbox çoklu dil desteği
Evet aynen dediğiniz gibiymiş sorun hepsini string yapınca düzeldi. Teşekkürler