darnau
Messages postés11Date d'inscriptionmardi 7 novembre 2006StatutMembreDernière intervention29 avril 2008
-
29 avril 2008 à 11:39
darnau
Messages postés11Date d'inscriptionmardi 7 novembre 2006StatutMembreDernière intervention29 avril 2008
-
29 avril 2008 à 14:41
Bonjour,
Je me permet de solliciter à nouveau votre aide.
Voila je ne comprend pas un problème... Pourquoi une instruction
que je répète 361 fois fonctionne si je saisis 361 fois les
instructions correspondantes et ne fonctionne pas dans une boucle for
i:=0 to 361 do :
var
f : TFileStream;
l, c, PosActual: Integer;
num, o , Inutile: String;
Premier : Boolean ;
Form1: TForm1;
FileName : string;
ShapeType: string;
implementation
{$R *.dfm}
procedure Tform1.TraitementFichier();
var
Index, X : integer;
chaine : string;
begin
Inutile:=IntToStr(HexToInt(Lire(PosActual,4,'Big')));
Memo1.Lines.Add(Inutile);
Index:= Memo1.Lines.IndexOf(Inutile);
Memo1.lines.add(Lire(PosActual,4,'Big'));
ShapeType:=Lire(PosActual, 4, 'Little');
if ShapeType = '00000001' then begin
chaine:=HexToDouble(StrToInt64('$'+Lire(PosActual, 8, 'Little')))+''' ,
'''+HexToDouble(StrToInt64('$'+Lire(PosActual, 8, 'Little')));
dm.QMBR2.close;
dm.QMBR2.SELECTSql.Clear;
dm.QMBR2.SELECTsql.add('INSERT INTO POINT (X, Y) VALUES ('''+chaine+''')');
dm.QMBR2.open;
dm.TRMBR.CommitRetaining;
//Memo1.Lines[Index]:=Memo1.Lines[Index]+ ' - Point : ' ;
//Memo1.lines.add(HexToDouble(StrToInt64('$'+Lire(PosActual, 8,
'Little')))+ ' - '+HexToDouble(StrToInt64('$'+Lire(PosActual, 8,
'Little'))));
end
else if ShapeType = '00000005' then begin
procedure Tform1.TraitementHeader();
Var
FileLength : Extended;
chaine : string;
test: integer;
begin
Edit1.Text:=Lire(PosActual,2,'Big');
Inutile:=Lire(PosActual,20, 'Big');
Ed_FileLength.Text:=Lire(PosActual,4,'Big');
FileLength:=HexToInt(Ed_FileLength.Text);
Ed_FileLength.Text:=FloatToStr(FileLength/2);
Ed_Version.Text:=Lire(PosActual,4, 'Little');
Ed_type.Text:=Lire(PosActual,4, 'Little');
if StrToInt(Ed_type.Text) = 1 then begin
Label1.Caption:='C''est un point';
ShapeType:='00000001';
end
else if StrToInt(Ed_type.Text) = 5 then begin
Label1.Caption:= 'C''est des polygones';
ShapeType:='00000005';
end;
Ed_Xmin.Text:=Lire(PosActual, 8, 'Little');
Ed_Ymin.Text:=Lire(PosActual,8, 'Little');
Ed_Xmax.Text:=Lire(PosActual,8, 'Little');
Ed_Ymax.text:=Lire(PosActual,8, 'Little');
Edit1.Text:=IntToStr(HexToInt(Edit1.Text));
Ed_Xmin.Text:=(HexToDouble(StrToInt64('$'+Ed_Xmin.Text)));
Ed_Ymin.Text:=(HexToDouble(StrToInt64('$'+Ed_Ymin.Text)));
Ed_Xmax.Text:=(HexToDouble(StrToInt64('$'+Ed_Xmax.Text)));
Ed_Ymax.Text:=(HexToDouble(StrToInt64('$'+Ed_Ymax.Text)));
Ed_Version.Text:=IntToStr(HexToInt(Ed_Version.Text));
CHAINE:=Ed_Xmin.Text+''','''+Ed_Xmax.Text+''','''+Ed_Ymin.Text+''','''+Ed_Ymax.Text;
dm.QMBR2.close;
dm.QMBR2.SELECTSql.Clear;
test:=dm.QMBR2.SELECTsql.add('INSERT INTO MBR (XMIN, XMAX, YMIN, YMAX) VALUES ('''+chaine+''')');
Memo1.Lines.Add(dm.QMBR2.SelectSQL[test]);
//dm.QMBR2.SELECTsql.Add(' VALUES('+chaine+')');
dm.QMBR2.open;
dm.TRMBR.CommitRetaining;
end;
function Tform1.Lire(Position : integer; Boucle : integer; mode:string) : string;
var
c : Integer;
begin
PosActual:=PosActual+Boucle;
f.Position := Position;
SetLength(o, 16);
f.Read(o[1], 16);
if mode = 'Big' then begin
for c:=1 to Boucle do begin
Result:=Result+IntToHex(ord(o[c]),2);
end;
end
else begin
c:=Boucle;
while c <> 0 do begin
Result:=Result+IntToHex(ord(o[c]),2);
c:=c-1;
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
PosActual:=2;
Edit1.Text:='';
Ed_type.Text:='';
Ed_Xmin.text:='';
Ed_Ymin.Text:='';
Ed_Xmax.Text:='';
Ed_Ymax.Text:='';
Ed_Version.Text:='';
premier:=true;
if OpenDialog1.Execute then begin
FileName:=OpenDialog1.FileName;
f := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
TraitementHeader();
PosActual:=PosActual+32;
while PosActual < HexToInt(Ed_FileLength.Text) do
TraitementFichier();
end;
end;
function TForm1.HexToDouble(i64 : int64): string;
var
r: Double absolute i64; // r a donc la même adresse que i64, et tous les 2 sont codés sur 8 octets
begin
// on affecte l'un des deux
//ShowMessage(FloatToStr(r)); // et on lit l'autre...
result:=FloatToStr(r) ;
end;
Function TForm1.HexToInt (Value:string) : Integer;
begin
result := StrToInt('$'+ Value);
end;
function TForm1.DoubleToInt(Value : string) : string;
var i : integer;
ResultTemp :string;
begin
ResultTemp := '';
for i:=1 to 32 do begin
if Value[i] = ',' then
break
Else
ResultTemp:=ResultTemp+Value[i];
end;
Result:=ResultTemp;
end;
end.
Le message d'erreur quand je remplace les instruction par une boucle for ou while:
Le
projet ProjLOGGPS.exe a provoqué une classe d'exception EConvertError
avec le message "$4013F8468F781F3D4013F85B882DA821' n'esr pas une
valeur entière correcte'. Processus stoppé. Utilisez Pas-à-pas ou
Exécuter pour continuer.
dominique.stock
Messages postés436Date d'inscriptionvendredi 7 novembre 2003StatutMembreDernière intervention 8 octobre 20087 29 avril 2008 à 13:19
chaine:=HexToDouble(StrToInt64('$'+Lire(PosActual, 8, 'Little')))+''' , '''+HexToDouble(StrToInt64('$'+Lire(PosActual, 8, 'Little')));
c'est donc cette chaine qui plante lors de la deuxième itération ( pour info : il y en a 360 et pas 361)
avant de créer la chaine , fais afficher le résultat des lire() dans un memo+
controle le strtoint64 et le Hextodouble ...
darnau
Messages postés11Date d'inscriptionmardi 7 novembre 2006StatutMembreDernière intervention29 avril 2008 29 avril 2008 à 13:23
Ce que je ne comprend pas c'est que mon programme fonctionne parfaitement si je remplace la boucle for par un GROS copier/coller (360) des lignes suivantes:
chaine:=HexToDouble(StrToInt64('$'+Lire(PosActual, 8,
'Little')))+''' , '''+HexToDouble(StrToInt64('$'+Lire(PosActual, 8,
'Little')));
dm.QMBR2.close;
dm.QMBR2.SELECTSql.Clear;
dm.QMBR2.SELECTsql.add('INSERT INTO POINT (X, Y) VALUES ('''+chaine+''')');
dm.QMBR2.open;
dm.TRMBR.CommitRetaining;
darnau
Messages postés11Date d'inscriptionmardi 7 novembre 2006StatutMembreDernière intervention29 avril 2008 29 avril 2008 à 14:21
Je suis ravi de ne pas être le seul pour qui ce problème est une grande énigme...J'ai déjà demander à mon responsable de stage mais lui non plus n'a aucunes idées de la raison pour laquelle il y a une erreur en cas de repetitive par boucle alors quepar saisie de l'instruction X fois cela fonctionne bien.... Surtout que 361 est adapté à l'exemple sur lequel je travail actuelement pour que le programme soit compatible avec d'autre exemple il faut absolument faire une boucle for.
darnau
Messages postés11Date d'inscriptionmardi 7 novembre 2006StatutMembreDernière intervention29 avril 2008 29 avril 2008 à 14:41
Je ne sais pas... Probablement je ne sais pas faire, j'ai regarder en mode Pas à Pas detaillé et j'ai donc relevé ainsi la ligne de l'erreur!
MERCI, je ne sais pas comment ca ce fait mais je vien de trouver l'erreur... J'ai fait ce que tu m'as dis j'ai regardé les données et en fait c'est la variable result de la fonction Lire qu'il faut réinitialisé à '' si on utilise une boucle for... Alors pourquoi ca marche si on n'utilise pas de boucle... Bonne question! En tout cas le programme fonctionne avec une boucle For et je te remercie pour ton aide.