PDA

View Full Version : دريافت متن فارسي ClipBoard



seyed_farid
شنبه 24 اردیبهشت 1390, 20:50 عصر
من براي خواندن متن ClipBoard از دستور زير استفاده مي كنم
ClipBoard.AsText
ولي اگر كلمه فارسي در كليپ بورد ذخيره شده باشد فقط ؟؟؟؟ نمايش داده مي شود.:گیج:
براي حل مشكل بايد چكار كنم؟:تشویق:

SAASTN
شنبه 24 اردیبهشت 1390, 23:44 عصر
مسئلتون احتمالا به unicode بر می گرده، و احتمالا از نسخه های قدیمی تر دلفی استفاده می کنید، چون من تو XE چک کردم بدون مشکل کار می کنه:
69920
GetTextBuf رو هم یه چک بکنید:
procedure TForm1.Button1Click(Sender: TObject);
var
Buff: PChar;
begin
GetMem(Buff, 100);
Clipboard.GetTextBuf(Buff, 100);
Caption := Buff;
end;

اگه بازم جواب نداد یه تلاشیم برای تبدیل Buff به PWideChar بکنید، من نمی تونم تست کنم، اگرم چرت می گم یکی با بیل خاموشم کنه.
خلاصه اینکه بار و بندیلو ببندینو برا مهاجرت آماده شین.

mbshareat
یک شنبه 25 اردیبهشت 1390, 00:11 صبح
با سلام
جناب SAASTN من با دلفی 6 چک کردم اگه از خود ویرایشگر دلفی کپی کنم کار می کنه ولی از Notepad همون علام سوال میشه!راستی برای تست باید ClipBrd رو هم Use کرد!
اگه منظورتون از تبدیل به PWideChar اینطوریه:
Caption := PWideChar(Buff);
فقط تعداد علامت سوالها رو نصف کرد!

seyed_farid
یک شنبه 25 اردیبهشت 1390, 10:44 صبح
ممنون از جوابهاتون
اينها هم مشكل رو حل نكرد:متفکر::ناراحت::تشویق:

seyed_farid
پنج شنبه 29 اردیبهشت 1390, 21:55 عصر
كسي براي اين مشكل تو دلفي7 راه حلي پيدا نكرده؟:گریه:

یوسف زالی
پنج شنبه 29 اردیبهشت 1390, 22:49 عصر
شاید - فقط شاید فونت رو عوض کنی درست شه.
مثلا هردو Tahoma باشن.
من تو 7 تست کردم درست بود.
یه احتمال دیگه هم اینه که Default Language سیستم رو بذاری رو فارسی.
چون Caption برنامه های من هم همینجوری می شد.
اگه درست شد اطلاع بده که ما هم علت رو بفهمیم.

tdkhakpur
پنج شنبه 29 اردیبهشت 1390, 23:41 عصر
ولي اگر كلمه فارسي در كليپ بورد ذخيره شده باشد فقط ؟؟؟؟ نمايش داده مي شود.:گیج:
براي حل مشكل بايد چكار كنم؟:تشویق:

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

tdkhakpur
جمعه 30 اردیبهشت 1390, 23:56 عصر
tdkhakpur عزیز من تو دلفی 7 تست کردم داره کار می کنه.
ایشون احتمالا مشکل defaul language دارن
تا اونجایی که میدونم داخل دلفی هفت ansistring نمیتونه یونیکد رو داخلش ثبت کنه.

یوسف زالی
شنبه 31 اردیبهشت 1390, 00:55 صبح
"تا اونجایی که میدونم داخل دلفی هفت ansistring نمیتونه یونیکد رو داخلش ثبت کنه"

شما درست می فرمایید.

من با استفاده از WideChar در این کد تونستم این کار رو کنم:



function GetClipText: WideString;
var
Data: THandle;
P: Pointer;
begin
Result := '';
Clipboard.Open;
Data := GetClipboardData(CF_UNICODETEXT);
if Data <> 0 then
begin
P := GlobalLock(Data);
while WideChar(P^) <> #0 do
begin
Result := Result + WideChar(P^);
integer(P) := integer(P) + 2;
end;
GlobalUnlock(Data);
end;
Clipboard.Close;
end;


در حقیقت یه نگارش دیگه از GetAsText نوشتم.
موفق باشید.

یوسف زالی
شنبه 31 اردیبهشت 1390, 22:49 عصر
seyyedfarid آیا جواب کار شما رو داد؟

جناب tdkhakpur نظر شما در مورد این کد چیه؟
آیا راه دیگه ای پیدا کردید؟

tdkhakpur
شنبه 31 اردیبهشت 1390, 23:13 عصر
جناب tdkhakpur نظر شما در مورد این کد چیه؟

این موردی که استفاده میکنید بردن داده ها بر روی clipboard هست اما برای برگشت چی؟دلفی 7 میتونه ازش پشتیبانی کنه؟


آیا راه دیگه ای پیدا کردید؟

از کامپوننتهای سری tnt استفاده کنید تا بتونه داده های یونیکد شده رو از کلیپبورد بخونه.

یوسف زالی
شنبه 31 اردیبهشت 1390, 23:24 عصر
نه دیگه.
این مورد برای گرفتن از ClipBoard هست.
مثلا showmessage( GetClipText)// OK

