# Native Code > برنامه نویسی در Delphi > مباحث عمومی دلفی و پاسکال >  اصلاح کارکترهای "ک"درزمان ورود.

## SYNDROME

با سلام
دوستان بنده یک فرم Master ساختم وKeyPreview مربوط به فرم را True کرده ام و در رویداد KeyPress مربوط به آن کد زیر را نوشته ام.

procedure TMaster.MyEdit2KeyPress(Sender: TObject; var Key: Char);
begin
    IF Key = #223 then Key := #152;
    IF Key = #236 then Key := #237;
end;

حالا همه فرمهای را از کلاس این فرم می سازم.

  TForm1 = class(TMaster)

حالا هر زمان کاربر کلید"ک" را بزند و کد مربوط #223 باشد به #152 تغییر میکند.
و اگر کلید "ی" با کد #236 زده بشود به #237 تبدیل می شود.
حالا بنده دو سوال داشتم.
1-نظر شما دوستان در رابطه با این کار چی است؟خوب است یا بد و همچنین دلیل خود را بیان کنید.
2-اگر روشی بهتر و سریععتر از این داریدپیشنهاد کنید.
منتظر نظرات شما دوستان محترم هستم.

----------


## dkhatibi

روش بهتر کپی پیست کردن کد نوشته شده در رویداد گفته شده است.

----------


## SYNDROME

با سلام



> روش بهتر کپی پیست کردن کد نوشته شده در رویداد گفته شده است.


ممنون از اینکه نظر خود را اعلام کردید.
ولی می گویید چرا؟؟؟
منتظر نظرات شما و دیگر دوستان هستم.

----------


## FSarab

unit Unit1; 
interface 
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, AppEvnts, StdCtrls; 
type
TForm1 = class(TForm)
ApplicationEvents1: TApplicationEvents;
Edit1: TEdit;
procedure ApplicationEvents1Message(var Msg: tagMSG;
var Handled: Boolean);
private
{ Private declarations }
public
{ Public declarations }
end; 
var
Form1: TForm1; 
implementation 
{$R *.dfm} 
procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
var Handled: Boolean);
begin
if (Msg.message = WM_CHAR) and (Msg.wParam = 152) then
begin
Msg.wParam := 223;
Handled := False;
end
else if (Msg.message = WM_CHAR) and (Msg.wParam = 236) then
begin
Msg.wParam := 237;
Handled := False;
end;
end;

----------


## SYNDROME

با سلام
FSarab جان دستت درد نکنه ولی خط زیر در زمان اجرای برنامه پیغام می دهد و آن را پاک می کند.

ApplicationEvents1: TApplicationEvents;


دوستان نظرشان در رابطه با این روش چیست؟
باز هم من منتظر سایر جوابها و پیشنهاد ها هستم.

----------


## FSarab

کامپوننت ApplicationEvents را از پلت Additional به فرم اضافه کن و همچنین کامپوننت Edit را از پلت Standard به فرم اضافه کن.

----------


## ghabil

> با سلام
> دوستان بنده یک فرم Master ساختم وKeyPreview مربوط به فرم را True کرده ام و در رویداد KeyPress مربوط به آن کد زیر را نوشته ام.
> منتظر نظرات شما دوستان محترم هستم.


همین روش بهترین روش هست. سایر روشها مشکل دارند.




> روش بهتر کپی پیست کردن کد نوشته شده در رویداد گفته شده است.


این دیگه از اون حرفها بودها !!!!!

----------


## Arman_1367

من نمی دانم چرا بعضی از دوستان عادت کردن همدیگر را مسخره کنند اگر قرار به مسخره کردن هست دیگه فردی که مسخره شده نظر نمی ده و ...
امید وارم دیگه از این جور مسائل پیش نیاید.

هر کس برای خودش شخصیتی داره.



یا حق...

----------


## SYNDROME

با سلام
با شکر از آقای  Ghabil و همه دوستان دیگر.



> من نمی دانم چرا بعضی از دوستان عادت کردن همدیگر را مسخره کنند اگر قرار به مسخره کردن هست دیگه فردی که مسخره شده نظر نمی ده و ...
> امید وارم دیگه از این جور مسائل پیش نیاید.
> هر کس برای خودش شخصیتی داره.


فکر نکنم دوستان قصد چنین کاری را داشته باشند و با شناختی که بنده از دوستان داریم غیر ممکن است چنین منظوری داشته باشد.
*بهتر است از حاشیه خارج شویم.*
من باز هم متظر نظرات دیگر دوستان هستم.

----------


## Kamyar.Kimiyabeigi

چرا از kbd استفاده نمیکنین تا Keyboard همه کاربرانتون یکسان بشه در ضمن نیازی هم به کد نویسی نداره.

----------


## SYNDROME

با سلام



> چرا از kbd استفاده نمیکنین تا Keyboard همه کاربرانتون یکسان بشه در ضمن نیازی هم به کد نویسی نداره.


با تشکر از راهنمایی شما
قبلا در رابطه با این قضیه بحث شد که اگر نرم افزار دیگری روی سیستم نصب باشد تکلیف چیست؟

----------


## dkhatibi

می تونی یک کامپوننت edit برای این منظور بنویسی
این هم یک راه سخت تر و جالب تر. که از روش اولیه ی خودت باید بهره گیری.

----------


## SYNDROME

با سلام



> می تونی یک کامپوننت edit برای این منظور بنویسی
> این هم یک راه سخت تر و جالب تر. که از روش اولیه ی خودت باید بهره گیری.


دستت درد نکنه .
ولی اگر این کار را بکنم باید برای ComboBox و DbGrid و . . . کامپونتهای دیگر هم این کار را بکنم.
آیا راه حل دیگری سراغ ندارید.

----------


## اَرژنگ

با داده‌ها چکار میکنید؟ میریزیدشان به داتابیس؟ اگر که بله، به جایه اینکه ک ها را در قسمت گوئی جایگیزین کنید ، در زمان اینسرت به داتابیس عوض کنید.
روش FSarab چطور بود؟ به نظر من خوب آمد، از روش FSarab چرا استفاده نمیکنید؟ (امتحانش نکردم ، اگرشما امتحان کردید و به مشکلی برخوردید بگید)

----------


## مهدی کرامتی

بنظر من بهتره یک کامپوننت بنویسید که رویداد OnKeyDown فرم Parent را Hook کند و پس از اجرای پروسه تعویض کد کلید فشرده شده، رویداد مذکور در فرم Parent را فراخوانی کند که ضرری به روند اجرای برنامه وارد نشود. اگر توضیحات کافی نبود میتوانم کامپوننت را برایتان بنویسم.

