Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как создать особый список со столбцами и кнопками, Создание списка из полей и кнопки 
:(
    Опции темы
ColdDeath
Дата 6.11.2009, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Подскажите, пожалуйста, чем пользоваться если мне надо реализовать следующее: 
Список из N строк, каждая из которых состоит из двух столбцов и кнопки TButton. Столбцы то нет проблемы сделать, а вот как привязать к списку кнопки.

То есть:
1. Поле Поле Кнопка
2. Поле Поле Кнопка
3. Поле Поле Кнопка
.
.
.
N. Поле Поле Кнопка

Логически сразу представляется 2 варианта:
1. Создавать динамически кнопку отдельно в зависимости от количества строк в компоненте списка (StringGrid, ListBox,...). (Но тут возникает проблема: что делать, если кнопки начнут вылезать за край формы? У списка то появится панель прокрутки, а у кнопок - нет).
ИЛИ
2. Как-то инегрировать кнопку в компонент списка.
PM MAIL   Вверх
Anikmar
Дата 6.11.2009, 20:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

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



Вопрос не в ту ветку.
Какой компилятор? Если Билдер - я такое делал в TStringGrid
PM MAIL ICQ   Вверх
ColdDeath
Дата 6.11.2009, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Он самый. Ой... а расскажите плиз.... просто оч хочу такое реализовать. Заранее, огроменное спасибо ;) а по какому варианту делали - 1-ому или 2-ому?

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


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

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



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

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

в кратце - при двойном щелчке отображал кнопку
Код

void __fastcall TMAN_Grid::OnDblClick(TObject *Sender)
{
//... тут мои проверки
  ShowSelectButton(); // Моя функция отображения кнопки в ячейке
}

// Аналогично такой же код вешал на обработчик нажатия кнопки
void __fastcall TMAN_Grid::OnKeyPress(TObject *Sender,wchar_t &Key)
{
//...
        if (Key == '\r') ShowSelectButton();
        else Key = 0;
// ...

}

// Отображал кнопку так:
//---------------------------------------------------------------------------
/*
    Внутренний метод. Показывает кнопку выбора значения столбца
*/
void TMAN_Grid::ShowSelectButton(void)
{
    TRect Rect;
    Rect = Grid->CellRect(pvGrid->Col,pvGrid->Row);
    SelectButton->Parent = pvGrid->Parent;
    SelectButton->Left = Rect.Right - SelectButton->Width + pvGrid->Left;
    SelectButton->Top = Rect.Top + 2 + pvGrid->Top;
    SelectButton->Enabled = true;
    SelectButton->Visible = true;
    SelectButton->SetFocus();
}



В виду того, что кнопка мне была нужна только при щелчке на ячейке  ее создавал в методе инициализации своего класса - когда ему передавал грид
Код

    // Установка параметров кнопки выбора
    SelectButton = new TBitBtn(pvGrid->Parent);
    SelectButton->Parent = pvGrid->Parent;
    SelectButton->Caption = "...";
    SelectButton->ShowHint = true;
    SelectButton->OnExit = OnExitSelectButton;
    SelectButton->OnClick = SelectButtonClick;
    SelectButton->Width = pvGrid->DefaultRowHeight + pvGrid->DefaultRowHeight / 2;
    SelectButton->Height = pvGrid->DefaultRowHeight - 2;
    DM_Grid->IL_10->GetBitmap(0,SelectButton->Glyph);


В общем примерно так действовал. Рабочий код вам передать не представляется возможным - он тянет разные функции из моего проекта, так что замучаетесь разбираться и компилировать

Для того, чтобы все нормально отображалосьт мне пришлось перехватить практически все события грида.
PM MAIL ICQ   Вверх
ColdDeath
Дата 6.11.2009, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



оо ужос...как тяжело разобрацо O_o

а что такое        

OnExitSelectButton;
SelectButtonClick;

SelectButton->OnExit = OnExitSelectButton;
SelectButton->OnClick = SelectButtonClick;

и pvGrid?
PM MAIL   Вверх
ColdDeath
Дата 6.11.2009, 22:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



В общем, я попробовал так сделать:

Код

    for (int i = 0; i < Grid->RowCount; i++)
    {
        TBitBtn* SelectButton = new TBitBtn(Grid->Parent);
        SelectButton->Parent = Grid->Parent;
        SelectButton->Caption = "Удалить";
        SelectButton->Width = 60;
        SelectButton->Height = Grid->DefaultRowHeight - 2;

        TRect Rect;
        Rect = Grid->CellRect(3,i);
        SelectButton->Left = (Grid->Left+Rect.Right - Grid->Left+Rect.Left)/2-4;
        SelectButton->Top = Rect.Top + 2 + Grid->Top;

    }



Но трабла та, что кнопки статичные, то есть никак не привязаны к списку. То есть - то же самое, что взять и руками их поставить, на скруллбар не реагируют.
PM MAIL   Вверх
Anikmar
Дата 6.11.2009, 22:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

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



Цитата(ColdDeath @  6.11.2009,  21:37 Найти цитируемый пост)
оо ужос...как тяжело разобрацо O_o

Так вот я и предупреждал...

OnExitSelectButton; - Это вызов  моего обработчика события OnClick
SelectButtonClick; - Это имя ообработчика OnClick для моей кнопочки

