PBToolboxAI v5 ← Site

soundplayer — n_pbt_soundplayer #

← Riferimento dei componenti · Sommario della guida

Riproduce un suono o un brano — un file della postazione o un URL — in modo asincrono (eventi) o sincrono (la chiamata ritorna quando il suono è finito), e un bip puro senza alcun file. Tutti i formati che il motore WebView2 decodifica: mp3, wav, ogg, opus, flac, aac, m4a, mp4, webm. Nessuna DLL di terzi, nessun PlaySound limitato al wav.

▶ Vederlo dal vivo — Applicazione dimostrativa, riquadro Sound player: i suoni, il codice che li riproduce e questa pagina, fianco a fianco.


In breve #

Oggetto non visualen_pbt_soundplayer
Serve aUn carillon prima di un messaggio, un avviso, una musica d'attesa, un mp3 scelto dall'utente, un flusso da Internet
PrincipioUna pagina nascosta porta un lettore; of_play ritorna subito e gli eventi raccontano il resto, of_play_sync attende la fine del suono
DipendenzaIl runtime WebView2, già richiesto dalla libreria — nient'altro

Avvio rapido #

// In the window : the object
n_pbt_soundplayer inv_sound
inv_sound = create n_pbt_soundplayer

// Synchronous : the next line runs after the chime
inv_sound.of_play_sync(/*source*/ "C:\Windows\Media\chimes.wav")
MessageBox("Orders", "Order 4152 shipped.")

// Asynchronous : a music from the Internet, the window stays alive
inv_sound.ii_volume = 60
inv_sound.of_play(/*source*/ "https://example.org/music/lobby.mp3")

// When the window closes : the hidden player goes with the object
destroy inv_sound

Gli eventi ue_* arrivano da soli — il componente li preleva da solo finché il lettore è aperto e li solleva sul componente: niente da collegare, né ricevitore né timer.

Dove scrivere gli event #

Un oggetto creato da create n_pbt_soundplayer serve benissimo i suoni sincroni e quelli avviati senza attendere notizie — è ciò che fa l'avvio rapido —, ma i suoi eventi non hanno alcuno script: PowerBuilder non permette di scrivere ue_ended su un oggetto creato in uno script. Per reagire agli eventi, due vie:

Non distruggete il lettore da uno dei suoi stessi eventi: of_close basta, e la distruzione dell'oggetto lo fa per voi.


File o URL, e perché un brano lungo parte subito #


Proprietà #

ProprietàTipoPredefinitoRuolo
ii_volumeinteger100Volume in percentuale, da 0 a 100, consegnato con il verbo che avvia un suono — ed è il volume di QUEL suono: of_play, of_play_sync e of_crossfade regolano il suono principale; of_play_over, of_beep e of_play_named suonano il proprio a quel volume senza toccare il suono principale (un allarme a 100 su uno sfondo abbassato a 20); un suono messo in coda da of_enqueue lo conserva per il suo turno. Cambiato mentre un suono suona, attende il verbo successivo — solo of_fade_to cambia il suono in corso
ib_loopbooleanfalseVero per ripetere il suono in ciclo fino a of_stop — una suoneria, una musica di sottofondo. Consegnato con il suono successivo. of_play_sync lo ignora: un suono sincrono suona una volta, un ciclo non ha una fine da attendere. Un suono in ciclo non finisce mai: la coda (of_enqueue) attende dietro di esso fino a of_stop, of_next o of_stop_sound
il_timeout_mslong300000La durata massima di un suono sincrono (of_play_sync, of_beep_sync, of_play_named_sync); cinque minuti per impostazione predefinita. Oltre, la chiamata rende -4 e quel suono viene interrotto (segue ue_stopped) — solo lui: uno sfondo, le sovrapposizioni e la coda continuano. 0 o meno: 24 ore
ii_rateinteger100Velocità in percentuale (da 25 a 400), consegnata con il verbo che avvia un suono, per QUEL suono: il suono principale, o una sovrapposizione (of_play_over) senza cambiare il principale
ii_paninteger0Bilanciamento del suono PRINCIPALE, da -100 (sinistra) a 100 (destra), consegnato con of_play, of_play_sync o of_crossfade, per i FILE; un URL suona senza bilanciamento
il_fade_mslong0Dissolvenza in millisecondi (al massimo 10 000): ogni avvio sale dal silenzio, ogni of_stop o pausa si spegne, una ripresa risale; ue_stopped arriva comunque subito
ib_gapless_loopbooleanfalseCon ib_loop, un file BREVE della postazione va in ciclo senza interruzioni: decodificato una volta, si concatena senza cuciture — una suoneria, un tappeto musicale. Al massimo 4 MB e 60 secondi (oltre, ue_failed con REASON_TOO_LONG); un URL va in ciclo nel modo ordinario. Consegnato con il verbo, come ib_loop
ib_mutedbooleanfalseTutti i suoni del lettore muti subito — il suono principale, le sovrapposizioni, i bip, i suoni con nome — ii_volume conservato: false riporta il suono allo stesso livello. In diretta
ib_queue_repeatbooleanfalseLa coda (of_enqueue) ricomincia dopo il suo ultimo suono, ancora e ancora; of_next dopo l'ultimo va al primo, of_previous prima del primo all'ultimo. Una coda i cui suoni falliscono tutti si ferma comunque. In diretta
ipo_ownerpowerobjectnullL'oggetto visuale per cui lavora questo lettore: la licenza si verifica sulla sua classe. Necessario solo nell'applicazione dimostrativa; una chiave di sviluppo o di runtime sblocca il lettore senza di esso. Non sbloccato, il lettore è in modalità demo — solo i primi 10 secondi di un suono sono riprodotti

