Visualizzazione dei risultati da 1 a 2 su 2
  1. #1

    [delphi 7] errore distruzione tstrings

    vorrei capire perkè il seguente codice mi dà errore di violazione:

    var
    listst:tstrings;
    i:integer;
    begin
    listst:=tstrings.Create ;
    openmp3.Execute;
    listst:=openmp3.Files;
    for i:=0 to listst.Count-1 do
    begin
    listst[i]:=ExtractFileName(listst[i]);
    end;
    listmp3.Items.AddStrings(listst);
    listst.Destroy;
    end;

    la prima volta che esgue questa serie di istruzione non dà problemi..
    ma se la rieseguo per una seconda volta,mi dà errore!!
    il problema sicuramente è nella distruzione di listst,ma non capisco il perkè..

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,288
    La classe TStrings è una classe astratta, pertanto non va creata e utilizzata, poichè funge solamente da scheletro implementativo (a mo' di interfaccia) per le classi discendenti, come TStringList ad esempio.

    In secondo luogo, non hai bisogno di creare un'istanza dell'oggetto dato che dopo tale operazione assegni alla variabile di tipo TStrings il riferimento alla proprietà Files; avrai un "memory leak" poichè si perde il riferimento all'oggetto TStrings che hai creato prevenendo la possibilità di distruggerlo...tuttavia, finisci per distruggere l'oggetto esposto dalla proprietà Files richiamando Destroy, di fatto "rompendo" il normale funzionamento del componente.

    Ottieni un Access Violation poichè alla seconda esecuzione il componente ti restituisce il riferimento immagazzinato nella proprietà Files ad un oggetto che, però, hai distrutto precedentemente.

    Infine, concludo con un ulteriore suggerimento: per distruggere un oggetto, è meglio chiamare il metodo Free al posto di Destroy, poichè il primo è statico ed è in grado di controllare se il riferimento utilizzato è diverso da nil.

    Nel caso specifico, non hai bisogno di creare alcunchè, né di distruggerlo, soprattutto se si tratta di un oggetto gestito internamente dal componente.

    Direi che ci sono diverse lacune riguardo i principi fondamentali di programmazione in Delphi...consiglierei un appropriato ripasso o studio approfondito.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.