SelectButton->OnExit = OnExitSelectButton; - Это я установил для кнопки свой обработчик выхода. Он нужен для того, чтобы кнопка
сразу исчезла из виду как только покинули ячейку

SelectButton->OnClick = SelectButtonClick; - Это я установил свой обработчик для кнопки

и pvGrid? - Это собственно Грид, с которым я работаю.

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

Поэтому я подошел к вопросу доработки нужных мне компонентов написанием своего оберточного класса, который является обычным классом С++ и его не надо инсталировать в среду - а можно таскать с собой как файл проекта.

Поэтому я и боялся - что просто так пример выложить будет сложно.

Суть моего подхода была следующая:
Создал свой отдельный класс работы с гридом. параллельно мне понадобились служебные классы - колонки, списки объектов и т.п. Но суть остатется прежней: при некоторых событиях для ячейки грида я там рисую кнопку. События, которые я перехватывал - это вход в ячейку, нажатие клавиши на клавиатуре, покидание ячейки. Кнопку я создавал одну - так как при нажатии на нее я мог спокойно определить текущую ячейку грида. Да и на экране это смотрелось лучше - куча кнопок в столбец выглядело некрасиво, а вот при клике на ячейке появлялась моя кнопка. Обработчики я устанавливал динамически - так как мой грид я применял в куче форм, мне нужно было чтобы ширина колонок автоматически выравнивалась и т.п.

В общем лучше подходить последовательно - Код, который показывал бы кнопку именно в текущей ячейке я привел. Если хотите кнопки в столбец появляется сложность: при изменении высоты сетки нужно динамически менять кол-во кнопок. Привязывать кнопку к каждой строке грида выглядит расточительно - на экране не больше 40 строк, а в таблице их могут быть сотни и тысячи - незачем создавать кнопку для каждой строки... Я выбрал вариант - клик на ячейке - появилась кнопка.

PM MAIL ICQ   Вверх
ColdDeath
Дата 7.11.2009, 09:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



хм... а дело говорите smile тогда не надо бояться, что кнопки вылезут за границу формы и не будут подвержены прокручиванию вместе со списком smile верно?
PM MAIL   Вверх
ColdDeath
Дата 7.11.2009, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Ладно. решил тоже по одной кнопке создавать. Но не могу понять как делать так, чтобы при нажатии в другую ячейку - кнопка из предыдущей ячейки стиралась. 
А отлавливаете ячейку здесь, да? 

Код

Rect = Grid->CellRect(pvGrid->Col,pvGrid->Row);


Подскажите как удалять уже созданную кнопку при щелчке на другую ячейку, пожалуйста. Если кнопки создавать как TBitBtn* SelectButton = new TBitBtn(Grid->Parent);

я пробовал сделать так: 
UsersList - это StringGrid
Код

//---------------------------------------------------------------------------
void __fastcall TMainDBProperties::UsersListDblClick(TObject *Sender)
{
    ShowSelectButton();
}
//---------------------------------------------------------------------------
void TMainDBProperties::ShowSelectButton()
{
                        delete SelectButton // [color=crimson]то есть при каждом выполнении процедуры, удаляем указатель на старую кнопку. но заранее я ещё инициализировал глобально SelectButton НУЛЛём. На случай если не оздано не одной кнопки[/color]
        TBitBtn* SelectButton = new TBitBtn(UsersList->Parent);
        SelectButton->Parent = UsersList->Parent;
        SelectButton->Caption = "...";
        SelectButton->ShowHint = true;
     // SelectButton->OnExit = OnExitSelectButton;
     // SelectButton->OnClick = SelectButtonClick;
        SelectButton->Width = UsersList->DefaultRowHeight +
            UsersList->DefaultRowHeight / 2;
        SelectButton->Height = UsersList->DefaultRowHeight - 2;

        TRect Rect;
        Rect = UsersList->CellRect(4,UsersList->Row);
        SelectButton->Parent = UsersList->Parent;
        SelectButton->Left = Rect.Right - SelectButton->Width + UsersList->Left;
        SelectButton->Top = Rect.Top + 2 + UsersList->Top;
        SelectButton->Enabled = true;
        SelectButton->Visible = true;
        SelectButton->SetFocus();
}
//---------------------------------------------------------------------------

Но не работает всеравно удаление предыдущей созданой кнопки. Видимо удаляется только казатель на неё, а сама кнопка не убирается. В общем я запутался.

Это сообщение отредактировал(а) ColdDeath - 7.11.2009, 11:18
PM MAIL   Вверх
ColdDeath
Дата 7.11.2009, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Со стиранием я разобрался.. SelectButtom->Free();
Но почему же кнопка так и не понимает что для неё Parent - StringGrid. Или это не реально сделать? А то прокручиваю список, а кнопка так и не двигается...
PM MAIL   Вверх
Anikmar
Дата 9.11.2009, 23:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

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



Цитата(ColdDeath @  7.11.2009,  16:55 Найти цитируемый пост)
Со стиранием я разобрался.. SelectButtom->Free();
Но почему же кнопка так и не понимает что для неё Parent - StringGrid. Или это не реально сделать? А то прокручиваю список, а кнопка так и не двигается... 

У меня при выходе из "кнопочной" ячейки кнопка убиралась. 
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

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

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

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

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


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

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


 




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


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

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