----------


## SYNDROME

با سلام



> بنظر من بهتره یک کامپوننت بنویسید که رویداد OnKeyDown فرم Parent را Hook کند و پس از اجرای پروسه تعویض کد کلید فشرده شده، رویداد مذکور در فرم Parent را فراخوانی کند که ضرری به روند اجرای برنامه وارد نشود. اگر توضیحات کافی نبود میتوانم کامپوننت را برایتان بنویسم.


دست شما دوست عزیز درد نکنه.
منظورتان دقیقا همین روشی هست که خودم در اول تاپیک پیشنهاد دادم.
اگر امکان دارد بیشتر توضیح دهید.
با تشکر

----------


## SYNDROME

با سلام



> با داده‌ها چکار میکنید؟ میریزیدشان به داتابیس؟ اگر که بله، به جایه اینکه ک ها را در قسمت گوئی جایگیزین کنید ، در زمان اینسرت به داتابیس عوض کنید.


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



> روش FSarab چطور بود؟ به نظر من خوب آمد، از روش FSarab چرا استفاده نمیکنید؟ (امتحانش نکردم ، اگرشما امتحان کردید و به مشکلی برخوردید بگید)


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

----------


## SYNDROME

با سلام
اقا Arman گل می تونی در رابطه با دستورات بالا توضیح بدهی و نحوه کار کردنش و نحوه اصلاح کدها.(من تا حالا با این نوع کار آشناییت ندارم)
ممنون از کمکتان

----------


## SYNDROME

با سلام



> دوست عزیز آی دی بزار تا برات توضیح بدم.


SYNDROME2100@Yahoo.com
حالا یک سوال.
روشی را که خودم پیشنهاد دادم چطور بود.فکر کنم تقریبا یک نوع نگرش دارند ولی در نحوه اجرا متفاوتند.

----------


## FSarab

http://us.f13.yahoofs.com/bc/467ec31...xesfGBgmsUJ0Kx

----------


## مهدی کرامتی

منظورم دقیقا چنین چیزی بود:

unit uFarsiFixer;

interface

uses
  Forms,
  Controls,
  SysUtils,
  Dialogs,
  Classes;

type
  TFarsiKeyboardHook = class(TComponent)
  private
    parentKeyDown: TKeyEvent;
    procedure myKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
  protected
    { Protected declarations }
  public
    constructor Create(AOwner: TComponent); override;
  published
    { Published declarations }
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Barnamenevis.org', [TFarsiKeyboardHook]);
end;

{ TFarsiKeyboardHook }

constructor TFarsiKeyboardHook.Create(AOwner: TComponent);
begin
  inherited;
  if AOwner is TForm then
    begin
      parentKeyDown := TForm(Owner).OnKeyDown;
      TForm(Owner).OnKeyDown := myKeyDown;
      TForm(Owner).KeyPreview := true;
    end;
end;

procedure TFarsiKeyboardHook.myKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if Key = 223 then Key := 152;
  if Key = 236 then Key := 237;
  if Assigned(parentKeyDown) then
    parentKeyDown(Sender, Key, Shift);

end;

end.



فکر میکنم کد فوق اونقدر ساده هست که نیازی به توضیح نداشته باشه، اما بهرحال اگر نیاز هست بفرمائید تا توضیح بدم.

----------


## Kamyar.Kimiyabeigi

> با سلام
> 
> با تشکر از راهنمایی شما
> قبلا در رابطه با این قضیه بحث شد که اگر نرم افزار دیگری روی سیستم نصب باشد تکلیف چیست؟


ولی این kbd اصلا" کار غیر استانداردی انجام نمیده برعکس Keyboard را کاملا" استاندارد میکنه. من خودم بشخصه بعنوان کاربر وقتی ببینم که Keyboard ام استاندارد شده ترجیح میدم بقیه نرم افزارهای سیستمم هم براساس همین Keyboard کار کنن.

----------


## Arman_1367

به نظر شما آیا این روش بهتره که KeyPreview فرم فعال کنیم می دانید اگر مثلاً 10 تا panel روی هم باشد برای آنکه خود کنترل کلید را برای فرم بفرستد باید یک حلقه را طی کند و بالآخره این یک مقدار زمان هر چند اندک می گیرد بعد می گن دلفی زبان کندی همینه دیگه البته من قبول دارم همه شما تجربه بیشتری دارید اما تمام برنامه نویسی این نیست که کد بی نقصی باشه باید علاوه بر آن از بهترین روش هم استفاده بشه تا برنامه سریع هم باشه.

----------


## Hamid_PaK

روش آرمان خوب بود ولی کاش دیگه یه روال جدا واسه WndProc درست نمی کرد و همون رو Override می کرد ...

یا حق ...

----------


## SYNDROME

با سلام



> ولی این kbd اصلا" کار غیر استانداردی انجام نمیده برعکس Keyboard را کاملا" استاندارد میکنه. من خودم بشخصه بعنوان کاربر وقتی ببینم که Keyboard ام استاندارد شده ترجیح میدم بقیه نرم افزارهای سیستمم هم براساس همین Keyboard کار کنن.


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

----------


## ghabil

بازهم میگم بنظر من روش خودت از همه روشهایی که اینجا مطرح شده (بجز مورد ساختن کامپوننت که تقریبا یکی هستند) روش بهتری به دلایل مختلف که از همه مهمترشون اینه که یک ساختار درست Object Oriented هست نه Spaghetti Oriented ;)

----------


## SYNDROME

با سلام
با تشکر فراوان از کاربر گرامی DelphiAssistant.
واقعا بنده را شما و دیگر دوستان شرمنده کردید.
دستورا شما را در یک Unit نوشتم و برنامه اجرا شد.ولی 2 تا مشکل دارم.
1-اگر امکان داشت دستورات را تا حدودی برام توضیح دهید.(البته گیرایی بنده پایین است :چشمک:  )
2-و نحوه فعال شدن تابع زیر را نیز توضیح دهید.
منتظر جواب شما هستم.
با تشکر

----------


## SYNDROME

با سلام



> بازهم میگم بنظر من روش خودت از همه روشهایی که اینجا مطرح شده (بجز مورد ساختن کامپوننت که تقریبا یکی هستند) روش بهتری به دلایل مختلف که از همه مهمترشون اینه که یک ساختار درست Object Oriented هست نه Spaghetti Oriented ;)


