Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.02.12;
Скачать: CL | DM;

Вниз

Вопрос по TKOLListBox   Найти похожие ветки 

 
ALex13   (2004-11-08 23:12) [0]

Камрады помогите!
Как программно выделить определенный пункт в ListBox.
Используя CurIndex можно только получить индекс текущего элемента.
Строка типа: ListBox1.CurIndex:=5 - не срабатывает.

Использую: Delphi 6, KOL v.1.95


 
Sewix ©   (2004-11-08 23:31) [1]

ListBox1.ItemSelected[5]:=true;


 
ecm   (2004-11-08 23:37) [2]

Что бы работало присваивание, типа
ListBox1.CurIndex:=5
не обходимо чтобы в ListBox1.Options обязательно было:
loNoExtendSel = TRUE;
loMultiSelect = FALSE;
иначе НЕ работает :)
...
MSDN: LB_SETCURSEL
...
Remarks

Use this message only with single-selection list boxes. You cannot use it to set or remove a selection in a multiple-selection list box.


 
Alex13   (2004-11-09 18:17) [3]

Спасибо большое.
Все заработало!


 
Halfback   (2005-02-15 02:09) [4]

У меня вот тоже вопрос по TKOLListBox.
Т.к. CheckListBox в KOL/MCK нет(во всяком случае я не нашел) то вот хотелось бы узнать, как в имеющемся компоненте TKOLListBox приделать к стороке слева галочку как это реализовано в VCL CheckListBox??? А то простое выделение строки как то визуально не очень смотриться и хочется галочку.


 
SPeller ©   (2005-02-15 10:42) [5]

Halfback   (15.02.05 2:09) [4]
Только OwnerDraw


 
Unknown Mystic ©   (2005-02-15 12:57) [6]

>> Halfback   (15.02.05 02:09) [4]

Попробуй TKOLListView у него есть опция что-то вроде lvoCheckBoxes. Кстати Style не забудь в lvsList поставить (так кажется он называется)


 
Halfback   (2005-02-15 13:59) [7]

>> Unknown Mystic ©
Всё сделал как Вы написали но в компоненте вообще ничего не появляется. Вот, например, пишу процедуру:

procedure TForm1.KOLForm1FormCreate(Sender: PObj);
var
 i: integer;
begin
ListView1.Clear;
for i:=1 to 10 do
   begin
   ListView1.Add("Slovo " + Int2Str(i));
   end;            
end;

и ничего не появляется. Почему так?


 
Unknown Mystic ©   (2005-02-15 14:18) [8]

>> Halfback   (15.02.05 13:59) [7]

Потому, что надо использовать метод LVItemAdd().
Что бы проверить стоит ли галочка или нет надо использовать LVItemStateImgIdx[]

// В твоем примере в цикле begin и end можно было не ставить.


 
VNavigator ©   (2005-02-15 23:20) [9]

Попробуй ставить чек этой процедурой
procedure TForm1.Set_Checked(hwndLV: HWND; i: Integer; Checked: Boolean);
var
 Item: TLVItem;
begin
 Item.statemask := LVIS_STATEIMAGEMASK;
 Item.State := ((Integer(Checked) and 1) + 1) shl 12;
 SendMessage(hwndLV, LVM_SETITEMSTATE, i, Integer(@Item));
end;


 
Halfback   (2005-02-15 23:51) [10]

>> Unknown Mystic
Вот теперь всё пучком. Сенкс!!!

>> VNavigator
Прошу ногами не пинать но не пойму как эту процедуру вызывать. Я вот пишу
procedure TForm1.Button1Click(Sender: PObj);
begin
Set_Checked(,1,True);
end;

А вот что писать до первой запятой??? И можно пояснение процедуры??? Т.е. что каждый параметр значит? Особенно что писать на место hwndLV: HWND ???


 
thaddy   (2005-02-16 01:12) [11]

hwndLV: HWND = yourcontrol.handle

Thats all


 
thaddy   (2005-02-16 01:13) [12]

