PDA

View Full Version : فایل متنی



shining_eye
سه شنبه 08 تیر 1389, 15:46 عصر
من یک فایل متنی دارم که نباید این امکان در آن باشد که با دکمه delete ویا backspace
بتوان اطلاعات آن را delete کردبلکه فقط امکان این را داشته باشد که با کلید های سمت بالا و پایین
بتوان روی آن حرکت کرد.و الان خطی که روی آن قرار داریم مقدارش داخل یک 1Edit ریخته شود

Felony
سه شنبه 08 تیر 1389, 16:05 عصر
منظورتون کجاست ؟ داخل Memo یا Richedit ؟ اگر اینطوره خاصیت ReadOnly مربوط یه شئ مورد نظر رو با True مقداردهی کنید .
اگر هم کلا منظورتون این هست که نشه متن داخل فایل رو حذف یا تغییر داد ( حتی با برنامه هایی مثل Notepad ) که سیستم عامل همچین امکانی رو در اختیارتون نمیزاره .

shining_eye
چهارشنبه 09 تیر 1389, 08:20 صبح
آیا برای اینکه این کار رو بکنم (یعنی خطی که فلشر روشه بره تو edit1)باید از اشاره گر استفاده کنم؟

Felony
چهارشنبه 09 تیر 1389, 08:55 صبح
اشاره گر هیچ ارتباطی با این کار نداره ، برای این منظور باید به صورت زیر عمل کنید :

Edit1.Text:= Memo1.Lines.Strings[SendMessage(Memo1.Handle,EM_LINEFROMCHAR,-1,0)] ;

shining_eye
چهارشنبه 09 تیر 1389, 09:21 صبح
1.[SendMessage(Memo1.Handle,EM_LINEFROMCHAR,-1,0)] ;
این قسمت چه کار میکنه؟
نمیتونیم بگیم هر خطی که اشاره گر روی آن قرار دارد رو بریزه تو edite1

Felony
چهارشنبه 09 تیر 1389, 09:55 صبح
خوب این خط هم همین کار رو میکنه ، Memo یکی از اشیاء ارائه شده توسط ویندوز هست ( از کلاس TCustomEdit مشتق شده ) که در دلفی پیاده سازی شده ، خود Memo به طور پیش فرض متدی برای گرفتن خط جاری نداره ( مثلا : LineIndex ) به همین دلیل با فرستادن پیغام بالا به شئ Memo مورد نظر ازش درخواست میکنیم که شماره خطی که الان بهش اشاره میشه رو به ما بده .

shining_eye
چهارشنبه 09 تیر 1389, 10:53 صبح
1-دستور کلی sendmessage چیه؟اون 0,1چی کار می کنن؟
2- من این کد رو تو کجا بنویسم که لازم نباشد حتما دکمه ای رو فشار بدم تا عبارتی که در memoروش وایستادیم بیاد تو .editمیخوام خود به خود که روی عناصر memo حرکت می کنم بیان تو edit

Felony
چهارشنبه 09 تیر 1389, 11:15 صبح
من این کد رو اولا ازتون خواستم به هم توضیح بدید تو help دلفی هم em_linefromchar رو پیدا نکردم.
EM_LINEFROMCHAR یکی از پیغام های استاندارد ویندوز هست ، کلید Ctrl صفحه کلید رو نگه دارید و روی همین پیغام در ادیتور کد دلفی کلیک کنید تا لیست دیگر پیغام های استاندارد ویندوز به نمایش در بیاد .


