powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Delphi 7. Отключенный item в listbox. Или другая идея?
13 сообщений из 13, страница 1 из 1
Delphi 7. Отключенный item в listbox. Или другая идея?
    #39683813
Валерий666
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день. То ли пересидел то-ли, закончилась фантазия.
Суть задания в следующем:
Есть TListBox, в него грузится номенклатурный справочник, а ля:
1 - тра-тра -та, в том числе:
1.1 - холодное
1.2 - горячее
1.3 - вкусное
2 - следующее тра-та-та
3 - еще одно тра-та-та
4 - очередное тра-та-та, в том числе:
4.1 - зеленое
4.2 - сладкое
и.т.п

Как сделать отключенные(не селективные) итемы (1 и 4 в данном примере), чтобы их нельзя было выбрать, т.к. они в итоге не несут смысловой нагрузки и на них нет счетчиков?
Максимум что нашел по этому, так это в выставить свойство lbOwnerDrawFixed и в обработчике сделать свою прорисовку цветом.
Может натолкнете на другую мысль?
...
Рейтинг: 0 / 0
Delphi 7. Отключенный item в listbox. Или другая идея?
    #39683814
Валерий666
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Опечаточка вышла!!!, не ListBox , а ComboBox !!!
...
Рейтинг: 0 / 0
Delphi 7. Отключенный item в listbox. Или другая идея?
    #39683836
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Валерий666Может натолкнете на другую мысль?

Ничего другого нет. Системный List Box не имеет такой функциональности.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Delphi 7. Отключенный item в listbox. Или другая идея?
    #39683838
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
перехватить события "закрыли" и "выбрали" и если нужно, смешать выбор вниз по списку ?

запихнуть туда не список, а дерево ?

http://www.sql.ru/forum/438022
http://delphimaster.net/view/1-1384
...
Рейтинг: 0 / 0
Delphi 7. Отключенный item в listbox. Или другая идея?
    #39683883
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Валерий666> Как сделать отключенные(не селективные) итемы
Валерий666> (1 и 4 в данном примере), чтобы их нельзя было выбрать

Чтобы их нельзя было выбрать в диалоговом окне выбора или как ?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Delphi 7. Отключенный item в listbox. Или другая идея?
    #39683940
d7i
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вроде ни в каких стандартных ComboBox нет запрета отдельных item.
Как писали выше, надо или делать свой ComboBox или перехватывать события выбора/навигации
и "перескакивать" через запрещенные item.
Лучше всего, конечно, написать свой. Там Вы сможете делать всё, что пожелаете.
И выделять цветом и запрещать и т.д. и т.п.
...
Рейтинг: 0 / 0
Delphi 7. Отключенный item в listbox. Или другая идея?
    #39684239
valeriy2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
d7i,

а как сделать свой? если наследоваться от стандартного, то и в них не будет "запрета отдельных item(s)"
не с нуля же
как тогда перерисовывать все эти стандартные части?
...
Рейтинг: 0 / 0
Delphi 7. Отключенный item в listbox. Или другая идея?
    #39684245
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
может не стоит смешивать мокрое и горячее? Если хотите, чтобы не возможно было выбирать item, не включайте его в список. А если у вас это дерево, то тогда выберите другой компонент для его отображения.
...
Рейтинг: 0 / 0
Delphi 7. Отключенный item в listbox. Или другая идея?
    #39684268
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
valeriy2если наследоваться от стандартного, то и в них не будет "запрета отдельных item(s)"

зато сможешь событие "выбрали" и "закрыли" перехватывать изнутри компонента, независимо от пропертей OnXXXXX

Но по смыслу тут всё же больше дерево подходит
...
Рейтинг: 0 / 0
Delphi 7. Отключенный item в listbox. Или другая идея?
    #39684288
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сто лет назад делал, криво, но как канва - вполне

Код: pascal
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.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
unit HSComboBox;
{ Позволяет запрещать для выбора отдельные строки, по умолчанию, начинающиеся со знака '-', выбор определяется внешним обработчиком }

interface
uses
  Windows, Messages, Classes, Controls, StdCtrls;

