مسائل مربوط به رشته ها در ویژوال بیسیک

saalek110

Well-Known Member
سلام
من میخوام یه نفر برام در مورد کد های اسکی تعریف کنه و کاربرد اونها رو برام بگه

عکسها از :
http://www.asciitable.com/

6faz42.gif


dmtwzp.gif

یک پروژه ایجاد کنید. بعد بروید به پنجره کد و از کومبوباکس های بالا form از کومبوی چپ و KeyDown از کومبوی راست را بزنید تا کد رویدادش باز بشه. بعد بنویسید:
کد:
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
Print KeyCode
End Sub
این رویداد میشه گفت مثل یک تابع دو ورودی دارد. یکی KeyDown و یکی Shift . که البته ما این ورودی ها را نمی دهیم. وقتی کاربر کلیدی را می زنه این کار اتوماتیک انجام میشه.
و می بینید که هر کلیدی را بزنیم طبق جداول بالا کدش روی فرم print می شود.
 

saalek110

Well-Known Member
تمرین بعدی برای کدهای اسکی:

یک پروژه بسازید و یک باتون به فرم اضافه کنید.
از توابع این سایت:
http://www.aivosto.com/vbtips/stringopt2.html
تابع asc است.
کد بنویسید:

کد:
Private Sub Command1_Click()
Print Asc("a")
End Sub

ascw
و
ascb
را هم تمرین کنید.
 

saalek110

Well-Known Member
تمرین بعدی برای کدهای اسکی:

یک پروژه بسازید و یک باتون به فرم اضافه کنید.
از توابع این سایت:
http://www.aivosto.com/vbtips/stringopt2.html
تابع chr است.
کد بنویسید:

کد:
Private Sub Command1_Click()
Print chr(97)
End Sub

chrw
و
chrb
را هم تمرین کنید.
 

mohamadrezamm

New Member
سلام به همه دوستان من برنامه ای می خواستم که حروف را درتکست باکس با استفاده از یک کامند از هم جدا کند مثلا وقتی مشهد را در تکست باکس تایپ کردیم و کامند را زدیم نتیجه رو به رو حاصل شود (مشهد= م ش ه د) با تشکر از همه شما
 

the_king

مدیرکل انجمن
برای اجرای این کد به یک CommandBox با نام Command1 و یک TextBox با نام Text1 نیاز دارید :

کد:
Private Sub Command1_Click()
    Dim Pos As Long, Text As String
    Text = Text1.Text
    For Pos = 1 To Len(Text) + 1 Step 2
        Text = Left(Text, Pos) & " " & Mid(Text, Pos + 1)
    Next
    Text1.Text = Trim(Text)
End Sub

اگر می خواهید که عبارتی نظیر "مشهد = " هم در خروجی مشاهده شود آخرین سطر کد را مطابق نمونه زیر تغییر دهید :

کد:
Private Sub Command1_Click()
    Dim Pos As Long, Text As String
    Text = Text1.Text
    For Pos = 1 To Len(Text) + 1 Step 2
        Text = Left(Text, Pos) & " " & Mid(Text, Pos + 1)
    Next
    Text1.Text = [B]Text1.Text & " = " &[/B] Trim(Text)
End Sub
 

mohamadrezamm

New Member
سلام به همه دوستان گلم به خصوص the_king جان عزیز
من یک سوال برام پیش اومده که اگر جوابم را بدید خیلی سپاس گذار می شوم :
آیا وی بی این امکان را دارد که وقتی حروف ما از هم جدا شدند خودش تشخیص دهد که حروف ما چسبنده هستند یا خیر و به ما نشان دهد برای مثال محمد=م ح م د ====>ﻣ ﺤ ﻤ ﺪ اگر این امکان را دارد لطف کنید و برایم سورسش رو بگذارید.
 

the_king

مدیرکل انجمن
سلام به همه دوستان گلم به خصوص the_king جان عزیز
من یک سوال برام پیش اومده که اگر جوابم را بدید خیلی سپاس گذار می شوم :
آیا وی بی این امکان را دارد که وقتی حروف ما از هم جدا شدند خودش تشخیص دهد که حروف ما چسبنده هستند یا خیر و به ما نشان دهد برای مثال محمد=م ح م د ====>ﻣ ﺤ ﻤ ﺪ اگر این امکان را دارد لطف کنید و برایم سورسش رو بگذارید.
لطفا از ارسال مکرر تقاضا برای پاسخگویی به سوالات جدا پرهیز کنید، ممکن است به هر دلیلی امکان پاسخگویی سریع
به سوال شما میسر نباشد.

