Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Builder
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
Dinkin
654 / 451 / 118
Регистрация: 31.05.2013
Сообщений: 2,358
Записей в блоге: 3
1

TListView +TCheckBox

04.02.2015, 11:07. Просмотров 1083. Ответов 13
Метки нет (Все метки)

Добрый день, возможно ли в шапку компонента вставить чекбокс, что бы получился эффект "выбрать все" как в почтовых страницах?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.02.2015, 11:07
Ответы с готовыми решениями:

VCL Component TCheckBox
Как перегрузить виртуальный метод Paint() для TCheckBox. Или же в каком методе...

Как в ячейке TGrid использовать TDateTime, TCheckBox, TString и TButton?
Добрый день! Подскажите пожалуйста - как в ячейке TGrid использовать...

Недочёты в TListView
Фрагмент кода: TListColumn *NewColumn; ListView1->Align = alNone;...

Умные указатели и TListView
Здравствуйте!! Ребята подскажите по такому вопросу? Вот этот код ...

TListView и свойство Data
Добрый день. У меня вопрос следующего содержания: Формирую список TListView...

13
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
26101 / 17501 / 6943
Регистрация: 22.10.2011
Сообщений: 30,823
Записей в блоге: 6
04.02.2015, 11:28 2
Возможно: How to show a check box in TListView header column?

В синтаксис Билдера сам переведешь?
1
SatanaXIII
Супер-модератор
Эксперт С++
5773 / 2772 / 376
Регистрация: 01.11.2011
Сообщений: 6,744
Завершенные тесты: 1
04.02.2015, 11:34 3
По конкатенации компонентов вот здесь можно еще чуток поглядеть: ComboBox и CheckListBox в одном компоненте
1
Dinkin
654 / 451 / 118
Регистрация: 31.05.2013
Сообщений: 2,358
Записей в блоге: 3
04.02.2015, 11:45  [ТС] 4
Отличный вариант с делфи, но перевести трудновато
0
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
26101 / 17501 / 6943
Регистрация: 22.10.2011
Сообщений: 30,823
Записей в блоге: 6
04.02.2015, 12:22 5
Лучший ответ Сообщение было отмечено BRcr как решение

Решение

Dinkin, header:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class TForm1 : public TForm
{
__published: // IDE-managed Components
 
    TListView *ListView1;
    void __fastcall FormCreate(TObject *Sender);
 
private: // User declarations
 
    int HeaderID;
    MESSAGE void __fastcall WMNotify(TWMNotify &Message);
 
public: // User declarations
    __fastcall TForm1(TComponent* Owner);
 
    BEGIN_MESSAGE_MAP
        VCL_MESSAGE_HANDLER(WM_NOTIFY, TWMNotify, WMNotify);
    END_MESSAGE_MAP(TForm)
};
cpp:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
{
}
 
MESSAGE void __fastcall TForm1::WMNotify(TWMNotify &Message)
{
    if (Message.NMHdr->idFrom == HeaderID)
        if (Message.NMHdr->code == HDN_ITEMSTATEICONCLICK)
        {
            ShowMessage("You have clicked the header check box");
        }
    TForm::Dispatch(&Message);
}
 
void __fastcall TForm1::FormCreate(TObject *Sender)
{
    HD_ITEM HeaderItem;
    ListView_SetExtendedListViewStyle(ListView1->Handle,
        LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT);
    HWND HeaderHandle = ListView_GetHeader(ListView1->Handle);
    int HeaderStyle = ::GetWindowLongPtr(HeaderHandle, GWL_STYLE);
    HeaderStyle |= HDS_CHECKBOXES;
    ::SetWindowLongPtr(HeaderHandle, GWL_STYLE, HeaderStyle);
 
    HeaderItem.mask = HDI_FORMAT;
    Header_GetItem(HeaderHandle, 0, &HeaderItem);
    HeaderItem.fmt |= (HDF_CHECKBOX | HDF_FIXEDWIDTH);
    Header_SetItem(HeaderHandle, 0, &HeaderItem);
 
    HeaderID = ::GetDlgCtrlID(HeaderHandle);
}
Как-то вот так, проверяй...
1
Dinkin
654 / 451 / 118
Регистрация: 31.05.2013
Сообщений: 2,358
Записей в блоге: 3
04.02.2015, 12:56  [ТС] 6
Компилица, но в шапочке не появляется чекик)
0
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
26101 / 17501 / 6943
Регистрация: 22.10.2011
Сообщений: 30,823
Записей в блоге: 6
04.02.2015, 13:08 7
А шапочка-то сама есть? ViewStyle в vsReport выставлен? Ибо:
1
Миниатюры
TListView +TCheckBox  
Dinkin
654 / 451 / 118
Регистрация: 31.05.2013
Сообщений: 2,358
Записей в блоге: 3
04.02.2015, 13:19  [ТС] 8
Да вроде все так же
0
Миниатюры
TListView +TCheckBox  
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
26101 / 17501 / 6943
Регистрация: 22.10.2011
Сообщений: 30,823
Записей в блоге: 6
04.02.2015, 13:25 9
У тебя не Vista+, поэтому работоспособность кода не гарантируется. По ссылке это написано вторым предложением (да еще и болдом выделено)

