2009-12-23 12 views
1

J'ai le code suivant qui échoue toujours avec une « erreur abstraite »:Pourquoi ai-je une "erreur abstraite" lors de l'appel de TJclCompressArchive.Compress?

arch := TJclCompressArchive.Create(GetDesktop + 'Support.7z'); 
    try 
    with arch do 
    begin 

     if FindFirst('*.log', faAnyFile, sr) = 0 then 
     begin 
     repeat 
      AddFile(ExtractFileName(sr.Name),sr.Name); 
     until FindNext(sr) <> 0; 

     FindClose(sr); 
     end; 

     Compress; //this line throws the error 
    end; 
    finally 
    arch.free; 
    end; 

Cependant, je reçois toujours cette erreur en essayant de Compresser. Des idées sur ce que je fais mal ici?

+0

@Ken Blanc - Je viens de mes reflète des modifications à qu'est-ce que vous et jasonpenny avez suggéré, mais je reçois toujours des fichiers de taille zéro mis dans mes archives ...? – croceldon

+0

Ken, en changeant la déclaration de variable n'affectera rien. Tant que le type d'exécution de l'objet n'est pas abstrait, le type de la variable à la compilation n'a pas d'importance. C'est simplement le fonctionnement des méthodes virtuelles, abstraites ou non. –

+0

Bienvenue sur Stack Overflow, Croceldon. Jason a raison. Votre modification modifie complètement la question. Votre question originale a été répondue. Veuillez supprimer la mise à jour et l'afficher en tant que nouvelle question. Puis revenez et acceptez la réponse de Jason. –

Répondre

4

Je crois que vous devez dire quel type de JclCompressArchive créer, comme lui donner arch := TJcl7zCompressArchive.Create... au lieu de JclCompressArchive.Create().

Si vous regardez la section « Hiérarchie des classes » de JclCompression.pas:


TJclCompressionArchive 
    | 
    |-- TJclCompressArchive 
    | | 
    | |-- TJclSevenzipCompressArchive 
    |   | 
    |   |-- TJclZipCompressArchive  handled by sevenzip ... 
    |   |-- TJclBZ2CompressArchive  handled by sevenzip ... 
    |   |-- TJcl7zCompressArchive  handled by sevenzip ... 
    |   |-- TJclTarCompressArchive  handled by sevenzip ... 
    |   |-- TJclGZipCompressArchive handled by sevenzip ... 
    |   |-- TJclXzCompressArchive  handled by sevenzip ... 

Mise à jour
Je pense que la bonne façon d'utiliser StackOverflow aurait été d'ajouter une nouvelle question, car après la mise à jour, c'est une question complètement différente.

Je ne sais pas pourquoi vous jeter à TJclCompressArchive à AddFile() et Compress(), il semble fonctionner pour moi sans les moulages

const 
    FILENAME = 'Support.7z'; 
var 
    archiveclass: TJCLUpdateArchiveClass; 
    arch: TJclUpdateArchive; 
    sr: TSearchRec; 
begin 
    archiveclass := GetArchiveFormats.FindUpdateFormat(FILENAME); 

    if not Assigned(archiveclass) then 
    raise Exception.Create('Could not determine the Format of ' + FILENAME); 

    arch := archiveclass.Create(FILENAME); 
    try 
    // if FileExists(FILENAME) then // if you want to add any new files, 
    // arch.ListFiles;   // in addition to what is already there 

    if FindFirst('*.pas', faAnyFile, sr) = 0 then 
    begin 
     repeat 
     arch.AddFile(ExtractFileName(sr.Name),sr.Name); 
     until FindNext(sr) <> 0; 

     FindClose(sr); 
    end; 

    arch.Compress; 
    finally 
    arch.free; 
    end; 
end; 
+0

Je pense que vous êtes sur la bonne voie - s'il vous plaît voir mon édition ci-dessus. – croceldon

+0

@jasonpenny: juste essayé votre code - il fonctionne sans erreurs, mais tous les fichiers dans l'archive sont de taille nulle. – croceldon

+0

Cela peut être un problème avec vos versions JCL et 7-zip DLL, j'ai couru ce code à partir de Delphi 2007, (copié 7z.dll de 7-zip version 4.65 dans% ProgramFiles% \ 7-Zip \ dans le répertoire EXE et le dernier JCL version), et sur un autre ordinateur de Delphi2009, (avec 7z.dll à partir de la version 4.64 et le dernier JCL,) et ils ont tous deux produit des fichiers .7z de travail. Ou peut-être quelque chose à faire avec les fichiers journaux eux-mêmes? Si vous pouvez les faire un clic droit dans l'Explorateur et créer le fichier 7z de cette façon, je ne vois pas pourquoi ce code ne fonctionnerait pas – jasonpenny