Bonjour,

Je suis actuellement en train de travailler sur un projet devant réaliser l'interface entre une base de donnée HF7 (sous windev) et l'utilisateur en utilisant
Delphi6 comme moyen de communication avec la base de donnée.
Ce projet permet de remplacer une interface développé en pascal permettant la communication avec une base de donnée HF3.


Pour y parvenir, j'ai donc repris la philosophie du projet développé en Pascal. Cependant, j'ai un problème lorsque j'utilise
les fonctions hlit, hajoute... fournies par les biblio de delphi. Le problème est que l'utilisation de la fonction hlit semble modifier la valeur
du pointeur contenant l'adresse du fichier dans lequel l'enregistrement va être placé.

De plus, une fois cette procédure exécutée, Les procédures suivantes ne le sont plus.
(procédure permettant de recopier l'enregistrement dans un fichier temporaire).

Voici mon code source. (je n'ai pas fait figurer le code permettant l'initialisation a la base générée par windev lors de la génération
de l'analyse.)

D'avance Merci.

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
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
 
program test_Hlit;
 
{$APPTYPE CONSOLE}
 
uses
  SysUtils,
  wdhf;
 
 
type
 
TypeED=record //  Type venant du fichier "EDIT.pas"
    case byte of
    0:(
         hactif: char;
         rang: integer;
         ecretmin: real;
         ecretmax: real;
         unites:array [1..4] of byte;
         coeff:array [1..4] of real;
         optioned:array [1..4] of byte;
         optiontx:array [1..4] of integer;
         valusu1: real;
         valusu2: real;
         edchamps1: string[12];
         edchamps2: string[12];
         edchamps3: string[12];
         edchamps4: string[12];
     );
end;
 
//------------------------------------------------//
 
var
    recordFile : file;       // fichier recevant l'enregistrement
    size : integer;          // taille de l'enregistrement
    ptrRecord : pointer;     // pointeur contenant l'adresse du recordFile
    recno : integer;         // numéro d'enregistrement
    ED: TypeED;              // type d'enregistrement utilisé
    ficTransfert : string;   // nom du fichier de transfert
const
nomficTransfert = 'trans.bin';
nomfic = 'EDIT'; // fichier dans lequel on va récupérer les informations (edit.fic)
//------------------------------------------------//
 
 
(* --------------------------------------------------------------------------
 *  function SetRecordParam
 *                          renvoie true si la table demandée est valide.
 *
 *  Description : cette fonction affecte la taille du record, ainsi qu'un
 *                pointeur vers ce record suivant la table demandée
 *  Entrees     : nomfic : nom du fichier de la base (= nom de la table)
 *  Sorties     : size : taille de la structure de donnée associée à la table
 *                ptrRecord : pointeur vers le record associé à la table
 *
  --------------------------------------------------------------------------- *)
 
function setRecordParam(nomfic : string;
                         var size : integer;
                         var ptrRecord : pointer): boolean;
var fichierConnu : boolean;
begin
fichierconnu:=true;
     if (nomfic='EDIT') then
     begin
        size:= sizeof(typeED);
        ptrRecord := Addr(ED);
     end
     else
     begin
         fichierConnu := false;
     end;
     SetRecordParam := fichierConnu;
end;
 
 
 
(* --------------------------------------------------------------------------
 *  procedure ReadAndCopyToRecord
 *
 *  Description : Ouvre le fichier recordFile, en lit le contenu, l'écrit dans
 *                ptrRecord^ puis ferme le fichier.
 *  Entrees     : RecordFile : fichier utilisé pour transmettre un record
 *                ptrRecord : pointeur vers le record associé à la table
 *                size : taille de la structure de donnée associée à la table
 *
  --------------------------------------------------------------------------- *)
procedure ReadAndCopyToRecord(VAR RecordFile : File; ptrRecord : pointer; size : integer);
 
var
   i : integer;
const
   ntentative = 10;
begin
     i := 1;
   {$IOChecks Off}
    repeat                        {on essaye d'ouvrir le fichier plusieurs fois}
          sleep(1);               {avec un delai, car il faut que le fichier   }
          Reset(RecordFile,size); {soit crée par l'executable dos              }
          Inc(i);
    until (IOResult = 0) or (i > ntentative);
   {$IOChecks On}
    if(i > ntentative) then
    begin
         writeln('erreur ouverture du fichier de transfert');
    end;
//begin
 
    Reset(RecordFile,size);
    BlockRead(recordFile,ptrRecord^,1);
    Close(recordFile);
 
end;
 
//---------------------------------------------------------------------------//
//---------------------------------------------------------------------------//
 
 
procedure GeneriqueLectureHF(VAR recordFile : file;
                             ptrRecord : pointer;
                             size : integer );
 
 
begin
recno:=1;
 
hlit(nomfic+'.fic',recno);
     //permet de se positionner dans la base pour y effectuer la lecture.
 
     // le problème se situe ici ou le programme n'exécute pas la fonction ReadAndCopyToRecord
     // la valeur de ptrRecord est nil depuis que l'on a utilisé la fonction wdhf.hlit
ReadAndCopyToRecord(recordFile,ptrRecord,size); {copie du résultat dans le record corrrespondant}
 
end;
 
 
//---------------------------------------------------------------------------//
//---------------------------------------------------------------------------//
 
///// PROGRAMME PRINCIPAL /////
 
begin
 
fictransfert:=getcurrentdir+'\'+nomficTransfert;
Assign(recordFile,ficTransfert);
// on assigne le nomficTransfert (trans.bin) au fichier recordfile
 
if(setRecordParam(nomfic,size, ptrRecord)) then
   begin
        GeneriqueLectureHF(recordFile, ptrRecord, size);
   end
   else
   begin
   writeln('nom de fichier inconnu');
   end;
;
end.
L'erreur ne vient pas uniquement de cette partie de code étant donné que depuis ce matin, j'ai découvert que l'utilisation de la biblio (.dll) fournie par windev n'est pas suffisante et qu'il faut ouvrir et initialiser la connexion avec la base pour parvenir à dialoguer avec celle-ci.

WinDev propose de générer un fichier pascal/delphi permettant de réaliser cette connexion automatiquement à partir de l'analyse de la base qui est faite depuis windev (analyse --> génération avancée --> programmation avec un autre langage...) cette action permet ainsi de générer un fichier au format .pas ainsi qu'un fichier .h permettant d'initialiser la connexion a la base (fonction Hinit). Cependant, l'execution de ce programme (sans que j'y ajoute quoi que ce soit) me renvoie l'erreur :"Erreur d'initialisation du contexte HF".

Quelqu'un a-t-il déja rencontré ce type d'erreur ?
Comment y palier ?

D'avance merci.