На самом деле странно, что эти свойства в рантайме нельзя менять...хотя может и можно, просто я пока не знаю как...
Как вставить checkbox в stringgrid
Модератор: Модераторы
Крутяк! Спасибо огромное, Vadim! Там еще и ширину отдельной колонки можно устанавливать и много чего еще! Чет у меня мысли совсем в другом направлении шли..
На самом деле странно, что эти свойства в рантайме нельзя менять...хотя может и можно, просто я пока не знаю как...
На самом деле странно, что эти свойства в рантайме нельзя менять...хотя может и можно, просто я пока не знаю как...
-
Vladimir_Ivanov
- незнакомец
- Сообщения: 6
- Зарегистрирован: 13.03.2010 17:10:47
можно еще так:
Код: Выделить всё
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
Grids, StdCtrls;
type
{ TForm1 }
TForm1 = class(TForm)
StringGrid1: TStringGrid;
procedure FormCreate(Sender: TObject);
procedure StringGrid1DrawCell(Sender: TObject; aCol, aRow: Integer;
aRect: TRect; aState: TGridDrawState);
private
{ private declarations }
public
{ public declarations }
end;
var
Form1: TForm1;
List:TList;//будет содержать список визуальных обьектов
implementation
{ TForm1 }
procedure TForm1.FormCreate(Sender: TObject);
var C:^TCheckBox;
I:integer;
begin
List:=TList.Create; //Список наших визуальных обьектов
List.Capacity:=StringGrid1.RowCount; //ну типа скока их :)
for I:=1 to StringGrid1.RowCount do //Заполнения списка созданными обьектами
begin //если быть честным то указателями на них
new(C);
C^:=TCheckBox.Create(StringGrid1);
C^.Parent:=StringGrid1;
C^.Visible:=False;
List.Add(C); //само добавление указателя
end;
end;
procedure TForm1.StringGrid1DrawCell(Sender: TObject; aCol, aRow: Integer;
aRect: TRect; aState: TGridDrawState);
begin
//процедура которая перерисовывает ячейку с номером колонки aCol и строки aRow
// aRect - прямоугольник нашей ячейки
if (acol=2) and (aRow<>0)then
begin //предположим что нуна рисовать во 2-ой колонке.
TCheckBox(List[aRow]^).Top:=arect.Top;
TCheckBox(List[aRow]^).Left:=arect.Left;
TCheckBox(List[aRow]^).Visible:=True;
end;
if (acol=3) and (aRow=3)then
begin //чисто для примера
TCheckBox(List[0]^).Top:=arect.Top;
TCheckBox(List[0]^).Left:=arect.Left;
TCheckBox(List[0]^).Visible:=True;
end;
end;
initialization
{$I unit1.lrs}
end.
Ха! Методом научного тыка все же понял как с колонками в рантайме работать. Если кому надо, то:
StringGrid.Columns.Items[n]
Делает с колонками что угодно, даже выравнивание по содержимому (а я для этого процедуру писал).
Vladimir_Ivanov,
Cпасибо, но ведь этот способ гораздо сложнее. Или в нем есть определенные плюсы оправдывающие его применение?
StringGrid.Columns.Items[n]
Делает с колонками что угодно, даже выравнивание по содержимому (а я для этого процедуру писал).
Vladimir_Ivanov,
Cпасибо, но ведь этот способ гораздо сложнее. Или в нем есть определенные плюсы оправдывающие его применение?
-
Vladimir_Ivanov
- незнакомец
- Сообщения: 6
- Зарегистрирован: 13.03.2010 17:10:47
По идее когда в таблице будет достаточно много различных данных то это себя окупит. ну например как ты будешь организовывать работу с ComboBox ну или еще чем нибудь, а работа через списки да пожайлуйста хоть еще одну таблицу помести в ячейку..
. потом в дальнейшем начнешь работать с классами и даже создовать свои элементы (визуальные) то опять таже проблема.. Ну принуждать я не буду, сам понимаешь...
Да это я понимаю, любой элемент стандартными средствами не вставишь, но раз реализована работа с комбобоксом, то почему бы не воспользоваться..
Добавлено спустя 2 минуты 31 секунду:
Кстати с ним так и работать проще будет, ведь по сути бокс там только нарисован, а ячейка принимает значение в зависимости от его состояния(тоже регулируется свойством)
Добавлено спустя 2 минуты 31 секунду:
Кстати с ним так и работать проще будет, ведь по сути бокс там только нарисован, а ячейка принимает значение в зависимости от его состояния(тоже регулируется свойством)
Код: Выделить всё
Делает с колонками что угодно, даже выравнивание по содержимому (а я для этого процедуру писал).А как сделать выравнивание по содержимому средствами lazarus - StringGrid.Columns.Items[n]?
Гм... Это сделать крайне затруднительно, т.к. я использую для этой цели только свойство компонента в дизайнере и никакого кода.
Если я захочу раскрасить ячейки, то мне придется использовать DefaultDrawing=False и OnDrawCell - при этом затрутся все чекбоксы созданные через свойства компонента.
Как быть в таком случае?
Неужели никто не подскажет как сделать checkbox с раскраской ячеек?
Пытаюсь рисовать их сам, но наталкиваюсь на огромные баги (в XP классике раскраска непонятно как скачет, в XP теме раскраска вообще не работает у чекбокса).
Пытаюсь рисовать их сам, но наталкиваюсь на огромные баги (в XP классике раскраска непонятно как скачет, в XP теме раскраска вообще не работает у чекбокса).
Боюсь даже туда смотреть, т.к. похоже там каша неимоверная.
Например вызов 2-3 раза OnDrawCell ячейки раза для одной перерисовки - это в порядке вещей
Не удивительно что StringGrid так мерцает и тупит.
Например вызов 2-3 раза OnDrawCell ячейки раза для одной перерисовки - это в порядке вещей
Не удивительно что StringGrid так мерцает и тупит.
-
alex208210
- постоялец
- Сообщения: 207
- Зарегистрирован: 12.05.2010 13:16:51
mirk, выше был предложен более универсальный и правильный способ вставки компонентов в таблицу через отрисовку, используйте его, тогда раскраска будет без проблем.
выше был предложен более универсальный и правильный способ вставки компонентов в таблицу через отрисовку, используйте его, тогда раскраска будет без проблем
Его и использовал, но при большом количестве строк начинаются глюки при скроллинге.
Причина глюков: checkbox привязываются к stringgrid (.Parent:=StringGrid), а не к ячейке. Т.е. они (checkbox'ы) начинают перекрывать друг друга и вызывать различные визуальные аретфакты. Необходимо динамически отслеживать какие строки не показываются и скрывать их checkbox'ы. Но как это сделать я не знаю - не нашел свойство показывающее первую отображаемую строку в stringgrid.
Плюс не очень понятно как бороться с множественным вызовом OnDrawCell - это вызывает затупы и мерцания.
- alexs
- долгожитель
- Сообщения: 4066
- Зарегистрирован: 15.05.2005 23:17:07
- Откуда: г.Ставрополь
- Контактная информация:
mirk
Почему тебя отрисовка страшит?
В гриде для это есть готовый метод - DrawGridCheckboxBitmaps
На примере DBGrid - ожно посмотреть как он вызывается - DrawCheckboxBitmaps
Там всё просто и понятно.
И вообще - зачем создавать головную боль себе. Возьм для отображения DBGrid (или RxDBGrid), а данные расположи в наследние DataSet-а (в том-же RxMemoryTable).
Обычно этого вполне хватает.
Почему тебя отрисовка страшит?
В гриде для это есть готовый метод - DrawGridCheckboxBitmaps
На примере DBGrid - ожно посмотреть как он вызывается - DrawCheckboxBitmaps
Там всё просто и понятно.
И вообще - зачем создавать головную боль себе. Возьм для отображения DBGrid (или RxDBGrid), а данные расположи в наследние DataSet-а (в том-же RxMemoryTable).
Обычно этого вполне хватает.
Почему тебя отрисовка страшит?
Сама отрисовка меня не страшит - я ее использую без проблем.
Страшит использование не оптимального кода из реализации Lazarus.
Считаю его не оптимальным, т.к. вижу множественные вызовы перерисовки и наблюдаю огромное количество багов в IDE.
Поэтому и хочется реализовать правильно, а не как в Lazarus