با تشکر از Ghabil عزیر که باز هم نظر خود را بیان کرد.
علیرضا جان ما برنامه نویسان باید یاد بگیریم همیشه گوش شنوا داشته باشیم تا بتوانیم قویتر از قبل شویم.
هدف بنده از ایجاد این تاپیک 2 پیز بود:
1-رفع مشکل خودم.
2-بعد از بحث با دوستان دیگر به یک روش مناسب برسیم و روش پیشنهادی را تحلیل و ضعف و حسن آنها را بیان کنیم.
دوستان لطف کردند و در این بحث شرکد کردند و واقعا بنده را مورد لطف خود قرار دادند.
بنده امیدوار در پایان این تاپیک به یک جمع بندی خوب برسیم.
با تشکر از همه دوستان که نظرتان خود را بیان کردند و باز هم منتظر نظرات بقیه کاربران هستیم .

----------


## A.Nemati

نظرات جالبی ارایه شد ولی به این موضوع نیز فکر کنید.
در برنامه‌های ما کاربران برای ورود اطلاعات معمولا یا از Edit استفاده می‌کنند یا Memo و در موارد معدودی از Combobox و MaskEdit. و همین نیازهای ما رو پاسخ می‌ده. به نظر من بهتره بجای اینکه ما اورهد این کار رو روی کل فرم بگذاریم و یا کی‌برد رو Hook کنیم، می‌تونیم چهار کلاس پایه کوچولو برای این چهار کامپوننت (تازه اگه هر چهارتاش لازم باشه)، درست کنیم که حروف رو جایگزین کنه (مثل TMaster آقای SYNDROME).
مزیت این کار زیاده، مثلا:
1- اورهد بیخودی روی کل سیستم ندارید و فقط ابزار موردی نیازتون اونم در موقع ورود اطلاعات، چک می‌شن.
2- همین اطلاعات رو توی دیتابیس می‌ریزید و در نتیجه موقع نمایش اطلاعات در هر کامپوننتی (Grid, Label, Edit, ListBox, ...) همونطوری که ذخیره شده می‌بینید.
3- می‌تونید کم کم این کامپوننتهای پایه خودتون رو توسعه بدید و عملا از یک OO اصولی لذت ببرید.

موفق باشید.

----------


## اَرژنگ

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


اگر درست برنامه نویسی شده باشه ذاشتن یک فیلتر در لایه داتابیس کار درستی است.
به جایه اینکه در هر فرم ک ها و ی ها را بخواهند درست کنند، باید یا در یکجا برایه کل اپلیکیشن کار کنه و یا اینکه در یکی از لایه‌هایه داتابیس و یا لایه منطقی برنامه (البته اگر برنامه نویسی لایه‌ای میکنند اگر هم که خیر ، برایه برنامه‌نویسی به روش اسپاگتی دیگر روش بهتر و یا بد تر وجود نداره ).

----------


## SYNDROME

با سلام



> نظرات جالبی ارایه شد ولی به این موضوع نیز فکر کنید.
> در برنامه‌های ما کاربران برای ورود اطلاعات معمولا یا از Edit استفاده می‌کنند یا Memo و در موارد معدودی از Combobox و MaskEdit. و همین نیازهای ما رو پاسخ می‌ده. به نظر من بهتره بجای اینکه ما اورهد این کار رو روی کل فرم بگذاریم و یا کی‌برد رو Hook کنیم، می‌تونیم چهار کلاس پایه کوچولو برای این چهار کامپوننت (تازه اگه هر چهارتاش لازم باشه)، درست کنیم که حروف رو جایگزین کنه (مثل TMaster آقای SYNDROME).
> مزیت این کار زیاده، مثلا:
> 1- اورهد بیخودی روی کل سیستم ندارید و فقط ابزار موردی نیازتون اونم در موقع ورود اطلاعات، چک می‌شن.
> 2- همین اطلاعات رو توی دیتابیس می‌ریزید و در نتیجه موقع نمایش اطلاعات در هر کامپوننتی (Grid, Label, Edit, ListBox, ...) همونطوری که ذخیره شده می‌بینید.
> 3- می‌تونید کم کم این کامپوننتهای پایه خودتون رو توسعه بدید و عملا از یک OO اصولی لذت ببرید.
> 
> موفق باشید.


با تشکر از اظهار نظر شما دوست بزرگوار.



> اگر درست برنامه نویسی شده باشه ذاشتن یک فیلتر در لایه داتابیس کار درستی است.
> به جایه اینکه در هر فرم ک ها و ی ها را بخواهند درست کنند، باید یا در یکجا برایه کل اپلیکیشن کار کنه و یا اینکه در یکی از لایه‌هایه داتابیس و یا لایه منطقی برنامه (البته اگر برنامه نویسی لایه‌ای میکنند اگر هم که خیر ، برایه برنامه‌نویسی به روش اسپاگتی دیگر روش بهتر و یا بد تر وجود نداره ).


ولی دوست گرامی روشی که بنده گفتم و دیگر دوستان نیز گفتند راحت است چون فقط در اول فرم می نویسی TForm2 = class(TForm_Master) و خیلی راحت است.
ولی باز هم از نظر شما متشکرم.
کاربر محترم *DelphiAssistant* من منتظر توضیحات شما هستم.
ممنون می شوم اگر در رابطه با تابعی که نوشتید توضیح بدهید.
با تشکر فراوان

----------


## FSarab

unit uFarsiFixer;
interface
uses
 Forms,
 Controls,
 SysUtils,
 Dialogs,
 Classes;
type
 TFarsiKeyboardHook = class(TComponent)
 private
   parentKeyPress: TKeyPressEvent;
   procedure myKeyPress(Sender: TObject; var Key: Char);
 protected
   { Protected declarations }
 public
   constructor Create(AOwner: TComponent); override;
 published
   { Published declarations }
 end;
procedure Register;
implementation
procedure Register;
begin
 RegisterComponents('Barnamenevis.org', [TFarsiKeyboardHook]);
end;
{ TFarsiKeyboardHook }
constructor TFarsiKeyboardHook.Create(AOwner: TComponent);
begin
 inherited;
 if AOwner is TForm then
   begin
     parentKeyPress := TForm(Owner).OnKeyPress;
     TForm(Owner).OnKeyPress := myKeyPress;
     TForm(Owner).KeyPreview := True;
   end;
end;
procedure TFarsiKeyboardHook.myKeyPress(Sender: TObject; var Key: Char);
begin
 if Key = #152 then Key := #223;
 if Key = #236 then Key := #237;
 if Assigned(parentKeyPress) then
   parentKeyPress(Sender, Key);
end;
end.

----------


## اَرژنگ

