ehsan_faal
پنج شنبه 06 فروردین 1394, 12:09 عصر
سلام دوستان.من توی برنامم کدی رو نوشتم که وقتی توی richedit اینتر زده شد کرسر موس بیاد آخر خط و در حالت عادی درست کار میکنه اما اگه به جای تایپ ورودی چیزی رو پیست کنم مهم نیست طول چیزی که پیست شده چقدر باشه کرسر همیشه میاد بعد از کاراکتر یکی مونده به آخر:عصبانی++::عصبانی++::عصبان ++:
باید چیکار کنم؟
procedure TForm1.BinRichKeyPress(Sender: TObject; var Key: Char);var
SourceStr: string;
begin
if not(Key in ['0', '1', #8, #13, #32]) then
begin
Key := #0; // Discard Key #8: BackSpace #13 :Enter #32: Space
end;
if (Key = chr(VK_RETURN)) and (Trim(BinRich.Text) <> '') then
begin
Key := #0;
SourceStr := Trim(BinRich.Text);
InputDec.Text := BinaryToDecimal(SourceStr);
HexRich.Text := BinaryToHexaDecimal(SourceStr);
BinRich.SelStart := Length(Trim(BinRich.Text));
end
else if (Key = chr(VK_RETURN)) and (Trim(HexRich.Text) = '') then
begin
Key := #0;
BinRich.Text := '';
Keybd_Event(VK_HOME, 0, 0, 0);
Keybd_Event(VK_HOME, 0, KEYEVENTF_KEYUP, 0);
end
else if Key = chr(VK_SPACE) then
begin
InputDec.Text := '';
HexRich.Text := '';
BinRich.Text := '';
Key := #0;
end;
end;
مشکل زمانیه که اینتر زده میشه و اطلاعات وارد شده،حالتهای زیادی رو تست کردم.
لطفا کمک کنید.
برنامه ای هم که میگم اینجا گذاشتم:
http://s4.picofile.com/file/8179205700/AVR.rar.html
Mahmood_M
جمعه 07 فروردین 1394, 11:30 صبح
در حالت عادی همچین مشکلی وجود نداره ! ، فکر کنم مشکل اینجاست که شما از Trim استفاده کردید و قبل از اولین کارکتر یا بعد از آخرین کارکتر یک Space وجود داره ، و طول اندازه گیری شده بعد از Trim ، یک واحد کمتر از مکان آخرین کارکتر محاسبه میشه ( در حالتی که Space در ابتدای متن باشه )
درواقع استفاده از Trim در اینجا خیلی مناسب نیست ، برای رفتن به آخر متن باید Space ها هم محاسبه بشن ، یا حداقل Space اول ( اولین کارکتر ) محاسبه بشه که در این صورت می تونید به جای Trim ، از TrimRight استفاده کنید
ehsan_faal
جمعه 07 فروردین 1394, 13:29 عصر
اولین space کجاست؟
فرض کنین به محض شروع برنامه کاربر یه چیزایی رو وارد میکنه به عنوان اولین کلید Space رو که نمیزنه.
در مورد طول رشته بعد از تریم کردن یه سوال پیش اومده واسم :
مگه تریم فقط فواصل قبل و بعد رو از رشته حذف نمیکنه ؟
اگه اینطور باشه پس طول رشته بایستی دقیقا به اندازه تعداد کاراکترهاش باشه دیگه، اینطور نیست؟
منظورم اینه که دیگه نباید یه دونه کمتر بده
ehsan_faal
جمعه 07 فروردین 1394, 13:36 عصر
الان تست کردم،با همین تریم کار میکنه ولی همچنان مشکلی که گفتم رو داره ولی با TrimRight اصلا کار نمیکنه و به محض پیست شدن چیزی توی فیلد ارور میده و متن ارورش هم اینه که ظاهرا یه اینتر قبل از شروع رشته قرار میگیره.هر چی به کد نگاه میکنم اصلا نمیفهمم یه اینتر قبل از رشته کی بوجود میاد:عصبانی++::عصبانی++::عصبا ی++:
Mahmood_M
جمعه 07 فروردین 1394, 16:33 عصر
اولین space کجاست؟
فرض کنین به محض شروع برنامه کاربر یه چیزایی رو وارد میکنه به عنوان اولین کلید Space رو که نمیزنه.
در کورد طول رشته بعد از تریم کردن یه سوال پیش اومده واسم :
مگه تریم فقط فواصل قبل و بعد رو از رشته حذف نمیکنه ؟
اگه اینطور باشه پس طول رشته بایستی دقیقا به اندازه تعداد کاراکترهاش باشه دیگه، اینطور نیست؟
منظورم اینه که دیگه نباید یه دونه کمتر بده
قضیه خیلی ساده ست ، خاصیت SelStart یک مقدار عددی دریافت می کنه ، این مقدار عددی شماره ی کارکتری هست که اشاره گر جاش میشینه ، منظور از Space کارکتر فاصله ست
فرض کنید این عبارت در RichEdit باشه :
" This is a test"
مقدار این دستور :
Length(Trim(RichEdit.Text))
میشه شماره کارکتر یکی مونده به آخر ، تعداد کل کارکترها میشه تعداد کارکترهای بعد از Trim به علاوه یدونه Space که در ابتدا قرار داره ، برای رفتن به کارکتر آخر نباید Trim کنید !
الان تست کردم،با همین تریم کار میکنه ولی همچنان مشکلی که گفتم رو داره ولی با TrimRight اصلا کار نمیکنه و به محض پیست شدن چیزی توی فیلد ارور میده و متن ارورش هم اینه که ظاهرا یه اینتر قبل از شروع رشته قرار میگیره.هر چی به کد نگاه میکنم اصلا نمیفهمم یه اینتر قبل از رشته کی بوجود میاد
هدفتون دقیقا چیه ؟ لطفا توضیح بهتری بدید و پیغام های خطا رو اینجا بنویسید
ehsan_faal
جمعه 07 فروردین 1394, 16:42 عصر
بذارین بیشتر توضیح بدم:
من میخوام یه عدد از کاربر بگیرم و اون رو به مبنای 2 و16 ببرم.تا اینجا مشگلی ندارم.
یه گزینه واسه مثال گذاشتم که کاربر رو هر فیلدی که بود با راست کلیک کردن و انتخاب گزینه مربوط مثالی که از قبل در نظر گرفتم توی فیلد پیست بشه و بعد از پیست شدن با زدن اینتر معادل اون عدد رو توی دو تا فیلد دیگه بگیرم.
خب این یه حالته یعنی کاربر یه چیزی رو پیست کنه که قبلا تست کردم و اگه به selstart یه دونه اضافه کنم بعد از زدن اینتر کرسر میاد بعد از آخرین کاراکتر.
اما حالت دیگه اینه که کاربر خودش یه عددی رو کاراکتر به کاراکتر وارد کنه. در این حالت فقط کدی که توی پست اول گذاشتم باعث میشه که بعد از زدن اینتر کرسر آخر خط وایسته.بقیه کدهایی که پیشنهاد شده یا ارور میده که فرمت عدد ورودی درست نیست(مثلا به خاطر اینکه یه اینتر (خط خالی) قبل یا بعد از رشته ورودی قرار میگیره) یا اینکه کرسر میره خط بعد وایمیسته که با توجه به اینکه توی فرمم ارتفاع richedit هام کمه در این حالت بعد از زدن اینتر کاربر دیگه عددی رو که وارد کرده نمیبینه.
راهی هست که هر دو حالت هم زمان رفع بشه نه مثل الان که یه کد واسه یه حالت درسته ولی واسه یه حالت دیگه نه!
با تشکر
ehsan_faal
جمعه 07 فروردین 1394, 16:42 عصر
این کدمه:
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ComCtrls, sRichEdit,
sLabel, sButton, Vcl.Menus, Vcl.Clipbrd, sCheckBox, sListBox, sCheckListBox,
sGroupBox, sRadioButton, Vcl.ExtCtrls, sPanel, System.Math, sEdit,
sSkinManager, acAlphaHints, Binary;
type
TForm1 = class(TForm)
sLabel1: TsLabel;
sLabel2: TsLabel;
sLabel3: TsLabel;
InputDec: TsRichEdit;
HexRich: TsRichEdit;
BinRich: TsRichEdit;
sLabel4: TsLabel;
DecRadiobtn: TsRadioButton;
HexRadiobtn: TsRadioButton;
BinRadiobtn: TsRadioButton;
slphnts1: TsAlphaHints;
pm1: TPopupMenu;
E1: TMenuItem;
pm2: TPopupMenu;
E2: TMenuItem;
pm3: TPopupMenu;
E3: TMenuItem;
sLabel5: TsLabel;
procedure InputDecKeyPress(Sender: TObject; var Key: Char);
procedure InputDecEnter(Sender: TObject);
procedure HexRadiobtnClick(Sender: TObject);
procedure BinRadiobtnClick(Sender: TObject);
procedure DecRadiobtnClick(Sender: TObject);
procedure HexRichEnter(Sender: TObject);
procedure HexRichExit(Sender: TObject);
procedure HexRichKeyPress(Sender: TObject; var Key: Char);
procedure BinRichKeyPress(Sender: TObject; var Key: Char);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure po(Sender: TObject);
procedure BinRichEnter(Sender: TObject);
procedure E1Click(Sender: TObject);
procedure E2Click(Sender: TObject);
procedure E3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.BinRadiobtnClick(Sender: TObject);
begin
BinRich.SetFocus;
InputDec.Text := '';
HexRich.Text := '';
BinRich.Text := '';
end;
procedure TForm1.BinRichEnter(Sender: TObject);
begin
BinRadiobtn.Checked := True;
LoadKeyboardLayout('00000409', KLF_ACTIVATE);
end;
procedure TForm1.BinRichKeyPress(Sender: TObject; var Key: Char);
var
SourceStr: string;
begin
if not(Key in ['0', '1', #8, #13, #32]) then
begin
Key := #0; // Discard Key #8: BackSpace #13 :Enter #32: Space
end;
if (Key = chr(VK_RETURN)) and (Trim(BinRich.Text) <> '') then
begin
Key := #0;
SourceStr := Trim(BinRich.Text);
InputDec.Text := BinaryToDecimal(SourceStr);
HexRich.Text := BinaryToHexaDecimal(SourceStr);
BinRich.SelStart := Length(Trim(BinRich.Text));
end
else if (Key = chr(VK_RETURN)) and (Trim(HexRich.Text) = '') then
begin
Key := #0;
BinRich.Text := '';
Keybd_Event(VK_HOME, 0, 0, 0);
Keybd_Event(VK_HOME, 0, KEYEVENTF_KEYUP, 0);
end
else if Key = chr(VK_SPACE) then
begin
InputDec.Text := '';
HexRich.Text := '';
BinRich.Text := '';
Key := #0;
end;
end;
procedure TForm1.DecRadiobtnClick(Sender: TObject);
begin
InputDec.SetFocus;
InputDec.Text := '';
HexRich.Text := '';
BinRich.Text := '';
end;
procedure TForm1.E1Click(Sender: TObject);
begin
InputDec.Text := '989203610476';
end;
procedure TForm1.E2Click(Sender: TObject);
begin
HexRich.Text := DecimaloHexaDecimal('989203610476');
end;
procedure TForm1.E3Click(Sender: TObject);
begin
BinRich.Text := DecimalToBinary('989203610476');
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var
KeyBoardState: TKeyboardState;
begin
GetKeyboardState(KeyBoardState);
if KeyBoardState[VK_CAPITAL] = 1 then
begin
Keybd_Event(VK_CAPITAL, 1, KEYEVENTF_EXTENDEDKEY or 0, 0);
Keybd_Event(VK_CAPITAL, 1, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0);
end;
end;
procedure TForm1.po(Sender: TObject);
var
KeyBoardState: TKeyboardState;
begin
GetKeyboardState(KeyBoardState);
if KeyBoardState[VK_NUMLOCK] = 0 then
begin
Keybd_Event(VK_NUMLOCK, 1, KEYEVENTF_EXTENDEDKEY or 0, 0);
Keybd_Event(VK_NUMLOCK, 1, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0);
end;
end;
procedure TForm1.HexRadiobtnClick(Sender: TObject);
begin
HexRich.SetFocus;
InputDec.Text := '';
HexRich.Text := '';
BinRich.Text := '';
end;
procedure TForm1.HexRichEnter(Sender: TObject);
var
KeyState: TKeyboardState;
begin
HexRadiobtn.Checked := True;
GetKeyboardState(KeyState);
if KeyState[VK_CAPITAL] = 0 then
begin
Keybd_Event(VK_CAPITAL, 1, KEYEVENTF_EXTENDEDKEY or 0, 0);
Keybd_Event(VK_CAPITAL, 1, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0);
end;
LoadKeyboardLayout('00000409', KLF_ACTIVATE);
end;
procedure TForm1.HexRichExit(Sender: TObject);
begin
Keybd_Event(VK_CAPITAL, 1, KEYEVENTF_EXTENDEDKEY or 0, 0);
Keybd_Event(VK_CAPITAL, 1, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0);
end;
procedure TForm1.HexRichKeyPress(Sender: TObject; var Key: Char);
var
SourceStr: string;
begin
if not(Key in ['0' .. '9', 'A' .. 'F', #8, #13, #32]) then
begin
Key := #0; // Discard Key #8: BackSpace #13 :Enter #32: Space
end;
if (Key = chr(VK_RETURN)) and (Trim(HexRich.Text) <> '') then
begin
Key := #0;
SourceStr := Trim(HexRich.Text);
InputDec.Text := HexaDecimalToDecimal(SourceStr);
BinRich.Text := HexaDecimalToBinary(SourceStr);
HexRich.SelStart := Length(Trim(HexRich.Text)) + 1;
end
else if (Key = chr(VK_RETURN)) and (Trim(HexRich.Text) = '') then
begin
Key := #0;
HexRich.Text := '';
Keybd_Event(VK_HOME, 0, 0, 0);
Keybd_Event(VK_HOME, 0, KEYEVENTF_KEYUP, 0);
end
else if Key = chr(VK_SPACE) then
begin
InputDec.Text := '';
HexRich.Text := '';
BinRich.Text := '';
Key := #0;
end;
end;
procedure TForm1.InputDecEnter(Sender: TObject);
begin
DecRadiobtn.Checked := True;
LoadKeyboardLayout('00000409', KLF_ACTIVATE);
end;
procedure TForm1.InputDecKeyPress(Sender: TObject; var Key: Char);
var
SourceStr: string;
begin
if not(Key in [#32, #13, #8, '0' .. '9']) then
begin
Key := #0;
end;
if (Key = chr(VK_RETURN)) and (Trim(InputDec.Text) <> '') then
begin
Key := #0;
SourceStr := Trim(InputDec.Text);
HexRich.Text := DecimaloHexaDecimal(SourceStr);
BinRich.Text := DecimalToBinary(SourceStr);
InputDec.SelStart := Length(Trim(InputDec.Text));
end
else if (Key = chr(VK_RETURN)) and (Trim(InputDec.Text) = '') then
begin
Key := #0;
InputDec.Text := '';
Keybd_Event(VK_HOME, 0, 0, 0);
Keybd_Event(VK_HOME, 0, KEYEVENTF_KEYUP, 0);
end
else if Key = chr(VK_SPACE) then
begin
InputDec.Text := '';
HexRich.Text := '';
BinRich.Text := '';
Key := #0;
end;
end;
end.
ehsan_faal
جمعه 07 فروردین 1394, 16:47 عصر
قضیه خیلی ساده ست ، خاصیت SelStart یک مقدار عددی دریافت می کنه ، این مقدار عددی شماره ی کارکتری هست که اشاره گر جاش میشینه ، منظور از Space کارکتر فاصله ست
فرض کنید این عبارت در RichEdit باشه :
" This is a test"
مقدار این دستور :
Length(Trim(RichEdit.Text))
میشه شماره کارکتر یکی مونده به آخر ، تعداد کل کارکترها میشه تعداد کارکترهای بعد از Trim به علاوه یدونه Space که در ابتدا قرار داره ، برای رفتن به کارکتر آخر نباید Trim کنید !
هدفتون دقیقا چیه ؟ لطفا توضیح بهتری بدید و پیغام های خطا رو اینجا بنویسید
ممنون. الان تازه گرفتم راهنماییه شما رو.
مشکلم حل شد.
فقط باید جایی که از selstart استفاده میکردم از TrimRight استفاده میکردم.:تشویق:
Mahmood_M
جمعه 07 فروردین 1394, 16:56 عصر
راستش دلیل به آخر بردن کرسر رو متوجه نشدم ، اما شما باید قبل از هر چیزی مقدار عددی که وارد شده رو به عنوان یک String از RichEdit بخونید و اعمال محاسباتی یا هر چیز دیگه رو روی اون انجام بدید نه اینکه هر بار عملیات رو روی متن درون RichEdit انجام بدید و نکته ی دیگه اینکه به جای گذاشتن Trim در کد زیر :
InputDec.SelStart := Length(Trim(InputDec.Text));
ابتدا باید Enter ها و Space های اضافی رو از متن درون RichEdit حذف کنید و بعد طول متن درون اون رو با Length بگیرید :
RichEdit1.Text := Trim(RichEdit1.Text);
RichEdit1.SelStart := Length(RichEdit1.Text);
اگر این کار رو نکنید ، باید Space ها و Enter ها و سایر کارکتر ها رو برای مقداردهی SelStart لحاظ کنید ، یعنی نمی تونید از Trim استفاده کنید !
با رعایت دو مورد بالا مشکلتون حل میشه
ویرایش : خوشحالم که مشکلتون حل شد ، اما اگر موارد بالا رو هم رعایت کنید به مشکلات کمتری بر می خورید ، موفق باشید
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.