دستور کلی sendmessage چیه؟اون 0,1چی هستن؟
توابع SendMessage و PostMessage جزء توابع API ویندوز هستن و برای ارسال پیغام به پنجره مورد نظر ازشون استفاده میشه ( در ویندوز تمام کار ها در پشت صحنه با ارسال و پردازش پیغام ها انجام میشه ) ، تفاوت تابع SendMessage و PostMessage هم در این هست که وقتي با استفاده از تابع SendMessage پيامي ارسال مي كنيد ، تابع منتظر دريافت پيامي از طرف برنامه مقصد می ماند كه نشان ميدهد پيامش به درستي ارسال شده . مثل زماني كه شما SMS اي ارسال مي كنيد و بعد منتظر پيام ارسالش ( Delivery Report ) مي مانيد ، SendMessage هم به همين صورت هست ، درواقع تضمين ميكنه تا زماني كه پيامش به درستي ارسال نشده باشه روال برنامه ادامه پيدا نميكنه و گاهي موجب فریز شدن برنامه ميشه ، چون ممکنه برنامه ی مقصد نتونه به پیغام ارسال شده پاسخ بده ولي PostMessage بلافاصله پيام رو ارسال مي كنه و منتظر هيچ بازخوردي هم نميمونه و برنامه به کارعادی خودش ادامه میده .

اون -1 و 0 هم پارامترهای تابع هستن که بسته به پیغام ارسالی ( در اینجا LINEFROMCHAR ) تغییر میکنن .



ثانیا من این کد رو تو کجا بنویسم که لازم نباشد حتما دکمه ای رو فشار بدم تا عبارتی که در memoروش وایستادیم بیاد تو .editمیخوام خود به خود که روی عناصر memo حرکت می کنم بیان تو edit
کد زیر رو در رویداد OnKeyDown شئ Memo بنویسید :
case Key of
VK_UP: Edit1.Text:= Memo1.Lines.Strings[SendMessage(Memo1.Handle,EM_LINEFROMCHAR,-1,0)-1];
VK_LEFT: Edit1.Text:= Memo1.Lines.Strings[SendMessage(Memo1.Handle,EM_LINEFROMCHAR,-1,0)];
VK_DOWN: Edit1.Text:= Memo1.Lines.Strings[SendMessage(Memo1.Handle,EM_LINEFROMCHAR,-1,0)+1];
VK_RIGHT: Edit1.Text:= Memo1.Lines.Strings[SendMessage(Memo1.Handle,EM_LINEFROMCHAR,-1,0)];
end;

shining_eye
چهارشنبه 09 تیر 1389, 13:30 عصر
حالا برای delete کردن جایی که الان مقدارش تو edite1هست هم از memo هم ازedit چه کدی باید بنویسم؟

Felony
چهارشنبه 09 تیر 1389, 13:41 عصر
کمی هم خودتون تلاش کنید ...
Memo1.Lines.Delete(SendMessage(Memo1.Handle,EM_LIN EFROMCHAR,-1,0));
Edit1.Clear;

shining_eye
چهارشنبه 09 تیر 1389, 13:44 عصر
var
str:string;
begin
str:=memo1.Lines.Text;
delete(str,pos(edit1.Text ,str),3);
memo1.Lines.Text :=str;
edit1.Clear;
end;
من این طور نوشتم درسته؟

Felony
چهارشنبه 09 تیر 1389, 13:51 عصر
چیش درسته ؟ دقیقا میخواین با این کد چیکار کنید ؟

shining_eye
چهارشنبه 09 تیر 1389, 14:27 عصر
میخوام بره عبارتی که الان تو editeهست روهم تو memo هم تو edit پاک کنه.اون دستور که شما گفتید همه رو پاک می کنه هر چند بار کلیک کنی یه خط رو پاک می کنه.

Felony
چهارشنبه 09 تیر 1389, 14:46 عصر
جواب این سوالتون رو که تو تاپیک قبلی دادم !
http://barnamenevis.org/forum/showthread.php?t=230733

برای پاک کردن Edit هم از متد Clear آن استفاده کنید .

shining_eye
چهارشنبه 09 تیر 1389, 14:51 عصر
ولی این دستور میره اولین مقدار در memo رو پاک می کنه که برابر مقدارedit باشه نه اون خطی رو که الان روش هستیم

