Gestisci le sezioni delle diapositive nelle presentazioni con C++
Introduzione
Le sezioni organizzano diapositive consecutive in gruppi nominati senza modificare il contenuto della diapositiva. Con Aspose.Slides per C++, è possibile creare, riordinare, rinominare, ispezionare e rimuovere le sezioni tramite il metodo Presentation::get_Sections.
Le sezioni sono particolarmente utili quando:
- una presentazione di grandi dimensioni deve essere divisa in argomenti o capitoli logici;
- diversi gruppi di diapositive sono assegnati a collaboratori diversi;
- le diapositive devono essere elaborate, spostate o unite come gruppi.
Scegliere nomi di sezione concisi che descrivano lo scopo delle diapositive raggruppate. Poiché le sezioni fanno parte della struttura della presentazione, utilizzare le API delle sezioni per determinare l’appartenenza invece di ricavarla dalle posizioni delle diapositive.
Crea e gestisci le sezioni
Utilizzare ISectionCollection::AddSection per creare una sezione specificando il suo nome e la diapositiva di inizio. Aspose.Slides determina a quali diapositive appartiene la sezione dalla struttura delle sezioni corrente della presentazione.
Lo stesso ISectionCollection consente anche di:
- spostare una sezione insieme alle sue diapositive usando ISectionCollection::ReorderSectionWithSlides;
- rimuovere solo la definizione della sezione con ISectionCollection::RemoveSection, che conserva le sue diapositive;
- rimuovere una sezione e le sue diapositive con ISectionCollection::RemoveSectionWithSlides;
- aggiungere una sezione vuota alla fine con ISectionCollection::AppendEmptySection.
Il seguente esempio crea due sezioni, sposta una di esse, la rimuove insieme alle sue diapositive e aggiunge una sezione vuota:
#include <DOM/ISectionCollection.h>
#include <DOM/ISlideCollection.h>
#include <DOM/Presentation.h>
using namespace Aspose::Slides;
auto presentation = System::MakeObject<Presentation>();
auto layoutSlide = presentation->get_LayoutSlide(0);
auto titleSlide = presentation->get_Slide(0);
presentation->get_Slides()->AddEmptySlide(layoutSlide);
auto resultsSlide = presentation->get_Slides()->AddEmptySlide(layoutSlide);
presentation->get_Slides()->AddEmptySlide(layoutSlide);
auto sections = presentation->get_Sections();
sections->AddSection(u"Introduction", titleSlide);
auto resultsSection = sections->AddSection(u"Results", resultsSlide);
sections->ReorderSectionWithSlides(resultsSection, 0);
sections->RemoveSectionWithSlides(resultsSection);
sections->AppendEmptySection(u"Appendix");
Dopo queste operazioni, la presentazione contiene la sezione Introduction con le sue diapositive e una sezione vuota Appendix. La sezione Results e le sue diapositive sono state rimosse.
Rinomina le sezioni
Per rinominare una sezione, chiamare ISection::set_Name. Le diapositive e la posizione della sezione rimangono inalterate.
Il seguente esempio crea una sezione e ne modifica il nome:
#include <DOM/ISection.h>
#include <DOM/ISectionCollection.h>
#include <DOM/Presentation.h>
using namespace Aspose::Slides;
auto presentation = System::MakeObject<Presentation>();
auto slide = presentation->get_Slide(0);
auto section = presentation->get_Sections()->AddSection(u"Overview", slide);
section->set_Name(u"Introduction");
Recupera diapositive dalle sezioni
Il metodo Presentation::get_Sections restituisce un ISectionCollection che è possibile enumerare. Per ogni ISection, chiamare ISection::GetSlidesListOfSection per ottenere le diapositive che attualmente vi appartengono. Il metodo restituisce un ISectionSlideCollection, che fornisce un conteggio, accesso indicizzato ed enumerazione.
Il seguente esempio crea due sezioni popolate e una sezione vuota, quindi stampa per ogni sezione il suo nome, identificatore, diapositiva di avvio, il conteggio delle diapositive e i numeri delle diapositive. Utilizza l’accesso indicizzato per leggere la prima diapositiva e un ciclo for basato su intervallo per elaborare ogni diapositiva. Per la sezione vuota, la collezione restituita ha un conteggio pari a zero, l’accesso indicizzato non è utilizzato e l’enumerazione non esegue iterazioni.
#include <DOM/ISection.h>
#include <DOM/ISectionCollection.h>
#include <DOM/ISectionSlideCollection.h>
#include <DOM/ISlide.h>
#include <DOM/ISlideCollection.h>
#include <DOM/Presentation.h>
#include <system/console.h>
using namespace Aspose::Slides;
auto presentation = System::MakeObject<Presentation>();
auto layoutSlide = presentation->get_LayoutSlide(0);
auto firstSlide = presentation->get_Slide(0);
presentation->get_Slides()->AddEmptySlide(layoutSlide);
auto thirdSlide = presentation->get_Slides()->AddEmptySlide(layoutSlide);
auto sections = presentation->get_Sections();
sections->AddSection(u"Introduction", firstSlide);
sections->AddSection(u"Details", thirdSlide);
sections->AppendEmptySection(u"Appendix");
for (const auto& section : sections)
{
auto sectionSlides = section->GetSlidesListOfSection();
auto startingSlide = section->get_StartedFromSlide();
System::Console::WriteLine(u"Section: {0}", section->get_Name());
System::Console::WriteLine(u"ID: {0}", section->get_SectionId().ToString());
if (startingSlide == nullptr)
{
System::Console::WriteLine(u"Starting slide: none");
}
else
{
System::Console::WriteLine(u"Starting slide: {0}", startingSlide->get_SlideNumber());
}
System::Console::WriteLine(u"Slide count: {0}", sectionSlides->get_Count());
if (sectionSlides->get_Count() > 0)
{
System::Console::WriteLine(u"First slide via index: {0}", sectionSlides->idx_get(0)->get_SlideNumber());
}
System::Console::Write(u"Slide numbers:");
for (const auto& slide : sectionSlides)
{
System::Console::Write(u" {0}", slide->get_SlideNumber());
}
System::Console::WriteLine();
}
L’appartenenza a una sezione è determinata dalla struttura delle sezioni della presentazione. Non calcolare manualmente l’intervallo di una sezione a partire da ISection::get_StartedFromSlide, dagli indici delle diapositive e dalla diapositiva di avvio della sezione successiva.
Le modifiche strutturali possono cambiare sia le diapositive restituite per una sezione sia i loro numeri. Ciò include il riordino delle diapositive, la clonazione di una diapositiva in una sezione, lo spostamento di una sezione insieme alle sue diapositive, la rimozione di diapositive e la rimozione di sezioni. Il prossimo esempio chiama ISection::GetSlidesListOfSection dopo ogni tale cambiamento invece di mantenere ipotesi sui confini precedenti della sezione.
#include <DOM/ISection.h>
#include <DOM/ISectionCollection.h>
#include <DOM/ISectionSlideCollection.h>
#include <DOM/ISlide.h>
#include <DOM/ISlideCollection.h>
#include <DOM/Presentation.h>
#include <system/console.h>
#include <system/shared_ptr.h>
#include <system/string.h>
using namespace Aspose::Slides;
auto presentation = System::MakeObject<Presentation>();
auto layoutSlide = presentation->get_LayoutSlide(0);
auto firstSlide = presentation->get_Slide(0);
presentation->get_Slides()->AddEmptySlide(layoutSlide);
auto thirdSlide = presentation->get_Slides()->AddEmptySlide(layoutSlide);
presentation->get_Slides()->AddEmptySlide(layoutSlide);
auto sections = presentation->get_Sections();
auto firstSection = sections->AddSection(u"First", firstSlide);
auto secondSection = sections->AddSection(u"Second", thirdSlide);
auto printSectionSlides = [](const System::String& label, const System::SharedPtr<ISection>& section)
{
auto sectionSlides = section->GetSlidesListOfSection();
System::Console::Write(u"{0} ({1} slides):", label, sectionSlides->get_Count());
for (const auto& slide : sectionSlides)
{
System::Console::Write(u" {0}", slide->get_SlideNumber());
}
System::Console::WriteLine();
};
printSectionSlides(u"Initially", firstSection);
auto slidesBeforeClone = firstSection->GetSlidesListOfSection();
presentation->get_Slides()->AddClone(slidesBeforeClone->idx_get(0), firstSection);
printSectionSlides(u"After cloning into the section", firstSection);
auto slidesBeforeReorder = firstSection->GetSlidesListOfSection();
auto firstSlideInSection = slidesBeforeReorder->idx_get(0);
auto lastSlideInSection = slidesBeforeReorder->idx_get(slidesBeforeReorder->get_Count() - 1);
auto firstSectionPosition = firstSlideInSection->get_SlideNumber() - 1;
presentation->get_Slides()->Reorder(firstSectionPosition, lastSlideInSection);
printSectionSlides(u"After reordering slides", firstSection);
sections->ReorderSectionWithSlides(firstSection, 1);
printSectionSlides(u"After moving the section", firstSection);
auto slidesBeforeRemoval = firstSection->GetSlidesListOfSection();
presentation->get_Slides()->Remove(slidesBeforeRemoval->idx_get(0));
printSectionSlides(u"After removing a slide", firstSection);
sections->RemoveSectionWithSlides(secondSection);
for (const auto& section : sections)
{
printSectionSlides(u"Remaining section", section);
}
Chiamare nuovamente ISection::GetSlidesListOfSection ogni volta che diapositive o sezioni sono riordinate, clonate, spostate o rimosse. In questo modo l’elaborazione successiva rimane allineata alla struttura corrente della presentazione.
Il formato PPT (PowerPoint 97–2003) non conserva i metadati delle sezioni. Utilizzare questo flusso di lavoro con un formato che supporta le sezioni, ad esempio PPTX; la conversione in PPT rimuove la struttura delle sezioni necessaria per l’enumerazione successiva.
FAQ
Le sezioni vengono conservate quando si salva nel formato PPT (PowerPoint 97–2003)?
No. Il formato PPT non supporta i metadati delle sezioni, quindi il raggruppamento delle sezioni viene perso quando si salva in .ppt.
È possibile nascondere un’intera sezione?
No. Una sezione non ha uno stato di visibilità. Per nascondere il suo contenuto, chiamare ISlide::set_Hidden per ogni diapositiva nella sezione.
Come posso trovare la sezione che contiene una diapositiva?
Enumerare Presentation::get_Sections, chiamare ISection::GetSlidesListOfSection per ogni sezione e confrontare le diapositive restituite con la diapositiva target. Per una sezione non vuota, ISection::get_StartedFromSlide restituisce la sua prima diapositiva; per una sezione vuota, restituisce nullptr.