> با سلام
> 
> ولی دوست گرامی روشی که بنده گفتم و دیگر دوستان نیز گفتند راحت است چون فقط در اول فرم می نویسی TForm2 = class(TForm_Master) و خیلی راحت است.
> ولی باز هم از نظر شما متشکرم.


راحتی در برنامه‌نویسی۲ جور است.
۱ـ با یک هک که فعلا برنامه کار کند. 
۲ـ استفاده از اصولی که در دراز مدت توسعه برنامه و نگهداریش راحت باشد٫

این روش که شما گفتید و دیگر دوستان نیز گفتند راحتیش به این است الان با یک خط از یک لحاظ این مشکل را برطرف کرده ولی به مشکلات دیگری که میانجمد فکر کنید:
۱ـمنطق برنامه را به گوئی گره میزنه (این همیشه در دراز مدت مشکل ایجاد میکنه)
۲ـ اگر کسی مستقیما داتا را به داتابیس وارد کند(چه دستی و یا با یک برنامه دیگر) این روش ک ها را درست نمیکنه
۳- تمام فرمهایه پروجکت باید از TForm_Master باید به ارث ببرند. دلیل این ارث بردن به این که منطق برنامه را که مرتبط به نگهداری داده در داتابیس است را داشته باشند به رفتار فرم گره میزنه. حالا اینکه طرض رفتار فرمها عوض شده به سختی استفاده کردن از فرم اضافه میکند، البته نه الان که تازه است و کد دیگری نیست ولی با گذاشتن زمان و اضافه شدن کد احتمالش بیشتر میشه. وقتی هم که مشکلات ایجاد میشه به دلیل وجود داشتن کد در جائی که نیاز نبود (یعنی اینکه یک روش حل اشتباه در دراز مدت بیشتر ناراحتی بوجود میاره ).

حالا اگر برنامه قرار نبود که داده ها را به داتابیس بریزه و فقط کاراکترها را ک شان را عوض کند، این روش حرف نداشت. ولی این برنامه به احتمال زیاد در آینده گسترش خواهد یافت. اگر مشکل را الان به شکل صحیح درست نکنید با گذشت زمان فقط سختر میشه. 

در ضمن اینها نظر من نیست، هر کتاب شروع برنامه نویسی همین را میگد و فقط من بازگو کردم.
مشکل شما در حقیقت فقط اصلاح کارکترهایه ک در زمان ورود نیست، بله دلایل و عواقب اینکار در قسمتهایه دیگر برنامه اثر میگذارند. با داشتن راه حلی که عواقب اینکار را فقط به یک قسمت کوچکی از برنامه محدود میکنند در دراز مدت خیلی راحتتر خواهد بود تا استفاده از TForm2 = class(TForm_Master).

اما اگر این برنامه قرار نیست گسترش پیدا کند و از این حالتی که الان وجود داره تغییر نخواهد کرد (و الان هم کار میکند) در آن سورت از TForm2 = class(TForm_Master) استفاده کنید و هرچی که بالا گفتم ر افراموش کنید.

----------


## اَرژنگ

> بازهم میگم بنظر من روش خودت از همه روشهایی که اینجا مطرح شده (بجز مورد ساختن کامپوننت که تقریبا یکی هستند) روش بهتری به دلایل مختلف که از همه مهمترشون اینه که یک ساختار درست Object Oriented هست نه Spaghetti Oriented ;)


Object Oriented  به تنهایی هیچ فایده‌ای نداره، استفاده از طراحی‌هایه درست پله بعد است.
در ضمن یک بالانسی باید بین مشکلاتی که یک روش حل میکند و مشکلات دیگری که بوجود میاره باشد. در این بحث ما حتی دلیل اینکار را نپرسیده نمیتونیم نظر بدیم. 
نوشتن برنامه هایی که از اسپاگتی کد استفاده میکنند و کاملا هم Object Oriented هستند خیلی آسان است.
مثال:
در باتن کلیکها کد نوشتن، همینطوری ساختن رشته‌هایه  اس‌کیو‌ال با استفاده از تکستهایه ادیت‌باکسها و ...
Object Oriented مثل یک چاقو میماند، میشه باهاش هم جراحی کرد و هم قصابی ، روش استفاده هم مهمه، چونکه بعضا قصابی هم لازمه.

----------


## اَرژنگ

> روش بهتر کپی پیست کردن کد نوشته شده در رویداد گفته شده است.


این بدترین کاری است که یک برنامه نویس میتونه انجام بده. کد ایشان خیلی مختصر و جمع و جور است، با کپی و پیست فقط مشکلات اضافه میشه.
به http://en.wikipedia.org/wiki/Inherit...mputer_science)
نگاه بندازید.

----------


## اَرژنگ

من یک سوال داشتم، دلیل اینکار چی است؟ چرا فقط ک ها؟ ی هم دو جور است.
اگر ممکن است دلایل اینکه چرا اینکار را نیاز دارید هم را بگید، وقتی که مشکل اصلی معلوم نیست  حرف زدن در مورد یک روش حل معنی نداره.
در ضمن همینطوری عوض کردن داده کار درستی نیست. به فرض هم بگیم که بهترین روش را برایه عوض کردن ک داریم. این کار اصلا از قوائد برنامه نویسی بدور است. اگر ما داریم داده ها را عوض میکنیم، چیزی که در داتابیس میگذاریم چی هست؟ چونکه همان چیزی نیستش که کاربر به برنامه داد. فرض کنید گوگل هم همینطوری کار میکرد ، موقع جسجو فقط ک هایی را خودش قبول داره میگرفت. اصلا برایه کسی قابل قبول نمیبود.
 مشکلی که میخواهید حل کنید اصلا چی هست؟  چونکه این روش جواب درست به  یک سوال اشتباه است.

----------


## اَرژنگ

> با سلام
> 
> با تشکر از راهنمایی شما
> قبلا در رابطه با این قضیه بحث شد که اگر نرم افزار دیگری روی سیستم نصب باشد تکلیف چیست؟


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

----------


## Arman_1367

