Convertir projet Delphi en VB Express [Résolu]

Signaler
Messages postés
17
Date d'inscription
vendredi 17 février 2006
Statut
Membre
Dernière intervention
25 janvier 2008
-
Guillaume1109
Messages postés
27
Date d'inscription
samedi 17 mars 2007
Statut
Membre
Dernière intervention
11 octobre 2009
-
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.

Merci

19 réponses

Messages postés
14670
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
28 mars 2020
139
Bonjour

Fournis un peu de quoi manger (enfin voir où tu bloque) pour que l'on puisse t'aider.

Dans Word, j'Excel. (juste pour la citation)
VB (6, .NET1&2), C++, C#.Net1
Mon site
Messages postés
17
Date d'inscription
vendredi 17 février 2006
Statut
Membre
Dernière intervention
25 janvier 2008

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;
Messages postés
14670
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
28 mars 2020
139
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
Messages postés
17
Date d'inscription
vendredi 17 février 2006
Statut
Membre
Dernière intervention
25 janvier 2008

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;
Messages postés
14670
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
28 mars 2020
139
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
Messages postés
17
Date d'inscription
vendredi 17 février 2006
Statut
Membre
Dernière intervention
25 janvier 2008

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;

Merci beaucoup de ton soutien.

Pascal
Messages postés
14670
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
28 mars 2020
139
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.

2) Code équivalent
my.Computer.FileSystem.WriteAllBytes (tempBame,variable,false)

3) valeur hexa :
$30 -> &h30
(Je ne connais pas Delphi, mais je pense que le $ signifie que la valeur est en Hexadécimal).

Dans Word, j'Excel. (juste pour la citation)
VB (6, .NET1&2), C++, C#.Net1
Mon site
Messages postés
17
Date d'inscription
vendredi 17 février 2006
Statut
Membre
Dernière intervention
25 janvier 2008

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;

Les MsgBox sa je comprends c'est tres simple lol.

Désolé de t'embéter.
Merci

Pascal
Messages postés
14670
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
28 mars 2020
139
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
Messages postés
17
Date d'inscription
vendredi 17 février 2006
Statut
Membre
Dernière intervention
25 janvier 2008

C'est encore moi
C'est quoi TfileScanner

var f:TfileScanner

Je pense que ce sera tout.

Merci beaucoup pour ce grand coup de pouce.
Tu es un chef bien que tu connais pas Delphi tu est un Dieu.

Encore Merci
Messages postés
14670
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
28 mars 2020
139
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
Messages postés
17
Date d'inscription
vendredi 17 février 2006
Statut
Membre
Dernière intervention
25 janvier 2008

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é.

Pascal
Messages postés
17
Date d'inscription
vendredi 17 février 2006
Statut
Membre
Dernière intervention
25 janvier 2008

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é.

Pascal
Messages postés
14670
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
28 mars 2020
139
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
Messages postés
17
Date d'inscription
vendredi 17 février 2006
Statut
Membre
Dernière intervention
25 janvier 2008

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;
Messages postés
14670
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
28 mars 2020
139
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
Messages postés
17
Date d'inscription
vendredi 17 février 2006
Statut
Membre
Dernière intervention
25 janvier 2008

Je suis preneur
Peux tu me le mettre sur un speedyshare ou autre ?
ou si tu sais ou retrouver mon mail.
Messages postés
14670
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
28 mars 2020
139
Bonjour

Envoyé, si tu n'a pas le fichier dans le mail, je peux te l'envoyer en zip.

Dans Word, j'Excel. (juste pour la citation)
VB (6, .NET1&2), C++, C#.Net1
Mon site
Messages postés
27
Date d'inscription
samedi 17 mars 2007
Statut
Membre
Dernière intervention
11 octobre 2009

J'aimerai bien recevoir le fichier par mail aussi.