Решение для НЕ "Vista и старше" приведено чуть ниже, но это я уже переводить не буду.
1
Dinkin
654 / 451 / 118
Регистрация: 31.05.2013
Сообщений: 2,358
Записей в блоге: 3
04.02.2015, 13:31  [ТС] 10
Действительно,тестируется на XP....
0
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
26101 / 17501 / 6943
Регистрация: 22.10.2011
Сообщений: 30,823
Записей в блоге: 6
04.02.2015, 14:04 11
Лучший ответ Сообщение было отмечено BRcr как решение

Решение

Ну, вот для XP. Не проверял, ибо негде.

header:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class TForm1 : public TForm
{
__published: // IDE-managed Components
 
    TListView *ListView1;
    void __fastcall FormCreate(TObject *Sender);
    void __fastcall FormDestroy(TObject *Sender);
 
private: // User declarations
 
    typedef LRESULT(__stdcall *func)(HWND, unsigned, WPARAM, LPARAM);
 
    HWND FListHeaderWnd;
    TCheckBox *FListHeaderChk;
    func FSaveListHeaderWndProc, FListHeaderWndProc;
    void __fastcall ListHeaderWndProc(TMessage &Msg);
 
public: // User declarations
    __fastcall TForm1(TComponent* Owner);
};
cpp:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
// ---------------------------------------------------------------------------
#define OEMRESOURCE
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
#include <memory>
 
// ---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
 
// ---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
{
}
// ---------------------------------------------------------------------------
 
TPoint GetCheckSize()
{
    std::auto_ptr<TBitmap> bm(new TBitmap);
    bm->Handle = ::LoadBitmap(NULL, MAKEINTRESOURCE(OBM_CHECKBOXES));
    return Point(bm->Width / 4, bm->Height / 3);
}
 
void __fastcall TForm1::ListHeaderWndProc(TMessage &Msg)
{
    if (Msg.Msg == WM_COMMAND && ((HWND)(Msg.LParam))
        == FListHeaderChk->Handle && Msg.WParamHi == BN_CLICKED)
    {
        FListHeaderChk->Checked = !FListHeaderChk->Checked;
 
        ShowMessage("Click at header CheckBox");
 
    }
    Msg.Result = CallWindowProc(FSaveListHeaderWndProc, FListHeaderWnd, Msg.Msg,
        Msg.WParam, Msg.LParam);
}
 
void __fastcall TForm1::FormCreate(TObject *Sender)
{
    ListView1->HandleNeeded();
    FListHeaderWnd = ListView_GetHeader(ListView1->Handle);
 
    FListHeaderChk = new TCheckBox((TComponent*)0);
    TPoint CheckSize = GetCheckSize();
    FListHeaderChk->Height = CheckSize.X;
    FListHeaderChk->Width = CheckSize.Y;
 
    TRect HeaderSize;
 
    ::ShowWindow(ListView1->Handle, SW_SHOWNORMAL);
    ::GetClientRect(FListHeaderWnd, &HeaderSize);
    FListHeaderChk->Top = (HeaderSize.Bottom - FListHeaderChk->Height) / 2;
    FListHeaderChk->Left = FListHeaderChk->Top;
 
    FListHeaderChk->Parent = this;
    ::SetParent(FListHeaderChk->Handle, FListHeaderWnd);
 
    FListHeaderWndProc = (func)Classes::MakeObjectInstance(ListHeaderWndProc);
    FSaveListHeaderWndProc = (func)::GetWindowLongPtr(FListHeaderWnd, GWLP_WNDPROC);
    ::SetWindowLongPtr(FListHeaderWnd, GWLP_WNDPROC, (LONG_PTR)FListHeaderWndProc);
}
 
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
    ::SetWindowLongPtr(FListHeaderWnd, GWL_WNDPROC, (LONG_PTR)FSaveListHeaderWndProc);
    Classes::FreeObjectInstance(FListHeaderWndProc);
    delete FListHeaderChk;
}
// ---------------------------------------------------------------------------
Обрати внимание на вторую строку. Она ОБЯЗАТЕЛЬНА, без нее даже компилироваться не должно...
2
Dinkin
654 / 451 / 118
Регистрация: 31.05.2013
Сообщений: 2,358
Записей в блоге: 3
04.02.2015, 14:29  [ТС] 12
Да все отлично! и такой вопрос,а как достучаться к событиям данного чека, что в шапке?
0
BRcr
4016 / 2306 / 291
Регистрация: 03.02.2011
Сообщений: 5,064
Записей в блоге: 10
04.02.2015, 14:34 13
Дык, ListHeaderWndProc() - диспетчер сообщений же.
1
Dinkin
654 / 451 / 118
Регистрация: 31.05.2013
Сообщений: 2,358
Записей в блоге: 3
04.02.2015, 14:38  [ТС] 14
Цитата Сообщение от BRcr Посмотреть сообщение
Дык, ListHeaderWndProc() - диспетчер сообщений же.
не внимательный я
0
04.02.2015, 14:38
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.02.2015, 14:38

Компоненты TListView и TListBox
Привет всем! Подскажите чем можно реализовать вот это? (То что на скрине)...

Ошибки с модальными окнами и TListView
Добрый день. Возникла следующая проблема. Суть программы. Некое количество...

Ошибка доступа при очистке TListView
Всем привет! Помогите пожалуйста решить проблему. На форме имеется компонент...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru