PDA

View Full Version : ارسال محتوای آرایه به ClipBoard



juiande
چهارشنبه 14 مهر 1389, 10:58 صبح
با سلام خدمت اساتید گرام
لطفا بفرمایید چه جوری میشه محتوای یک آرایه رو مستقیما با ClipBoard کپی کرد
ممنونم

Felony
پنج شنبه 15 مهر 1389, 09:09 صبح
این سوال چه ربطی به بخش توسعه IDE دلفی داره ؟

اگر میخواین تمامی مقادیر موجود تو یه ارایه رو به حافظه موقت انتقال بدید میتونید اونها رو یکی کنید و بعد به حافظه موقت انتقال بدید ، یعنی مثلا اگر یه آرایه رشته ای دارید همه رشته ها رو با یک کارکتر جدا کننده ( مثلا , ) به هم بچسبونید و بعد رشته حاصل رو به حافظه موقت بدید ، برای خواندن هم کافیه رشته رو با استناد به همون کارکتر جدا کننده جدا کنید .

Mahmood_M
پنج شنبه 15 مهر 1389, 14:10 عصر
راه دیگش اینه که یک Format برای چیزی که می خواید به Clipboard بفرستید بسازید ، ابتدا آرایه ی خودتون رو به صورت زیر به عنوان یک Type تعریف کنید :
type
TMyArray = array[0..9] of Integer;

متغیرهای زیر رو هم به صورت عمومی یا Global تعریف کنید :
var
Form1: TForm1;
...
MyArray : TMyArray;
AHandle, MyArrayFormat : Cardinal;
APointer : ^TMyArray;

برای فرستادن آرایه به ClipBoard به صورت زیر عمل کنید :

procedure TForm1.BitBtn1Click(Sender: TObject);
var
I: Integer;
begin
for I := 0 to 9 do
MyArray[I] := I;

MyArrayFormat := RegisterClipboardFormat('CF_MYARRAY');

if not OpenClipboard(Handle) then
begin
ShowMessage('Unable to open the Clipboard !');
Exit;
end;

EmptyClipboard;

AHandle := GlobalAlloc(GMEM_DDESHARE or GMEM_MOVEABLE, SizeOf(TMyArray));
APointer := GlobalLock(AHandle);
APointer^ := MyArray;
GlobalUnlock(AHandle);

SetClipboardData(MyArrayFormat, AHandle);

CloseClipboard;
end;

در دستورات بالا ابتدا آرایه مقدار دهی میشه ، بعد یک Format برای Clipboard به نام CF_MYARRAY ثبت میشه ، در مرحله ی بعد فضایی در حافظه به اندازه ی TMyArray برای آرایه ی خودمون در نظر میگیریم و بعد اون رو Lock یا قفل می کنیم تا بدون تداخل برنامه های دیگه باهاش کار کنیم ، بعد آرایه رو درون اون فضا قرار می دیم ، در آخر هم فضای قفل شده رو آزاد می کنیم ( از حالت قفل در میاریم ) و بعد همون فضایی که اطلاعاتمون رو درونش قرار دادیم رو با توجه به فرمت MyArrayFormat درون Clipboard قرار می دیم و در آخر هم Clipboard رو می بندیم ...

برای دریافت اطلاعات از Clipboard هم به صورت زیر عمل کنید :
procedure TForm1.BitBtn2Click(Sender: TObject);
begin
if not Clipboard.HasFormat(MyArrayFormat) then
begin
ShowMessage('Data in ClipBoard have no "MyArrayFormat" Format');
Exit;
end;
if not OpenClipboard(Handle) then
begin
ShowMessage('Unable to open the Clipboard !');
Exit;
end;

AHandle := GetClipboardData(MyArrayFormat);
APointer := GlobalLock(AHandle);
MyArray := APointer^;
GlobalUnlock(AHandle);

CloseClipboard;
end;
در دستورات بالا هم ابتدا فرمت Clipboard رو بررسی میکنیم ، اگر فرمت مورد نظرمون بود ، Clipboard رو باز میکنیم ، اطلاعاتش رو میگیرم ، در MyArray قرار میدیم و در آخر هم اون رو می بندیم ...

با این روش می تونید هر نوع اطلاعاتی رو به حافظه Clipboard بفرستید ...

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