PDA

View Full Version : مشکل نمایش Memo



mahdiya
یک شنبه 07 مهر 1387, 12:52 عصر
من یک Memo روی فرم قرار می دم که مخفی هست و می خوام وقتی روی باتنی کلیک می کنم Memo ظاهر بشه. و در این Memo یک سری اطلاعات کوچیک وجزئی نمایش داده می شه که ثابته و کاربر اجازه تغییر اونها رو نداره.مشکلی که دارم اینه که:
در حالتی که ReadOnly=true , Enabled=True قرار می دم کاربر می تونه نوشته های Memo رو انتخاب کنه که نمی خوام انتخاب بشه

برای اینکه کاربر نتونه نوشته ها رو انتخاب کنه Enabled=false می کنم که در این حالت هم وقتی روی Memo کلیک می شه انگار که روی ابزارهای زیر Memo کلیک کردیم(کلیک های ماوس به ابزار زیر Memo ارسال می شه)
لطفا اگه راه حل رو می دونید یا ابزار دیگه ای رو مناسب می دونید راهنمایی بفرمایید
متشکرم

Felony
یک شنبه 07 مهر 1387, 14:16 عصر
شاید راه بهتر و منطقی تری هم باشه ولی من این راه به نظرم رسید در رویداد OnClick عنصر Memo کد زیر رو وارد کنید :


memo1.SelStart:=0;

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

mahdiya
یک شنبه 07 مهر 1387, 23:27 عصر
متاسفانه با این راه حل شما جواب مورد نظرم رو نگرفتم

vcldeveloper
دوشنبه 08 مهر 1387, 01:34 صبح
می تونید یا خودتون یک کامپوننت جدید بسازید و اون رو از TMemo مشتق بگیرید و پیام WM_COPY را هندل کنید:


TMyMemo = class(TMemo)
protected
procedure HandleNoClipbrdCopy(var Msg: TMessage); message WM_COPY;
end;

//Implementation

procedure TMyMemo.ProcessClipboardCopy(var Msg: TMessage);
begin
end;
* این باعث میشه که پیام WM_COPY به کنترل شما نرسه و کپی انجام نشه.


یا اینکه کامپوننت جدید نسازید، فقط WinProc کامپوننت Memo را تغییر بدید:


TForm1 = class(TForm)
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
private
FOldMemoWinProc : procedure (var Message: TMessage) of object;
procedure MemoWinProc(var Message: TMessage);
public
end;

// Implementation

procedure TForm1.FormCreate(Sender: TObject);
begin
FOldMemoWinProc := Memo1.WindowProc;
Memo1.WindowProc := MemoWinProc;
end;

procedure TForm1.MemoWinProc(var Message: TMessage);
begin
if Message.Msg <> WM_COPY then
FOldMemoWinProc(Message);
end;