type
  TOnCanSelectEvent = procedure (Sender : TObject; Index : Integer;
                                 var CanSelect : Boolean) of object;
  TOnDrawFocusRectEvent = procedure (Sender : TObject;
                                     const Rect : TRect;
                                     State: TOwnerDrawState) of object;
  TFocusRectKind = (frStandard, frCustom);

  THSComboBox = class(TCustomComboBox)
  private
    { Список ассоциированных значений }
    FValues : TStrings;
    FLastKey : Integer;
    FOnCanSelect: TOnCanSelectEvent;
    FFocusRectKind: TFocusRectKind;
    FOnDrawFocusRect: TOnDrawFocusRectEvent;
    function CanSelectItem (AItemIndex : Integer) : Boolean;
    function GetValue: String;
    procedure SetValue(const Value: String);
    procedure SetValues(const Value: TStrings);
    procedure SetFocusRectKind(const Value: TFocusRectKind);
    procedure CNDrawItem(var Message: TWMDrawItem); message CN_DRAWITEM;
  protected
    { Обработчик события определения доступности элемента списка }
    { Сделан виртуальным для возможности переопределения в наследниках компонента}
    procedure DoCanSelect (AItemIndex : Integer; var CanSelect : Boolean); dynamic;
    { Отрисовка FocusRect }
    procedure DoDrawFocusRect (const Rect : TRect;
       State: TOwnerDrawState); dynamic;
    procedure Change; override;
    procedure KeyDown(var Key: Word; Shift: TShiftState); override;
    procedure SetStyle (Value : TComboBoxStyle); override;
    { Для рисования разделительных строк не надо
      вызывать процедуру пользователя }
    procedure DrawItem(Index: Integer; Rect: TRect;
      State: TOwnerDrawState); override;
  public
    constructor Create(AOwner : TComponent); override;
    destructor  Destroy; override;
    { Ассоциированное с элементом списка значение из списка значений.
      Сделано только в runtime, так как в design-time оно не имеет смысла }
    property Value : String read GetValue write SetValue;
  published
    property Style; {Must be published before Items}
    property Anchors;
    property BiDiMode;
    property Color;
    property Constraints;
    property Ctl3D;
    property DragCursor;
    property DragKind;
    property DragMode;
    property DropDownCount;
    property Enabled;
    property Font;
    property ImeMode;
    property ImeName;
    property ItemHeight;
    property MaxLength;
    property ParentBiDiMode;
    property ParentColor;
    property ParentCtl3D;
    property ParentFont;
    property ParentShowHint;
    property PopupMenu;
    property ShowHint;
    property Sorted;
    property TabOrder;
    property TabStop;
    property Text;
    property Visible;
    { Список ассоциированных значений для редактирования, копирования и т.д. }
    property Values : TStrings read FValues write SetValues;
    { Тип прямоугольника фокуса }
    property FocusRectKind : TFocusRectKind
            read FFocusRectKind write SetFocusRectKind default frStandard;
    { События }
    property OnChange;
    property OnClick;
    property OnContextPopup;
    property OnDblClick;
    property OnDragDrop;
    property OnDragOver;
    property OnDrawItem;
    property OnDropDown;
    property OnEndDock;
    property OnEndDrag;
    property OnEnter;
    property OnExit;
    property OnKeyDown;
    property OnKeyPress;
    property OnKeyUp;
    property OnMeasureItem;
    property OnStartDock;
    property OnStartDrag;

    property Items; { Must be published after OnMeasureItem }
    { Событие для определения доступности элемента списка ComboBox'а }
    property OnCanSelect : TOnCanSelectEvent read FOnCanSelect
             write FOnCanSelect;
    { Событие для отрисовки FocusRect,когда компонент имеет фокус }
    { Вызывается только в случае установки FocusRectKind в frCustom }
    property OnDrawFocusRect : TOnDrawFocusRectEvent read FOnDrawFocusRect
             write FOnDrawFocusRect;

  end;

implementation
uses
  Graphics, SysUtils;

{ THSComboBox }

function THSComboBox.CanSelectItem(AItemIndex: Integer): Boolean;
var
  CanSelect : Boolean;
begin
  DoCanSelect (AItemIndex, CanSelect);
  Result := CanSelect;
end;

procedure THSComboBox.Change;
var
  OldIndex, NewIndex : Integer;
begin
  OldIndex := ItemIndex;
  NewIndex := OldIndex;
  while NOT CanSelectItem(NewIndex) do
    if FLastKey = VK_UP then begin
      Dec(NewIndex);
      if NewIndex < 0 then
        FLastKey := VK_DOWN;
    end else begin
      Inc(NewIndex);
      if NewIndex > Pred(Items.Count) then
        FLastKey := VK_UP;
    end;
  if NewIndex <> OldIndex then
    ItemIndex := NewIndex;
  inherited;
end;

{ Переписано с небольшими исправлениями из TCustomComboBox.CNDrawItem }
procedure THSComboBox.CNDrawItem(var Message: TWMDrawItem);
var
  State: TOwnerDrawState;
begin
  with Message.DrawItemStruct^ do begin
    State := TOwnerDrawState(LongRec(itemState).Lo);
    if itemState and ODS_COMBOBOXEDIT <> 0 then
      Include(State, odComboBoxEdit);
    if itemState and ODS_DEFAULT <> 0 then
      Include(State, odDefault);
    Canvas.Handle := hDC;
    Canvas.Font := Font;
    Canvas.Brush := Brush;
    if (Integer(itemID) >= 0) and (odSelected in State) then begin
      Canvas.Brush.Color := clHighlight;
      Canvas.Font.Color := clHighlightText
    end;
    if Integer(itemID) >= 0 then
      DrawItem(itemID, rcItem, State)
    else
      Canvas.FillRect(rcItem);
    if odFocused in State then
      DoDrawFocusRect(rcItem, State);
    Canvas.Handle := 0;
  end;
end;

constructor THSComboBox.Create(AOwner: TComponent);
begin
  inherited;
  FValues := TStringList.Create;
  FLastKey := VK_DOWN; { По умолчанию, последнее движение было вниз, при выборе
  недоступного элемента фокус автоматически перемещается на следующий
  доступный элемент }
  FFocusRectKind := frStandard;
end;

destructor THSComboBox.Destroy;
begin
  FValues.Free();
  inherited;
end;

procedure THSComboBox.DoCanSelect(AItemIndex: Integer;
  var CanSelect: Boolean);
begin
  CanSelect := NOT ((Style = csOwnerDrawFixed) AND (Items[AItemIndex] = '-'));
  if Assigned(FOnCanSelect) then
    FOnCanSelect (Self, AItemIndex, CanSelect);
end;

procedure THSComboBox.DoDrawFocusRect(const Rect: TRect;
      State: TOwnerDrawState);
begin
  case FFocusRectKind of
  frStandard:
    Windows.DrawFocusRect(Canvas.Handle, Rect);
  frCustom:
    if Assigned(OnDrawFocusRect) then
      FOnDrawFocusRect(Self, Rect, State);
  end;
end;

procedure THSComboBox.DrawItem(Index: Integer; Rect: TRect;
  State: TOwnerDrawState);
begin
  if (Style = csOwnerDrawFixed) AND (Items[Index] = '-') AND
     NOT (odComboBoxEdit in State) then begin
    { Нарисовать разделительную линию }
    with TControlCanvas(Canvas) do begin
      FillRect(Rect);
      if odFocused in State then
        Pen.Color := clWhite
      else
        Pen.Color := clBlack;
      Pen.Width := 1;
      MoveTo (Rect.Left, Rect.Top + (Rect.Bottom - Rect.Top) DIV 2);
      LineTo (Rect.Right, Rect.Top + (Rect.Bottom - Rect.Top) DIV 2);
    end;
  end else
    inherited;
end;

{ Вернуть ассоциированное с текущим элементом списка значение }
function THSComboBox.GetValue: String;
begin
  Result := '';
  if (ItemIndex >= 0) AND (ItemIndex < FValues.Count) then
    Result := FValues[ItemIndex];
end;

procedure THSComboBox.KeyDown(var Key: Word; Shift: TShiftState);
begin
{ Для определения того, в какую сторону двигаться, если выбран недоступный
  элемент, запоминаем последнюю нажатую клавишу. }
  FLastKey := Key;
  inherited;
end;

{ Установить новый стиль с запретом стилей csSimple,csDropDown. }
procedure THSComboBox.SetFocusRectKind(const Value: TFocusRectKind);
begin
  if (FFocusRectKind <> Value) then begin
    FFocusRectKind := Value;
    Invalidate();
  end;
end;

procedure THSComboBox.SetStyle(Value: TComboBoxStyle);
begin
  if Value in [csSimple, csDropDown] then
    Value := csDropDownList;
  inherited SetStyle(Value);
end;

{ Установить элемент списка, с которым ассоциируется значение.
  Если нового значения нет в списке, то установить выбранный индекс в -1 }
procedure THSComboBox.SetValue(const Value: String);
var NewIndex : Integer;
begin
  NewIndex := FValues.IndexOf(Value);
  if NewIndex > Pred(Items.Count) then
    NewIndex := -1;
  ItemIndex := NewIndex;
  Change();
end;

procedure THSComboBox.SetValues(const Value: TStrings);
begin
  FValues.Assign(Value);
end;

end.

...
Рейтинг: 0 / 0
Delphi 7. Отключенный item в listbox. Или другая идея?
    #39684303
Гирлионайльдо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что мешает добавить банальную проверку в выборе - если мы выбираем не нужный нам индекс. То мы возвращаем прежний индекс - который был установлен до.
...
Рейтинг: 0 / 0
Delphi 7. Отключенный item в listbox. Или другая идея?
    #39684345
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гирлионайльдомы возвращаем прежний индекс - который был установлен до.Вот пользователь удивится
...
Рейтинг: 0 / 0
Delphi 7. Отключенный item в listbox. Или другая идея?
    #39684437
d7i
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schiСто лет назад делал, криво, но как канва - вполне


Вот так и надо. Нет тут ничего сверхсложного.
Только терпение и аккуратность.
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Delphi 7. Отключенный item в listbox. Или другая идея?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]