PDA

View Full Version : سوال: RAD Studio - Caret



hkiani
دوشنبه 06 بهمن 1393, 10:58 صبح
با سلام خدمت همگی دوستان برنامه نویس

در راد استودیو (دلفی یا سی بیلدر) وقتی حین اجرا برنامه صفحه کلید را فارسی می کنیم، صفحه کلید فارسی می‌شود ولی شکل کرسر (Caret) تغییر نمی‌کند. یعنی اگر در ابتدا صفحه کلید انگلیسی باشد کرسر به صورت پرچم چپ به راست است. با فارسی کردن صفحه کلید باید کرسر راست به چپ شود ولی نمی‌شود در حالی که صفحه کلید فارسی شده است.
این مشکل در نسخه‌های قبلی دلفی و سی بیلدر وجود نداشت.

من از RAD Studio XE و ویندوز سون استفاده می کنم. ولی در RAD Studio XE6 هم امتحان کردم این مشکل برطرف نشده بود.

آیا دوستان در این زمینه نظری دارند؟ ممنون می‌شوم راهنمایی کنید. با تشکر.

meytib
دوشنبه 06 بهمن 1393, 14:27 عصر
برای فارسی کردن معمولا از دو دستور زیر استفاده میشه :




Application.BiDiKeyboard:='00000429';
LoadKeyboardLayout('00000429',KLF_ACTIVATE);

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


LoadKeyboardLayout('00000429',KLF_ACTIVATE);


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

hkiani
دوشنبه 06 بهمن 1393, 17:40 عصر
از پاسختون ممنونم. شاید منظورم را خوب بیان نکردم. روشی که شما گفتید تغییر صفحه کلید به روش کدنویسی (programatical) است که در مورد آن مشکلی وجود ندارد. من هم برای آن از پروپرتی‌های BiDiKeyboard و NonBiDiKeyboard مربوط به Application استفاده می‌کنم. مانند کد زیر:


Application->BiDiKeyboard = L"00000429";
Application->NonBiDiKeyboard = L"00000409";

بعد از اجراء کد فوق، پس از فوکوس شدن هر کنترلی که BiDiMode آن چپ به راست باشد صفحه کلید انگلیسی می شود و برای هر کنترلی که راست به چپ باشد پس از فوکوس شدن صفحه کلید به طور خودبه‌خود فارسی می‌شود. در این زمینه مشکلی نیست.

فاما مشکل زمانی است که کاربر به صورت اینتراکتیو صفحه کلید را عوض می‌کند مثلا از انگلیسی به فارسی تغییر می‌دهد (با زدن کلید Ctrl+Alt سمت راست). در این گونه مواقع صفحه کلید به درستی تغییر می‌کند یعنی اگر کلیدی را بزنیم فارسی تایپ می‌شود ولی شکل کرسر همچنان به صورت پرچم چپ براست باقی می‌ماند. در سایر برنامه ها می‌بینیم که وقتی صفحه کلید را تغییر می‌دهیم شکل کرسر نیز به نحو مناسب تغییر می‌کند تا کاربر با مشاهده‌ی آن بفهمد صفحه کلید فارسی فعال است یا انگلیسی.

حتی روش فوق را هم که گفتید امتحان کردم باز هم شکل کرسر تغییر نکرد (صفحه کلید فارسی شد). آیا شما هم با این مشکل مواجه هستید یا نه؟ لطفا نظر بدهید.

meytib
دوشنبه 06 بهمن 1393, 21:48 عصر
بله درسته وقتی کاربر خودش صفحه کلید رو عوض کنه تا زمانی که کرسر به جای دیگه ای نره پرچم اشتباه هست !.:متفکر:

meytib
دوشنبه 06 بهمن 1393, 21:55 عصر
با این پروسیجر مشکل حل میشه :



procedure OnChangeLanguageEvent(var Msg: TMessage); message CM_INPUTLANGCHANGE;
.
.
.

procedure TForm1.OnChangeLanguageEvent(var Msg: TMessage);
begin
Screen.ActiveControl.Perform(WM_KILLFOCUS,0,0);
Screen.ActiveControl.Perform(WM_SETFOCUS,0,0);
inherited;
end;

hkiani
چهارشنبه 08 بهمن 1393, 18:08 عصر
بسیار عالی بود. مشکل برطرف شد. در ضمن مشکل دیگری نیز داشتم که با توجه به توضیحات شما مرتفع شد. مدتی بود که کند بودن برنامه اذیت کننده بود و من نمی دونستم علت آن چیست بعد فهمیدم که علت آن تنظیم نمودن BiDiKeyboard و NonBiDiKeyboard بوده است.

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

hkiani
چهارشنبه 08 بهمن 1393, 20:32 عصر
نمونه برنامه به C++‎‎‎‎‎ Builder برای دوستانی که مایلند از آن استفاده کنند:


// Unit1.h
//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------

#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------

class TForm1 : public TForm
{
__published: // IDE-managed Components
TEdit *Edit1;

private: // User declarations
MESSAGE void __fastcall CMInputLangChange(TMessage &Message);

public: // User declarations
__fastcall TForm1(TComponent* Owner);

BEGIN_MESSAGE_MAP
VCL_MESSAGE_HANDLER(CM_INPUTLANGCHANGE, TMessage, CMInputLangChange);
END_MESSAGE_MAP(TWinControl);
};
//---------------------------------------------------------------------------

extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------

#endif




// Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------

#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::CMInputLangChange(TMessage &Message)
{
ActiveControl->Perform(WM_KILLFOCUS,0,0);
ActiveControl->Perform(WM_SETFOCUS,0,0);
}
//---------------------------------------------------------------------------