Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Копирование ячеек StringGrid и ActionList 
:(
    Опции темы
Usper
Дата 8.2.2011, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Копирование содержимого выделенных ячеек в StringGrid реализовать довольно просто, но у меня в приложении используються разные компоненты и хотелось бы, чтобы через главное меню приложения можно было бы производить схожие действия для разных компонентов, даже если эти действия для некоторых компонентов не предусмотрены. Вероятно нужно использовать компонент ActionList, но как связать разные действия в одном пункте меню, чтобы они корректно работали?
Поясню на примере. Допустим на форме есть StringGrid и Memo. Хочу сделать операцию копирования, при этом чтобы она работала в зависимости от того, где сейчас находиться фокус ввода. Если фокус ввода в Memo, то событие стандартное, если фокус ввода в StringGrid, то вызывается моя функция, которая заносит в буфер обмена содержимое выделенных ячеек. При этом пункт меню "копировать" должен корректно отображать возможность копирования в данный момент, то есть если фокус ввода на какой-нибудь кнопке, например, то операция недоступна.


--------------------
На посохе волшебном нехилый набалдашник, большой такой, огромный, нехилый набалдашник.
PM MAIL   Вверх
nick42
Дата 8.2.2011, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Если я правильно Вас понял, то следующий пример может помочь разобраться...


Код

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

      AnsiString stroka = "Test program";
      int rowc, colc;

//---------------------------------------------------------------------------

void __fastcall TForm1::Edit2Click(TObject *Sender)
{
       Copy1->Enabled = (Memo1->Focused() || StringGrid1->Focused());
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
       Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Copy1Click(TObject *Sender)
{
      if (Memo1->Focused())
        stroka = Memo1->SelText;
      if (StringGrid1->Focused())
        stroka = StringGrid1->Cells[colc][rowc] ; 
      Form1->Caption = "Caption: "+stroka;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
        for (int i=0;i<StringGrid1->ColCount;i++)
          for (int j=0;j<StringGrid1->RowCount;j++)
            StringGrid1->Cells[i][j] = IntToStr(j)+" "+IntToStr(i);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::StringGrid1Click(TObject *Sender)
{
       colc = StringGrid1->Col;
       rowc = StringGrid1->Row;
}
//---------------------------------------------------------------------------



Присоединённый файл ( Кол-во скачиваний: 6 )
Присоединённый файл  pack.zip 10,08 Kb
PM MAIL   Вверх
Usper
Дата 9.2.2011, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Спасибо за подсказку, но я не зря упомянул ActionList. Если в проекте большое количество компонентов, то функций обработчиков тоже нужно писать много, нужно отслеживать каждый компонент, а это не очень хорошо. ActionList позволяет автоматизировать эту ситуацию. И, к тому же, Ваш проект не совсем правильно работает, пункт "копировать" становится активным если Memo1 находиться в фокусе. Но пункт должен становиться активным когда Memo1 находиться не просто в фокусе, а когда есть выделение текста, то есть есть что копировать.
У меня проблема заключается в том, что когда я пишу своё действие (копировать выделенные ячейки из таблицы), программа не видит доступно ли действие в данный момент или нет. В справке пишут, что когда программа находиться в состоянии "idle" (то есть бездействует) постоянно наступает событие OnUpdate, в котором собственно можно проверить находиться в фокусе таблица или нет и этим гарантируется правильное определение доступности действия. Но фактически событие OnUpdate у моего действия никогда не наступает. То есть на самом деле это событие у действий наступает только по мере необходимости (например событие связано с пунктом меню, и соответственно перед отображением этого меню на экран происходит событие OnUpdate). А так как я пишу собственное действие, и оно не связано с меню, то это действие никогда и не срабатывает.


--------------------
На посохе волшебном нехилый набалдашник, большой такой, огромный, нехилый набалдашник.
PM MAIL   Вверх
Usper
Дата 9.2.2011, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Мне внеазпно пришло в голову, что я и сам могу вызывать когда надо событие OnUpdate smile
Тогда всё становиться проще:
Код

//---------------------------------------------------------------------------

#include <vcl.h>
#include <clipbrd.hpp>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
    for(int i=0; i<StringGrid1->ColCount; i++)
        for(int j=0; j<StringGrid1->RowCount; j++)
            StringGrid1->Cells[i][j]=IntToStr((StringGrid1->ColCount)*j+i);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::CellsCopyUpdate(TObject *Sender)
{
     CellsCopy->Enabled = StringGrid1->Focused();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::UniversalCopyUpdate(TObject *Sender)
{
    CellsCopy->Update();
    EditCopy1->Update();
    if(EditCopy1->Enabled || CellsCopy->Enabled) UniversalCopy->Enabled = true;
    else UniversalCopy->Enabled = false;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::CellsCopyExecute(TObject *Sender)
{
    AnsiString S;
    for(int i = StringGrid1->Selection.Top; i <= StringGrid1->Selection.Bottom; i++)
    {
        for(int j = StringGrid1->Selection.Left ; j <= StringGrid1->Selection.Right; j++)
        {
            S = S + StringGrid1->Cells[j][i];
            if(j != StringGrid1->ColCount - 1)S = S + '\t';
        }
        if(i != StringGrid1->Selection.Bottom) S = S + "\r\n";
    }
    Clipboard()->AsText = S;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::UniversalCopyExecute(TObject *Sender)
{
    if(StringGrid1->Focused()) CellsCopy->Execute();
    else  EditCopy1->Execute();
}
//---------------------------------------------------------------------------


Но вот само событие копирования ячеек в буфер обмена мне не очень нравиться. Как бы его сделать поуниверсальнее, чтобы работало не с конкретным StringGrid`ом а со всеми StringGrid`ами проекта...

Присоединённый файл ( Кол-во скачиваний: 12 )
Присоединённый файл  UCopy.zip 4,41 Kb


--------------------
На посохе волшебном нехилый набалдашник, большой такой, огромный, нехилый набалдашник.
PM MAIL   Вверх
nick42
Дата 9.2.2011, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Usper @  9.2.2011,  11:38 Найти цитируемый пост)
Но вот само событие копирования ячеек в буфер обмена мне не очень нравиться. Как бы его сделать поуниверсальнее, чтобы работало не с конкретным StringGrid`ом а со всеми StringGrid`ами проекта

.. я бы сделал это так:

      for (int i=0;i<Form1->ControlCount;i++)
        if (String(Form1->Controls[i]->ClassName())=="TStringGrid") 
          if (((TStringGrid *)Form1->Controls[i])->Focused())
                {  здесь код ...  }



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

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

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

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

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


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

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


 




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


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

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