پردازش و نمایش کاراکتر های فارسی و Glyph ها (اشکال مختلف کاراکتر ها) نیازمند سیستم Unicode است که برای هر
کاراکتر دو بایت فضا نیاز دارد (نه یک بایت همانند ANSI). و متاسفانه توابع ویژوال بیسیک 6 و نسخه های قبل از آن،
بصورت ترکیبی از Unicode و ANSI هستند. مثلا رشته های String در ویژوال بیسیک Unicode اند ولی کنترل هایی نظیر
TextBox بر اساس ANSI طراحی شده اند.

اجازه دهید که با یک مثال این مساله را نشان دهم، فرض کنید که بخواهیم کاراکتر ⅓ (کاراکتر 1/3) را که کد Unicode آن 8531
ده دهی است را در متغیر Text ذخیره کنیم، تابع ChrW کد کاراکتر را به رشته تبدیل کرده و بر می گرداند :
کد:
    Dim Text As String
    Text = [B]ChrW[/B](8531)

و با تابع AscW می توانیم کد کاراکتر را مجددا از رشته استخراج کرده و با تابع MsgBox اعلام کنیم که به درستی عدد 8531 را
اعلام خواهد کرد :
کد:
    Dim Text As String
    Text = ChrW(8531)
    MsgBox [B]AscW[/B](Text)

تا اینجای کار ویژوال بیسیک کاملا سیستم Unicode را پیاده می کند، اما فرض کنیم که یک کنترل TextBox داشته باشیم
با نام Text1 و بجای متغیر Text از این کنترل Text1 استفاده کنیم :
کد:
    Text1 = ChrW(8531)
    MsgBox AscW(Text1)

و برخلاف انتظار، بجای عدد 8531، عدد 63 اعلام می شود که کد کاراکتر علامت سوال (?) است و در داخل TextBox هم
کاراکتر ? قرار می گیرد. علت این مساله این است که کنترل Text1 تنها می تواند کاراکتر های تک بایتی (کد 0 الی 255)
را در خود جای دهد و توانایی نمایش کاراکتری با کد 8531 را ندارد، پس بجای آن کاراکتر ? را درج می کند.

راه حل استفاده از توابع API ویندوز است که مشکل را حل می کنند.
در برنامه ای که نوشتم توابع زیر Unicode هستند :

تابع GetCharacterPlacementW برای استخراج Glyph های کاراکتر ها (حالت های چسبان و غیر چسبان حروف فارسی-عربی)
تابع ExtTextOutW برای نمایش Glyph ها
تابع GetWindowTextW برای دریافت رشته Unicode داخل یک TextBox (از مشخصه Text کنترل های TextBox استفاده نکنید
چون ANSI هستند)
تابع GetWindowTextLengthW برای دریافت طول رشته Unicode داخل یک TextBox
تابع SetWindowTextW برای ارسال یک متن Unicde به داخل یک TextBox

این توابع API را درون یک ماژول (Module) به نام ModuleUnicode تعریف کردم و برای استفاده ساده تر از آنها توابعی را با
ویژوال بیسیک ایجاد کردم :

تابع GetGlyphs مجموعه Glyph های یک رشته را درون یک آرایه از نوع Integer برمی گرداند، پارامتر hDC بایستی
روی مشخصه hDC یک Form یا PictureBox یا TextBox یا ... تنظیم شود، اینکه در آن کنترل چه فونتی بکار رفته باشد اهمیت
زیادی دارد، زیرا یک کاراکتر ممکن است در دو فونت متفاوت شماره Glyph های متفاوتی داشته باشد.

تابع GetText متن Unicde داخل یک TextBox را بر می گرداند.

تابع SetText متن Unicode داخل یک TextBox را به متن دلخواهی تغییر می دهد.

