PDA

View Full Version : سوال: تابعی جهت کوتاه کردن و به نمایش درآوردن یک مسیر کامل (Path) در Label



gilsoft
پنج شنبه 08 دی 1390, 07:51 صبح
سلام دوستان عزیز
احتمالا در برخی از نرم افزارها دیده اید که یک مسیر را به این شکل در یک لیبل یا ... نمایش میدهند :

C:\Documents and Settings\Gilsoft\...\WindowsApplication1\bin\Debug

برای مثال میخوام مسیر طولانی زیر را به کوتاه ترین شکل ممکن تبدیل کنم و در یک لیبل به نمایش در آورم :متفکر:

C:\Documents and Settings\Gilsoft\My Documents\Visual Studio 2010\Projects\CommercialApplication\WindowsApplica tion1\bin\Debug

آیا دوستان برای چنین کاری تابعی نوشته اند ؟ یا خود VB.net چنین چیزی در خود دارد ؟

ممنون میشم اگه جواب بدید ... خداوکیلی خیلی گیرم !!


:متفکر::متفکر::متفکر:

Hybrid
پنج شنبه 08 دی 1390, 09:42 صبح
دوست عزیز ، این کار خیلی راحته ...

باید از تابع Api استفاده کنی ، اسمش GetshortPathName هست به ترتیب مراحل زیر رو برو تا به جوابت برسی...(البته این فقط یه مثاله)

1)ابتدا یه تکست باکس و یه باتن روی فرمت قرار بده ...

2)در بالای Code Editor تعریف تابع رو بنویس.


Declare Function GetShortPathName Lib "kernel32" Alias "GetShortPathNameA" _
(ByVal lpszLongPath As String, ByVal lpszShortPath As String, ByVal cchBuffer As Integer) As Integer

3)در رویداد Click دکمه کد زیر رو قرار بده ...


Dim strPath As String = Application.StartupPath

Dim strShortPath As String = Space(100)

GetShortPathName(strPath, strShortPath, 100)

TextBox1.Text = strShortPath

3)برنامه رو اجرا کن و نتیجه رو ببین.

4) موفق باشین

gilsoft
پنج شنبه 08 دی 1390, 10:08 صبح
برنامه رو اجرا کن و نتیجه رو ببین.


سلام دوست عزیز
برنامه رو اجرا کردم نتیجه اش این شد : D:\VISUAL~2\Projects\TELEPH~1\TELEPH~1\bin\Debug
من میخوام که شما به آن سه تا نقطه (...) توجه کنید !
از همین کدی هم که گذاشتید ممنونم (چون همین هم نمی دونستم)

gilsoft
چهارشنبه 14 دی 1390, 00:42 صبح
دوستان این مشکل من هنوز حل نشد ! کسی از شما عزیزان بلده ؟

alimanam
پنج شنبه 15 دی 1390, 00:19 صبح
با سلام

دوست عزیز این که کاری نداره بشین یه تابع بنویس که رشته مورد نظرت رو به این فرمت خاص تبدیل کنه . حتماً که نباید تابعش موجود باشه خودت هم میتونی ینویسی ! ( متن رو کلیک کن ببین چقدر آسونه :متفکر: )
(http://up9.iranblog.com/images/41z9s51xq1wxwc3bldl.png)
موفق باشید./

gilsoft
پنج شنبه 15 دی 1390, 22:34 عصر
با سلام

دوست عزیز این که کاری نداره بشین یه تابع بنویس که رشته مورد نظرت رو به این فرمت خاص تبدیل کنه . حتماً که نباید تابعش موجود باشه خودت هم میتونی ینویسی ! ( متن رو کلیک کن ببین چقدر آسونه :متفکر: )
(http://up9.iranblog.com/images/41z9s51xq1wxwc3bldl.png)
موفق باشید./
http://barnamenevis.org/showthread.php?320599-%D9%85%D8%B4%DA%A9%D9%84-%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF-Property-%D8%AF%D8%B1-Class&p=1409087&viewfull=1#post1409087

gilsoft
دوشنبه 19 دی 1390, 06:45 صبح
سلام . طبق نظر دوست عزیز alimanam (http://barnamenevis.org/member.php?43498-alimanam) بالاخره نشستم و نوشتم ... :تشویق: گذاشتم رو سایت شاید بدرد دوستان دیگه بخوره ...
احتمال میدم این قطعه کد رو بشه خیلی کوتاه تر نوشت ! اما شما به بزرگی خودتون بزارین بحساب بی تجربگی من ! ....

Function BreakPath(ByVal mPath As String, ByVal mLen As Integer) As String
Const BS = "\"
Dim sP() As String = Split(mPath, BS)
Dim P1 As String = sP(0) + BS + sP(1) + BS
Dim P2 As String = BS + sP(sP.Length - 2) + BS + sP(sP.Length - 1)
Dim Sum As Integer = Len(P1) + 3 + Len(P2)
If mLen >= Sum Then
Dim L As Integer = 2
Dim R As Integer = sP.Length - 3
Do While mLen >= Sum
If L >= R Then Exit Do
'*************************************
If (Len(sP(L)) + 1 + Sum) <= mLen Then
P1 = P1 + sP(L) + BS
Sum = Len(P1) + 3 + Len(P2)
L += 1
End If
'*************************************
If (Len(sP(R)) + 1 + Sum) <= mLen Then
P2 = BS + sP(R) + P2
Sum = Len(P1) + 3 + Len(P2)
R -= 1
Else
Exit Do
End If
'*************************************
Loop
Else
Return mPath
End If
Console.WriteLine("Len(mPath) = " + Len(mPath).ToString)
BreakPath = P1 + StrDup(mLen - (Sum - 3), ".") + P2
Console.WriteLine("Len(BreakPath) = " + Len(BreakPath).ToString)
End Function

alimanam
دوشنبه 19 دی 1390, 12:54 عصر
با سلام

ازاینکه خودتون آستین بالا زدین خوشحالم :تشویق: در مورد تابعی که نوشتین من نتونستم ازش استفاده کنم لطف کنین یک سمپل بنویسین که از این تابع استفاده میکنه البته نه به صورت وین کنسول به صورت برنامه معمولی . تابعی که نوشته بودم این بود :

Private Function ShortPath(ByVal path As String) As String
If path.Length = 0 Then Return Nothing
Dim npath As String() = path.Split(New Char() {"\"})
If npath.Length > 4 Then
Dim objPath As String = String.Empty
objPath &= npath(0) & "\" & npath(1) & "\...\"
objPath &= npath(npath.Length - 2) & "\" & npath(npath.Length - 1)
Return objPath
Else
Return path
End If
End Function
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
lbl2.Text = ShortPath(TextBox1.Text)
End Sub

موفق باشید./

gilsoft
دوشنبه 19 دی 1390, 17:36 عصر
اینم طرز استفاده از تابع معرفی شده در پست 7#

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Label1.Text = "D:\Visual Studio 2008\Projects\Components\gsControls\gsControls\bin \Debug\gsControls.dll"
Label2.Text = BreakPath(Label1.Text, 55)
End Sub

مقدار برگشتی مثال فوق : D:\Visual Studio 2008\Projects\...\Debug\gsControls.dll
پارامتر دوم (عدد 55) حداکثر طول رشته برگشتی را مشخص می کند. :لبخندساده:

alimanam
دوشنبه 19 دی 1390, 17:49 عصر
با سلام

بله درسته ولی تابع شما در انتها باید مقدار رشته رو برمیگردوند که من توجه بهش نکرده بودم . یعنی به این صورت :

Return (BreakPath)


البته یه مشکل کوچولو داره و اون مربوط میشه به این موضوع که اگه مسیری که به تابع میدیم بین کاراکترهاش اگه فاصله باشه کمی بدریخت میشه .

http://up4.iranblog.com/images/2y5sgd4q7zxmyzpyrin.png


امیدوارم همینجوری ادامه بدی دوست خوبم .

موفق باشی

gilsoft
سه شنبه 20 دی 1390, 00:19 صبح
کد سطر 32 از تاپیک 7# رو به شکل زیر تغییر بدید مشکلش حل میشه

BreakPath = P1 + "..." + P2

در ضمن سطرهای 31 و 33 رو هم میتونید حذف کنید (صرفا جهت تست تابع بود)