دوستان امید وارم حال همگی شما خوب باشد.
به نظر من روش آقای ارژنگ بهتر است و با منطق برنامه نویسی شئی گرا بیشتر همخوانی دارد چون یک فیلتر برای اصلاح کارکترهای ورودی هم کار یک برنامه نویس را راحت تر می کند و هم حجم برنامه را کاهش می دهد یک مثال ساده این است که با استفاده از کمپاننت DelphiAssistant شما برای هر فرم باید یک کمپاننت قرار دهید اما با در دست گرفتن پیامهای ارسالی برای برنامه شما فقط یک کمپاننت و فقط یک بار کد نویسی نیاز دارید.در ضمن فرض کنید شما بخواهید از یک فرم که در کمپاننت خاصی طراحی شده و به صورت مستقیم امکان دسترسی به آن را ندارید در برنامه استفاده کنید و باز هم نیاز به اصلاح کارکتر ورودی داشته باشید پس  این راه  بهتر است.
در هر صورت این یک کمپاننت ساده هست که امکان فیلتر کردن رویدادهای موشواره و کی بورد ارسالی برای پروژه را به شما می دهد.
لینک دانلود :لبخند گشاده!:

----------


## A.Nemati

> به هر حال در برنامه نویسی همه چیز را نمیشه انجام داد و گاها باید تکالیف را به متخصصش واگذار کرد و اینجوری که من دستگیرم شد برایه این مشکل شما kbd متخصص است. 
> این کار استانداردی است از این بابت که برنامه‌هایی هستند که برایه درست کار کردن از برنامه‌ها و یا فریم ورکهایه دیگر بهره مند میشند. به کاربر اطلاع بدید و دردسر خودتان را کم کنید.


اگه به این موضوع به عنوان یک روش کلی و اصولی بخواهیم نگاه کنیم، نمی‌تونیم چیزی مثل kbd رو مطرح کنیم.
چرا بیشتر ما وقتی صحبت از برنامه‌هامون می‌شه اونا رو فقط در یک محدوده چند یا حداکثر چند ده کاربر می‌بینیم؟ به نظر من وقتی یک برنامه اصولی می‌نویسید، باید به بازه‌های بزرگتری فکر کنید. قبول کنید که خیلی سخته که برای تک تک کاربران یک سازمان بزرگ، kbd نصب کنید. حالا اگه برنامه‌تون بخواد روی وب کار کنه که واویلا می‌شه...
مشکل دیگه اینکه برخی کاربرها هستند که نمی‌تونید به راحتی صفحه کلیدشون رو عوض کنید، حالا یا سلیقه‌ای، یا همانطور که دوستان گفتند به خاطر برنامه‌های دیگشون و یا حتی برخی کاربران که فکر می‌کنند خیلی واردن! اصلا نمی‌ذارن شما به ویندوزشون دست بزنید.!!!
حتما پیش خودتون فکر می‌کنید که "اگه من به عنوان برنامه‌نویس، اینو اجبار کنم، باید انجام بده". ولی دوستان، در سازمان‌های بزرگ چنین خبرهایی نیست، به راحتی سیستم شما را کنار می‌گذارن.
به نظر من بهتره کمی علمی‌تر با سوالی که در ابتدا مطرح شده برخورد کنیم.
موفق باشید.

----------


## SYNDROME

با سلام



> بستگی دارد. شما نمیتوانید که تمام مشکلات را حل کنید. آگر این روش کمترین مشکلات را در بر دارد، میتوانید به کاربر اعلام کنید که برایه استفاده از نرم افزاز شما kbd فعال میشود، و برایه غیر فعال کردنش هم بهشان اطلاعت میدید.
> به هر حال در برنامه نویسی همه چیز را نمیشه انجام داد و گاها باید تکالیف را به متخصصش واگذار کرد و اینجوری که من دستگیرم شد برایه این مشکل شما kbd متخصص است. 
> این کار استانداردی است از این بابت که برنامه‌هایی هستند که برایه درست کار کردن از برنامه‌ها و یا فریم ورکهایه دیگر بهره مند میشند. به کاربر اطلاع بدید و دردسر خودتان را کم کنید.


با این روش یا بایدسیستم شما نصب باشد یا سیستم شرکت دیگر.
هر روز هم مشکل تازه ای پیش می آید.

----------


## SYNDROME

با سلام



> دوستان امید وارم حال همگی شما خوب باشد.
> به نظر من روش آقای ارژنگ بهتر است و با منطق برنامه نویسی شئی گرا بیشتر همخوانی دارد چون یک فیلتر برای اصلاح کارکترهای ورودی هم کار یک برنامه نویس را راحت تر می کند و هم حجم برنامه را کاهش می دهد یک مثال ساده این است که با استفاده از کمپاننت DelphiAssistant شما برای هر فرم باید یک کمپاننت قرار دهید اما با در دست گرفتن پیامهای ارسالی برای برنامه شما فقط یک کمپاننت و فقط یک بار کد نویسی نیاز دارید.در ضمن فرض کنید شما بخواهید از یک فرم که در کمپاننت خاصی طراحی شده و به صورت مستقیم امکان دسترسی به آن را ندارید در برنامه استفاده کنید و باز هم نیاز به اصلاح کارکتر ورودی داشته باشید پس این راه بهتر است.
> در هر صورت این یک کمپاننت ساده هست که امکان فیلتر کردن رویدادهای موشواره و کی بورد ارسالی برای پروژه را به شما می دهد.
> لینک دانلود


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

----------


## SYNDROME

با سلام
با اجازه کاربر DelphiAssistant من کامژونت ایشان را کمی تغییر دادم(در حالت قبل کار نمی کرد)

unit Unit_FarsiFixer;
interface
uses
  Forms,
  Controls,
  SysUtils,
  Dialogs,
  Classes;
type
  TFarsiKeyboardHook = class(TComponent)
  private
    parentKeyPress: TKeyPressEvent;
    procedure myKeyPress(Sender: TObject; var Key: Char);
  protected
    { Protected declarations }
  public
    constructor Create(AOwner: TComponent); override;
  published
    { Published declarations }
  end;
procedure Register;
implementation
procedure Register;
begin
  RegisterComponents('Barnamenevis.org', [TFarsiKeyboardHook]);
end;
{ TFarsiKeyboardHook }
constructor TFarsiKeyboardHook.Create(AOwner: TComponent);
begin
  inherited;
  IF AOwner is TForm then
    begin
      parentKeyPress := TForm(Owner).OnKeyPress;
      TForm(Owner).OnKeyPress := myKeyPress;
      TForm(Owner).KeyPreview := true;
    end;
end;
procedure TFarsiKeyboardHook.myKeyPress(Sender: TObject; var Key: Char);
begin
  if Key = #223 then Key := #152;
  if Key = #236 then Key := #237;
  if Assigned(parentKeyPress) then
    parentKeyPress(Sender, Key);
end;
end.

امیدوارم از کار بنده ناراحت نشده باشید.
این کامپونت را تست کردم درست جواب داد.
با تشکر فراوان.

----------


## ghabil