تابع PrintGlyph یک Glyph مشخص را در موقعیت x و y (برحسب Pixel) دلخواهی چاپ می کند. پارامتر hDC بایستی
روی مشخصه hDC یک Form یا PictureBox تنظیم شود، هر فونت و رنگی که در آن فرم یا کنترل فعال باشد برای ترسیم
Glyph بکار خواهد رفت. حتما فونتی را بکار ببرید که در هنگام بکارگیری تابع GetGlyphs بکار برده بودید.

Preview.gif


کد کامل برنامه به همراه فایل اجرایی exe ضمیمه این پست می باشد.
 

پیوست ها

  • Glyph Separator.zip
    7 کیلوبایت · بازدیدها: 65

mosyhey

Member
من زیاد در جریان نیستم که چه کار می خواهی بکنی اما اگر می خواهی همه فاصله های در یک رشته را برداری از این می توانی استفاده کنی:
کد:
Private Sub Command1_Click()
    Text1.Text = Replace(Text1.Text, " ", "")
End Sub
 

mohamadrezamm

New Member
لطفا از ارسال مکرر تقاضا برای پاسخگویی به سوالات جدا پرهیز کنید، ممکن است به هر دلیلی امکان پاسخگویی سریع
به سوال شما میسر نباشد.

پردازش و نمایش کاراکتر های فارسی و glyph ها (اشکال مختلف کاراکتر ها) نیازمند سیستم unicode است که برای هر
کاراکتر دو بایت فضا نیاز دارد (نه یک بایت همانند ansi). و متاسفانه توابع ویژوال بیسیک 6 و نسخه های قبل از آن،
بصورت ترکیبی از unicode و ansi هستند. مثلا رشته های string در ویژوال بیسیک unicode اند ولی کنترل هایی نظیر
textbox بر اساس ansi طراحی شده اند.

اجازه دهید که با یک مثال این مساله را نشان دهم، فرض کنید که بخواهیم کاراکتر ⅓ (کاراکتر 1/3) را که کد unicode آن 8531
ده دهی است را در متغیر text ذخیره کنیم، تابع chrw کد کاراکتر را به رشته تبدیل کرده و بر می گرداند :
کد:
    dim text as string
    text = [b]chrw[/b](8531)
و با تابع ascw می توانیم کد کاراکتر را مجددا از رشته استخراج کرده و با تابع msgbox اعلام کنیم که به درستی عدد 8531 را
اعلام خواهد کرد :
کد:
    dim text as string
    text = chrw(8531)
    msgbox [b]ascw[/b](text)
تا اینجای کار ویژوال بیسیک کاملا سیستم unicode را پیاده می کند، اما فرض کنیم که یک کنترل textbox داشته باشیم
با نام text1 و بجای متغیر text از این کنترل text1 استفاده کنیم :
کد:
    text1 = chrw(8531)
    msgbox ascw(text1)
و برخلاف انتظار، بجای عدد 8531، عدد 63 اعلام می شود که کد کاراکتر علامت سوال (?) است و در داخل textbox هم
کاراکتر ? قرار می گیرد. علت این مساله این است که کنترل text1 تنها می تواند کاراکتر های تک بایتی (کد 0 الی 255)
را در خود جای دهد و توانایی نمایش کاراکتری با کد 8531 را ندارد، پس بجای آن کاراکتر ? را درج می کند.

راه حل استفاده از توابع api ویندوز است که مشکل را حل می کنند.
در برنامه ای که نوشتم توابع زیر unicode هستند :

تابع getcharacterplacementw برای استخراج glyph های کاراکتر ها (حالت های چسبان و غیر چسبان حروف فارسی-عربی)
تابع exttextoutw برای نمایش glyph ها
تابع getwindowtextw برای دریافت رشته unicode داخل یک textbox (از مشخصه text کنترل های textbox استفاده نکنید
چون ansi هستند)
تابع getwindowtextlengthw برای دریافت طول رشته unicode داخل یک textbox
تابع setwindowtextw برای ارسال یک متن unicde به داخل یک textbox

این توابع api را درون یک ماژول (module) به نام moduleunicode تعریف کردم و برای استفاده ساده تر از آنها توابعی را با
ویژوال بیسیک ایجاد کردم :

