2010-01-15 7 views
6

Comment puis-je convertir ce morceau de code VB6 en C#?C# & VB6: Comment convertir une instruction 'with' en C#?

http://pastebin.com/f16e19351

J'ai essayé moi-même et a obtenu jusqu'à présent à:

http://pastebin.com/f7ca199f0

EDIT: Code Je suis en train de traduire existe ici: http://www.codeproject.com/KB/vb-interop/MouseHunter.aspx

+0

Copie possible de [équivalent C# pour le mot clé Visual Basic: 'With' ... 'End With'?] (Http://stackoverflow.com/questions/4174773/c-sharp-equivalent-for-visual-basic -keyword-with-end-with) – DaveInCaz

+0

@DaveInCaz Peut-être classer l'autre en tant que doublon puis puisque cette question a été posée avant celle-là? – Zolomon

Répondre

7

Vous n'avez pas montré le code EventThief, ce qui le rend vraiment impossible à dire. Mais en général:

With expression 
    .Foo = a 
    .Bar = b 
End With 

se traduirait par

var x = expression; 
x.Foo = a; 
x.Bar = b; 

(Bien sûr, vous pouvez spécifier le type explicitement ...)

Le point commun est que expression est seulement évalué une fois. Dans le code particulier que vous avez montré, il n'y a pas besoin d'une variable supplémentaire bien sûr, car l'expression est seulement la variable locale en premier lieu.

Votre erreur réelle ressemble à juste à faire avec les types de EventThief.RIGHT_DOWN etc plutôt qu'avec l'instruction WITH.

EDIT: D'accord, vous avez maintenant montré le code original qui EventThief -t utilisation booléens ... mais vous ne l'avez pas montré votre Code EventThief porté. Vous avez écrit:

Il dit et.LEFT_UP est un court

... mais il ne faut pas. Dans l'original c'est un Boolean, alors pourquoi est-ce un short sur votre port?

+0

J'ai ajouté un lien dans ma question, voir la modification. Il suffit de chercher "eventthief" et vous le trouverez. – Zolomon

+0

Je ne sais pas pourquoi c'est un court, j'utilise tlbimp comme mentionné ici: http://www.csharp-station.com/Articles/CSharpAndActiveXDlls.aspx pour permettre la DLL ActiveX à utiliser dans .NET et je le prends qu'il l'a converti en un court à la place ou quelque chose? Je vais juste essayer de convertir manuellement le tout en C#. Merci pour l'aide! – Zolomon

0

Il n'est pas équivalent à Avec en C# autant que je sache et vous devez explicitement lister l'objet lorsqu'il est référé à ses fonctions/propriétés membres.

0

Il n'y a pas d'équivalent C#.

2

Comme si

With EventStealingInfo 
    .RIGHT_DOWN = True 
    .RIGHT_UP = True 
End With 

devient

EventStealingInfo.RIGHT_DOWN = true; 
EventStealingInfo.RIGHT_UP = true; 
0

Tu ne peux pas juste changer le type de LEFT_UP être un bool?

En examinant votre code et la manière dont vous utilisez EventThief, vous pouvez utiliser une énumération de drapeaux afin de pouvoir définir des bits individuels, puis effectuer des comparaisons au niveau du bit.

+0

Je vais devoir regarder ça. Merci! – Zolomon

3

Je ne suis pas sûr, mais je pense que ce qui suit dans VB

With EventStealingInfo 
    .RIGHT_DOWN = True 
    .RIGHT_UP = True 
End With 

peut être traduit à peu près à

var EventStealingInfo = new EventThief(){ 
    RIGHT_DOWN = true, 
    RIGHT_UP = true 
}; 

RIGHT_UP et RIGHT_DOWN sont des propriétés publiques de la classe EventStealingInfo.

Cette construction en C# est connue comme Object Initializer.

+0

@stakx: Merci d'avoir signalé cela. – missingfaktor

0

Le mot clé "with" est simplement un raccourci pour sauvegarder le retypage du nom de la variable lorsque vous définissez plusieurs propriétés. Il n'y a pas d'équivalent en C#.

Même si vous aviez toujours un problème, vous essayez apparemment d'affecter un booléen à un type de données court.

Qu'y a-t-il dans la classe EventThief? Pouvez-vous simplement faire en sorte que les champs LEFT_UP soient booléens?

+0

Regardez le lien dans l'édition dans ma question, recherchez "EventThief" et vous le trouverez. – Zolomon

+0

En fait, il met également en cache la référence d'objet, ce qui peut gagner du temps si l'objet en question doit être résolu en recherchant une série imbriquée de propriétés - ou pire encore un appel de méthode créant une instance pour une utilisation temporaire. Bien sûr, vous pouvez également mettre en cache manuellement en créant d'abord une nouvelle variable de référence temporaire et en l'utilisant. – Bob77

1

je pense qu'il est plus proche, vous pouvez aller:

EventThief EventStealingInfo = new EventThief() 
{ 
    RIGHT_DOWN = true, 
    RIGHT_UP = true 
}; 
+0

J'irais avec cette réponse (sauf que cela devrait vraiment dire '... = new EventThief()'). Les initialiseurs d'objet sont probablement la chose la plus proche de l'instruction 'With' de Visual Basic. – stakx

+0

opérations, fixé que, ty –

1

Puis-je appeler votre proposition Option A.

  1. Prenez la communauté VB6 code qui crée une DLL pour gérer les hooks Windows.
  2. que Traduisez à C#

Puis-je proposer l'option B et l'option C, que je pense que ce sera plus facile?

Option B
1. Commencez par Microsoft's C# code pour faire face à des crochets Windows.
2. L'adapter si nécessaire, en regardant ce que l'API appelle le VB6 code makes.

Option C
1. Prenez le construit VB6 DLL du community code.
2. Appelez cette DLL à partir de votre nouvelle application C# via Interop.

+0

J'ai essayé l'option 2 d'abord, puis j'ai essayé l'option 3 lorsque le premier a échoué. C'est alors que j'ai rencontré l'erreur avec le mauvais type dans la structure EventThief, donc j'ai essayé l'option 1 et j'ai rencontré une autre erreur qui disait que le GUID était mauvais et je me suis perdu sur ce qu'il fallait faire. – Zolomon