C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Странности с Clipboard()
Benish
Отправлено: 07.02.2005, 16:26


Дежурный стрелочник

Группа: Участник
Сообщений: 67



Есть программа:

CODE

void __fastcall TForm1::Button1Click(TObject *Sender)
{
         if (Clipboard()->HasFormat(CF_TEXT))
   {
//Вариант 1
       Clipboard()->AsText = Edit1->Text;
//Вариант 2
       Clipboard()->SetTextBuf(Edit1->Text.c_str());
//Вариант 3
       Edit1->CopyToClipboard();

   }

}


Форма, на ней TEdit и TButton. После набора текста и нажатия кнопки, текст должен записываться в Clipboard.

Интересно, что:
Вариант 1 и 2 работают у меня на машине и не работают на других компах. Вариант 3 не работает даже у меня.
Подскажите пожалуйста, в чем тут дело!
Gedeon
Отправлено: 07.02.2005, 17:24


Ветеран

Группа: Модератор
Сообщений: 1742



Ну во первых что такое Clipboard() ??????????????????

Ну и дальше все работает вот так
CODE

   TClipboard *C = new TClipboard();
  if (C->HasFormat(CF_TEXT)){
       //Âàðèàíò 1
              //C->AsText = Edit1->Text;
       //Âàðèàíò 2
              //C->SetTextBuf(Edit1->Text.c_str());
       //Âàðèàíò 3
              Edit1->CopyToClipboard();
      }
      delete C;

А про третий вариант в хэлпе можно глянуть было
QUOTE
Copies the selected text in the edit control to the Clipboard.

Т.е. надо его сначала выделить.
Benish
Отправлено: 08.02.2005, 13:09


Дежурный стрелочник

Группа: Участник
Сообщений: 67



QUOTE (Gedeon @ 07/02/2005, 18:26)
Ну во первых что такое Clipboard() ??????????????????


Цитата из BCBhelp:

Returns an instance of TClipboard.
Unit Clipbrd
Category clipboard routines

extern PACKAGE TClipboard* __fastcall Clipboard(void);

Description

Applications use a single instance of TClipboard for interacting with the system clipboard. If the application has never used the Windows clipboard, calling Clipboard creates a new instance of TClipboard. If the clipboard has already been used, Clipboard returns the previously created TClipboard object.

To use Clipboard and the TClipboard object, include Clipbrd.hpp in the source module.

-------------------------------------------------------------------------------------------


This example uses a button and an edit control on a form. When the user clicks the button, any text on the clipboard is pasted into the edit control. If there is no text on the clipboard, a message box appears.

Note: To use this example, you must include .
CODE

void __fastcall TForm1::Button1Click(TObject *Sender)

{
 if (Clipboard()->HasFormat(CF_TEXT))
   Edit1->Text = Clipboard()->AsText;
 else
   Application->MessageBox("The clipboard does not contain text.", NULL, MB_OK);
}

Benish
Отправлено: 08.02.2005, 13:33


Дежурный стрелочник

Группа: Участник
Сообщений: 67



2 Gedeon:

Спасибо. С CopyToClipboard недоглядел.

Попытка применить ваше решение тоже не принесла результатов.

Вообщем после удаления конструкции:

CODE

 if (C->HasFormat(CF_TEXT))



Все заработало и на других машинах.
Gedeon
Отправлено: 08.02.2005, 13:44


Ветеран

Группа: Модератор
Сообщений: 1742



Ясно.

Запустил на 2 других тачках 98, ХР — все работает.


Вместе с if (Clipboard()->HasFormat(CF_TEXT))
вот буквально следующий код
CODE

__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
Clipboard()->AsText = "sss";
   if (Clipboard()->HasFormat(CF_TEXT))
    Edit1->Text = Clipboard()->AsText;
}
//---------------------------------------------------------------------------


Отредактировано Gedeon — 08/02/2005, 12:50
Benish
Отправлено: 08.02.2005, 15:34


Дежурный стрелочник

Группа: Участник
Сообщений: 67



Хмммм...

Вообщем если использовать вот такой код:

CODE

void __fastcall TForm1::Button1Click(TObject *Sender)
{

 Clipboard()->AsText = "";  

 if (Clipboard()->HasFormat(CF_TEXT)) Clipboard()->AsText = Edit1->Text;

}



то все работает, на всех машинах.

Такое впечатление, что Clipboard(), до инициализации текстом, не знает, что она может работать с текстом.

Вернуться в Вопросы программирования в C++Builder