C# - Label‘Daki Yazıyı Düzenlemek
-
Hacılar yaptığım iş openFileDialog'dan bir dizindeki dosyayı seçince, seçilen dizinin label'da görünmesi. Bu kısımda sıkıntı yok. Fakat dizin çok uzun olduğu zaman label a sığmıyor örneğin;
c:\program files\asdasdasd\bdbdbdbdbd\tbt.exe dizinine tıkladığımda label a sadece c:\program files\ kısmı sığıyor. Benim yapmak istediğim şey label a sığmayacak bir değer girildiğinde (bu kontrolü nasıl yapacağımı da bilmiyorum) label içine
c:\...\tbt.exe şeklinde dizinin ilk ve son kısmını label a sığacak şekilde yazdırmak, mümkün müdür ?
edit: şu şekilde birşey buldum ama nasıl kullanacağım hakkında bir fikrim yok.
C#’ta aşağıdaki Windows API’sini kullanarak uzun dizin isimlerini arasına … gelecek şekilde kısaltabiliyorsunuz. [DllImport("shlwapi.dll", CharSet = CharSet.Auto)] static extern bool PathCompactPathEx([Out] StringBuilder pszOut, string szPath, int cchMax, int dwFlags); Böylece aşağıdaki gibi dizin isimleri elde edilebiliyor : C:\Documents and Settings\jatwood…\UnitTests.vb \\wumpus\public\Hilo Deliverab…\photo-small.jpg
-
Hocam label in autoSize özelliği var senin yazına göre kendisi boyutlanıyor bir bak ona istersen
-
Hocam AutoSize bir alt satıra geçiyor. Benim kullanabileceğim label tek satır ve boyu sınırlı 213; 20 boyutları dışına çıkmadan sığdırmam gerekiyor.
-
hocam düz mantık olacak ama şöyle bişe yapsan
mesela label1 karakter uzunluğu şu kadarsa width arttır
-
Hocam zaten AutoSize özelliği tam olarak bu dediğini yapıyor. Ama dediğim gibi benim label boyum sınırlı ama içine dizin boyu ne olursa olsun sığdırmam gerekiyor bunun da tek yolu C:\...\test.exe haline bir şekilde getirebilmek diye düşünüyorum.
-
şöyle yap o zmn hocam şu anda tuttuğun yolu bir stringe ata label a da text ine kendin yaz "C/ .../tbt.exe" diye
-
hocam teşekkürler çözüm için ama daha global kullanabileceğim bir çözüm gerekiyor bana
-
şöyle bir şey yapabilirsin.
1. yol
öncelikle label in belirttiğin ölçülerde kaç tane karakter aldığını bul atıyorum 108 tane. 8 tane karakteri çıkar ve onu 100 olarak varsay. çünkü gelen bilgide i karakteri de çok olabilir a karakteri de. Kapladığı hacimler farklı olacaktır..
yapacağın işlem filename stringinden ilk 100-105 karakteri alıp incelemektir.. bu inceleme şöyle olacak
c:\a....\ ...... \senindosyan.exe öncelikle 100 ile senindosyan.exe karakterlerini (toplam karakter sayısı 16) çıkart, 84 eder. gelen filne name atıyorum 200 karakter olsun.
senin yapacağın iş. 0-84 karakter arasını almandır ve sonra slash karakterini arayacaksın. ilk olarak bu karakteri max 5 olmak üzere arttırıp slash bulmaya çalış
84 karakter için c: ..... ...\den
85 karakter için c: ..........\dene
86 karakter için c:..........\denem
87 karakter için c:..........\deneme
88 karakter için c:..........\deneme\
gördüğün gibi 88 . karakterde bulduk. 84 + 5 den küçük olduğu için bunu kullanabilirsin. diziden toplam 88 karakter alıp
"c:...........deneme\" .... " \senindosyan.exe" gibi eklersin.
farzedelelim o klasörün adı deneme değil de "deneme güzel şeydir" diye olsun o halde
84 karakter için c: ..... ...\den
85 karakter için c: ..........\dene
86 karakter için c:..........\denem
87 karakter için c:..........\deneme
88 karakter için c:..........\deneme (boşluk var)
89 karakter için c:..........\deneme g
90 karakter için c:..........\deneme gü
gördüğün gibi hala slash ı bulamadı 84 +5 de. O halde umudu kesip bundan sonra 84. karakter itibaren ilk slashı alıyorsun..
lastofindex var c# da. onunla tüm karakter - 84 yaparsın ondan sonra sana ilk slashın yerini söyler.. yukarıdaki işlemi de o şekilde yaptırabilirsin
c:...... klasör\ şeklinde alırsın sonra c:\......\klasör + ...." \senindosyan.exe"
2. split fonksiyonunu kullanarak "\" işaretiyle böldürüp hesini bir diziye at yani
string a = "c:\program files\deneme1\deneme2 "
string dizi[] = a.Split("\"); yaparsan. dizinin elemanları
c:
program files
deneme1
deneme2
olur.
bunların tek tek karakterlerini sırayla topla ve 84 olup olmadığına bak, tabii her bir dizi elemanı için de bir slash eklemeyi unutma
c:\program files\ karakter sayısı ? 18 ... 84 oldu mu hayır? devam
c:\program files\deneme1\ --> 26... 84 oldu mu? hayır. devam
c:\program files\deneme1\deneme2\ -> 34 .... 84 oldu mu hayır. başka var mı yok? o halde bunu kabul et.
farzedelim
c:\program ..................... \ deneme12 -> 92 ... 84 oldu mu? evet geçiyor .O halde deneme12 den öncekileri al (dizideki aktif index neyse onun bir eksiğini alabilirsin
dizi[0] + dizi[1] ... .dizi[10] + "senindosya.exe"
gibi bir şeyler yapabilirsin.. biraz uzun ve uğraştırıcı yöntem oldu ama vermiş olduğun api deki çalışma mantığı bu tarz bir şey
-
windows apilerini nasıl kullanacağını
http://www.tahribat.com/Dokuman-Windows-Api-Kullanimi-C-Net-368/
şu dökümanda öğrenebilirsin
-
Teşekkür ediyorum Hocam. o verdiğim WinApi'yi kullanmayı başaramazsam sanırım kullanmam gereken yöntem bu olacak. Ama bu WinApi yi çözebilirsem en verimisi o olacak sanıyorum
-
SharpShooter bunu yazdı:
-----------------------------windows apilerini nasıl kullanacağını
http://www.tahribat.com/Dokuman-Windows-Api-Kullanimi-C-Net-368/
şu dökümanda öğrenebilirsin
-----------------------------Döküman sana aitmiş hocam eline sağlık, okuyorum.