procedure TForm1.Button1Click(Sender: PObj);
begin
Set_Checked(Listview.handle,1,True);
end;


 
Halfback   (2005-02-16 02:37) [13]

И вот еще тогда вопросик: как узнать, напротив какой строки я поставил галочку. Лично я нашел решение только циклом
i:=0;
while ListView1.LVItemStateImgIdx[i]<>2 do
   begin
   inc(i);
   if i>=ListView1.LVCount then
       begin
       i:= -1; // Т.е. таких строк НЕТ
       break;
       end;
   end;
Label1.Caption:= Int2Str(i); // Показывает номер строки в кот. галочка

Может есть способ полегче?


 
thaddy   (2005-02-16 02:54) [14]

ListView_GetNextItem in win32.help. with LVM_SELECTED


 
Halfback   (2005-02-16 03:06) [15]

>> thaddy
А Set_Checked с listBox прокатит?


 
Unknown Mystic ©   (2005-02-16 10:56) [16]

>> Halfback   (16.02.05 03:06) [15]

Как уже говорил SPeller ©   (15.02.05 10:42) [5] для ListBox"а только OwnerDraw. Кстати если посмотреть исходники CheckListBox"а, то там как раз используется OwnerDraw.

>> thaddy   (16.02.05 02:54) [14]

Может я ошибаюсь(приду домой - проверю), но selected и checked - разные вещи и LVM_SELECTED не поможет.
Я как-то пробовал получать номера выбранных(checked) элементов не перебирая их в цикле, но ничего не вышло.
У ListView есть 2 метода:
LVNextItem() и LVNextSelected()
но ни один из них не выдавал нужного результата.


 
thaddy   (2005-02-16 11:35) [17]

You are right, I didn&#39;t realize they were different!


 
Halfback   (2005-02-16 23:37) [18]

>> Unknown Mystic
Вот и я про что.
Просто я пытаюсь сделать алгоритм, при котором в ListView можно было бы поставить не более одной галочки. Т.е. если поставить новую то старая убирется. На VCL это выглядело так:

procedure TForm1.OnClickCheck(Sender: TObject);
var
i: byte;
begin
CheckListBox1.Items.BeginUpdate;
for i:=0 to CheckListBox1.Count-1
 do CheckListBox1.Checked[i]:=False;
 CheckListBox1.Checked[CheckListBox1.ItemIndex]:=True;
CheckListBox1.Items.EndUpdate;
end;

А как это в KOL сделать - ????


 
Unknown Mystic ©   (2005-02-17 16:33) [19]

OnLVStateChange - срабатывает в том числе и на установку/снятие галочки.
Что какой параметр означает? Используй, например, MsgOK и смотри.
Если тебе нужна только 1 галочка, то нет смысла перебирать все эл-ты. Храни где-нибудь номер выделенного, например, в св-ве Tag.


 
Halfback   (2005-02-17 17:29) [20]

Вот короче процедура, которая ставит только одну галочку в ListView:
procedure TForm1.LV1OnLVStateChange(Sender: PControl; IdxFrom,
 IdxTo: Integer; OldState, NewState: Cardinal);
var i: smallint;
begin
ListView1.BeginUpdate;
for i:=0 to ListView1.LVCount do
   if ListView1.LVItemStateImgIdx[i]=2 then
       if i<>Old_checkind then New_Checkind:=i;
ListView1.LVItemStateImgIdx[-1]:=1;
ListView1.LVItemStateImgIdx[New_checkind]:=2;
Old_checkind:=New_checkind;
ListView1.EndUpdate;
end;

Переменные Old_checkind и New_checkind - глобальные.

Еще вот вопрос: как с определенной стороки ListView убрать иконку где ставится галочка?


 
Unknown Mystic ©   (2005-02-18 18:11) [21]

Кошмар какой :)
Зачем все элементы списка перебирать? Зачем Old_checkind? И зачем выключать галочки у всех элементов, когда нужно только у одного?

Не понял вопроса. Убрать иконку совсем, т.е. чтоб ни квадратика, ни галочки вообще небыло? Так это написано в kol.pas в комментарии к LVItemStateImgIdx[].


 
Halfback   (2005-02-18 18:35) [22]

