これは、いくつかの計算が行われるコードの一部です (コード全体は非常に巨大です)。
コントロールクラス::
void BeginEdit(int nFilas) {
if (!_editando) {
if (_muestraBarraProgreso) {
this->BarraProgreso->Value = 0;
this->BarraProgreso->Visible = true;
}
_editando = true;
_lastEdit = nFilas;
this->Cursor = Cursors::WaitCursor;
this->Refresh();
SendMessageClass::SuspendDrawing();
}
};
/// <summary>Provoca se realicen los cambios visuales no realizados desde que se
/// llamó a BeginEdit, como this->Controls.Add(...), Ajustar los tamaños de los controles, ...</summary>
void EndEdit(void) {
if (_editando) {
int f;
_editando = false;
AjustaHeaders();
AjustaTamaños(); //Provoca el ajuste de las filas sin ajustar las columnas
//Esto lo hago para minimizar el número de AjustaTamaños()
for (f=_lastEdit; f<_nFilas; f++)
_fila[f]->EndEdit(false); //Provoca el ajuste de las columnas
this->MuestraBarraProgreso = false;
this->Cursor = Cursors::Default;
SendMessageClass::ResumeDrawing();
}
};
void AjustaTamaños(void) {
if (!_editando && _nFilas>0) {
int topOffset = 0, leftOffset = 0, bottomOffset = 0;
if (_showColumnHeaders) topOffset = this->tlpColumnHeaders->Height;
if (_showRowHeaders) leftOffset = this->tlpRowHeaders->Width;
if (_muestraEstado) bottomOffset = this->EstadoRecipiente->Height;
int hOffset = leftOffset + 2;
int vOffset = topOffset + bottomOffset + 2;
int i, j = 0, stp;
if (_varsCom->ordenFilas == TipoOrdenFilas::Descendiente) {
j = 0; stp = 1;
}
else {
j = _nFilas-1; stp = -1;
}
for (i=0; i<_nFilas; i++) {
_fila[j]->Left = hOffset;
_fila[j]->Width = this->Width - hOffset;
_fila[j]->Top = (_nFilas - 1 - i) * (this->Height - vOffset) / _nFilas + topOffset;
_fila[j]->Height = (this->Height - vOffset) / _nFilas;
j+=stp;
}
}
};
フィラクラスで:
/// <summary>Provoca que no se realicen los cambios visuales hasta que se llame EndEdit</summary>
void BeginEdit(void) {
if (!_editando) {
_editando = true;
_lastEdit = _nColumnas;
SendMessageClass::SuspendDrawing();
}
};
/// <summary>Provoca se realicen los cambios visuales no realizados desde que se
/// llamó a BeginEdit, como this->Controls.Add(...), Ajustar los tamaños de los controles, ...</summary>
void EndEdit(bool resumirDrawing) {
if (_editando) {
_editando = false;
AjustaTamaños();
for (int c=_lastEdit; c<_nColumnas;c++)
_columna[c]->EndEdit(resumirDrawing);
if (resumirDrawing) SendMessageClass::ResumeDrawing();
}
};
void AjustaTamaños(void) {
if (!_editando) {
int j, stp;
if (_varsCom->ordenColumnas == TipoOrdenColumnas::IzquierdaDerecha) {
j = 0; stp = 1;
}
else {
j = _nColumnas-1; stp = -1;
}
for (int i=0; i<_nColumnas; i++) {
_columna[j]->Width = this->Width / _nColumnas;
_columna[j]->Left = i * this->Width / _nColumnas;
_columna[j]->Top = 0;
_columna[j]->Height = this->Height;
j+=stp;
}
}
};
ColumnaClass で:
void BeginEdit(void) {
_editando = true;
SendMessageClass::SuspendDrawing();
};
void EndEdit(bool resumirDrawing) {
if (_editando) {
_editando = false;
_CambiaEstado = _estado;
if (resumirDrawing) SendMessageClass::ResumeDrawing();
}
};
internal:
/// <summary>Obtiene o establece el estado de la posición sin activar el evento ColumnaChange</summary>
property EstadoColumna _CambiaEstado {
EstadoColumna get() { return _estado; }
void set(EstadoColumna value) {
_estado = value;
if ( (_varsCom->bloquearLlenas && ((value & EstadoColumna::llena) == EstadoColumna::llena)) ||
(_varsCom->bloquearVacias && ((value & EstadoColumna::llena) != EstadoColumna::llena)) ) {
if ((_estado & EstadoColumna::seleccionada) == EstadoColumna::seleccionada)
_estado = (EstadoColumna) (_estado ^ EstadoColumna::seleccionada);
_estado = (EstadoColumna) (_estado | EstadoColumna::bloqueada);
}
else {
if ((_estado & EstadoColumna::bloqueada) == EstadoColumna::bloqueada)
_estado = (EstadoColumna) (_estado | EstadoColumna::bloqueada);
}
if (!_editando) {
ActualizaEstado();
ActualizaToolTip();
}
}
};
/// <summary>Actualiza la visualización de la posición leyendo de nuevo los parámetros</summary>
void ActualizaEstado(void) {
if (!_editando && _varsCom->estilo) {
this->ColumnaCtl->BackColor = _varsCom->estilo->GetEstilo[(int) _estado]->colorFondo;
this->ColumnaCtl->CellBorderStyle = _varsCom->estilo->GetEstilo[(int) _estado]->bordeCelda;
this->ColumnaCtl->BackgroundImageLayout = _varsCom->imageLayout;
if (this->Estado[EstadoColumna::llena])
this->ColumnaCtl->BackgroundImage = _varsCom->imagenLlena;
else if (this->Estado[EstadoColumna::vacia])
this->ColumnaCtl->BackgroundImage = _varsCom->imagenVacia;
}
};
/// <summary>Actualiza los textos del ToolTipText de la posición</summary>
void ActualizaToolTip(void) {
if (!_editando && _varsCom->etiquetas) {
String^ sTmp = "";
int __tmp__ = 0;
if (_varsCom->tipoHeaderFilas == TipoHeader::Numerica)
sTmp = _varsCom->etiquetas->Fila + ": " + _nombreFila;
else if (System::Int32::TryParse(_nombreFila, __tmp__))
sTmp = _varsCom->etiquetas->Fila + ": " + gcnew String((wchar_t) ('A' + __tmp__ - 1), 1);
else
sTmp = _varsCom->etiquetas->Fila + ": " + _nombreFila;
if (_varsCom->tipoHeaderColumnas == TipoHeader::Numerica)
sTmp += ", " + _varsCom->etiquetas->Columna + ": " + _posicion + "\n";
else
sTmp += ", " + _varsCom->etiquetas->Columna + ": " + gcnew String((wchar_t) ('A' + _posicion - 1), 1) + "\n";
if (_nombre != "") {
if ((_estado & EstadoColumna::llena) == EstadoColumna::llena)
sTmp += _varsCom->etiquetas->Posicion + ": " + _nombre + "\n";
else
sTmp += _varsCom->etiquetas->PosicionVacia + ": " + _nombre + "\n";
}
if ((_estado & EstadoColumna::llena) == EstadoColumna::llena) sTmp += "Ocupada, ";
else sTmp += "Vacía, ";
if ((_estado & EstadoColumna::seleccionada) != EstadoColumna::vacia) sTmp += "Seleccionada";
else sTmp += "Sin seleccionar";
this->ToolTip1->ShowAlways = false;
this->ToolTip1->SetToolTip(this->ColumnaCtl, sTmp);
this->ToolTip1->ShowAlways = true;
}
};
私はそれらが計算のほとんどの部分だと思います..少しコメントを外して、スペイン語ですが、どんな助けも本当に役に立ちます! とにかくありがとう!