Indexer des composants

bilou2000 Messages postés 30 Date d'inscription lundi 10 novembre 2003 Statut Membre Dernière intervention 15 mars 2005 - 27 nov. 2004 à 07:16
frdriss Messages postés 1 Date d'inscription vendredi 19 juillet 2002 Statut Membre Dernière intervention 7 février 2007 - 7 févr. 2007 à 11:08
bonjours à tous

voila, j'ai 6 Tblobfields Je voudrais les lire avec un boucle du style for ...

for CmpTBoucle:= 0 to 1 do
begin

Monblobfield.Name:= montblobfield+IntToStr(2) ;

MonBlob := Tblobstream.create(monblobfield, bmRead);
BuFMaPhrase.Position:= Sauvpos;

le probleme est que lorsque je crée monblob il y une erreur.
si je ne precise pas monblobfield.name =>incompatibilité .
comment arriver à copier mes 6 blob dans "monblobfield" en faisant une boucle.

Merci ......

5 réponses

cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
27 nov. 2004 à 22:39
Voilà une solution générique :

var
  i, ii: integer;
  IbDataSet: TIbDataSet;
  BlobField: TBlobField;
  Stream: TStream;
begin
  for i := 0 to ComponentCount - 1 do
    //repérer les composants TIbTable ou TIbQuery
    if Components[i] is TIbDataSet then
    begin
      IbDataSet := TIbDataSet(Components[i]);
      //inspection des champs de l'ensemble de données
      for ii := 0 to IbDataSet.FieldCount - 1 do
        //à la recherche des champs blobs
        if IbDataSet.Fields[ii] is TBlobField then
        begin
          //on en tient un !
          BlobField := IbDataSet.Fields[ii];
          //Création d'un flux en lecture
          Stream := IbDataSet.CreateBlobStream(BlobField, bmRead);
          try
            {....là, tu peux utiliser ton stream....}
          finally
            Stream.Free;
          end;
        end;{if IbDataSet.Fields[ii] is TBlobField}
    end; {for ii := 0 to IbDataSet.FieldCount - 1}
end;

C'est plus clair ?

Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
May Delphi be with you
0
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
27 nov. 2004 à 22:42
Erratum :
une erreur s'est glissée dans la ligne:
//on en tient un !
          BlobField := IbDataSet.Fields[ii];


Il faut écrire à la place :
//on en tient un !
          BlobField := IbDataSet.Fields[ii] as TBlobField;

Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
May Delphi be with you
0
cs_nitrique Messages postés 344 Date d'inscription jeudi 1 mai 2003 Statut Membre Dernière intervention 4 avril 2011 1
22 janv. 2007 à 11:59
Bonjour,

Je n'ai pas de dataset, mais suis directement connecté a l'ADOQuery, je procède comme suit:
monFlux := adoqTemplate.CreateBlobStream(TBlobField(adoqTemplate.FieldByName('impimg')), bmRead);

Seulement, ce n'est pas un tStream mais un tMemoryStrem, il me fair une erreur.

Comment faire ?
0
cs_nitrique Messages postés 344 Date d'inscription jeudi 1 mai 2003 Statut Membre Dernière intervention 4 avril 2011 1
22 janv. 2007 à 12:18
J'ai essayé de le caster:
monFlux := TMemoryStream(adoqTemplate.CreateBlobStream(TBlobField(adoqTemplate.FieldByName('impimg')), bmRead));
Mais lors du chargement, il me met: Erreur de lecture de flux. :-(

Je pense qu'il est bon de repartir depuis le début.
En fait, j'essaye de sauvegarder un tImage32 dans un champ "mémo" (equivalent de blob je pense) d'une table Access.
Voici comment je procède pour l'enregistrement:

imgTmp := TBitmap32.Create();
imgTmp.LoadFromFile(opdMain.FileName);
monFlux := TMemoryStream.Create();
imgTmp.SaveToStream(monFlux);
monFlux.Position := 0;
TBlobField(adoqTemplate.FieldByName('impImg')).LoadFromStream(monFlux);
imgTmp.Free;
monFlux.free;

Ca a l'air de marcher (même si je m'étonne que dans mon champ, il n'y ai que: "BM¦?" pour une image, mais je me dis qu'il doit y avoir des caractères invisibles ou cachés).

Seulement, je ne sais pas comment recharger mon flux.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
frdriss Messages postés 1 Date d'inscription vendredi 19 juillet 2002 Statut Membre Dernière intervention 7 février 2007
7 févr. 2007 à 11:08
Je pense que le problème vient du type de ton champs.
Si tu crée dans une table de base de données "Access" un champs de type Mémo on peux y stoquer du text sans problème; par contre on ne peut y stoquer une valeures binaire car il y a de fortes chances que notre flux qu l'on veut stocker contient des caractère spécieaux dont celui de fin de chaîne de caractère. donc votre flux sera tranqué lors de son enregistrement donc vous perdez vous données.
Vous pouvez modifier le type de votre champs "Mémo" en "Binaire" en spécifiant la taille de ce champs. et utiliser le même code que vous a proposé Delphiprog.
Remarque : Le type "Binaire" ne figure pas dans la liste des types d'Access il faut le saisir à la main.

Driss
0
Rejoignez-nous