تابع getglyphs مجموعه glyph های یک رشته را درون یک آرایه از نوع integer برمی گرداند، پارامتر hdc بایستی
روی مشخصه hdc یک form یا picturebox یا textbox یا ... تنظیم شود، اینکه در آن کنترل چه فونتی بکار رفته باشد اهمیت
زیادی دارد، زیرا یک کاراکتر ممکن است در دو فونت متفاوت شماره glyph های متفاوتی داشته باشد.

تابع gettext متن unicde داخل یک textbox را بر می گرداند.

تابع settext متن unicode داخل یک textbox را به متن دلخواهی تغییر می دهد.

تابع printglyph یک glyph مشخص را در موقعیت x و y (برحسب pixel) دلخواهی چاپ می کند. پارامتر hdc بایستی
روی مشخصه hdc یک form یا picturebox تنظیم شود، هر فونت و رنگی که در آن فرم یا کنترل فعال باشد برای ترسیم
glyph بکار خواهد رفت. حتما فونتی را بکار ببرید که در هنگام بکارگیری تابع getglyphs بکار برده بودید.

preview.gif


کد کامل برنامه به همراه فایل اجرایی exe ضمیمه این پست می باشد.
ُسلام به همه دوستان گل به خصوص مدیر های انجمن
می دونم نباید درخواست برای جواب داشته باشم
اما این برنامه خیلی فوریه :کسی می تونه خروجی این برنامه رو در تکست باکس دیگری نمایش بده راستی اگر کسی می دونه چه جوری میشه متن داخل تکست بباکس رو بر اساس یونی کد یا انسی ذخیره کنه برام سورسش رو بگذاره
بازم جا داره در اینجا از گذاشتن این پست برای درخواست جواب کمال شرمندگی و معذرت را داشته باشم
 

the_king

مدیرکل انجمن
ُسلام به همه دوستان گل به خصوص مدیر های انجمن
می دونم نباید درخواست برای جواب داشته باشم
اما این برنامه خیلی فوریه :کسی می تونه خروجی این برنامه رو در تکست باکس دیگری نمایش بده راستی اگر کسی می دونه چه جوری میشه متن داخل تکست بباکس رو بر اساس یونی کد یا انسی ذخیره کنه برام سورسش رو بگذاره
بازم جا داره در اینجا از گذاشتن این پست برای درخواست جواب کمال شرمندگی و معذرت را داشته باشم

در مورد ذخیره سازی و فراخوانی متن یونیکد (از متغیر String و به داخل متغیر String) قبلا در صفحه سوم این گفتگو
روتین ارائه کردم :

پنجره showopen و showsave

می مونه انتقال متن String به درون TextBox و یا خواندن از TextBox به داخل یک متغیر String ، دقت کنید که خواندن از
TextBox و نوشتن داخل TextBox همچنان با آن دو تابع GetText و SetText ای که معرفی کردم انجام بشه وگرنه
اطلاعات Unicode در بین راه تبدیل به Ansi میشه و از دست میره.
 

mohamadrezamm

New Member
سلام به همه عزیزان
the_king جان من از کمک شما در مورد ذخیره سازی بی نهایت سپاس گذارم
من ذخیره سازی رو تونستم درست کنم با کمکتون ولی نمایش ﻣ ﺸ ﻬ ﺪ را در تکست باکس دیگری نتونستم
اگر براتون امکان داره روی همون برنامه قبلی وقتی روی کامند کلیک شد به جای اینکه روی فرم ﻣ ﺸ ﻬ ﺪ را نمایش بدهد در درون یک تکست باکس دیگری نمایش دهد
خیلی خیلی ممنون از کمک شما در برنامه هایی قبلی
 

mohamadrezamm

New Member
سلام به همه دوستان من رفتم و از تابع GetText و setText استفاده کردم ولی نتیجه در خروجی همان تکست باکس دوم همان مشهد بود کسی میتونه کمکم کنه و برنامه رو بنویسه؟
 

mohamadrezamm

New Member
سلام به همه
the_king جان من سعی کردم با همون تابع های که گفتی کار کنم ولی وقتی می خواد بره توی تکست دیگری به جای ﻣ ﺸ ﻬ ﺪ رقم چاپ می کنه مثلا 3157412336 می تونی برنامه رو برام تغیر بدی که به جای رقم خود حروفم رو بنویسه مثلا ﻣ ﺸ ﻬ ﺪ؟
ممنون
 

