کار با clipboard در دلفی - کلیپ بورد

saalek110

Well-Known Member
با سلام.
من می خوام داخل کلیپ بورد چیزی بریزم ولی نمی خواهم محتوای کلیپ بورد کاربر که فارسی هست خراب بشه.
آیا راهی برای ذخیره کلیپ بورد در جایی هست که حالت فارسی آن بهم نخورد؟
 

farhad110

Member
سالك جان منظور شما رو دقيقا متوجه نشدم. از قبل چيزي درون كليپ بورد هست كه ميخوايد نگه داشته بشه؟ يا شما ميخواهيد متن فارسي رو به كليپ لورد انتقال بديد؟
 

saalek110

Well-Known Member
سلام فرهاد جان.
چیزی که من می خواهم درون کلیپ بورد بریزم انگلیسی است.ولی نمی خواهم محتوای فارسی که قبلا در کلیپ بورد کاربر بوده مخدوش بشه. دنبال راهی می گردم که محتوای فارسی جایی ذخیره بشه و بعد استفاده از کلیپ بورد دوباره سر جای خود برگردانده شود.
 

saalek110

Well-Known Member
چیزی که من می خواهم درون کلیپ بورد بریزم انگلیسی است.ولی نمی خواهم محتوای فارسی که قبلا در کلیپ بورد کاربر بوده مخدوش بشه. دنبال راهی می گردم که محتوای فارسی جایی ذخیره بشه و بعد استفاده از کلیپ بورد دوباره سر جای خود برگردانده شود.

در کلیب برد حالت های مختلفی رو میشه ذخیره کرده که ساده ترین یه متن ساده هست.
سالک جان این 3 نمونه رو نگاه کن، اگه قضیه حل نشد، بگو:

1- http://delphi.about.com/od/vclusing/a/tclipboard.htm
2- http://delphi.about.com/od/windowssh...pboard_spy.htm
3 - http://www.swissdelphicenter.ch/torr...ode.php?id=739

ممنون از توجه دوستان.
ممنون آقا نوید.
مشکلم حل شد.

جواب را قرار می دهم تا دیگران هم استفاده کنند.
ابتدا clipbrd را uses کنید.
بعد 3 باتون به فرم بیافزایید.
دکمه اولی برای ذخیره محتوای کلیپ برد در فایل است.
دکمه دوم برای دستکاری فرضی کلیب بورد .
دکمه سوم برای بازیابی کلیب بورد.
کد:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,clipbrd, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
  procedure CopyStreamToClipboard(fmt: Cardinal; S: TStream);
var
  hMem: THandle;
  pMem: Pointer;
begin
  Assert(Assigned(S));
  S.Position := 0;
  hMem       := GlobalAlloc(GHND or GMEM_DDESHARE, S.Size);
  if hMem <> 0 then
  begin
    pMem := GlobalLock(hMem);
    if pMem <> nil then
    begin
      try
        S.Read(pMem^, S.Size);
        S.Position := 0;
      finally
        GlobalUnlock(hMem);
      end;
      Clipboard.Open;
      try
        Clipboard.SetAsHandle(fmt, hMem);
      finally
        Clipboard.Close;
      end;
    end { If }
    else
    begin
      GlobalFree(hMem);
      OutOfMemoryError;
    end;
  end { If }
  else
    OutOfMemoryError;
end; { CopyStreamToClipboard }

procedure CopyStreamFromClipboard(fmt: Cardinal; S: TStream);
var
  hMem: THandle;
  pMem: Pointer;
begin
  Assert(Assigned(S));
  hMem := Clipboard.GetAsHandle(fmt);
  if hMem <> 0 then
  begin
    pMem := GlobalLock(hMem);
    if pMem <> nil then
    begin
      try
        S.Write(pMem^, GlobalSize(hMem));
        S.Position := 0;
      finally
        GlobalUnlock(hMem);
      end;
    end { If }
    else
      raise Exception.Create('CopyStreamFromClipboard: could not lock global handle ' +
        'obtained from clipboard!');
  end; { If }
end; { CopyStreamFromClipboard }

procedure SaveClipboardFormat(fmt: Word; writer: TWriter);
var
  fmtname: array[0..128] of Char;
  ms: TMemoryStream;
begin
  Assert(Assigned(writer));
  if 0 = GetClipboardFormatName(fmt, fmtname, SizeOf(fmtname)) then
    fmtname[0] := #0;
  ms := TMemoryStream.Create;
  try
    CopyStreamFromClipboard(fmt, ms);
    if ms.Size > 0 then
    begin
      writer.WriteInteger(fmt);
      writer.WriteString(fmtname);
      writer.WriteInteger(ms.Size);
      writer.Write(ms.Memory^, ms.Size);
    end; { If }
  finally
    ms.Free
  end; { Finally }
end; { SaveClipboardFormat }

procedure LoadClipboardFormat(reader: TReader);
var
  fmt: Integer;
  fmtname: string;
  Size: Integer;
  ms: TMemoryStream;
begin
  Assert(Assigned(reader));
  fmt     := reader.ReadInteger;
  fmtname := reader.ReadString;
  Size    := reader.ReadInteger;
  ms      := TMemoryStream.Create;
  try
    ms.Size := Size;
    reader.Read(ms.memory^, Size);
    if Length(fmtname) > 0 then
      fmt := RegisterCLipboardFormat(PChar(fmtname));
    if fmt <> 0 then
      CopyStreamToClipboard(fmt, ms);
  finally
    ms.Free;
  end; { Finally }
end; { LoadClipboardFormat }

procedure SaveClipboard(S: TStream);
var
  writer: TWriter;
  i: Integer;
begin
  Assert(Assigned(S));
  writer := TWriter.Create(S, 4096);
  try
    Clipboard.Open;
    try
      writer.WriteListBegin;
      for i := 0 to Clipboard.formatcount - 1 do
        SaveClipboardFormat(Clipboard.Formats[i], writer);
      writer.WriteListEnd;
    finally
      Clipboard.Close;
    end; { Finally }
  finally
    writer.Free
  end; { Finally }
end; { SaveClipboard }

procedure LoadClipboard(S: TStream);
var
  reader: TReader;
begin
  Assert(Assigned(S));
  reader := TReader.Create(S, 4096);
  try
    Clipboard.Open;
    try
      clipboard.Clear;
      reader.ReadListBegin;
      while not reader.EndOfList do
        LoadClipboardFormat(reader);
      reader.ReadListEnd;
    finally
      Clipboard.Close;
    end; { Finally }
  finally
    reader.Free
  end; { Finally }
end; { LoadClipboard }



// Examples:

{ Save Clipboard }

procedure TForm1.Button1Click(Sender: TObject);
var
  ms: TMemoryStream;
begin
  ms := TMemoryStream.Create;
  try
    SaveClipboard(ms);
    ms.SaveToFile('c:\ClipBrdSaved.dat');
  finally
    ms.Free;
  end; { Finally }
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
clipboard.Clear;
end;

procedure TForm1.Button3Click(Sender: TObject);
var
  fs: TfileStream;
begin
  fs := TFilestream.Create('c:\ClipBrdSaved.dat',
    fmopenread or fmsharedenynone);
  try
    LoadClipboard(fs);
  finally
    fs.Free;
  end; { Finally }
   end;
end.
منبع:
http://www.swissdelphicenter.ch/torry/showcode.php?id=945
 

جدیدترین ارسال ها

بالا