Metodi #

MetodoRuolo
of_get_last_error ( ) → stringPerché l'ultima chiamata è fallita: file mancante, formato non decodificabile, indirizzo http://, URL muto, nessuna uscita audio, numero di un suono non più in corso. Riempito anche da ue_failed e dopo ogni -5. Dopo un of_play_sync che ha reso 0: "stopped" se il suono è stato interrotto invece che suonato fino alla fine
of_open ( ) → longCrea il lettore. Facoltativo — ogni metodo lo fa — ma chiamarlo all'apertura della finestra paga il costo una volta. Rende l'handle (> 0), o -2 se il lettore non ha potuto essere creato (of_get_last_error() dice perché)
of_is_open ( ) → booleanVero appena il lettore esiste
of_play (string as_source {, long al_start_ms}) → longSuona senza attendere: un file della postazione o un URL https, la fine arriva da ue_ended. al_start_ms fa partire il suono da quel punto (in modalità demo, mai oltre i primi 10 secondi). Il suono principale in corso è sostituito, senza evento; un bip o un suono con nome continua. Rende 0 una volta avviato, -5 se la sorgente è rifiutata subito — vuota, un indirizzo http://, un indirizzo file:// malformato, un formato rifiutato dal nome: of_get_last_error() dice quale, il suono in corso continua e nessun ue_failed segue —, -2 se il lettore non ha potuto essere creato, -4 se la pagina non ha risposto
of_play_sync (string as_source) → longSuona e attende la fine: la chiamata ritorna quando il suono è finito (o fermato). La finestra continua a ridisegnarsi, ma oltre 250 ms tutti i componenti PBToolboxAI dell'applicazione mostrano la clessidra e ignorano il mouse fino al ritorno: riservalo ai suoni brevi. Suona una volta, qualunque cosa dica ib_loop. Rende 0 una volta finito il suono (of_get_last_error() = "stopped" se è stato interrotto), -2 se il lettore non ha potuto essere creato, -4 se non ha potuto suonare, se il_timeout_ms è scaduto (solo quel suono viene interrotto) o se un altro suono sincrono attende già
of_beep (long al_hz, long al_ms) → longUn suono puro senza file: al_hz (da 20 a 20 000) per al_ms millisecondi (da 10 a 5 000), al volume ii_volume; un valore oltre un limite vi è riportato. Un canale a sé: of_play non lo interrompe, of_stop sì. Ritorna subito; segue ue_ended. Rende 0 una volta avviato, -5 se al_hz o al_ms vale 0 o meno (una variabile non inizializzata non suona un bip predefinito), -2 se il lettore non ha potuto essere creato, -4 se la pagina non ha risposto
of_beep_sync (long al_hz, long al_ms) → longLo stesso suono, e la chiamata ritorna quando è finito: due di seguito fanno un segnale a due note. Rende 0, -5 se al_hz o al_ms vale 0 o meno, -2 se il lettore non ha potuto essere creato, o -4 senza uscita audio, se il_timeout_ms è scaduto (solo il bip è interrotto) o se un altro suono sincrono attende già (of_get_last_error())
of_stop ( ) → longFerma tutto ciò che il lettore suona — il suono, un bip, un suono con nome, le sovrapposizioni, una dissolvenza incrociata — e svuota la coda; segue un ue_stopped, subito. Con il_fade_ms, il suono principale si spegne in quel tempo invece di fermarsi di colpo Rende 0 una volta fatto.
of_pause ( ) → longSospende il suono dov'è (su il_fade_ms); of_resume lo riprende. Rende 0 una volta fatto, -5 se non c'è nulla da sospendere — nessun suono principale, o già in pausa; un bip o una sovrapposizione non si sospendono —, -2 se il lettore non ha potuto essere creato, -4 se la pagina non ha risposto
of_resume ( ) → longRiprende il suono dove of_pause l'ha lasciato. Rende 0 una volta fatto, -5 se nessun suono è in pausa, -2 se il lettore non ha potuto essere creato, -4 se la pagina non ha risposto
of_seek (long al_ms) → longSi posiziona in un punto del suono, in millisecondi dal suo inizio. In modalità demo, mai oltre i primi 10 secondi. Per PARTIRE da una posizione, of_play ne accetta una: il lettore non conserva alcun suono fermato in cui spostarsi. Rende 0 una volta fatto, -5 se nessun suono è in corso (nulla da spostare), -2 se il lettore non ha potuto essere creato, -4 se la pagina non ha risposto
of_is_playing ( ) → booleanVero finché un suono, un bip, un suono con nome o una sovrapposizione è in corso — un suono in pausa conta, non è finito
of_is_paused ( ) → booleanVero finché il suono è sospeso da of_pause
of_duration ( ) → longLa lunghezza del suono in millisecondi, 0 finché sconosciuta; anche ue_started la porta
of_position ( ) → longDov'è il suono, in millisecondi — da leggere da un timer per far avanzare una tua barra di avanzamento
of_source ( ) → stringCiò che of_play ha ricevuto per ultimo, tale e quale
of_play_over (string as_source) → longSuona un suono SOPRA ciò che suona, senza interromperlo, a ii_volume e ii_rate — i suoi: lo sfondo conserva i propri (uno sfondo abbassato da of_fade_to resta basso sotto un allarme a 100); of_stop_sound lo ferma da solo, of_stop con il resto. Rende il numero del suono (> 0) — i suoi eventi lo portano, due sovrapposizioni dello stesso file si distinguono grazie a esso —, -5 se la sorgente è rifiutata subito, -2 se il lettore non ha potuto essere creato, -4 se la pagina non ha risposto
of_enqueue (string as_source) → longMette un suono in CODA: suonato subito se il lettore è libero, dopo il suono (o il bip, o il suono con nome) in corso altrimenti, mai interrotto. Il suono in coda conserva ii_volume, ii_rate e ib_loop come sono al momento della chiamata, per il suo turno; un suono in ciclo non finisce mai, la coda attende dietro di esso. Un suono che non può suonare solleva ue_failed al suo turno e la coda continua. La coda conserva ciò che ha suonato: of_next, of_previous. Rende il numero del suono (> 0), -2 se il lettore non ha potuto essere creato, -4 se la pagina non ha risposto
of_clear_queue ( ) → longDimentica la coda — i suoni in attesa e quelli che ha già suonato —, senza interrompere quello che suona; ue_queue_done segue comunque la sua fine. Rende 0 una volta fatto, -2 se il lettore non ha potuto essere creato, -4 se la pagina non ha risposto
of_queue_count ( ) → longRende il numero di suoni ancora in attesa
of_preload (string as_source) → longCarica un suono senza suonarlo: il primo of_play di quella sorgente parte istantaneamente. Un file che si rivela illeggibile è segnalato da quell'of_play, tramite ue_failed. Rende 0 una volta fatto, -5 se la sorgente è rifiutata subito (of_get_last_error() dice perché), -2 se il lettore non ha potuto essere creato, -4 se la pagina non ha risposto
of_fade_to (integer ai_volume, long al_ms) → longPorta il volume a ai_volume (0-100) in al_ms ms sul suono in corso; il valore diventa ii_volume, e un suono suonato sopra nel frattempo non interrompe la dissolvenza. Rende 0 una volta fatto, -2 se il lettore non ha potuto essere creato
of_play_named (string as_name) → longUn suono SINTETIZZATO, senza file, al volume ii_volume: SOUND_SUCCESS, SOUND_ERROR, SOUND_WARNING, SOUND_INFO, SOUND_NOTIFY. Un canale a sé: of_play non lo interrompe, of_stop sì. Rende 0 una volta avviato, -2 se il lettore non ha potuto essere creato; un nome sconosciuto passa da ue_failed (REASON_UNKNOWN)
of_play_named_sync (string as_name) → longLo stesso suono, e la chiamata ritorna alla sua fine. Rende 0, -2 se il lettore non ha potuto essere creato, -4 su un nome sconosciuto, senza uscita audio o se un altro suono sincrono attende già (of_get_last_error())
of_has_output ( ) → booleanVero se la postazione ha un'uscita audio: da chiedere PRIMA di un allarme. Il suono va sempre all'uscita predefinita di Windows
of_equalizer (boolean ab_on {, integer ai_gains[]}) → longEqualizzatore a 5 bande (60 / 230 / 910 / 3600 / 14000 Hz, of_eq_frequencies dà i centri), guadagno in dB da -24 a 24 (un valore fuori limite è riportato al più vicino); l'overload imposta tutti i guadagni (una banda che l'array non raggiunge torna a 0), of_equalizer_band uno in diretta. File LOCALI. Rende 0 una volta fatto, -2 se il lettore non ha potuto essere creato
of_equalizer_band (integer ai_band, integer ai_gain) → longImposta il guadagno di UNA banda (ai_band da 1 a 5, ai_gain in dB, da -24 a 24) e lo applica subito al suono in corso — un cursore vostro mosso in diretta; le altre bande mantengono il loro guadagno. Rende 0, -5 se la banda è fuori limite, -2 se il lettore non ha potuto essere creato
of_eq_frequencies (ref long al_freqs[]) → longRiempie al_freqs con la frequenza centrale di ogni banda, in Hz e in ordine (60, 230, 910, 3600, 14000) — ciò che un'etichetta di banda tua mostra. Rende il numero di bande, 5
of_meter (boolean ab_on {, integer ai_bars}) → longAccende un vu-meter / analizzatore: interrogate poi of_level (0-100) e of_spectrum (ai_bars barre) da un timer per disegnare il vostro visualizzatore. File LOCALI. Rende 0 una volta fatto, -5 se ai_bars esce da 1 a 64 (nulla cambia), -2 se il lettore non ha potuto essere creato
of_level ( ) → longRende il livello sonoro dell'istante, 0 a 100, letto dal vivo — l'ago di un VU meter; 0 quando il meter (of_meter) è spento o nulla suona. Da interrogare da un timer
of_spectrum (ref long al_bars[]) → longRiempie al_bars con lo spettro, letto dal vivo: tanti valori quanti of_meter ha chiesto, 0 a 100 ciascuno, basse frequenze prima — le barre di un analizzatore tuo. Rende il numero di barre, 0 a meter spento
of_crossfade (string as_source, long al_ms) → longDissolvenza incrociata: il suono corrente si spegne in al_ms (al massimo 10 000) mentre la nuova sorgente sale — un cambio di traccia senza interruzione; 0 passa subito. Il nuovo suono prende ii_volume, ii_rate, ii_pan e ib_loop, e un of_fade_to durante la salita prende il controllo. of_stop durante la dissolvenza ferma entrambi, e un of_play_sync che attendeva il primo suono ritorna; il suono sostituito non solleva nulla. Rende 0 una volta avviato, -5 se la sorgente è rifiutata subito — il suono in corso continua allora, intatto —, -2 se il lettore non ha potuto essere creato, -4 se la pagina non ha risposto
of_play_range (string as_source, long al_from_ms, long al_to_ms) → longSuona un SEGMENTO di un file, da al_from_ms a al_to_ms — una banca di suoni brevi in un solo file, ognuno suonato dai suoi limiti. Sostituisce il suono principale come of_play, con le sue impostazioni; con ib_loop il segmento risuona dal suo inizio. ue_ended alla sua fine. Rende 0 una volta avviato, -5 se al_from_ms è negativo, al_to_ms non viene dopo, o la sorgente è rifiutata subito, -2 se il lettore non ha potuto essere creato, -4 se la pagina non ha risposto
of_stop_sound (long al_sound) → longFerma UN suono tramite il suo numero (of_play_over e of_enqueue lo rendono, gli eventi lo portano): una sovrapposizione — le altre continuano —, il suono principale (su il_fade_ms, la coda passando al successivo), un bip, un suono con nome; segue un ue_stopped. Un suono ancora IN ATTESA è tolto dalla coda, senza evento. Rende 0 una volta fatto, -5 se nessun suono porta ora quel numero, -2 se il lettore non ha potuto essere creato, -4 se la pagina non ha risposto
of_next ( ) → longSuona subito il suono SUCCESSIVO della coda — il suono in corso è sostituito, senza evento; con ib_queue_repeat, dopo l'ultimo viene il primo. ue_source_changed dice dove si trova la coda. Rende 0 una volta fatto, -5 se non c'è un suono successivo, -2 se il lettore non ha potuto essere creato, -4 se la pagina non ha risposto
of_previous ( ) → longSuona il suono PRIMA di quello in corso nella coda — la coda conserva ciò che ha suonato; coda ferma, l'ultimo suonato di nuovo. Con ib_queue_repeat, prima del primo viene l'ultimo. Rende 0 una volta fatto, -5 se non ce n'è, -2 se il lettore non ha potuto essere creato, -4 se la pagina non ha risposto
of_queue_index ( ) → longRende il posto nella coda (1 = il primo suono messo in coda) del suono in corso, 0 quando quel suono non viene dalla coda o nulla suona
of_is_buffering ( ) → booleanVero finché il suono gira ma attende i suoi dati — il tempo annunciato da ue_buffering: un flusso di Internet che si blocca, un salto lontano in un file letto da un URL. Un file della postazione non attende mai
of_process_events ( )Svuota la coda degli eventi e li solleva sull'oggetto. Il pump interno del componente lo chiama per te finché il lettore è aperto — non lo chiami mai
of_close ( ) → longLibera il lettore, fermando prima il suono, subito (senza dissolvenza): un suono che suonava finisce con il suo ue_stopped, sollevato prima del ritorno; fatto per voi alla distruzione dell'oggetto. Non distruggete il lettore da uno dei suoi eventi: of_close basta Rende 0 una volta fatto.
of_reset ( ) → longFerma il suono e riporta ogni impostazione al valore predefinito Rende 0 una volta fatto.