the_king

مدیرکل انجمن
یک سئوال از the_king عزیز:

در تاپیک:
مسائل مربوط به رشته ها در ویژوال بیسیک
مسائل مربوط به یونیکد و کار با زبان فارسی بحث شد.

ولی در این برنامه وقتی من فارسی نوشتم در فایل تکست به درستی در تکست باکس نمایش داده شد.
و وقتی هم فارسی نوشتم در تکست باکس درست در فایل ذخیره شد. یعنی در فایل فارسی نوشته شده بود.

خواستم این قضیه را برای من شفاف کنید.

البته من ویندوز xp خود را روی فارسی تنظیم کرده ام. آیا این موضوع باعث درستی کار من بوده یا اینکه ابزارها مثل تکست باکس واقعا قادر به این کار هستند.
ولی شما در پستهای صفحه 5 و 6 آن تاپیک در جواب جناب mohamadrezamm گفتید باید از توابع api استفاده بشود و مستقیما Text1.Text استفاده نشود.

اگر خواستید جواب بدهید با نقل این پست در همان تاپیک جواب دهید. من برنامه را در زیر نقل می کنم:

برنامه ای که محتوای یک تکست باکس را در یک فایل تکست ذخیره و بازیابی می کند:
دو باتون و یک تکست باکس به فرم بیافزایید با کد زیر:
کد:
Private Sub Command1_Click()
Open "c:\test.txt" For Output As 1

Print #1, Text1.Text

Close #1
End Sub

Private Sub Command2_Click()
Open "c:\test.txt" For Input As 2
Line Input #2, x
Text1.Text = x
Close #2
End Sub

ویندوز XP جزو سیستم عامل هایی است که ذاتا بر پایه Unicode طراحی شده اند، برعکس ویندوز های 98 که ذاتا بر پایه
ANSI طراحی شده اند. کنترلهای استانداردی نظیر TextBox جزئی از خود سیستم عامل اند، به همین دلیل در ویندوز XP
تمامی کنترلهای TextBox استاندارد، Unicode اند، حتی در برنامه های ANSI همانند ویژوال بیسیک 6. گواه این مساله،
قابلیت paste کردن کاراکتر های Unicode ای است که در جداول ANSI وجود ندارند، البته به شرطی که یک فونت Unicode
همانند Arial یا Tahoma یا Times New Roman بکار ببرید و نه یک فونت ANSI همانند MS Sans Serif.

مثلا متن ⅜+⅛-⅝=⅞ را در زمان اجرای یک برنامه ویژوال بیسیک می توانید داخل یک TextBox با فونت هایی
نظیر Tahoma به درستی Paste کنید.

اما از آنجایی که ویژوال بیسیک یک متن ANSI را به کنترل ارسال می کند و یا از آن دریافت می کند، سیستم عامل ناچار
به تبدیل محتویات رشته از ANSI به Unicode و بالعکس است.

آن زبانی که شما برای non-Unicode Language در بخش Advanced تنظیمات Regional and Language Options
انتخاب می کنید، مشخص می کند که در برنامه های non-Unicode (در اغلب موارد منظور ANSI است) همانند
ویژوال بیسیک 6، متن Unicode بایستی به چه کاراکتر هایی محدود گردد، مثلا به کاراکتر های زبان فارسی.
طبیعی است که اگر کاراکتری در آن جدول کاراکتر های زبان نباشد، به خوبی ذخیره نمی شود و نمایش نمی یابد.
متاسفانه جدول کاراکتر های ANSI تک بایتی است (256 خانه) و 128 کاراکتر ابتدای آن اختصاص به زبان انگلیسی دارد و
تنها 128 کاراکتر (به دلایل تکنیکی عملا از این هم کمتر) برای سایر زبانهای انتخابی باقی می ماند.

سالک جان، چون در کامپیوتر شما زبان فارسی برای برنامه های non-Unicode انتخاب شده ، یک متن ساده فارسی
به خوبی در رشته های ANSI ذخیره می شود و به درستی نمایش می یابد. اما mohamadrezamm عزیز برای نمایش
و ذخیره سازی عبارتی مثل ﻣ ﺤ ﻤ ﺪ نیاز به ذخیره سازی کاراکتر هایی دارند که در جدول 128 حرفی فارسی
معادلی ندارد و در هنگام تبدیل از Unicode به رشته های ANSI به عبارت م ح م د مبدل می گردد که دیگر
ظاهر حروف چسبان را نخواهد داشت.

