سلام
من به کمپوننتی نیاز دارم که با تغییر مقادیر داخل Clipboard برنامه رو مطلع کنه.
سلام
من به کمپوننتی نیاز دارم که با تغییر مقادیر داخل Clipboard برنامه رو مطلع کنه.
پیاده سازیش کار مشکلی نیست .
اول باید با استفاده از تابع SetClipboardViewer کلیپ بورد رو به برنامه وصل کنید .یعنی این تابع یک THandle برمیگردونه .
اگر میخواهید محتویات ائن رو هم نمایش بدید ،
در طول برنامه از Message های WM_DRAWCLIPBOARD و WM_CHANGECBCHAIN استفاده کنید . که اولی برای اینه که هروقت محتوای کلیپ بورد تغییر کرد ، صادر میشه . دومی هم برای اینه که اگر به از طریق زنجیره کلیپ بورد تغییری کرد و پنجره ای که ما میخواهیم در اون محتویات رو نمایش بدیم از زنجیره خارج شد ، اون رو اصلاح کنیم و ما اطلاعات رو از دست ندیم .
در آخر برنامه هم لازمه که تابع ChangeClipboardChain رو صدا بزنید تا پنجره خودمون رو از زنجیره کلیپ بورد ، خارج کنیم .
البته اگر قصد نمایش اون رو ندارید فقط تابعی که اول گفتم و مسج WM_DRAWCLIPBOARD کفایت میکنه .
ClipBrd رو هم باید به لیست uses اضافه کنید .
.
موفق باشید
از جوابتون ممنونم .
ولی مطمئن نیستم بتونم پیادش کنم ، اگه موفق نشدم باز باهاتون تماس می گیرم.
میخواهید نمایش هم بدید یا فقط اطلاع از تغییر براتون مهمه ؟
نمایش اون هم برم مهمه یعنی می خوام از ش استفاده کنم .
با توجه به راهنماییهای Mahyaa من دستوراتی به این شکل نوشتم ولی جواب نمی ده.
private
{ Private declarations }
ClipBoardHandle:THandle;
Procedure WM_DRAWCLIPBOARD(var Msg: TMessage);message WM_DRAWCLIPBOARD;
_____________
Procedure TFormMain.WM_DRAWCLIPBOARD(var Msg: TMessage);
begin
ShowMessage('Clipboard.AsTex'););
end;
در اول اجرای برنامه یا هنگام Create شدن فرم ، باید تابع SetClipboardViewer رو صدا بزنید تا هندل فرمی رو که میخواهید محتوای کلیپ بورد رو در اون نمایش بدید ، وارد زنجیره کلیپ بورد کنید. اینطوری :
ClpChain : THandel; //--> Delclare this as Global var
.
.
.
ClpChain := SetClipboardViewer(Handle); //-->Hnadle is the Handle of the form
و در آخر کار هم (مثلا در Destroy فرم) این کار رو میکنیم تا پنجره رو از زنجیره خارج کنیم :
ChangeClipboardChain(Handle, ClpChain);
حالا اون Procedure که خودتون نوشتید ، باید کار بکنه .
فقط برای نمایش اون باید به دوتا مساله دقت کنید .
1- هنگام نمایش باید مطمئن بشید که محتوای کلیپ بورد Text هستش که بخواهید به صورت متنی نمایشش بدید . این کمک میکنه :
if Clipboard.HasFormat(cf_text) then
begin
ShowMessage('Clipboard.AsTex');
end;
2- از مسج WM_CHANGECBCHAIN باید استفاده کنید و یک Procedure بنویسید که در صورتی که تغییری در زنجیره کلیپ بورد بوجود اومد و فرم نمایش دهنده شما از زنجیر خارج شد ، خودش اصلاحش کنه .
.
با تشکر از توجهتون ولی من تمام کارهایی رو که گفته بودید انجام دادم ولی جواب نداد یعنی موقع اجرای برنامه وقتی محتویات کلیپ برد رو تغییر میدم برنامه متوجه نمی شده و هیچ پیامی رو نشون نمی ده البته تو اینترنت سرچ کردم و مثل اینکه کمپوننت RubIcon یک چنین ابزاری رو برای کنترل کلیپ برد داره ولی نتونستم خود کمپوننت رو پیدا کنم.
من نمونه اش رو براتون میگذارم
یک Clipboard viewer خیلی ساده که فقط به محض تغییر در محتویات کلیپ بورد اون رو در یک Memo نشون میده :