>> Unknown Mystic
на мою процедуру забей - сам знаю что она кривая. Зато работает.

Вопрос вот какой - как в определенной стороке убрать иконку сосвем(чтоб ни квадратика и ни галочки)??? Что то мне сейчас такой процедуры не найти (хотя раньше когда всё перебирал точно была такая, только вот забыл какая).


 
Unknown Mystic ©   (2005-02-18 19:10) [23]

Как я уже сказал:

> Так это написано в kol.pas в комментарии к LVItemStateImgIdx[].


 
Halfback   (2005-02-18 20:11) [24]

>> Unknown Mystic
Ну там написано
Value 0 allows to remove checkbox at all.
Т.е. если я пишу
ListView2.LVItemStateImgIdx[2]:=0;
то иконка с галочкой(или без) во второй строке дложна исчезнуть.
Но такого не происходит. Причем включение(LVItemStateImgIdx[2]:=2) и отключение галочки(LVItemStateImgIdx[2]:=1) работают без проблем.


 
Unknown Mystic ©   (2005-02-18 20:55) [25]

Во-первых не во второй строке, а в третьей. А во-вторых косяк у тебя где-то в другом месте, потому как у меня это работает.


 
Unknown Mystic ©   (2005-02-18 23:52) [26]

А виновата в этом, я думаю, та самая, которая "кривая" и которая "Зато работает".

Неплохо было бы пошагово программу выполнять...


 
Halfback   (2005-02-19 01:16) [27]

>> Unknown Mystic
А если более точно, то косяк был в том, что у меня была отрублена двойная буфферизация. Теперь иконка убирается.

Зачем все элементы списка перебирать? Зачем Old_checkind? И зачем выключать галочки у всех элементов, когда нужно только у одного?
А как найти номер строки, в иконки которой стоит галочка??? Походу нет такой функции в ListView... Посему и перебирал всё иконки в  итемсах.


 
Halfback   (2005-02-19 01:52) [28]

Еще есть вопрос по KOLListBox. Нужен аналог VCL функции ListBox1.ItemEnabled[]
В принципе устроит реализция в KOLListView.


 
Unknown Mystic ©   (2005-02-19 09:12) [29]

>> Halfback   (19.02.05 01:16) [27]

DoubleBuffer тут не причем вообще (я его вообще ни разу не включал), ну разве что как-то влияет на твои begin и end Update, хотя что-то сомнительно.

> А как найти номер строки, в иконки которой стоит галочка???

А зачем тебе глобальная переменная? Но для этого нужна 1 переменная, а не 2.

и вообще, только сейчас заметил, у тебя код вообще зацикливаться должен... Присвоение значения LVItemStateImgIdx[], тоже срабатывает OnLVStateChange.

>> Halfback   (19.02.05 01:52) [28]

Не знаю. Посмотри еще раз может в KOL"е есть что-то такое, если нет - посмотри как это сделано в VCL.


 
0legat0r   (2005-06-16 14:47) [30]

Галочка - хорошо, а вот как выделять всю строку другим цветом по клику в любой колонке? Как, например, в Тотальном Командире?
Выделяется только строка в левой колонке.


 
thaddy   (2005-06-16 15:10) [31]

Can you mail me a picture of what you mean? Then I can make it maybe.



Страницы: 1 вся ветка

Текущий архив: 2006.02.12;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.044 c
4-1133257179
баклан
2005-11-29 12:39
2006.02.12
Нажатие кнопок, вводе текста и прочее...


15-1138081406
wHammer
2006-01-24 08:43
2006.02.12
Большие целые числа (Delphi 5)


2-1138324492
Лом
2006-01-27 04:14
2006.02.12
что за глюк !


2-1138293587
только начал...
2006-01-26 19:39
2006.02.12
Совсем тупые вопросы по взаимодействию с БД в Делфи


15-1137394603
Nic
2006-01-16 09:56
2006.02.12
Чё-то с погодой не то...