Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Многостолбцовый LISTBOX в Delphi

Ксюнька Мыслитель (9740), закрыт 14 лет назад
Через какое имеено сообщение добавляются колонки в LISTBOX при указанном стиле LBS_MULTICOLUMN... и как в дальнейшем именно работать с ним... то есть добавлять строки именно в определенный столбец удалять и т.д. Поделитесь ссылочкой
Лучший ответ
Костя Кузнецов Мудрец (17143) 14 лет назад
Вроде такого нельзя.. . Нужно юзать другие контролы.

" Возможно ли в диалоговом окне, в объекте ListBox добавить колонки, и если можно то как их использовать? У него точно есть свойство "Несколько колонок". "

"возможно.
нужно выбрать "Multi-column" в редакторе ресурсов (или при создании окна соответствующий стиль указать) , и после создания окна, послать ему сообщение LB_SETCOLUMNWIDTH, в параметре WParam указав ширину колонок в пикселях.
заполняются ячейки, если не ошибаюсь, слева направо.
т. е. , если у тебя две колонки, то при добавлении элементов данных в список сначала всегда заполняется левый, потом правый (и дальше до конца) , потом добавляется новая строка.
а работать с ними - так-же, как и с одноколоночным списком.
обращение к элементу всегда идет по индексу, и там без разницы в одну колонку они отображаются, или в несколько. "
Источник: cyberforum . ru/visual-cpp/thread119650.html
КсюнькаМыслитель (9740) 14 лет назад
хорошо.. раз низзя так низзя... может тогда подскажете какойнить компонент типа StringGrid'a но на чистом API? VCL нинадо))
Костя Кузнецов Мудрец (17143) сейчас... проверю кое-што и скажу... а может и не скажу (
КсюнькаМыслитель (9740) 14 лет назад
ну или чтоб без особого геморроя как можно сделать чтоб при рокручивании одного списка прокручивался и другой (третий и т.д) именно в ту позицию в которую прокручивается основной?
Остальные ответы
sm Просветленный (32574) 14 лет назад
> как .. добавлять строки именно в определенный столбец удалять и т. д

Никак.
Логически "столбец" как был один, так им и останется.
А стиль LBS_MULTICOLUMN всего лишь определяет визуальное "разбиение" контролом одного длиннющего списка на множество колонок.
КсюнькаМыслитель (9740) 14 лет назад
хорошо.. раз низзя так низзя... может тогда подскажете какойнить компонент типа StringGrid'a но на чистом API? VCL нинадо))
sm Просветленный (32574) Ты, Ксюнька, барышня очевидно неглупая и достаточно грамотная).. Но иногда такое ляпнешь, что хоть стой хоть падай) Ну скажи на милость, о каком дельфийском "компоненте .. на чистом API" может идти речь, если компонент, согласно дельфийской "кухне", - это объект-наследник класса TComponent, который объявлен и иреализован в юните Classes, на котором, в свою очередь, базируется вся VCL ?)
КсюнькаМыслитель (9740) 14 лет назад
ну или чтоб без особого геморроя как можно сделать чтоб при рокручивании одного списка прокручивался и другой (третий и т.д) именно в ту позицию в которую прокручивается основной?
Алексей Пастухов Гуру (2528) 14 лет назад
бросаем на форму tlistbox
вводим строки для начала из трех столбцов (для простоты лучше использовать обжект хотябы как записи) столбцы в строке делим символом |

свойство Style в lbOwnerDrawFixed
в событии OnDrawItem:

var s,q,w:string; //для простоты предполлогаем что 3 столбца
begin
__if (odSelected in state) then lst1.canvas.Brush.Color:=clRed else
________________________lst1.canvas.Brush.Color:=clwhite;
__lst1.canvas.FillRect(rect);
__s:=lst1.Items.Strings[index];
__q:=Copy(s,1,Pos('|',s)-1);
__Delete(s,1,Pos('|',s));
__w:=Copy(s,1,Pos('|',s)-1);
__Delete(s,1,Pos('|',s));
__lst1.canvas.TextOut(Rect.Left,Rect.Top,q);
__lst1.canvas.TextOut(Rect.left+HeaderControl1.Sections.Items[0].Width,Rect.Top,w);
__lst1.canvas.TextOut(Rect.left+HeaderControl1.Sections.Items[0].Width+
___________________HeaderControl1.Sections.Items[1].Width,Rect.Top,s);
end;

бросаем tHeaderControl выравниваем задаем 2 секции третья организуется сама собой до конца
в событии OnSectionresize:
begin
_____ listbox1.Invalidate;
end;
Похожие вопросы