Eventi #

EventoQuando
ue_started (string as_source, long al_duration_ms, long al_sound)Il suono parte davvero — un URL, una volta ricevuti abbastanza dati. al_duration_ms è la lunghezza quando il file la dice, 0 altrimenti; al_sound è il numero del suono
ue_ended (string as_source, boolean ab_truncated, long al_sound)Il suono è finito, da sé. ab_truncated è vero quando il limite demo l'ha tagliato, mai con licenza. Un suono in ciclo non finisce: si ferma. Un suono principale SOSTITUITO da un altro (of_play, of_crossfade, of_next…) non solleva nulla: è il vostro script che l'ha sostituito
ue_failed (string as_source, string as_message, string as_reason, long al_sound)Il suono non ha potuto suonare — una sorgente rifiutata subito da un metodo è il suo -5, non questo evento. as_reason è una parola da testare, una costante REASON_*: REASON_INSECURE (indirizzo http://), REASON_FORMAT (formato rifiutato dal nome), REASON_UNSUPPORTED (file mancante, indirizzo file:// malformato), REASON_NETWORK, REASON_DECODE, REASON_NO_SOURCE, REASON_UNKNOWN (suono con nome inesistente), REASON_UNAVAILABLE (nessuna uscita audio), REASON_TOO_LONG (un ciclo senza interruzioni di un file troppo lungo), REASON_FAILED (il resto, un errore di script della pagina compreso); as_message è la frase da mostrare, nella lingua di visualizzazione; al_sound il numero del suono. Un suono della coda che fallisce non ferma la coda
ue_stopped ( )Sollevato una volta quando of_stop (o of_close, of_stop_sound, o la fine di il_timeout_ms per il suono di quella chiamata) ha interrotto ciò che suonava — non quando un suono finisce da solo, quello è ue_ended
ue_paused ( ) / ue_resumed ( )Il suono è sospeso, poi riprende
ue_progress (long al_position_ms, long al_duration_ms)Una volta al secondo di orologio durante la riproduzione, qualunque sia ii_rate: posizione e durata
ue_queue_done ( )L'ultimo suono della coda (of_enqueue) è finito — mai con ib_queue_repeat, la coda ricomincia
ue_buffering (boolean ab_on)ab_on vero: il suono gira ma attende i suoi dati — un flusso di Internet che si blocca, un salto lontano in un file letto da un URL; falso: riparte (o è messo in pausa, fermato, sostituito, in errore). Un'attesa di meno di un quarto di secondo non dice nulla
ue_source_changed (long al_index, string as_source)La coda passa a uno dei suoi suoni — da sé, tramite of_next, of_previous o ib_queue_repeat: al_index è il suo posto nella coda (1 = il primo suono messo in coda), as_source ciò che è stato messo in coda

Più suoni, dissolvenze, coda #

// A background in a loop, faded in ; an alert over it, the background lowered meanwhile
inv_sound.il_fade_ms = 1500
inv_sound.ib_loop = true
inv_sound.of_play(/*source*/ "C:\Windows\Media\Ring05.wav")
inv_sound.of_fade_to(/*volume*/ 20, /*ms*/ 500)

// The alert has its own volume : the background stays at 20
inv_sound.ii_volume = 100
inv_sound.of_play_over(/*source*/ "C:\Windows\Media\Alarm01.wav")

// Announcements in a row : each one waits for the previous
inv_sound.of_enqueue(/*source*/ "order-4152.mp3")
inv_sound.of_enqueue(/*source*/ "order-4153.mp3")

// A confirmation with no file at all
inv_sound.of_play_named(/*name*/ n_pbt_soundplayer.SOUND_SUCCESS)
// Local variables
long ll_first

// Two alerts of the same file : each one has its own number
ll_first = inv_sound.of_play_over(/*source*/ "C:\Windows\Media\Alarm01.wav")
inv_sound.of_play_over(/*source*/ "C:\Windows\Media\Alarm01.wav")

// Later : the first one stopped alone, the other goes on
inv_sound.of_stop_sound(/*sound*/ ll_first)

// A queue that starts over after its last sound, and the next sound right now
inv_sound.ib_queue_repeat = true
inv_sound.of_next()

// A ring that loops without a gap, then everything silent for a moment
inv_sound.ib_loop = true
inv_sound.ib_gapless_loop = true
inv_sound.of_play(/*source*/ "C:\Windows\Media\Ring05.wav")
inv_sound.ib_muted = true

Esempi #

Un segnale a due note, senza alcun file #

// Each call waits for its tone : the second starts when the first is over
inv_sound.of_beep_sync(/*hz*/ 660, /*ms*/ 180)
inv_sound.of_beep_sync(/*hz*/ 990, /*ms*/ 220)

Un mp3 scelto dall'utente, con una barra di avanzamento #

// Local variables
string ls_path, ls_file
constant unsignedlong OFN_EXPLORER = 2
constant unsignedlong OFN_NOCHANGEDIR = 64

// Let the user pick a music file - in the Explorer style, without moving the current folder of the application - then play it
if GetFileOpenName("Music", ls_path, ls_file, "mp3", "Music (*.mp3;*.wav;*.flac),*.mp3;*.wav;*.flac", /*initdir*/ "", OFN_EXPLORER + OFN_NOCHANGEDIR) = 1 then
	inv_sound.of_play(/*source*/ ls_path)          // returns at once ; ue_started brings the length
	Timer(0.5)                         // in the window's timer event :
end if

// event timer of the window
if inv_sound.of_is_playing() then
	hpb_progress.Position = inv_sound.of_position() * 100 / Max(inv_sound.of_duration(), 1)
end if

Una suoneria in ciclo finché l'utente agisce #

// A ring at 40 %, in a loop until it is stopped
inv_sound.ii_volume = 40
inv_sound.ib_loop = true
inv_sound.of_play(/*source*/ "C:\Windows\Media\Ring01.wav")

// ... later, in the button that acknowledges the call :
inv_sound.of_stop()

Buone pratiche #

← Riferimento dei componenti · Sommario della guida