چون در زبان فارسی هر کاراکتر ممکن است چندین حالت چسبان و غیر چسبان داشته باشد
(همانند کاراکتر ح چسبان وسط ) تعداد کل کاراکتر های مورد نیاز برای نمایش تمامی
حالات حروف به مراتب بیشتر از جدول کوچک ANSI است.

برای همین حتی با وجود تنظیمات Regional and Language Options ای که روی کامپیوتر شما وجود دارد،
نمی توانید به عنوان مثال متن ﻣ ﺤ ﻤ ﺪ را با متد Text کنترل TextBox به درستی دریافت کرده و یا
با فرمان های استاندارد Print و Line Input درون فایلهای متنی به همان شکل اولیه ذخیره و یا بازیابی کنید.

در ادامه این پست کدی را نوشتم که این مساله را با همان مثال ﻣ ﺤ ﻤ ﺪ عملا نشان می دهد.
روتین های CmdSave1_Click و CmdLoad1_Click همان کد های هستند که بطور عادی از مشخصه Text
کنترل TextBox استفاده می کنند و فایلهای ANSI را بکار می برند. برای همین است که موفق به ذخیره سازی و فراخوانی
صحیح عبارت مورد نظر نمی شوند.

چون این مثال به تنهایی تنها شامل تکرار موضوعات قبلی بود، از یک تکنیک ویژه برای ایجاد کنترل های برنامه به نام
تکنیک ایجاد کنترلها در زمان اجرا (Create Controls at Runtime) استفاده کردم تا تنوعی ایجاد شود.
به همین دلیل کافیست کد برنامه را در یک فرم خالی قرار دهید، نیازی به وجود هیچگونه کنترلی روی فرم نیست،
برنامه در زمان اجرا بطور خودکار کنترلهای لازم را ایجاد کرده و روی فرم قرار می دهد :

کد:
Option Explicit

Private Const WM_PASTE As Long = &H302
Private Const GMEM_MOVEABLE As Long = &H2
Private Const CF_UNICODETEXT As Long = 13

Private Declare Function SendMessageW Lib "user32.dll" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByRef lParam As Any) As Long
Private Declare Function CloseClipboard Lib "user32.dll" () As Long
Private Declare Function EmptyClipboard Lib "user32.dll" () As Long
Private Declare Function OpenClipboard Lib "user32.dll" (ByVal hWnd As Long) As Long
Private Declare Function SetClipboardData Lib "user32.dll" (ByVal wFormat As Long, ByVal hMem As Long) As Long
Private Declare Function GlobalAlloc Lib "kernel32.dll" (ByVal wFlags As Long, ByVal dwBytes As Long) As Long
Private Declare Function GlobalLock Lib "kernel32.dll" (ByVal hMem As Long) As Long
Private Declare Function GlobalUnlock Lib "kernel32.dll" (ByVal hMem As Long) As Long
Private Declare Function GlobalFree Lib "kernel32.dll" (ByVal hMem As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)

Public WithEvents TextBox1 As TextBox
Public WithEvents CmdLoad1 As CommandButton
Public WithEvents CmdSave1 As CommandButton
Public WithEvents CmdInsert As CommandButton

Private Sub Form_Load()
    ScaleMode = vbPixels
    Set CmdLoad1 = Controls.Add("VB.CommandButton", "CmdLoad1")
    Set CmdSave1 = Controls.Add("VB.CommandButton", "CmdSave1")
    Set TextBox1 = Controls.Add("VB.TextBox", "TextBox1")
    Set CmdInsert = Controls.Add("VB.CommandButton", "CmdInsert")
    With TextBox1
        .Text = "Use Insert button"
        .Font.Name = "Tahoma"
        .Font.Size = 10
        .Alignment = vbCenter
        .RightToLeft = True
        .Visible = True
        .Move 10, 10, 210, 25
    End With
    With CmdInsert
        .Caption = "Insert (Mohammad)"
        .Visible = True
        .Move 10, 50, 210, 30
    End With
    With CmdLoad1
        .Caption = "Load (ANSI)"
        .Visible = True
        .Move 10, 90, 100, 30
    End With
    With CmdSave1
        .Caption = "Save (ANSI)"
        .Visible = True
        .Move 120, 90, 100, 30
    End With