> Object Oriented  به تنهایی هیچ فایده‌ای نداره، استفاده از طراحی‌هایه درست پله بعد است.
> در ضمن یک بالانسی باید بین مشکلاتی که یک روش حل میکند و مشکلات دیگری که بوجود میاره باشد. در این بحث ما حتی دلیل اینکار را نپرسیده نمیتونیم نظر بدیم. 
> نوشتن برنامه هایی که از اسپاگتی کد استفاده میکنند و کاملا هم Object Oriented هستند خیلی آسان است.
> مثال:
> در باتن کلیکها کد نوشتن، همینطوری ساختن رشته‌هایه  اس‌کیو‌ال با استفاده از تکستهایه ادیت‌باکسها و ...
> Object Oriented مثل یک چاقو میماند، میشه باهاش هم جراحی کرد و هم قصابی ، روش استفاده هم مهمه، چونکه بعضا قصابی هم لازمه.


با اینکه سعی کردی از جملات قشنگی استفاده کنی ولی چیزایی که گفتی درست نیست ، البته نیمخوام د مورد اینکه OOP خوبه یا بده بحث فلسفی بکنم چون متاسفانه اکثر بحثهای اینجا بجای اینکه به نتیجه گیری علمی ختم بشه به قفل و کلید و کلون ختم میشه ولی نه از زبان خودم که از زبان افراد صاحب نظر بهت میگم که OOP و حفظ قواعدش رو بصورت کامل و دقیق و بدون تنبلی اولین اصل برنامه نویسیت قرار بده ، اگر میخوای روزی بجای کدنویس برنامه نویس و طراح سیستم بشی .
منظورم هم از سیستم یک سیستم به معنی واقعی هست.

جدای از این مباحث اگر روزی برنامه نویسی OOP رو کامل فهمیدی اون روز بهت قول میدم که لذت برنامه نویسی برات چندین برابر میشه و دیگه امکان نداره حاضر بشی بزاریش کنار و تبلیغ اسپاگتی بکنی.

----------


## اَرژنگ

> با اینکه سعی کردی از جملات قشنگی استفاده کنی ولی چیزایی که گفتی درست نیست ، البته نیمخوام د مورد اینکه OOP خوبه یا بده بحث فلسفی بکنم چون متاسفانه اکثر بحثهای اینجا بجای اینکه به نتیجه گیری علمی ختم بشه به قفل و کلید و کلون ختم میشه ولی نه از زبان خودم که از زبان افراد صاحب نظر بهت میگم که OOP و حفظ قواعدش رو بصورت کامل و دقیق و بدون تنبلی اولین اصل برنامه نویسیت قرار بده ، اگر میخوای روزی بجای کدنویس برنامه نویس و طراح سیستم بشی .
> منظورم هم از سیستم یک سیستم به معنی واقعی هست.
> 
> جدای از این مباحث اگر روزی برنامه نویسی OOP رو کامل فهمیدی اون روز بهت قول میدم که لذت برنامه نویسی برات چندین برابر میشه و دیگه امکان نداره حاضر بشی بزاریش کنار و تبلیغ اسپاگتی بکنی.


کسی تبلیغ اسپاگتی نمیکنه، خواستم بگم که اگر یک روشی آسان است دلیل بر درستی‌اش نیست.
در ضمن همانطوری که گفتم OOP اولین پله است، اگر یکمقداری Object Oriented Design Patterns را مطالعه کنید متوجه میشید.
یکی از کتابهایه پترن با این جمله شروع شده بود:" با اینکه تمام اصول OOP را رعایت میکردم بازهم یک چیزی کم بود".
مثالهایی که زدم برایه این بود که حتی با رعایت قوائد OOP بازهم کافی نیست، نه اینکه شکستنش خوبه.
در طراحی سیستم یکسال بعد از اینکه برنامه نویسی را شروع کردم از ۳ لایه کمتر کار نکردم،فکر میکنید سیستمهایی که ساختم به اندازه کافی واقعی هستند؟
روشی را که شما گفتید از همه روشهایه دیگر بهتر است و تنها به دلیل OOP بودنش.
از لحاظ ابتدائی به نظر OOP میاد ولی زیادی استفاده کردن از inehritence یکی از مشکلات طراحی سیستمها با OOP است.
در این مشکل استفاده کردن از وراثت برایه حل این مسئله هیچ دلیلی نداشت.
اگر واقعا میخواهید از کد نویسی به طراحی سیستمها (چه واقعی و چه تفریحى) برسید، OOP را را اولین پله در این راه بدانید و به مطالعه Object Oriented Design Patterns بپردازید.
برایه شروع من کتاب Design Patterns Explained را توصیه میکنم.
http://www.amazon.com/Design-Pattern.../dp/0201715945

----------


## ghabil

[QUOTE=اَرژنگ;359202]در طراحی سیستم یکسال بعد از اینکه برنامه نویسی را شروع کردم از ۳ لایه کمتر کار نکردم،فکر میکنید سیستمهایی که ساختم به اندازه کافی واقعی هستند؟
[/Qoute]
من در حدی نیستم که بخوام نظر بدم و با این اطلاعات م نمیشه نظر داد ،اما  اگر خودت میدونی که بودن خوب حتما بودند.

[QUOTE=اَرژنگ;359202]
روشی را که شما گفتید از همه روشهایه دیگر بهتر است و تنها به دلیل OOP بودنش.
از لحاظ ابتدائی به نظر OOP میاد ولی زیادی استفاده کردن از inehritence یکی از مشکلات طراحی سیستمها با OOP است.
در این مشکل استفاده کردن از وراثت برایه حل این مسئله هیچ دلیلی نداشت.
[/Qoute]
میگم فقط میخواهید اینجا بحث کنید ، Abstraction بنظر من مهمترین امکان OOP هست و هیچ وقت هیچ مشکلی نداشته !! شاید بهتر باشه بیشتر از این هم در این زمینه توضیح ندی!
ضمنا میتونستی بجای اینکه بگی هیچ دلیل نداره بپرسی دلیلش چیه ; برای  نمونه فرض کن به دلیلی نمی خواستیم در بعضی از فرمها تغییرات رو اعمال کنیم یا در بعضی میخواستیم مثلا یک تغییر دیگه هم بدهیم ، مقایسه کن ببین تو هرکدوم از روشها بجز این روش چقدر کار می برد و در این روش چقدر کار ساده هست .