Felony
چهارشنبه 09 تیر 1389, 15:03 عصر
یعنی مثلا میخواین تو Edit بنویسی Ali و برنامه تو خط جاری که تو Memo انتخاب شده همه Ali ها رو پاک کنه و به خط های دیگه کار نداشته باشه ؟

shining_eye
چهارشنبه 09 تیر 1389, 15:20 عصر
یعنی تو memo مقادیر زیر را دارم

1
2
2
1
5

و همانطور که گفتم با کلیدهای صفحه کلید روشون حرکت میکنم و روی هر کودوم بایستم مقدازش میره توedit1
حالا من می خوام اگه کلید حذف رو زدم بره و دقیقا خطی که روش هستم رو در memo پاک کنه مثلا اون 2 رو که آبی کردم روی اون هستم پس توی edit هم مقدار 2 هست حالا میخوام همین 2 نه 2ی اول پاک شه.کدی که گفتم میره اولین2 رو پاک میکن نه 2یی که مورد نظر منه

Felony
چهارشنبه 09 تیر 1389, 16:28 عصر
یعنی تو memo مقادیر زیر را دارم

1
2
2
1
5

و همانطور که گفتم با کلیدهای صفحه کلید روشون حرکت میکنم و روی هر کودوم بایستم مقدازش میره توedit1
حالا من می خوام اگه کلید حذف رو زدم بره و دقیقا خطی که روش هستم رو در memo پاک کنه مثلا اون 2 رو که آبی کردم روی اون هستم پس توی edit هم مقدار 2 هست حالا میخوام همین 2 نه 2ی اول پاک شه.کدی که گفتم میره اولین2 رو پاک میکن نه 2یی که مورد نظر منه

ای بابا ، منم که کدش رو براتون در آخرین پست صفحه قبل گزاشتم !
کد زیر رو در رویداد OnKeyDown شئ Memo مورد نظرتون وارد کنید ، با زدن دکمه Delete از صفحه کلید کار مورد نظرتون انجام میشه .

case Key of
VK_UP: Edit1.Text:= Memo1.Lines.Strings[SendMessage(Memo1.Handle,EM_LINEFROMCHAR,-1,0)-1];
VK_LEFT: Edit1.Text:= Memo1.Lines.Strings[SendMessage(Memo1.Handle,EM_LINEFROMCHAR,-1,0)];
VK_DOWN: Edit1.Text:= Memo1.Lines.Strings[SendMessage(Memo1.Handle,EM_LINEFROMCHAR,-1,0)+1];
VK_RIGHT: Edit1.Text:= Memo1.Lines.Strings[SendMessage(Memo1.Handle,EM_LINEFROMCHAR,-1,0)];
VK_DELETE:
begin
Memo1.Lines.Delete(SendMessage(Memo1.Handle,EM_LIN EFROMCHAR,-1,0));
Edit1.Clear;
end;
end;

shining_eye
پنج شنبه 10 تیر 1389, 09:16 صبح
من قبلا هم گفته بودم من تازه برنامه نویسی رو شروع کردم.اگه سوالام خیلی ابتدایی ببخشید.
من اگه بخوام خودم دستورات رو یاد بگیرم باید چه کار کنم؟من الان دارم کتاب دلفی آقای جعفر نژاد رو مطالعه می کنم ولی همه اون چیزایی که لازم دارم رو توش پیدا نمی کنم.مثلا من برای اینکه بدونم از دستور sendmessage box باید استاده کنم و داخل اون هم از اون پیغام em_linefromcharباید استفاده
کنم باید چه کاری بکنم؟(اینو فرضا گفتم)

tdkhakpur
پنج شنبه 10 تیر 1389, 09:34 صبح
مثلا من برای اینکه بدونم از دستور sendmessage box باید استاده کنم و داخل اون هم از اون پیغام em_linefromcharباید استفاده
کنم باید چه کاری بکنم؟(اینو فرضا گفتم)

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