End Sub

Private Sub [B]CmdSave1_Click[/B]()
    Open "c:\test.txt" For Output As 1
    Print #1, TextBox1.Text
    Close #1
End Sub

Private Sub [B]CmdLoad1_Click[/B]()
    Dim X As String
    TextBox1.Text = ""
    Open "c:\test.txt" For Input As 2
    Line Input #2, X
    Close #2
    TextBox1.Text = X
End Sub

Private Sub CmdInsert_Click()
    Dim Text As String
    Text = ChrW(&HFEE3) & " " & ChrW(&HFEA4) & " " & ChrW(&HFEE4) & " " & ChrW(&HFEA9)
    With TextBox1
        SetClipboardText Text
        .Text = ""
        DoEvents
        SendMessageW .hWnd, WM_PASTE, 0, ByVal 0&
    End With
End Sub

Private Sub SetClipboardText(ByVal Text As String)
    Dim Handle As Long, Pointer As Long
    Dim Length As Long
    On Error GoTo LErr
    Length = Len(Text)
    If OpenClipboard(0) = 0 Then Exit Sub
    If EmptyClipboard = 0 Or Length = 0 Then
        CloseClipboard
        Exit Sub
    End If
    Length = Length + 1
    Text = Text & vbNullChar
    Handle = GlobalAlloc(GMEM_MOVEABLE, Length * 2)
    If Handle <> 0 Then
        Pointer = GlobalLock(Handle)
        If Pointer = 0 Then
            GlobalFree Handle
        Else
            CopyMemory ByVal Pointer, ByVal StrPtr(Text), Length * 2
            GlobalUnlock Handle
            SetClipboardData CF_UNICODETEXT, Handle
        End If
    End If
LNext:
    CloseClipboard
    Exit Sub
LErr:
    Resume LNext
End Sub

پس از اجرای برنامه، ابتدا با دکمه Insert عبارت محمد را درون TextBox قرار داده و سپس سعی کنید تا با روال های عادی
آنرا در فایل متنی نوشته و یا فراخوانی کنید.
 

mohamadrezamm

New Member
the_king عزیز به خدا می دونم پست اضافی نباید بدم ولی می خواستم بگم شما که اینقدر استادی یک نگاهی هم به مشکل من بنداز توی پست های بالایی به خدا اگر این برنامه برام مهم نبود اینقدر اسرار نمی کردم
این برنامه برام خیلی حیاتی هست
بسیار تا بسیار ممنون میشم اگر این قابلیت رو به همون برنامه قبلی اضافه کنید
 

saalek110

Well-Known Member
king عزیز من مقداری مطالعه کردم و مقداری روی سورس شما کار کردم ولی هنوز درست بعضی قسمتها را نفهمیدم.

مثلا:
من یک تکست باکس به فرم اضافه کردم و رویداد کلیک باتون را این طور تغییر دادم( قسمتهای آبی اضافه شده ) :
کد:
Private Sub Command1_Click()
    Dim Text As String
    [COLOR="Blue"]Dim my_str As String[/COLOR]
    Dim Glyphs() As Integer
    Dim Index As Long
    Me.Cls
    Text = GetText(Text1)
    Glyphs = GetGlyphs(Text, Me.hDC)
    For Index = 0 To UBound(Glyphs)
        PrintGlyph Glyphs(Index), Me.hDC, 290 - (UBound(Glyphs) - Index) * 20, 70
    [COLOR="Blue"]    my_str = my_str & ChrW(Glyphs(Index))[/COLOR]
    Next
   [COLOR="Blue"]  SetText Text2, my_str[/COLOR]
End Sub
و انتظار داشتم همان چیزی که روی فرم شما چاپ کردید در تکست باکس دوم نمایش داده شود ولی ???? نمایش داده شد. یعنی شماره ها جابجاست. اشتباه من کجاست؟ بی زحمت کمی بیشتر توضیح دهید.
 

