I can't loop through all the layers. How in CorelDraw (c ++) can you access the elements of a collection in a loop? For Shapes, I was able to loop through the range through the shaperange.item property. But for layers, the item[] property takes no arguments, and getitem[1] does not return a layer object. Everywhere in the collections (shapes, layers, pages) there is a _NewEnum property, but nowhere in the documentation is there a single example of how to use it in a loop (for i = 1, i<count, ++i) or in a loop (for each). This is probably some kind of mystery, since the documentation simply contains the function headers, but how they are implemented - you need to guess.
The solution was found independently. Since C++ is a strongly typed language, you must specify the exact type of the argument.
If we look at any header of a function that refers to a collection of some objects, then we see that the argument must be of type _variant_t.
__declspec(property(get=GetItem)) IVGShapePtr Item[];IVGShapePtr GetItem(const _variant_t& IndexOrName);
And not just _variant_t, the index must be of type long.Therefore, accessing any element of any collection can look like this:
VGCore::IVGShapePtr shape = doc->Shapes->GetItem(_variant_t(1L));
Here "doc" is the previously retrieved VGCore::IVGDocumentPtr
The loop might look like this:
VGCore::IVGLayersPtr lrs = doc->ActivePage->Layers; VGCore::IVGLayerPtr lr = nullptr;
for (long i = 1; i <= lrs->Count; i++) { lr = lrs->Item[_variant_t(i)]; if (lr->Shapes->Count == 0 && lr->IsSpecialLayer == VARIANT_FALSE) lr->Delete(); }
in this example, I'm deleting all empty layers, and the layer doesn't have to be "master".