C Builder DrawGrid InsertControl неправильно перерисовывает после прокрутки

#c builder

#c builder

Вопрос:

Я пытаюсь добавить несколько элементов управления в drawgrid. Я могу добавить элементы управления, но после их добавления и прокрутки элементы управления отображаются в разных ячейках.

Вот код, который я использую для добавления элементов управления в мою drawgrid:

void __fastcall TForm1::Button1Click(TObject * Отправитель) {

pnlHierBox = новая панель управления (this); // определяется на уровне класса

 pnlHierBox->Left = 0;
pnlHierBox->Top = 0;
pnlHierBox->Width = 180;
pnlHierBox->Height = 120;

img = new TImage(pnlHierBox);
img->Picture = Image1->Picture;
img->Left = 0;
img->Top = 3;
img->AutoSize = true;
img->Parent = pnlHierBox;

     lbl = new TLabel(pnlHierBox);
lbl->Caption = "Employee 1";
lbl->Left = 24;
lbl->Top= 15;
lbl->Parent = pnlHierBox;

icon = new TImage(pnlHierBox);
icon->Picture = Image2->Picture;
icon->Left = 100
icon->Top = 63;
icon->AutoSize = true;

icon->Parent = pnlHierBox;
rect = DrawGrid1->CellRect(2,0);
     pnlHierBox->Top = rect.Top;
     pnlHierBox->Left = rect.Left;

     DrawGrid1->InsertControl(pnlHierBox);
  

// Добавьте другие элементы управления TPanel в drawgrid
//

}

Ответ №1:

Не вызывайте InsertControl() напрямую. Вместо этого используйте Parent свойство:

 // DrawGrid1->InsertControl(pnlHierBox);
pnlHierBox->Parent = DrawGrid1;
  

Комментарии:

1. Я убрал insertcontrol() и добавил pnlHierBox-> Parent = DrawGrid1; и все еще не рисую. Это похоже на то, что ячейки нужно сделать недействительными или перекрасить, а это не так. Работает нормально, я просто использую OnDrawCell и рисую изображения в ячейках. Я просто хотел иметь возможность управлять, чтобы я мог получать события при нажатии и т.д. Есть другие идеи? Ценю любую помощь. Спасибо.

2. Извините.. Упоминал ли твое имя @Remy Lebeau — TeamB

3. Элементы управления stock grid VCL НЕ предназначены для поддержки встроенных элементов управления (кроме их встроенного InplaceEdit элемента управления). Требуется много ручной работы, чтобы встроить элементы управления и поддерживать их синхронизацию. Вам лучше всего просто использовать OnDrawCell событие и имитировать нужное вам поведение пользовательского интерфейса.