Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > StringGrid


Автор: Aline 3.7.2006, 11:25
Всем привет!

Такая проблемка: в ячейку StringGrid'a мне надо вводить фоматированный текст (время, типа: hh:mm:ss.ms). Через Objects подцепила MaskEdit:

            for (int i = 1; i<=StringGrid1->RowCount; ++i){
    strMaskEdt = new TMaskEdit(StringGrid1);
    strMaskEdt->Parent = StringGrid1;
    strMaskEdt->Name = "StrGrEdtMask" + IntToStr(i);
    strMaskEdt->Left = StringGrid1->CellRect(0,i).left;
    strMaskEdt->Top = StringGrid1->CellRect(0,i).top;
    strMaskEdt->Width = StringGrid1->CellRect(0,i).Width();
    strMaskEdt->Height = StringGrid1->CellRect(0,i).Height();
    strMaskEdt->EditMask = "!90:00:00.00000>;1;_";
    strMaskEdt->Text = "00:00:00.00000";
    StringGrid1->Objects[0][i]= strMaskEdt;
             }

Всё замечательно, но вот когда ввожу данные в столбец времени и делаю потом скролинг, то текст обнуляется, т.е. устанавлявается  "00:00:00.00000". Как можно перекинуть текст связанного с ячейкой MaskEdit в саму ячейку? В какой момент это надо сделать? Например, я бы сделала на событие OnScroll, но его я не нашла у StrinGrid'a. Может кто-нибудь посоветует что-нибудь дельное. Буду очень признательна :-)

Автор: 040375 3.7.2006, 12:37
Попробуй сделать "перетаскивание" данных в OnDrawCell 

Автор: Aline 3.7.2006, 12:40
040375, 
пробовала, там в отображении ерунда получается
Хотя, может и неправильно делала...
Он тогда постоянно перерисовывает и картинка дергается 

Автор: 040375 3.7.2006, 12:41
Да и вообще, зачем в каждой строке создавать для ввода такой элемент, нельзя ли его создавать только в момент
выделения ячейки, а затем удалять - копируя строку в саму ячейку. А то как то громоздко ... 

Автор: _hunter 3.7.2006, 12:42
перекидывать нужно в OnChange edit' а 

Автор: Aline 3.7.2006, 14:25
_hunter, 
попробовала сделать обработку OnChange:
void __fastcall TDiscretForm::FormShow(TObject *Sender)
{
  for (int i = 1; i<=StringGrid1->RowCount; ++i){
    strMaskEdt = new TMaskEdit(StringGrid1);
    strMaskEdt->Parent = StringGrid1;
    strMaskEdt->Name = "StrGrEdtMask" + IntToStr(i);
    strMaskEdt->Left = StringGrid1->CellRect(0,i).left;
    strMaskEdt->Top = StringGrid1->CellRect(0,i).top;
    strMaskEdt->Width = StringGrid1->CellRect(0,i).Width();
    strMaskEdt->Height = StringGrid1->CellRect(0,i).Height();
    strMaskEdt->EditMask = "!90:00:00.00000>;1;_";
    strMaskEdt->Tag = i;
    strMaskEdt->OnChange = MskEdtChange;
    strMaskEdt->Text = "00:00:00.00000";
    StringGrid1->Objects[0][i]= strMaskEdt;
  }
}
//---------------------------------------------------------------------------

void __fastcall TDiscretForm::MskEdtChange(TObject *Sender)
{
  int iNumButton=((TMaskEdit*)Sender)->Tag;
  StringGrid1->Cells[0][iNumButton] = ((TMaskEdit*)Sender)->Text;
}


но почему-то в MskEdtChange даже не попадает, при установки там точки останова 

Автор: Aline 4.7.2006, 09:24
всё решается гораздо проще: MaskEdit мне нужен был для того, чтобы пользователь мог вводить данные только в определенном формате. Эта проблема решилась гораздо проще, без использования объектов 

если кому интересно:

void __fastcall TDiscretForm::StringGrid1GetEditMask(TObject *Sender, int ACol,
      int ARow, AnsiString &Value)
{
  if (ACol == 0)
    Value =  "!90:00:00.00000>;1;_";
}

всё остальное совершенно не нужно

Всем спасибо :-) 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)