> اگر واقعا میخواهید از کد نویسی به طراحی سیستمها (چه واقعی و چه تفریحى) برسید، OOP را را اولین پله در این راه بدانید و به مطالعه Object Oriented Design Patterns بپردازید.
> برایه شروع من کتاب Design Patterns Explained را توصیه میکنم.
> http://www.amazon.com/Design-Pattern.../dp/0201715945


این حرف شما مثل این میمونه که بگویید : دلفی بدون فلان کامپننت جانبی یک چیزی کم داره !
بنظر من OOP اول و آخر برنامه نویسی در نسل فعلی هست که روز به روز هم بیشتر مهم میشه و به همین خاطر هم هست که براش Extensionهایی مثل همین Design Patterns ساخته میشند تا کار باهاش رو بهتر بکنند. برای همین هم به همه دوستانی که در اوایل مسیر یادگیری هستند همیشه توصیه کردم و میکنم که از اصولی یاد گرفتن OOP غافل نشید . شما و سایر اساتید هم نظراتتون متین هست و حتما تجاربی دارید که من ندارم و به همین دلیل هم اینجا هستم که بتونم از تجربیات شما هم استفاده کنم.

----------


## اَرژنگ

> میگم فقط میخواهید اینجا بحث کنید ، Abstraction بنظر من مهمترین امکان OOP هست و هیچ وقت هیچ مشکلی نداشته !! شاید بهتر باشه بیشتر از این هم در این زمینه توضیح ندی!
> ضمنا میتونستی بجای اینکه بگی هیچ دلیل نداره بپرسی دلیلش چیه ; برای نمونه فرض کن به دلیلی نمی خواستیم در بعضی از فرمها تغییرات رو اعمال کنیم یا در بعضی میخواستیم مثلا یک تغییر دیگه هم بدهیم ، مقایسه کن ببین تو هرکدوم از روشها بجز این روش چقدر کار می برد و در این روش چقدر کار ساده هست .


این راحتی نیست، این دیسیپلین نداشتن و با تنبلی این مشکل را حل کردن است. همانطور که گفتم این روش Business Logic را به GUI برنامه گره میزنه. در سطح پائینی مشکل را حل میکند ولی مشکلات دیگری که بوجود میاره به راحت بودن اینکار (از لحاظ تنبلی ) نمیارزه.
در ضمن این Abstraction نیست که ایراد داره بلکه روشی که ازش داره استفاده میشه. نمیشه همه چیز را میخ ‌تلقی کرد و فقط با یک چکش کوبیدش. 





> این حرف شما مثل این میمونه که بگویید : دلفی بدون فلان کامپننت جانبی یک چیزی کم داره !
> بنظر من OOP اول و آخر برنامه نویسی در نسل فعلی هست که روز به روز هم بیشتر مهم میشه و به همین خاطر هم هست که براش Extensionهایی مثل همین Design Patterns ساخته میشند تا کار باهاش رو بهتر بکنند. برای همین هم به همه دوستانی که در اوایل مسیر یادگیری هستند همیشه توصیه کردم و میکنم که از اصولی یاد گرفتن OOP غافل نشید . شما و سایر اساتید هم نظراتتون متین هست و حتما تجاربی دارید که من ندارم و به همین دلیل هم اینجا هستم که بتونم از تجربیات شما هم استفاده کنم.