tdkhakpur
شنبه 31 اردیبهشت 1390, 23:42 عصر
این مورد برای گرفتن از ClipBoard هست.
مثلا showmessage( GetClipText)// OK

منظور نمایش در حالت runtime نیست منظور اینه که جایی نداره برای ذخیره؟(showmessage به دلفی ارتباطی نداره)
حالا بگیریم متن رو خوانا نشون بده میتونید توی دلفی 7 داخل ansistring ذخیره کنید واسه بعد یا داخل کپشن یک فرم جای بدید واسه روزهای بعد.

یوسف زالی
یک شنبه 01 خرداد 1390, 08:38 صبح
تو دلفی 7 میشه WideString ذخیره کرد.
یعنی برا استفاده های بعدی میشه اونو save کرد.
منظورتون رو متوجه شدم؟

tdkhakpur
یک شنبه 01 خرداد 1390, 12:39 عصر
یعنی برا استفاده های بعدی میشه اونو save کرد.
منظورتون رو متوجه شدم؟
ببینید اگه از نظر زبان تفاوت بین دلفی هفت و 9 رو مطالعه کنید میبینید که داخل ساختار دلفی 7 چه IDE باشه و یا خود فرم دلفی قادر نیست برای یک حرف از رشته از عدد از unicode استفاده کنه.
تا حالا نشده یک بپرسه که من برنامه رو با دلفی 7 نوسته باشم بعد اومد ارتقا بدم همه اون چیزهایی که نوشته بودم روی کپشنها همش علامت سوال شده.
اما برای اینکه بتونید ansiString رو به widString تبدیل کنید


function ToUnicodeString(s:string):WideString;
var
p1 : pChar;
pw1:array[0..1024]of WideChar;
nLen1,nLen2:integer;
begin
p1:=PChar(s);
nLen1:=Length(s);
nLen2:=nLen1 * 2;
MultiByteToWideChar(CP_ACP , MB_COMPOSITE , p1 , nLen2 , @pw1 , nLen2);
Result:=WideString(pw1);
end;

اما این دلیل نمیشه که علامت ؟ برگشت داده بشه .(فقط برای داده های دیتا های فایل مثل sql و چیزهای دیگه میشه ازش استفاده کرد.)

seyed_farid
سه شنبه 03 خرداد 1390, 23:46 عصر
با سلام.
هيچكدام از اين پاسخها مشكل را حل نكرده:گریه:
يعني تو دلفي7 براي اين مورد راه حلي ندارند:متعجب::خجالت::افسرده:

tdkhakpur
چهارشنبه 04 خرداد 1390, 00:19 صبح
يعني تو دلفي7 براي اين مورد راه حلي ندارند

راه حلش عرض شد استفاده از کامپوننتهای TNT یا اینکه بشینید کامپوننت بنویسید.
قضیه دلفی 7 مثل اون مثلی میمونه که میگن خشت اول گر نهد معمار کج تا سریا ...
دلفی هفت این پیش بینی رو برای ide و متغییر در نظر نگرفته که بتونه داده ها رو که شما به عنوان ثابت یا استاتیک در نظر میگیرید رو بصورت unicode داخل فایل باینری داشته باشه.

seyed_farid
جمعه 06 خرداد 1390, 16:11 عصر
يعني با استفاده از کامپوننتهای TNT اين مشكل وجود نداره؟:قلب:
از كجا گيرش بيارم؟:تشویق:

tdkhakpur
جمعه 06 خرداد 1390, 18:21 عصر
از كجا گيرش بيارم

داخل گوگل TntWare رو جستجو کنید..
http://www.google.com/search?q=download+TntWare+for+delphi&hl=en&prmd=ivns&ei=LrLfTdTOEcb5sgb62uy9BQ&start=20&sa=N&biw=1003&bih=619

seyed_farid
شنبه 21 خرداد 1390, 10:46 صبح
با سلام
من با اين tnt هم نتونستم درستش كنم.:ناراحت:
اگر شما با دلفي7 انجام داديد و نتيجه گرفتيد ميشه كدش را بگذاريد؟:تشویق:
ممنون

seyed_farid
دوشنبه 10 بهمن 1390, 02:57 صبح
با این دستور You-See شد.
ممنون :بوس:

function GetClipText: WideString;
var
Data: THandle;
P: Pointer;
begin
Result := '';
Clipboard.Open;
Data := GetClipboardData(CF_UNICODETEXT);
if Data <> 0 then
begin
P := GlobalLock(Data);
while WideChar(P^) <> #0 do
begin
Result := Result + WideChar(P^);
integer(P) := integer(P) + 2;
end;
GlobalUnlock(Data);
end;
Clipboard.Close;
end;

tiphooo
دوشنبه 10 بهمن 1390, 19:11 عصر
مشکل شما فقط به Regional & Language در Windows بر می گردد که تنظیمات آن برای فارسی به درستی انجام نشده و ربطی به محیط برنامه نویسی و یا ورژن دلفی ندارد و باید تنظیمات را تغییر دهی حال اینکه کد You-See که مشکل شما را حل کرده قاعدتا در مواردی که کاربر شما هم احتمالا این مشکل را داشته باشد بهتر است از این کد را استفاده کنی .