IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Delphi Discussion :

Questions sur les fichiers Ressource .RC .RES


Sujet :

Langage Delphi

  1. #1
    Candidat au Club
    Inscrit en
    Juillet 2005
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 7
    Points : 4
    Points
    4
    Par défaut Questions sur les fichiers Ressource .RC .RES
    Bonjour à tous,

    je suis débutant en delphi et j'ai quelques petites questions sur les fichiers ressource


    dans un fichier .RC, il y a 3 parties :

    nom - type - chemin
    par exemple:
    mondessin BITMAP "dessin1.bmp"

    est ce que le type à un role vraiment très important ?
    parce que si je compile avec ça : mondessin res1 "dessin1.bmp" ça marche quand même!
    où trouver la liste complète des types possible ? (TEXT, RCDATA, WAVE ect)


    maintenant pour les fichiers .RES:

    est il possible d'en extraire le contenue entier dans un répertoire et en un coup?
    par exemple si j'ai:
    mondessin1 BITMAP "dessin1.bmp"
    mondessin2 BITMAP "dessin2.bmp"
    mondessin3 BITMAP "dessin3.bmp"

    normalement pour extraire je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Ressources : TResourceStream;
     
    Ressources := TResourceStream.Create(hinstance, 'mondessin1, 'BITMAP');
    Ressources.SaveToFile('C:\dessin1.bmp);
    Ressources.Free;
     
    Ressources := TResourceStream.Create(hinstance, 'mondessin2, 'BITMAP');
    Ressources.SaveToFile('C:\dessin2.bmp);
    Ressources.Free;
     
    Ressources := TResourceStream.Create(hinstance, 'mondessin3, 'BITMAP');
    Ressources.SaveToFile('C:\dessin3.bmp);
    Ressources.Free;
    mais je voudrais extraire tout ça d'un coup? pas extraire un par un quoi...
    est il possible d'extraire d'un coup juste un type de fichier justement, par exemple tout les BITMAP ?
    si c'est possible, comment en suive la progression ?

    merci

  2. #2
    Membre chevronné
    Avatar de Pierre Castelain
    Inscrit en
    Avril 2002
    Messages
    523
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 523
    Points : 1 943
    Points
    1 943
    Par défaut
    Le type des ressources a une importance pour la lecture. Si tu dois utiliser une fonction Windows lisant une image par exemple, il faudra bien que tu identifie ta ressource avec un type BITMAP.
    Tu devrais jetter un oeil sur ceci : http://castelain.developpez.com/sources/ScanResources

  3. #3
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    LEs types permettent de definir le type d'informations et la maniere de les coder derriere.
    Ils sont une important, surtout si tu veux utiliser des methodes simplifiées.
    Mais tu peut quand meme compiler une ressource image en RC_DATA ... mais il faudra la traite comme un RC_data a la lecture ...

    Sinon il me semble qu'extraire toutes les ressources d'un coup n'est pas prevu de base. mais rien ne t'empeche de generer ta propre fonction qui extrait toutes les ressources en bouclant sur les methodes windows de recherche de ressources ...

    LE plus simple dans ton cas serait eventuelement de nomer tes ressources de meme types : BMP1, BMP2, BMPN etc ...
    De cette maniere un LoadFromRessourceName incremente par l'index de la boucle te permet de t'en sortir avec un minimum de code.
    On passe du temps a vous repondre, alors soyez sympas, passez du temps ..... a vous relire !
    --
    Pourquoi tant de haine pour cette pauvre aide Delphi ????
    Aiiimezzz laaaaa .... Si-Non-Cham-Pi-Gnon !!!
    --
    Pour plus de Renseignements : Venez me rejoindre sur Msn .... Promis je mords pas

  4. #4
    Candidat au Club
    Inscrit en
    Juillet 2005
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    merci à tous pour vos réponses

    le coup de la boucle incrementé m'a l'air parfait!


    mon fichier RC:
    mondessin1 BITMAP "dessin1.bmp"
    mondessin2 BITMAP "dessin2.bmp"
    mondessin3 BITMAP "dessin3.bmp"
    mondessin4 BITMAP "dessin4.bmp"
    mondessin5 BITMAP "dessin5.bmp"

    mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    var
    Ressources : TResourceStream;
    s : string;
    x : int64;
    begin
    x := 0;
    repeat
    inc(x);
    s := inttostr(x);
    Ressources := TResourceStream.Create(hinstance, 'mondessin'+s, 'BITMAP');
    Ressources.SaveToFile('C:\dessin'+s+'.bmp');
    Ressources.Free;
    until x = 3;
    end;

    maintenant ya un pb, si les noms de mes dessins sont différent genre Fond.bmp, marge.bmp, jaune.bmp ect...

    mondessin1 BITMAP "Fond.bmp"
    mondessin2 BITMAP "marge.bmp"
    mondessin3 BITMAP "jaune.bmp"
    mondessin4 BITMAP "rouge.bmp"
    mondessin5 BITMAP "papier0398.bmp"

    est il possible lors du Ressources.SaveToFile de l'enregistrer sous son nom d'origine (celui du fichier RC)?

    genre Ressources.SaveToFile('C:\'+nomresource);

    ?

    merci d'avance :-)

  5. #5
    Candidat au Club
    Inscrit en
    Juillet 2005
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    je bloque toujours sur mon problème de nom de fichier lors du SaveToFile...

    j'ai pensé à un truc:
    un fichier texte en ressource avec tout les noms orginaux de mes fichiers que je load en mémoire,
    puis je vais chercher les noms un par un avec ma boucle incrementé ...

    ?

    une idée ?

    merci d'avance

  6. #6
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    Oui j'ai trouve un systeme paliant a ce probleme une fois :
    Creer un tableau de ressources chaines.

    STRINGTABLE
    {
    0,"NomDeMonBitmap1"
    1,"NomDeMonBitmap2"
    2,"NomDeMonBitmap3"
    }


    Ensuite tu fait appel a la fonction "LoadStr(Index)" qui te permet de charger une chaine de type ressourcestring a l'aide d'un index.

    Il te suffit donc de boucler sur loadStr et charger le bitmap en fonction de lu nom renvoyé par loadStr
    On passe du temps a vous repondre, alors soyez sympas, passez du temps ..... a vous relire !
    --
    Pourquoi tant de haine pour cette pauvre aide Delphi ????
    Aiiimezzz laaaaa .... Si-Non-Cham-Pi-Gnon !!!
    --
    Pour plus de Renseignements : Venez me rejoindre sur Msn .... Promis je mords pas

  7. #7
    Candidat au Club
    Inscrit en
    Juillet 2005
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    ça m'a l'air d'être une excellente méthode

    je testerai demain, en tout les cas merci

  8. #8
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    vi .. j'ai decouvers ca dans la recherche de gestion de Dll delangues.

    Tu peut aussi inclure dans le .Rc un include de fichier pas.
    Tu peut donc definir des constantes entieres (codes) que tu utilise comme index et se baser dessus pour le chargement.

    Exemple :
    Const.pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Const
      CODE_CHAINE_1 = 1;
    .Rc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    #include "const.pas"
    STRINGTABLE
    {
      CODE_CHAINE_1,"Toto";
    }
    PRograme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    GetStr(CODE_CHAINE_1);
    On passe du temps a vous repondre, alors soyez sympas, passez du temps ..... a vous relire !
    --
    Pourquoi tant de haine pour cette pauvre aide Delphi ????
    Aiiimezzz laaaaa .... Si-Non-Cham-Pi-Gnon !!!
    --
    Pour plus de Renseignements : Venez me rejoindre sur Msn .... Promis je mords pas

  9. #9
    Candidat au Club
    Inscrit en
    Juillet 2005
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    ça marche super!

    voilà mon .RC:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    mondessin1 BITMAP "Fond.bmp" 
    mondessin2 BITMAP "marge.bmp" 
    mondessin3 BITMAP "jaune.bmp" 
    mondessin4 BITMAP "rouge.bmp" 
    mondessin5 BITMAP "papier0398.bmp" 
     
    STRINGTABLE
    {
    1,"Fond.bmp"
    2,"marge.bmp"
    3,"jaune.bmp"
    4,"rouge.bmp"
    5,"papier0398.bmp"
    }

    Et voilà mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
    s : string;
    x : Int64;
    begin
    x := 0;
    repeat
    inc(x);
    s := inttostr(x);
    Ressources := TResourceStream.Create(hinstance, 'mondessin'+s, 'BITMAP');
    Ressources.SaveToFile('C:\abc\'+LoadStr(x));
    Ressources.Free;
    until x = 5;
    end;

    maintenant j'ai une autre question:
    si je veux en suivre la progression, c'est mieux d'utiliser un case of ou un if ?
    lequel est le plus adapté, le plus rapide?

    genre juste après le Ressources.Free; :

    case x of
    20 rogressBar1.Position := ProgressBar1.Position+1;
    40 rogressBar1.Position := ProgressBar1.Position+1;
    60 rogressBar1.Position := ProgressBar1.Position+1;
    end;

    ou
    if x = 20 then begin ProgressBar1.Position := ProgressBar1.Position+1; end;
    if x = 40 then begin ProgressBar1.Position := ProgressBar1.Position+1; end;
    if x = 60 then begin ProgressBar1.Position := ProgressBar1.Position+1; end;


    merci

  10. #10
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 288
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 288
    Points : 1 936
    Points
    1 936
    Par défaut
    Si c'est tout les 20, vaux mieux faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if (x mod 20) = 0 then
      ProgressBar1.Position := ProgressBar1.Position+1;
    Delphi 7/XE2/XE3
    C#
    Oracle 9i à 12c
    SQL Server 2008 à 2014

  11. #11
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    Dans l'absolu, les cases sont plus rapide que les Ifs car les ifs sont tous testes (20 ifs = 20 tests).

    Si tu les imbriques, le code deviens vire illisible a mon gout, et dans le pire des cas, tu aura quand meme 20 tests. Si tes ifs testes chaques valeurs d'une boucle pour effectuer du code sur Chaques valeur, tu auraus
    1+2+3+4+...20 tests.

    Le Case Effectue un test unique puis acceder a la section par indexation.
    Tu minimise tes tests sur un grand nombre de valeurs et possede un code plus lisible (quitte a regrouper le code de tes elements de case dans une procedure).
    On passe du temps a vous repondre, alors soyez sympas, passez du temps ..... a vous relire !
    --
    Pourquoi tant de haine pour cette pauvre aide Delphi ????
    Aiiimezzz laaaaa .... Si-Non-Cham-Pi-Gnon !!!
    --
    Pour plus de Renseignements : Venez me rejoindre sur Msn .... Promis je mords pas

Discussions similaires

  1. question sur les fichiers
    Par bilal_sayed1 dans le forum Débuter
    Réponses: 13
    Dernier message: 24/02/2010, 16h33
  2. Question sur les fichiers
    Par simoj dans le forum C
    Réponses: 2
    Dernier message: 19/04/2008, 10h11
  3. Encore une question sur les fichiers midi
    Par m14w dans le forum Delphi
    Réponses: 1
    Dernier message: 07/05/2007, 22h51
  4. [AIX] Une question sur les fichiers
    Par Bahan dans le forum AIX
    Réponses: 1
    Dernier message: 11/04/2007, 08h59
  5. [RegEx] Question sur les fichiers
    Par xdoreau dans le forum Langage
    Réponses: 4
    Dernier message: 21/02/2007, 09h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo