Clipboard daki farklı ve çoklu formatları ayıklamak.

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
Lost Soul
Üye
Mesajlar: 1064
Kayıt: 01 Nis 2007 02:55
Konum: mekan ANKARA toprak ELAZIĞ
İletişim:

Clipboard daki farklı ve çoklu formatları ayıklamak.

Mesaj gönderen Lost Soul »

Bu konuyla ilgili bir çok araştırma yaptım.
Formatcount vs ile yapılan örnekler var.
Ancak örneklerin hepsinde ilk bulunan resim alınmış diğerleri ise boşlanmış.

Benim yapmak istediğim şu.
Web sayfasını seçip kopyaladağımız zaman haliyle
Clipboarda biçimlendirilmiş metinler, jpgler, pngler vs.. çeşitli biçemde veri yığınları gelmiş olacak.

Şimdi bunlar for i := 0 to Clipboard.Formatcount ile kaç tane olduğu, hangi formatta (1)(metafile,graphic,bitmap,text ...)
olduğu görülebiliyor. Fakat doğrudan (items gibi) alınamıyor, Handle,Pointer ve Stream gerekiyor. (2)
Bu da güzel.


ama tüm nesneleri tarayıp onları nasıl alacağımı bulamadım.

Bu konu hakkında yardımcı olabilir misiniz?.


_______________________________________________________
1:

Kod: Tümünü seç

 case cpType of
        1: Result := 'CF_TEXT';
        2: Result := 'CF_BITMAP';
        3: Result := 'CF_METAFILEPICT';
        4: Result := 'CF_SYLK';
        5: Result := 'CF_DIF';
        6: Result := 'CF_TIFF';
        7: Result := 'CF_OEMTEXT';
        8: Result := 'CF_DIB';
        9: Result := 'CF_PALETTE';
        10: Result := 'CF_PENDATA';
        11: Result := 'CF_RIFF';
        12: Result := 'CF_WAVE';
        13: Result := 'CF_UNICODETEXT';
        14: Result := 'CF_ENHMETAFILE';
        15: Result := 'CF_HDROP (Win 95)';
        16: Result := 'CF_LOCALE (Win 95)';
        17: Result := 'CF_MAX (Win 95)';
        $0080: Result := 'CF_OWNERDISPLAY';
        $0081: Result := 'CF_DSPTEXT';
        $0082: Result := 'CF_DSPBITMAP';
        $0083: Result := 'CF_DSPMETAFILEPICT';
        $008E: Result := 'CF_DSPENHMETAFILE';
        $0200..$02FF: Result := 'private format';
        $0300..$03FF: Result := 'GDI object';
        else
        Result:='Unknown Format:'+inttostr(cpType);

2:

Kod: Tümünü seç

var
  Data:THandle;
  DataPtr:Pointer;
  Reader:Treader;
begin
  ClipBoard.Open;
  try
    Data:=GetClipBoardData(cpType);
    if Data<>0 then
    Begin
      DataPtr :=GlobalLock(Data);
      if DataPtr<>nil then
      Begin
        try
          Result.WriteBuffer(DataPtr^,Globalsize(Data));
        finally
          GlobalUnlock(Data);
        end;
      End;
    End;
  finally
    ClipBoard.Close;
  end;
Kullanıcı avatarı
Lost Soul
Üye
Mesajlar: 1064
Kayıt: 01 Nis 2007 02:55
Konum: mekan ANKARA toprak ELAZIĞ
İletişim:

Re: Clipboard daki farklı ve çoklu formatları ayıklamak.

Mesaj gönderen Lost Soul »

Kimse clipboardla uğraşmadı mı bu güne kadar :)
Kullanıcı avatarı
Lost Soul
Üye
Mesajlar: 1064
Kayıt: 01 Nis 2007 02:55
Konum: mekan ANKARA toprak ELAZIĞ
İletişim:

Re: Clipboard daki farklı ve çoklu formatları ayıklamak.

Mesaj gönderen Lost Soul »

S.A. henüz bir çözüm bulamadım. Konuya tekrar dikkat çekme ihtiyacı hissettim :)
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: Clipboard daki farklı ve çoklu formatları ayıklamak.

Mesaj gönderen thelvaci »

Aslında sonuca oldukça yaklaşmışsınız.

Kod: Tümünü seç

procedure L(const Message : String);
begin
  form1.Memo1.Lines.Add( Message );
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  iFormat,
  iFormatCount,
  iCounter : Integer;

  FormatNames : array[0..255] of Char;
begin
  iFormatCount := Clipboard.FormatCount;
  L('FormatCount:' + InttoStr(iFormatCount));

  for iCounter := 0 to iFormatCount - 1 do
  begin
    iFormat := Clipboard.Formats[iCounter];
    L('Format:' + InttoStr(iFormat));

    GetclipboardFormatName(iFormat, FormatNames, SizeOf(FormatNames) - 1);
    L(FormatNames);
  end;
end;
gibi bir kod ile o anda clipboard'da mevcut olan bir yada birden fazla formatı gözlemleyebilirsiniz. Bunları gözlemledikten sonra da GetAsHandle ile okuyabilirsiniz diye düşünüyorum.
Cevapla