خیر، هیچ هم به نداشتن یک کمپوننت دردلفی نمیماند! بلکه مثل نداشتن تمام کمپوننتها در دلفی میماند.
اگر OOP ردیف کردن آجربود برایه ساختن دیوار باشد، Design Patterns نهوه سرهم کردن دیوارهاست که ساختمان درست سرهم شده باشه.
Design Patterns اکستنشنی بر OOP نیست بلکه روشهایه درست استفاده کردن از OOP است.
شما کاملا درست میگید OOP اولین اصولی است که باید یاد گرفته بشه. 
OO Application Arhitecture and Design
و 
OO Design Patterns
روشهایه درست استفاده از اصول OOP را یاد میدند.
من از نظر تجربه حدی نیستم که بتوانم چیزی یاد بدم، تازه امیدم هم به این است که کسانی که به این مطالب نگاه بندازند اشکلات من را بگیرند و به راه راست هدایت کنند (:

----------


## ghabil

> این راحتی نیست، این دیسیپلین نداشتن و با تنبلی این مشکل را حل کردن است. همانطور که گفتم این روش Business Logic را به GUI برنامه گره میزنه. در سطح پائینی مشکل را حل میکند ولی مشکلات دیگری که بوجود میاره به راحت بودن اینکار (از لحاظ تنبلی ) نمیارزه.
> در ضمن این Abstraction نیست که ایراد داره بلکه روشی که ازش داره استفاده میشه. نمیشه همه چیز را میخ ‌تلقی کرد و فقط با یک چکش کوبیدش.


من نمیخوام باهات کلکل بکنم ولی اینایی که میگی رو برو به یکی که از لحاظ فنی قبولش داری نشون بده ازش نظرشو بپرس. به هر حال ممنون.

----------


## اَرژنگ

> من نمیخوام باهات کلکل بکنم ولی اینایی که میگی رو برو به یکی که از لحاظ فنی قبولش داری نشون بده ازش نظرشو بپرس. به هر حال ممنون.


قصد کل کل نبود، فقط اینکه سعی کردم بگم که OOP بدونه درک عمییقتر از  نهوهایه استفاده‌اش فایده واقعیش بدست نمیاد،
این مطالبی را هم که گفتم  الان بعد از ۱۰ سال امتحان و تجربه و گوش کردن به کسانیکه  واقعا در این زمینه واردن  جرعت میکنم که بگم ، وگرنه اگر فقط فکر میکردم نظر من است ، هیچ چی نمیگفتم .
مخلصیم.

----------


## اَرژنگ

> من نمیخوام باهات کلکل بکنم ولی اینایی که میگی رو برو به یکی که از لحاظ فنی قبولش داری نشون بده ازش نظرشو بپرس. به هر حال ممنون.


به کتابی که قبلاً در پستم  اشاره کردم مراجعه کردم.
دلایل حرفهایی که گفتم افزایش به cohesion در لایه منطق برنامه و  کم کردن coupling بین منطق برنامه و GUI از میباشد.

با عرض پوزش که دلایل و رفرانس کامل نداده حرف زدم.
 فارسیه کلمات GUI, coupling و cohesion چیه؟

----------


## omid_delphi2

سلام بالاخره ما نفهمیدیم ک با سرکش فارسی یا ک بدون سرکش 
همین مشکل را هم با ی دارم
و اینکه کد هر کدوم چیه؟

----------


## SYNDROME

> سلام بالاخره ما نفهمیدیم ک با سرکش فارسی یا ک بدون سرکش 
> همین مشکل را هم با ی دارم
> و اینکه کد هر کدوم چیه؟


کدهای را به شکل زیر اصلاح کنید.

    IF Key = #152 Then Key := #223;
    IF Key = #236 Then Key := #237;

موفق باشید

----------


## iranianprogrammers

حالا این جا یه بحث پیش میاد .
فرض کنید شما یه برنامه ورود اطلاعات به کاربر دادید .
حالا اگه کاربر اطلاعات رو از یه جا مثل یه صفحه اینترنتی کپی و Paste کنه .
آیا این روش جواب میده ؟

----------


## SYNDROME

> حالا این جا یه بحث پیش میاد .
> فرض کنید شما یه برنامه ورود اطلاعات به کاربر دادید .
> حالا اگه کاربر اطلاعات رو از یه جا مثل یه صفحه اینترنتی کپی و Paste کنه .
> آیا این روش جواب میده ؟


در چنین مواقعی می توانی در هنگام ذخیره اطلاعات حروف فوق را اصلاح کنید و بعد از اصلاح اطلاعات تغییر یافته را ذخیره کنید.
موفق باشید

----------


## ali_abbasi22145

سلام و تشكر از همه دوستان

من چطور فيلد Title بانكم كه با "ك" , "ي" بزرگ و كوچك ايراددار  Import  شده به "ك" , "ي" بزرگ و كوچك درست تبديل كنم؟

----------


## Alir431

سلام
یکی از کاربران قطعه کد زیر رو ارسال کردن. من نمی‌تونم از این کد استفاده کنم، لطفا کمک کنید.


unit Unit_FarsiFixer;
interface
uses
  Forms,
  Controls,
  SysUtils,
  Dialogs,
  Classes;
type
  TFarsiKeyboardHook = class(TComponent)
  private
    parentKeyPress: TKeyPressEvent;
    procedure myKeyPress(Sender: TObject; var Key: Char);
  protected
    { Protected declarations }
  public
    constructor Create(AOwner: TComponent); override;
  published
    { Published declarations }
  end;
procedure Register;
implementation
procedure Register;
begin
  RegisterComponents('Barnamenevis.org', [TFarsiKeyboardHook]);
end;
{ TFarsiKeyboardHook }
constructor TFarsiKeyboardHook.Create(AOwner: TComponent);
begin
  inherited;
  IF AOwner is TForm then
    begin
      parentKeyPress := TForm(Owner).OnKeyPress;
      TForm(Owner).OnKeyPress := myKeyPress;
      TForm(Owner).KeyPreview := true;
    end;
end;
procedure TFarsiKeyboardHook.myKeyPress(Sender: TObject; var Key: Char);
begin
  if Key = #223 then Key := #152;
  if Key = #236 then Key := #237;
  if Assigned(parentKeyPress) then
    parentKeyPress(Sender, Key);
end;
end.

----------


## mah_par2009

باسلام
فایل kbdfa.dll ضميمه را در شاخه  های زیر به ترتیب کپی کنید و سپس پیغامی که ظاهر می شود را cancel کنید
c:\windows\system32\dllcache
c:\windows\system32
سپس سیتم رو reset کنید مشکلتون حل می شه.

----------


## SYNDROME

> باسلام
> فایل kbdfa.dll ضمیمه را در شاخه های زیر به ترتیب کپی کنید و سپس پیغامی که ظاهر می شود را cancel کنید
> c:\windows\system32\dllcache
> c:\windows\system32
> سپس سیتم رو reset کنید مشکلتون حل می شه.


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

----------


## joker

یک مشکلی دارم در این رابطه
فایلهایی دارم که با حرف ی ساخته شده اند
با استفاده از سورس زیر لیست فایلها و ساب فولدرها را میگیرم ولی فولدرها یا فایلهایی که حرف ی معمولی توش بکار رفته را تشخیص نمیده ، ولی" ي " اصطلاحا ی نقطه دار( shift +X) را بی مشکل تشخیص میده
چه پیشنهادی میدین؟ ( دلفی آخرش ورژن موجود هم 7 دارم :) به نظرتون چه کنم که مشکل بشه ؟


http://www.festra.com/eng/snip04.htm

----------


## Mask

با سلام
منم همچین مشکلی روبرو بودم. در مورد md5 کردن فایلهایی با این حروف. دسته آخر مجبور به اسباب کشی به دلفی 2009 به بعد شدم.
موفق باشی.

----------


## MohsenB

با سلام به همه دوستان

همه روشهایی که فرمودین خوبه و اون اولی هم به نظر من راحتتره ولی منم یه راهی بهتون میگم انشاء اله بدردتون بخوره :

این راه تمام مشکلاتی که برا قبلیا نقل شد رو نداره ، ببینید :

یه یونیت با این کدها درست کنید :



unit CorrectFar;

interface

uses
  Windows, Messages, Dialogs,SysUtils, Variants, Classes;

const
  c_CharCount=2;

type
  TCharArray = array[1..c_CharCount]of Char;

var
  S1: TCharArray=('ی' , 'ک');
  S2: TCharArray=('ي' , 'ک');

  function CF(txtIn :String):String;

implementation

function CharInTable(ch :Char):Byte;
  var i :Byte;
begin
    Result:= 0;
    for i := 1 to c_CharCount do
      if S1[i]=ch then begin
        Result:= i;
        Exit;
      end;
end;

function CF(txtIn :String):String;
var  i, r :integer;
begin
  for i:= 1 to length(txtIn) do
  begin
    r:= CharInTable(txtIn[i]);
    if r>0 then
      txtIn[i]:= S2[r];
  end;
end;

end.


حالا هر جا میخواید کلمه ای رو اصلاح کنید اول یونیت رو اعلام کنید :

Uses CorrectFar;
بعد بجای همچین خطی :

db1:= Edit1.Text;

یه همچین خطی بنویسید :

db1:= CF(Edit1.Text);
یا اینجوری بنویسید :

Edit1.Text:= CF(Edit1.Text);

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


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

موفق و سربلند باشید .

----------


## seyed_farid

چرا از تابع StringReplace استفاده نمي كنيد؟ :متفکر:

----------


## seyed_farid

چرا از تابع StringReplace
و يا
function ReplaceChar(s:string;c:char;charrep:char):string;
 begin
   while pos(c,s)>0 do
       s[pos(c,s)]:=charrep;
    ReplaceChar:=s;
 end;
استفاده نمي كنيد؟ :متفکر:

----------


## MohsenB

سلام

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

----------

