Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Запоминание содержимого буфера обмена 
:(
    Опции темы
Superklug
Дата 22.6.2009, 00:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 227
Регистрация: 16.6.2006

Репутация: нет
Всего: нет



Доброго времени суток!
В своей программе я работаю с буфером обмена... Получается так, что я могу "затереть" какие-то данные пользователя, которые он поместил в буфер. Соответственно мне необходимо каким-то образом сохранять, а затем восстанавливать содержимое буфера обмена.

Т.е. примерно так:

// запоминаем содержимое буфера
   ...
// мои операции
   ...
// восстанавливаем содержимое буфера

Подскажите как это можно реализовать?
PM MAIL   Вверх
mrbrooks
Дата 22.6.2009, 08:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 167
Всего: 306



Цитата(Superklug @  22.6.2009,  00:05 Найти цитируемый пост)
Подскажите как это можно реализовать? 


TClipboard спасет отца русской демократии?
PM MAIL   Вверх
Superklug
Дата 23.6.2009, 00:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 227
Регистрация: 16.6.2006

Репутация: нет
Всего: нет



Цитата(mrbrooks @  22.6.2009,  08:13 Найти цитируемый пост)
TClipboard спасет отца русской демократии? 

На сколько я знаю с этим классом можно только как с указателем работать... Т.е. написать TClipboard cb = *Clipboard(); нельзя.
Я пробовал перебрать и запомнить все форматы данных в буфере, а затем вернуть их на место.. Ничего не получилось.

 smile 
PM MAIL   Вверх
mrbrooks
Дата 23.6.2009, 07:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 167
Всего: 306



Цитата(Superklug @  23.6.2009,  00:10 Найти цитируемый пост)
Т.е. написать TClipboard cb = *Clipboard(); нельзя.

это еще что такое?  smile 
работать с TClipboard можно либо так:

Код

TClipboard()->HasFormat(CF_TEXT);
TClipboard()->AsText = "Hello world!"; // своство для записи/чтения


либо так:
Код

TClipboard *cb =  new Clipboard();
cb->HasFormat(CF_TEXT);
cb->AsText = "Hello world!";
delete cb;

PM MAIL   Вверх
Superklug
Дата 23.6.2009, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 227
Регистрация: 16.6.2006

Репутация: нет
Всего: нет



Это только текст.. В буфере находится сразу много форматов... Мне их всех запомнить как-то надо. А потом вернуть в буфер.

Я пробовал так:
Код

unsigned short *cb_format = new unsigned short[Clipboard()->FormatCount];
unsigned int *cb_value = new unsigned int[Clipboard()->FormatCount];
int format_count = Clipboard()->FormatCount;
for(int i=0; i<format_count; i++)
{
        cb_format[i]=Clipboard()->Formats[i];
        cb_value[i]=Clipboard()->GetAsHandle(cb_format[i]);
}

//мои действия с буфером
Clipboard()->Clear();

for(int i=0; i<format_count; i++)
        Clipboard()->SetAsHandle(cb_format[i],cb_value[i]);


Ничего не получается((
PM MAIL   Вверх
mrbrooks
Дата 23.6.2009, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 167
Всего: 306



Обрати внимание на метод HasFormat - в него передается флаг характерный твоей информации (текст, картинка и т.д.). см. хелп.

Цитата(Superklug @  23.6.2009,  13:16 Найти цитируемый пост)
В буфере находится сразу много форматов... Мне их всех запомнить как-то надо. А потом вернуть в буфер.


возможно есть смысл использовать массив TClipboard.
PM MAIL   Вверх
Superklug
Дата 23.6.2009, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 227
Регистрация: 16.6.2006

Репутация: нет
Всего: нет



Цитата(mrbrooks @  23.6.2009,  13:29 Найти цитируемый пост)
возможно есть смысл использовать массив TClipboard. 

Не понимаю(
PM MAIL   Вверх
mrbrooks
Дата 23.6.2009, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 167
Всего: 306



Цитата(Superklug @  23.6.2009,  13:58 Найти цитируемый пост)
Не понимаю( 

чего же тут непонятного.

Код

TClipboard *brd[10]; //вот тебе скажем десять объектов
brd[1] = new TClipboard();
//...
brd[10] = new TClipboard();

//собственно и работай с каждым из них. не забудь потом почистить


Честно говоря так никогда не изгалялся.  smile  И по этому за результат ничего сказать не могу. Попробуй - потом отпишись. 
Сейчас склоняюсь к мнению может проще создать массив потоков (TStream) и его потомков? 
Тоже как вариант - если ты все будешь хранить в памяти - то почему бы и нет.
PM MAIL   Вверх
Superklug
Дата 23.6.2009, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 227
Регистрация: 16.6.2006

Репутация: нет
Всего: нет



mrbrooks, чтобы сохранить текущее состояние буфера мне необходимо скопировать само значение, а не указатель. Если я пишу:
Код

        TClipboard *cb = new TClipboard();
        *cb = *Clipboard();

выдается ошибка Classes with properties cannot be copied by value.


А как работать с TStream?
PM MAIL   Вверх
Superklug
Дата 24.6.2009, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 227
Регистрация: 16.6.2006

Репутация: нет
Всего: нет



Нашел способ сохранять буфер в TStream. Код на Delphi: здесь
Переписал на Builder, но похоже где-то ошибся.. Посмотрите что не так?

Код

void TfmMain::CopyStreamToClipboard(unsigned short fmt, TStream *S)
{
        S->Position = 0;
        HWND hMem = GlobalAlloc(GHND | GMEM_DDESHARE, S->Size);
        if(hMem!=0)
        {
                Pointer pMem = GlobalLock(hMem);
                if(pMem!=NULL)
                {
                        try
                        {
                                S->Read(pMem,S->Size);
                                S->Position = 0;
                        }
                        catch(...)
                        {
                                GlobalUnlock(hMem);
                        }
                        Clipboard()->Open();
                        Clipboard()->SetAsHandle(fmt,(unsigned int)hMem);
                        Clipboard()->Close();
                }
                else
                        GlobalFree(hMem);
        }
}
//---------------------------------------------------------------------------


void TfmMain::CopyStreamFromClipboard(unsigned short fmt, TStream *S)
{
        HWND hMem = (HGLOBAL)Clipboard()->GetAsHandle(fmt);
        if(hMem!=0)
        {
                Pointer pMem = GlobalLock(hMem);
                if(pMem!=NULL)
                {
                        try
                        {
                                S->Write(pMem,S->Size);
                                S->Position = 0;
                        }
                        catch(...)
                        {
                                GlobalUnlock(hMem);
                        }
                }
        }
}
//---------------------------------------------------------------------------


void TfmMain::SaveClipboardFormat(unsigned short fmt, TWriter *writer)
{
        char fmtname[128];
        if(GetClipboardFormatName(fmt, fmtname, sizeof(fmtname))==0)
                fmtname[0]='\0';
        TMemoryStream *ms = new TMemoryStream;
        CopyStreamFromClipboard(fmt, ms);
        if(ms->Size>0)
        {
                writer->WriteInteger(fmt);
                writer->WriteString(fmtname);
                writer->WriteInteger(ms->Size);
                writer->Write(ms->Memory, ms->Size);
        }
        ms->Free();
}
//---------------------------------------------------------------------------


void TfmMain::LoadClipboardFormat(TReader *reader)
{
        unsigned short fmt = reader->ReadInteger();
        String fmtname = reader->ReadString();
        int Size = reader->ReadInteger();
        TMemoryStream *ms = new TMemoryStream;
        ms->Size = Size;
        reader->Read(ms->Memory,Size);
        if(fmtname.Length()>0)
                fmt = RegisterClipboardFormat(fmtname.c_str());
        if(fmt!=0)
                CopyStreamToClipboard(fmt, ms);
        ms->Free();
}
//---------------------------------------------------------------------------



void TfmMain::SaveClipboard(TStream *S)
{
        TWriter *writer = new TWriter(S,4096);
        Clipboard()->Open();
        writer->WriteListBegin();
        for(int i=0; i<Clipboard()->FormatCount; i++)
                SaveClipboardFormat(Clipboard()->Formats[i],writer);
        writer->WriteListEnd();
        Clipboard()->Close();
        writer->Free();

}
//---------------------------------------------------------------------------


void TfmMain::LoadClipboard(TStream *S)
{
        TReader *reader = new TReader(S,4096);
        Clipboard()->Open();
        Clipboard()->Clear();
        reader->ReadListBegin();
        while(!reader->EndOfList())
                LoadClipboardFormat(reader);
        reader->ReadListEnd();
        Clipboard()->Close();
        reader->Free();
}
//---------------------------------------------------------------------------


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0560 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.