Форум: "Потрепаться";
Текущий архив: 2004.03.28;
Скачать: [xml.tar.bz2];
ВнизCheckListBox Найти похожие ветки
← →
Igor_thief © (2004-03-01 20:29) [0]CheckListBox
Что за бред? Короче делаю я некоторые элементы этого списка с галками заголовками(header – ну типа без галки). Но вот прикол подкрался, мол, если кликнуть по header элементу в том месте, где должна быть галка, то срабатывает событие компонента OnClickCheck и отмечается галка, которая не отображается. Что за бред?
Но это еще не все! Мне надо в ручную перерисовать компонент. Ну вот как я это делаю:
procedure TfrmCategory.DrawCB(Rect: TRect; Index, CBState: integer);
var
CBRect: TRect;
begin
CBRect.Top := Rect.Top + (clbCategory.ItemHeight - 12) div 2;
CBRect.Left := Rect.Left + (clbCategory.ItemHeight - 12) div 2;
CBRect.Bottom := CBRect.Top + 12;
CBRect.Right := CBRect.Left + 12;
DrawFrameControl(clbCategory.Canvas.Handle, CBRect, DFC_BUTTON, CBState);
clbCategory.Canvas.TextOut(Rect.Left + 22, Rect.Top + 3, clbCategory.Items[Index]);
end;
procedure TfrmCategory.clbCategoryDrawItem(Control: TWinControl;
Index: Integer; Rect: TRect; State: TOwnerDrawState);
var
CBState: integer;
begin
if clbCategory.Header[Index] then
with clbCategory.Canvas do
begin
Font.Style := [fsBold];
FillRect(Rect);
Pen.Style := psInsideFrame;
Pen.Color := clBlack;
Polyline([Point(Rect.Left, Rect.Bottom - 1), Point(Rect.Right, Rect.Bottom - 1)]);
Pen.Color := clBtnShadow;
Polyline([Point(Rect.Left, Rect.Bottom - 2), Point(Rect.Right, Rect.Bottom - 2)]);
//Ну типа скрываю абажур при выделении заголовка
if odSelected in State then clbCategory.Canvas.DrawFocusRect(Rect);
//Далее сложилась ситуация: мне надо, чтобы если элемент Index является header и //элемент Index + 1 тоже, то в этих элементах надо нарисовать галки
if Index <> clbCategory.Count - 1 then
begin
if clbCategory.Header[Index + 1] then
begin
if not clbCategory.Checked[Index] then CBState := DFCS_BUTTONCHECK or DFCS_FLAT
else CBState := DFCS_BUTTONCHECK or DFCS_FLAT or DFCS_CHECKED;
DrawCB(Rect, Index, CBState);
end
//а это header без галки
else TextOut(Rect.Left + 2, Rect.Top + 3, clbCategory.Items[Index]);
end
else //ну и последний элемент списка если header, то с галкой
begin
if not clbCategory.Checked[Index] then CBState := DFCS_BUTTONCHECK or DFCS_FLAT
else CBState := DFCS_BUTTONCHECK or DFCS_FLAT or DFCS_CHECKED;
DrawCB(Rect, Index, CBState);
end;
end
else
// ну а это простые элементы
with clbCategory.Canvas do
begin
FillRect(Rect);
TextOut(Rect.Left + 5, Rect.Top + 3, clbCategory.Items[Index]);
end;
end;
Ну так глюк заключается в том, что при отладке все работает правильно, а при работе проги совсем не правильно. В чем проблема?
//точка осатова устанавливалась в OnClickCheck
procedure TfrmCategory.clbCategoryClickCheck(Sender: TObject);
var
CBState: integer;
Begin
//при запуске ch = false
if Ch then
begin
if clbCategory.Checked[clbCategory.ItemIndex] = false then
begin
Ch := false;
Exit;
end;
MessageDlg("Âûáðàííîé ìîæåò áûòü òîëüêî îäíà êàòåãîðèÿ.", mtInformation, [mbOK], 0);
clbCategory.Checked[clbCategory.ItemIndex] := false;
end
else Ch := true;
end;
Это сделано для того, чтобы можно было отметить только один элемент.
← →
Cobalt © (2004-03-01 22:44) [1]> отмечается галка, которая не отображается.
Что за бред?
Может простыми словами опишешь ситуации, когда надо отмечать, когда - не надо?
← →
Igor_thief © (2004-03-02 13:58) [2]Надо чтобы была возможность отметить галкой только один элемент (и не забыть при этом, что мы в некоторых заголовках самостоятельно выводим галку). Этот компонент взят из-за того, что у него есть возможность автоматически создавать галки и заголовки (а то в ручную впадло определять место нажатия миши и прорисовывать галки). Но вот слом, в заголовках гадки не отображаются, но если кликнуть в том месте, где должна быть галка, то срабатывает событие OnClickCheck и элемент "стает" Checked = true.
Страницы: 1 вся ветка
Форум: "Потрепаться";
Текущий архив: 2004.03.28;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.04 c