2016-04-27 11 views
2

数日前、私は、QRCodeライブラリを使用しようとしました。そこで私はいくつかの研究を行い、ここにいる人々が私を案内しました。 だから私は、私はこれは私がインテリセンスを見ると、他のclassessのオブジェクトと変数のいくつかを作成することができましたが、私は私が見ているクラスとのトラブルだ https://whoisburiedhere.wordpress.com/2011/07/12/creating-a-com-object-from-scratch-with-c/制約のある抽象クラスへのインタフェースの実装方法は?

ステップに続いインタフェースを作ることにしました廃棄()が、私は、MSへのアクセスの新機能は使用できません。

[Dim QRCD as New QRCode] 

私は新しいの使用が有効ではありませんが、私はラインで宣言することができ、エラーを取得:[

Dim QRCD as QRCode 

を私はそれがないと思うobject {QRDataと等しくしようとすると "それは許可されていません"というエラーが発生する}そのクラスは抽象クラスを実装している抽象クラスを抽象クラスに実装しようとしましたが、メソッドを実装しないでください "私がChildクラスに入れた場合、オブジェクトを作成することはできません。後でバインドされたメソッドのいずれも参照しません。 ここにQRCoderライブラリがあります。 https://github.com/codebude/QRCoder これは提供されている抽象クラスです。

{ 
using System; 

public abstract class AbstractQRCode<T> 
{ 
    protected QRCodeData qrCodeData; 

    protected AbstractQRCode(QRCodeData data) 
    { 
     qrCodeData = data; 
    } 
    public abstract T GetGraphic(int pixelsPerModule); 
} 

}

これは、それを実装して子クラスです。インターフェイスで既に変更されています。すべてのコードではないが、GetGraphic(何かのもの)と呼ばれる、互いに異なるいくつかのメソッドがあります。

[ComVisible(true)] 
[Guid("It's filled in the program"), InterfaceType(ComInterfaceType.InterfaceIsDual)] 
public interface neker 
{ 

    Bitmap GetGraphic(int pixelsPerModule); 
} 
[ComVisible(true)] 
[Guid(""), ClassInterface(ClassInterfaceType.AutoDual)] 

public class QRCode :AbstractQRCode<Bitmap>, IDisposable, neker 
{ 
    public QRCode(QRCodeData data) : base(data) {} 

    public override Bitmap GetGraphic(int pixelsPerModule) 
    { 
     return GetGraphic(pixelsPerModule, Color.Black, Color.White, true); 
    } 

    public Bitmap GetGraphic(int pixelsPerModule, string darkColorHtmlHex, string lightColorHtmlHex, bool drawQuietZones = true) 
    { 
     return GetGraphic(pixelsPerModule, ColorTranslator.FromHtml(darkColorHtmlHex), ColorTranslator.FromHtml(lightColorHtmlHex), true); 
    } 

これはこれがVBAで自分のコードされたサンプルコード(また提供)

QRCodeGenerator qrGenerator = new QRCodeGenerator(); 
QRCodeData qrCodeData = qrGenerator.CreateQrCode("The text which should be encoded.", QRCodeGenerator.ECCLevel.Q); 
QRCode qrCode = new QRCode(qrCodeData); 
Bitmap qrCodeImage = qrCode.GetGraphic(20); 

ある[これはモジュール内にある]

Public Sub QRCreator(QRtext As String) 
Dim QRCG As QRCoder.QRCodeGenerator 
Set QRCG = New QRCoder.QRCodeGenerator 
Dim QRCD As QRCodeData 
Set QRCD = QRCG.CreateQRCode(QRtext, ECCLevel_Q, False) 
Dim QRCO As QRCode 
Set QRCO = Factory.CreateQRCode(QRCD) 
Forms!Formulario1.[Oleobject].Picture = QRCO.GetGraphic(5) 
End Sub 

Public Sub InitiateProperties(Data As QRCodeData) 
//I declared it as Variant since QRCode is not avaliable 
Dim m_data As Variant 
m_data = Data 
End Sub 

これは別のモジュールである[Iはこのモジュールを使用してパラメータ付きオブジェクトを作成する] Pass arguments to Constructor in VBA

Public Function CreateQRCode(Data As QRCodeData) As QRCode 
//you see the word new is missing If I run it it says "An object is required" 

Set CreateQRCode = QRCode 
CreateQRCode.InitiateProperties Data:=Data 

End Function 

マイクロソフトアクセス2013から使用できるように変更するにはどうすればよいですか? インタフェースを使用しないでもう1つの方法はありますか? アクセスはvbaのビットマップをサポートしていますか? 私はこのすべてのものでとても新しいので、ありがとうございました。

編集: 私はそれができない理由を知ることができませんでした。なぜなら、パラメータを持つサポート担当者およびオーバーライドのあるメソッドを使用しているからです。どのように私はイメージをいつでも作成することができましたか?

答えて

1

まあ、確認し、試して失敗した後、私は自分の見方を変えることにしました。だから私はこの

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Drawing; 
using Interop; 
using System.Runtime.InteropServices; 
using stdole; 
namespace QRCoder 
{ 
[Guid("52724C82-F18C-460B-B48D-1F19E016F86E")] 
[ComVisible (true) , InterfaceType(ComInterfaceType.InterfaceIsDual)] 
public interface IQRCodeGene 
{ 
    string Create(string text, QRCodeGenerator.ECCLevel value, int pixelsPerModule); 
} 
[Guid("4F445AA5-D642-438B-A69A-429D621A3CB0")] 
[ComVisible (true), ClassInterface(ClassInterfaceType.None)] 
    public class QRCodeGene: IQRCodeGene, IDisposable 
{ 
    private QRCodeGenerator Instance; 
    public QRCodeGene() 
    { 
     Instance = new QRCodeGenerator(); 
    } 
    public string Create(string text, QRCodeGenerator.ECCLevel value, int pixelsPerModule) 
    { 
     var qrCodeData = Instance.CreateQrCode(text, value); 
     var qrCode = new QRCode(qrCodeData); 
     var bitmap = qrCode.GetGraphic(pixelsPerModule); 
// This line is the only modified by the provided in the code above. 
     bitmap.Save("C:\\"+text+".bmp", System.Drawing.Imaging.ImageFormat.Bmp); 
//I return this string for testing. I guess If removed the text wouldn't work. 
     return ("Hello"); 
    } 
    public void Dispose() 
    { 
     Instance.Dispose(); 
    } 

} 
} 

上記のコードは、私がアクセスVBAでトラフにこの機能を送信する任意のQRコードを生成しました:

その後
Public Sub QR(Text As String) 
Dim QRC As New QRCodeGene 
Dim x As String 
x = QRC.Create(Text, ECCLevel_Q, 5) 

End Sub 

私はちょうどで生成された画像とaccess.imageコントロールを読み込みますソース。 このコードを提供してくれてありがとうございます。

1

クラスにデフォルトコンストラクタがないため、COMオブジェクトを作成できません。

VBAの使用方法:

Public Sub QRCreator(text As String) 
    Dim qrc As New QRCoder.QRCodeGenerator 
    Forms!Formulario1.[Oleobject].Picture = qrc.Create(text, CCLevel_Q, 5) 
End Sub 

むしろ、元のAPIを公開しようとするよりも、あなたはあなたのニーズにマッチする方法で単一のクラスを作成する必要があります。ネット:

[Guid("C7CC4CA0-813A-431E-B92C-842A07735E72")] 
[ComVisible(true), InterfaceType(ComInterfaceType.InterfaceIsIDispatch)] 
public interface _QRCodeGenerator { 

    public IStdPicture Create(string text, int cclevel, int pixelsPerModule); 

} 


[ProgId("QRCoder.QRCodeGenerator")] 
[Guid("4DC2C1F8-2727-4120-80E1-8475650D8547")] 
[ComVisible(true), ClassInterface(ClassInterfaceType.None)] 
[Description("...")] 
public class QRCodeGenerator : _QRCodeGenerator, IDisposable { 

    private QRCoder.QRCodeGenerator instance; 

    public QRCodeGenerator() { 
     instance = new QRCoder.QRCodeGenerator(); 
    } 

    public IStdPicture Create(string text, int cclevel, int pixelsPerModule){ 
     var qrCodeData = instance.CreateQrCode(text, cclevel); 
     var qrCode = new QRCoder.QRCode(qrCodeData); 
     var bitmap = qrCode.GetGraphic(pixelsPerModule); 
     return ImageToPicture(bitmap); 
    } 

    public void Dispose() { 
     instance.Dispose(); 
    } 

    private static IStdPicture ImageToPicture(Bitmap bitmap) { 
     ... 
    } 
} 
+0

IStdPcitureにビットマップを変換する必要はありますか?またはビットマップを直接使用できますか? –

+0

VBAはビットマップ形式をサポートしておらず、 '[Oleobject] .Picture'は' IPictureDisp'または 'IPictureDisp'インターフェースを実装するオブジェクトを必要とします。 –

+0

私は 'IpictureDisp'インターフェースを実装するためにどのライブラリを使うべきかを見つけることができません。私はいくつかのStdOle.dllへの参照を見つけました。プロジェクトの参照を追加してから、 'stdole;そして、この線を 'class _QRCodeGenerator:i_QRCodeGenerator、IDispatch'に変更しました。私はまだその曲線の赤い線xDを取得します。私はプログラミングでうまくいきません、私は道で学んでいます。 –

関連する問題