--- basic.witharrayprob/source/runtime/step0.cxx 2006-10-09 16:37:40.000000000 +0100 +++ basic/source/runtime/step0.cxx 2006-10-13 07:12:29.000000000 +0100 @@ -49,6 +49,13 @@ #include #include +#include + +struct aDim +{ + INT32 lb; + INT32 ub; +}; SbxVariable* getDefaultProp( SbxVariable* pRef ); @@ -506,7 +513,6 @@ void SbiRuntime::StepDIM() SbxVariableRef refVar = PopVar(); DimImpl( refVar ); } - // #56204 DIM-Funktionalitaet in Hilfsmethode auslagern (step0.cxx) void SbiRuntime::DimImpl( SbxVariableRef refVar ) { @@ -704,6 +710,7 @@ void SbiRuntime::StepREDIMP_ERASE() void SbiRuntime::StepERASE() { SbxVariableRef refVar = PopVar(); + //SbxVariable* refVar = GetTOS(); SbxDataType eType = refVar->GetType(); if( eType & SbxARRAY ) { @@ -713,11 +720,38 @@ void SbiRuntime::StepERASE() // Typ hart auf den Array-Typ setzen, da eine Variable mit Array // SbxOBJECT ist. Bei REDIM entsteht dann ein SbxOBJECT-Array und // der ursruengliche Typ geht verloren -> Laufzeitfehler - USHORT nSavFlags = refVar->GetFlags(); - refVar->ResetFlag( SBX_FIXED ); - refVar->SetType( SbxDataType(eType & 0x0FFF) ); - refVar->SetFlags( nSavFlags ); - refVar->Clear(); + //if( SbiRuntime::isVBAEnabled() ) + if( pINST && pINST->IsCompatibility() ) + { + SbxBase* pElemObj = refVar->GetObject(); + SbxDimArray* pDimArray = PTR_CAST(SbxDimArray,pElemObj); + if( pDimArray ) + { + INT32 nDims = pDimArray->GetDims(); + std::slist< aDim > vDims; + std::slist< aDim >::iterator back = vDims.previous(vDims.end()); + for ( INT32 index=1; index<=nDims; ++index ) + { + aDim dim; + if ( pDimArray->GetDim32( index, dim.lb, dim.ub ) ) + back = vDims.insert_after( back, dim ); + } + // Clear all Value(s) and dims + pDimArray->Clear(); + std::slist< aDim >::iterator pIt = vDims.begin();; + std::slist< aDim >::iterator pEnd = vDims.end();; + for ( ; pIt != pEnd; ++pIt ) + pDimArray->AddDim32( pIt->lb, pIt->ub ); + } + } + else + { + USHORT nSavFlags = refVar->GetFlags(); + refVar->ResetFlag( SBX_FIXED ); + refVar->SetType( SbxDataType(eType & 0x0FFF) ); + refVar->SetFlags( nSavFlags ); + refVar->Clear(); + } } else if( refVar->IsFixed() )