the_king

مدیرکل انجمن
علت این مساله اینه که شماره Glyph مربوط به فونته و در هر فونتی می تونه متفاوت باشه و ارتباطی با شماره کاراکتر ها
در جدول Unicode نداره. شما بجای شماره Unicode کاراکتر ها از شماره Glyph شون استفاده کردید که با جدول Unicode
همخونی نداره.
 

mohamadrezamm

New Member
سلام به آقا سالک و the_king جان
میشه بگید الان باید از چه کدی در این برنامه استفاده کنیم تا به جای ؟؟؟؟ حروف چاپ بشه آخه من از صبحت های the_king جان چیزی دستگیرم نشد
خیلی ممنون از هر دو بزرگوار
 

the_king

مدیرکل انجمن
سلام به آقا سالک و the_king جان
میشه بگید الان باید از چه کدی در این برنامه استفاده کنیم تا به جای ؟؟؟؟ حروف چاپ بشه آخه من از صبحت های the_king جان چیزی دستگیرم نشد
خیلی ممنون از هر دو بزرگوار

شما هنوز در نمایش حروف یونیکد مشکل دارید؟ اگه استفاده از توابع API برایتان مشکل است، پیشنهاد می کنم از
کنترل TextBox ای که در Microsoft Forms 2.0 معرفی شده بجای TextBox استاندارد استفاده کنید که رابط اش
Unicode و نیازی به کد نویسی اضافه ندارد، البته کنترلهای ActiveX دردسر های خاص خود را دارند.

اگر روی سیستم تان Microsoft Office نصب شده است نیازی به نصب آن نیست ولی در غیر اینصورت بایستی
Microsoft ActiveX Control Pad را از سایت مایکروسافت دریافت کرده و نصب کنید که شامل Microsoft Forms 2.0 است.

لینک Microsoft ActiveX Control Pad در سایت مایکروسافت :

Microsoft ActiveX Control Pad

لینک مستقیم فایل setuppad.exe به حجم 2.7 مگابایت :

setuppad.exe

این برنامه که در سیستم هایی که Microsoft Office نصب شده وجود دارد، چندین فایل از جمله یک فایل dll به نام FM20.DLL
را در شاخه System32 ویندوز نصب میکنه که در ویژوال بیسیک تحت عنوان Microsoft Forms 2.0 Object Library
قابل استفاده است.

در منوی Project ویژوال بیسیک آیتم Components را انتخاب کنید (ترکیب کلیدی Ctrl + T).
حالا عنوان Microsoft Forms 2.0 Object Library را پیدا کنید و تیک بزنید.
اکنون سری کنترلهای Microsoft Forms 2.0 به لیست کنترلها اضافه می شود. اکنون بجای کنترل TextBox استاندارد
از کنترل TextBox ای که اضافه شده (آیکونی شبیه به |ab دارد) استفاده نمایید. این کنترل رابط اش Unicode است،
و متن های Unicode را به درستی نمایش می دهد و مشخصه Text اش هم Unicode است.
فقط دو نکته را همواره به خاطر داشته باشید.

1) اگر قصد ساختن فایل اجرایی exe یا انتقال پروژه به یک ویندوز دیگر را دارید، حتما این برنامه Microsoft ActiveX Control Pad
را به همراه داشته باشد تا قبل از اجرای برنامه یا باز کردن پروژه نصب گردد، وگرنه نه برنامه اجرا می شود و نه پروژه
به درستی باز می شود، اگر کنترل های Microsoft Forms 2.0 Object Library در ویندوز پیدا نشود، کنترل TextBox
مفقود شده با یک PictureBox جایگزین می شود که اجرای برنامه را مختل می کند.

2) همیشه یک فونت Unicode همانند Tahoma یا Arial یا Times New Roman را در TextBox ها بکار ببرید.

می توانید با کدهای زیر یک متن را در TextBox1 قرار دهید و یا متن داخل TextBox1 را در TextBox2 کپی کنید :

کد:
    TextBox1.Text = ChrW(&HFEE3) & " " & ChrW(&HFEA4) & " " & ChrW(&HFEE4) & " " & ChrW(&HFEA9)
    TextBox2.Text = TextBox1.Text
 

جدیدترین ارسال ها

بالا