cs_KeNNys
Messages postés17Date d'inscriptionvendredi 17 février 2006StatutMembreDernière intervention25 janvier 2008
-
16 janv. 2008 à 11:31
Guillaume1109
Messages postés25Date d'inscriptionsamedi 17 mars 2007StatutMembreDernière intervention11 octobre 2009
-
22 mars 2008 à 14:31
Bonjour les amis,
Je debut en VB Express.
J'ai un projet Delphi et j'aimerai le traduire en VB Express.
Pourrais je avoir de l'aide ?
J'ai commencer a faire des trcu mais je bloque sur des procedures qui me semble bien compliquer.
cs_KeNNys
Messages postés17Date d'inscriptionvendredi 17 février 2006StatutMembreDernière intervention25 janvier 2008 16 janv. 2008 à 14:30
Voici la partie ou j'ai difficulté :
Var S:String;
PROCEDURE SplitFile(Const Path:String;Var Dir,Name,Ext:String);
Var L:Integer;
i:Integer;
DirEndPos,PointPos:Integer;
Begin
DirEndPos:=0;
PointPos:=0;
L:=Length(Path);
For i:=1 To L Do
Case Path[I] of
'\':Begin DirEndPos:=i;PointPos:=0;End;
'.':PointPos:=i;
End;
if DirEndPos>1 Then Dir:=Copy(Path,1,DirEndPos) Else Dir:='';
if PointPos>1 Then
Begin
Name:=Copy(Path, DirEndPos+1,PointPos-DirEndPos-1);
Ext:=Copy(Path, PointPos+1,L-PointPos);
End
Else Begin
Name:=Copy(Path, DirEndPos+1,L-DirEndPos);
Ext:='';
End;
End;
{####################################################################}
{####################################################################}
{function CreateTempFile(Var Temp:String):BOOLEAN;
var TempDir : Array[0..255] of char;
TempName : Array[0..255] of char;
begin
Result:=FALSE;
// Get Tmporary Dir Name
FillChar(TempDir,sizeof(TempDir),0);
GetTempPath(sizeof(TempDir),TempDir);
// Create Temp File
FillChar(TempName,sizeof(TempName),0);
if ( GetTempFileName(TempDir,'fannansat',0,TempName) <>0 )
Then Temp:= TempName
else // Error
Begin
Application.MessageBox('Can''t Create Temp File','Error',MB_OK or MB_ICONERROR);
Exit;
End;
Result:=TRUE;
End;
}
function CopyTempFile(Name:String):BOOLEAN;
begin
Result:=FALSE;
// Copy File
Name[Length(Name)+1]:=#0;
if not CopyFile(@Name[1], TempName,FALSE) Then
Begin
Application.MessageBox('Can''t Read Bin File',MSGBXTITLE,MB_OK or MB_ICONERROR);
Exit;
End;
Result:=TRUE;
end;
Procedure ApplyChecksum(Var f:TFileScanner);
Var Sum,i : Longint;
SumTab : Array[0..3] of byte absolute Sum;
Begin
// Calc CheckSum
Seek(f.f, 0 );
Sum:=0;
For i:=1 to (f.Size-$30) do Sum:=Sum+f.ReadByte;
Seek( f.f, (f.Size-$30) );
For i:=3 downto 0 do BlockWrite(f.f,SumTab[i],1);
End;
function TForm1.SeekMpegHdr:Longint;
Var I:LongInt;
L,N:Cardinal;
Found:Boolean;
Begin
{ Search MPEG Header }
L:=$B3010000;
Seek(fBin.f, 0 );
Found:=FALSE;
SeekMpegHdr:=-1;
for i:=1 to (fBin.Size div 4) do
Begin
N:=fBin.ReadByte+$100*fBin.ReadByte+$10000*fBin.ReadByte+$1000000*fBin.ReadByte;
if (N=L) Then
if Not(Found)
Then Begin
Found:=True;
SeekMpegHdr:=(i-1)*4;
End
Else Begin
SeekMpegHdr:=-1;
Exit;
End;
End;
End;
function TForm1.ApplyMPEG:BOOLEAN;
Var i,BinMpegSize,BinMpegOfs : Longint;
begin
Result:=False;
// Create TempFile
if not CopyTempFile(EditBin.text) then Exit;
// Read Mpeg File
filemode:= fmOpenRead;
if (fMpeg.OpenFile(EditMpeg.text)=False) Then
Begin
Application.MessageBox('Can''t open Mpeg file',MSGBXTITLE, MB_OK or MB_ICONERROR);
Exit;
End;
fMpeg.Size:=fileSize(fMpeg.f);
if (fMpeg.Size>BinMpegSize) Then
Begin
fMpeg.CloseFile;
Application.MessageBox('The size of the Mpeg file is too Big. Abort!',MSGBXTITLE, MB_OK or MB_ICONERROR);
Exit;
End;
BinMpegSize:=17015;
//for i:=0 to (1000) do MpegBuf[i]:=$FF;
FillChar(MpegBuf,BinMpegSize,$FF);
BlockRead(fMpeg.f, MpegBuf,fMpeg.Size );
fMpeg.CloseFile;
if (MpegStart<>$B3010000) Then
Begin
Application.MessageBox('Mpeg Header don''t match'#13'Select another Mpeg file',MSGBXTITLE, MB_OK or MB_ICONERROR);
EditMpeg.Text:='';
Exit;
End;
// Open Bin File
filemode:= fmOpenReadWrite;
if (fBin.OpenFile(TempName)=False) Then
Begin
Application.MessageBox('Can''t open binary file',MSGBXTITLE, MB_OK or MB_ICONERROR);
Exit;
End;
fBin.Size:=fileSize(fBin.f);
// Seek For Mpeg Header within Binary file
BinMpegOfs:=SeekMpegHdr; { Get The Mpeg Start Offset }
if (BinMpegOfs=-1) Then
Begin
fBin.closefile;
Application.MessageBox('Can''t find Mpeg Header. Abort!',MSGBXTITLE, MB_OK or MB_ICONERROR);
Exit;
End;
// Write Mpeg Data to Binary file
Seek(fBin.f, BinMpegOfs);
BlockWrite(fBin.f, MpegBuf,BinMpegSize);
// Calc CheckSum
ApplyCheckSum(fBin);
// Close The Binary File
fBin.closefile;
Result:=TRUE;
End;
NHenry
Messages postés15113Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention22 avril 2024159 16 janv. 2008 à 15:22
Bonjour
1) évite de mettre réponse acceptée si ton pb n'est pas solutionné, sinon tu auras moins de visite (donc moins d'aide).
2) Quand on bosse avec .NET (VB Express), on poste dans la bonne catégorie ... (Tu as posté dans VB6).
3) je ne te traduit que quelques parties du code, charge à toi de t'en inspirer.
PROCEDURE SplitFile(Const Path:String;Var Dir,Name,Ext:String);
Var L:Integer;
i:Integer;
DirEndPos,PointPos:Integer;
Begin
DirEndPos:=0;
PointPos:=0;
L:=Length(Path);
For i:=1 To L Do
Case Path[I] of
'\':Begin DirEndPos:=i;PointPos:=0;End;
'.':PointPos:=i;
End;
if DirEndPos>1 Then Dir:=Copy(Path,1,DirEndPos) Else Dir:='';
if PointPos>1 Then
Begin
Name:=Copy(Path, DirEndPos+1,PointPos-DirEndPos-1);
Ext:=Copy(Path, PointPos+1,L-PointPos);
End
Else Begin
Name:=Copy(Path, DirEndPos+1,L-DirEndPos);
Ext:='';
End;
End;
En .NET, 2 versions :
Conforme à ton code (adapté car les chaines sont de base 0 et pas 1)
Met un \ à la fin de Dir
Private Sub SplitFile(ByVal Path As String, ByRef Dir As String, ByRef Name As String, ByRef Ext As String)
Dim L As Integer
Dim i As Integer
Dim DirEndPos As Integer
Dim PointPos As Integer
DirEndPos = 0
PointPos = 0
L = Path.Length
For i = 0 To L - 1
Select Case Path.Substring(i, 1)
Case ""
DirEndPos = i
PointPos = 0
Case "."
PointPos = i
End Select
Next i
If DirEndPos > 1 Then
Dir = Path.Substring(0, DirEndPos + 1)
Else
Dir = ""
End If
If PointPos > 1 Then
Name = Path.Substring(DirEndPos + 1, PointPos - DirEndPos - 1)
Ext = Path.Substring(PointPos + 1, L - PointPos - 1)
Else
Name = Path.Substring(DirEndPos + 1, L - DirEndPos - 1)
Ext = ""
End If
End Sub
Plus framwork :
Met le . avec l'extension
Private Sub SplitFile1(ByVal pCompleteFileName As String, ByRef pPath As String, ByRef pFileName As String, ByRef pExt As String)
pPath = IO.Path.GetDirectoryName(pCompleteFileName)
pFileName = IO.Path.GetFileNameWithoutExtension(pCompleteFileName)
pExt = IO.Path.GetExtension(pCompleteFileName)
End Sub
Voilà, si tu bloque encore, je suis là.
Dans Word, j'Excel. (juste pour la citation)
VB (6, .NET1&2), C++, C#.Net1
Mon site
cs_KeNNys
Messages postés17Date d'inscriptionvendredi 17 février 2006StatutMembreDernière intervention25 janvier 2008 16 janv. 2008 à 16:15
Merci pour ta réponse.
Je ne savais pas pour réponse accepter merci de m'avoir informé.
Oui effectivement j'ai encore besoin de ton aide
sur ces 3 procedures :
je bloque sur la première a cause du copyfile et sur la seconde a cause dut tableau (array) et enfi la troisieme a cause du ReadByte.
Désolé je suis trop nul mais bon je pense qu'avec cela ensuite je pourrais voler de mes propres ailes.
Merci beaucoup
function CopyTempFile(Name:String):BOOLEAN;
begin
Result:=FALSE;
Name[Length(Name)+1]:=#0;
if not CopyFile(@Name[1], TempName,FALSE) Then
Begin
Application.MessageBox('Can''t Read Bin File',MSGBXTITLE,MB_OK or MB_ICONERROR);
Exit;
End;
Result:=TRUE;
end;
Procedure ApplyChecksum(Var f:TFileScanner);
Var Sum,i : Longint;
SumTab : Array[0..3] of byte absolute Sum;
Begin
Seek(f.f, 0 );
Sum:=0;
For i:=1 to (f.Size-$30) do Sum:=Sum+f.ReadByte;
Seek( f.f, (f.Size-$30) );
For i:=3 downto 0 do BlockWrite(f.f,SumTab[i],1);
End;
Begin
L:=$B3010000;
Seek(fBin.f, 0 );
Found:=FALSE;
SeekMpegHdr:=-1;
for i:=1 to (fBin.Size div 4) do
Begin
N:=fBin.ReadByte+$100*fBin.ReadByte+$10000*fBin.ReadByte+$1000000*fBin.ReadByte;
if (N=L) Then
if Not(Found)
Then Begin
Found:=True;
SeekMpegHdr:=(i-1)*4;
End
Else Begin
SeekMpegHdr:=-1;
Exit;
End;
End;
End;
Vous n’avez pas trouvé la réponse que vous recherchez ?
NHenry
Messages postés15113Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention22 avril 2024159 16 janv. 2008 à 16:44
Bonjour
1) CopyFile -> System.IO.File.Copy(...)
2) SumTab : Array[0..3] of byte absolute Sum;
dim SumTab(3) as byte
3) Pour l'accès au fichier, regarde dans le forum et les sources VB.NET : recherche les sujet concernant les flux (stream) et les ouvertures de fichiers (normalement c'est dans System.IO.File.Open(...)).
Rem concernant les codes du type :
N:=A+$100*B+$10000*C+$1000000*D;
N=A + (B<<8)+(C<<16)+(D<<24)
Attention, pense à mettre A, B, C, D et N en UInteger, sinon il y auras un dépassement de capacité (un Byte ne peut pas dépasser 255).
Integer si D<128 sinon à mettre en Long ou ULong.
Dans Word, j'Excel. (juste pour la citation)
VB (6, .NET1&2), C++, C#.Net1
Mon site
cs_KeNNys
Messages postés17Date d'inscriptionvendredi 17 février 2006StatutMembreDernière intervention25 janvier 2008 17 janv. 2008 à 08:25
Salut,
Désolé d'être aussi lourd, lol
j'ai encore des petits soucis.
Le porjet sur lequel je suis est bien compliqué pour un simple amateur, mais j'espere devenir bientot autonome ;o).
Comment traduire :
Variable[Length(variable)+1}=#1
je commencait a traduire comme cela mais sa ne fonctionne pas :
Variable[variable.length+1]=#1
je ne sais pas non plus comment traduire cela a cause de l'@
CopyFile(@variable[1], tempBame, False)
et enfin cela c'est a cause du $ :
For i:=1 to (f.Size-$30) do Sum:=Sum+f.ReadByte;
NHenry
Messages postés15113Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention22 avril 2024159 17 janv. 2008 à 08:59
Bonjour
1) Les tableaux en VB.NET, explications de bases :
Déclaration :
Dim MonTab(5) as byte 'Déclare MonTab comme un tableau de 6 éléments (0 - 5) de type Byte
Dim MonTab() as integer 'Déclare MonTab comme un tableau dynamique (dont la taille peut changer en cours d'execution) de type Integer
Redim MonTab(5) 'Dimmensionne MonTab (précédemment déclaré en tant que tableau dynamique) à une taille de 6 éléments.
MonTab.Length 'Retourne la taille du tableau (Max=Length-1)
MonTab.GetUpperBound(0) 'Retourne Max-1 pour la première dimension
MonTab(2) 'Permet de récupérer/définir le 3ième élément
Tableau dynamique pour un ajout simplifié :
Dim MonTab as new List(of Byte) 'Déclare et instancie une liste d'octet
MonTab.Add(Value) 'Ajoute Value à la fin de la liste
MonTab.Count 'Retourne la taille de la liste
MonTab(2) Retourne le 3ième élément de la liste
MonTab.Remove(Value) 'Retire l'élément de valeur Value de la liste
MonTab.RemoveAt(Index) 'Retire l'élément mis à l'index Index de la liste
MonTab.Clear 'Vide la liste
MonTab.ToArray 'Retourne un tableau contenant les éléments de la liste
A noter qu'il est possible de faire des tableaus de classes et autres types.
cs_KeNNys
Messages postés17Date d'inscriptionvendredi 17 février 2006StatutMembreDernière intervention25 janvier 2008 17 janv. 2008 à 09:33
Merci beaucoup pour cette belle explication sur les tableaux, sa me sera bien utile.
Mais je ne comprnds toujours pas malheureusement :o(.
J'ai mis cela pour la fonction :
variable[Length(variable)+1]=#0
resultat :
Fonction(variable.Length + 1) = 0
mais j'ai un message d'erreur propriété Chars est ReadOnly
Voici la fonction complète
function CopyTempFile(Name:String):BOOLEAN;
begin
Name[Length(Name)+1]:=#0;
if not CopyFile(@Name[1], TempName,FALSE) Then
Begin
Application.MessageBox('Can''t Read Bin File',MSGBXTITLE,MB_OK or MB_ICONERROR);
Exit;
End;
end;
NHenry
Messages postés15113Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention22 avril 2024159 17 janv. 2008 à 09:55
Bonjour
private function CopyTempFile(byval pName as string) as Boolean
' Name+=chr(0) 'Pas besoin
try
System.IO.File.Copy(pName,TempName,false) 'Copie du fichier Name vers le fichier TempName
'TempName doit être déclaré en tant que String
'Le False indique que le fichier ne sera pas écrasé, si déjà présent -> Exception
catch ex as exception
messagebox.Show("Can't read bin file", MSGBXTITLE, MessageBoxButtons.OK,MessageBoxIcon.Error )
return False
end try
Return True
end function
Dans Word, j'Excel. (juste pour la citation)
VB (6, .NET1&2), C++, C#.Net1
Mon site
NHenry
Messages postés15113Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention22 avril 2024159 17 janv. 2008 à 10:26
Bonjour
Comme cela, TfileScanner est (je pense) un type définit par l'utilisateur (enfin le develloppeur), regarde dans ton projet, tu verra peut-être un type, une énumération ou une classe portant ce nom.
Merci pour le compliment.
Dans Word, j'Excel. (juste pour la citation)
VB (6, .NET1&2), C++, C#.Net1
Mon site
cs_KeNNys
Messages postés17Date d'inscriptionvendredi 17 février 2006StatutMembreDernière intervention25 janvier 2008 17 janv. 2008 à 16:19
J'ai trouve a quoi correspond TfileScanner.
EN fait c'est une fonctionne dans un autre document qui s'appelle FileScanner
Peut on faire cela ?
Private Sub nom_de_ma_nouvelle_fonction (f as tfileScanner) ??
encore une chose J'ai un truc comme cela
Procedure TForm2.SerialInit;
Begin
ComThread:=TCPTHread.Create(False)
End;
ComThread c'est une Variable ?
TCPThread c'est une fonction dans un autre document CPThread
Dois je refaire la meme structure ou mettre directement mon code dans mon fichier VB
Encore UN GRAND MERCI.
Et je trouve le compliment bien mmerité.
cs_KeNNys
Messages postés17Date d'inscriptionvendredi 17 février 2006StatutMembreDernière intervention25 janvier 2008 17 janv. 2008 à 16:19
J'ai trouve a quoi correspond TfileScanner.
EN fait c'est une fonctionne dans un autre document qui s'appelle FileScanner
Peut on faire cela ?
Private Sub nom_de_ma_nouvelle_fonction (f as tfileScanner) ??
encore une chose J'ai un truc comme cela
Procedure TForm2.SerialInit;
Begin
ComThread:=TCPTHread.Create(False)
End;
ComThread c'est une Variable ?
TCPThread c'est une fonction dans un autre document CPThread
Dois je refaire la meme structure ou mettre directement mon code dans mon fichier VB
Encore UN GRAND MERCI.
Et je trouve le compliment bien mmerité.
NHenry
Messages postés15113Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention22 avril 2024159 17 janv. 2008 à 16:26
Bonjour
1) Si c'est une fonction, regarde du coté des Delegate .
2) Là j'ai un doute, mais je suppose que CoThread est de type TCPThread et que Create est une fonction partagée (Shared Function en VB) qui est dans la classe précédamment citée.
Mais sans le code de TCPTHread.Create, je ne puis t'en dire plus.
Dans Word, j'Excel. (juste pour la citation)
VB (6, .NET1&2), C++, C#.Net1
Mon site
cs_KeNNys
Messages postés17Date d'inscriptionvendredi 17 février 2006StatutMembreDernière intervention25 janvier 2008 17 janv. 2008 à 16:32
Voila TCPThread.Create:
constructor TCPThread.Create(CreateSuspended: Boolean);
begin
inherited Create(CreateSuspended);
FreeOnTerminate := True; //Détruire à la sortie
Priority := tpLowest; // Setting priority
//if CreateSuspended then Resume; //Si le thread est en attente, le démarrer
end;
NHenry
Messages postés15113Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention22 avril 2024159 17 janv. 2008 à 16:51
Bonjour
La version VB donnerais un truc du genre :
Class TForm2
Private ComThread as TCPThread
sub SerialInit()
ConThread=new TCPThread
end sub
end class
Class TCPThread
inherits Une_classe_de_Thread '!!!!! EN .NET, il faut utiliser la classe System.Threading.Thread qui n'est pas héritable.
public sub New(Byval CreateSuspend as boolean)
...
End Sub
end class
Voilà, pour les threads, j'ai un fichier qui me sert beaucoup, je l'ai à dispo, si tu le veux, pas de pb.
Dans Word, j'Excel. (juste pour la citation)
VB (6, .NET1&2), C++, C#.Net1
Mon site