Memo1.Lines.Delete(Memo1.CaretPos.Y);
داخل کد فوق Memo1.CaretPos.Y شماره خط جاری را برای شما بر میگرداند.

Felony
پنج شنبه 10 تیر 1389, 09:56 صبح
لازم نیست برید و برنامه نویسی را به فرم سطح پایین در بیارید برای هر کاری خصوصیاتی وجود دارد و شما بهتره خصوصیات را مطالعه کنید.

Memo1.Lines.Delete(Memo1.CaretPos.Y);
داخل کد فوق Memo1.CaretPos.Y شماره خط جاری را برای شما بر میگرداند.

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

shining_eye
پنج شنبه 10 تیر 1389, 09:56 صبح
خوب من هم می خوام همین کار رو بکنم و می خواستم یه منبعی رو به من معرفی کنید که بتونم برای این کار ازش استفاده کنم.

tdkhakpur
پنج شنبه 10 تیر 1389, 10:05 صبح
خوب من هم می خوام همین کار رو بکنم و می خواستم یه منبعی رو به من معرفی کنید که بتونم برای این کار ازش استفاده کنم.

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

Felony
پنج شنبه 10 تیر 1389, 10:07 صبح
خوب من هم می خوام همین کار رو بکنم و می خواستم یه منبعی رو به من معرفی کنید که بتونم برای این کار ازش استفاده کنم.

بهترین منبع همین اینترنت هست ، اگر زبانتون خوب هست که به راحتی میتونید با جست و جو مطلب مورد نظر ( به زبان اصلی ) به جواب سوالتون برسید در غیر این صورت هم روی زبانتون کار کنید .
در ضمن جواب خیلی از سوال هایی که ممکنه اوایل کار به ذهنتون برسه بارها تو همین انجمن داده شده ، کافیه روش صحیح جست و جو در سایت رو یاد بگیرید تا به جواب سوالتون برسید .

shining_eye
پنج شنبه 10 تیر 1389, 10:56 صبح
در مورد همون memo ای که دارم اگر بخوام هر سطری که روش هستم (با کلید های صفحه کلید روش حرکت می کنم)کل اون خط رنگش تغییر کنه آیا امکانش هست.یا فقط richedit این امکان رو داره؟؟

Felony
پنج شنبه 10 تیر 1389, 11:37 صبح
خیر ، فقط Richedit این امکان رو داره .

shining_eye
پنج شنبه 10 تیر 1389, 11:53 صبح
حالا من چی کار کنم همه کدهام مربوط به memo هست؟
rich edit کدهاش با memo خیلی فرق داره؟
یا میتونم به جای همه memo هام richedit بذارم؟یه جا اینجور دیدم گفته بود ولی وقتی تغییرشون دادم و اجرا کردم دیگه فقط صفحه خالی form می اومد؟

Felony
پنج شنبه 10 تیر 1389, 11:59 صبح
تفاوت چندانی ندارن ، با کمی بررسی میتونید تغییرات لازم رو اعما کنید .

SAASTN
پنج شنبه 10 تیر 1389, 13:15 عصر
خوب من هم می خوام همین کار رو بکنم و می خواستم یه منبعی رو به من معرفی کنید که بتونم برای این کار ازش استفاده کنم.
به عقیده من اولین منبع خود Help دلفی هست. شما وقتی یکجایی توی کارکردن با مثلا Memo گیر می کنی بهترین موقعیته که بشینی کل متدها و Property های TMemo رو بخونی، یه مدت که همچین کاری رو بکنی دیگه کلیات کار اون زبون میاد دستت و دفعات بعدی خیلی سریعتر به نتیجه می رسی. اما خوب یک سری مسائل تکنیکی هستند که دیگه توی Help پیدا نمی شن و باید رفت سراغ اینترنت.