如何实现抽象 class 的接口是约束?
How to implement Interface to an abstract class which is constraint?
几天前,我尝试在 ms access vba 中使用(参考)一个没有界面的 QRCode 库 .net,但没有成功。所以我做了一些研究,这里的人指导了我。
所以我决定按照以下步骤制作界面
https://whoisburiedhere.wordpress.com/2011/07/12/creating-a-com-object-from-scratch-with-c/
我已经能够看到 intellisense 并创建其他 classess 的一些对象和变量,但是我遇到了 class 的问题,我在其中看到了 Dispose()但我无法在 ms 访问中使用新功能:
[Dim QRCD as New QRCode]
我收到一条错误消息,New 的使用无效,但我可以用以下行声明:
Dim QRCD as QRCode
[我认为那不是一个对象{如果我试图使它等于 QRData "That is no permited" 错误开始}] class 实现了一个抽象 class 有约束我我试图将接口放在抽象 class 中,如果我将它放在子 class 中,我会得到错误 "Does not implement the method" 我无法创建对象,也看不到任何方法与后期绑定。
QRCoder 库可以在这里找到。
https://github.com/codebude/QRCoder
这是提供的摘要 class。
{
using System;
public abstract class AbstractQRCode<T>
{
protected QRCodeData qrCodeData;
protected AbstractQRCode(QRCodeData data)
{
qrCodeData = data;
}
public abstract T GetGraphic(int pixelsPerModule);
}
}
这是实现它的子 class;它已经用界面修改了。不是所有的代码,但下面是几种方法,它们都称为 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);
}
这是示例代码(也提供)
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);
这是我在 VBA [这是一个模块]
中的代码
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
这是在另一个模块中[我使用这个模块创建带参数的对象]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
我如何修改它才能在 Microsoft Access 2013 中使用?
是另一种没有接口的方法吗?
access 是否支持 vba 中的位图?
我对所有这些东西都很陌生,非常感谢。
编辑:
我无法让它工作的原因是 COM VISIBLE 不支持带参数的构造函数和带覆盖的方法。那么答案就是我是如何创建这些图像的。
无法创建您的 COM 对象,因为 class 没有默认构造函数。与其尝试公开原始 API,不如创建一个 class 并使用符合您需要的方法:
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
.网:
[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) {
...
}
}
好吧,在检查、尝试和失败之后,我决定改变我的观点。所以我这样做了
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();
}
}
}
上面的代码生成了我在访问时通过此函数发送的任何内容的 QRCode VBA:
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 控制源生成的图片。
感谢 Florent B. 提供此代码。
几天前,我尝试在 ms access vba 中使用(参考)一个没有界面的 QRCode 库 .net,但没有成功。所以我做了一些研究,这里的人指导了我。 所以我决定按照以下步骤制作界面 https://whoisburiedhere.wordpress.com/2011/07/12/creating-a-com-object-from-scratch-with-c/
我已经能够看到 intellisense 并创建其他 classess 的一些对象和变量,但是我遇到了 class 的问题,我在其中看到了 Dispose()但我无法在 ms 访问中使用新功能:
[Dim QRCD as New QRCode]
我收到一条错误消息,New 的使用无效,但我可以用以下行声明:
Dim QRCD as QRCode
[我认为那不是一个对象{如果我试图使它等于 QRData "That is no permited" 错误开始}] class 实现了一个抽象 class 有约束我我试图将接口放在抽象 class 中,如果我将它放在子 class 中,我会得到错误 "Does not implement the method" 我无法创建对象,也看不到任何方法与后期绑定。 QRCoder 库可以在这里找到。 https://github.com/codebude/QRCoder 这是提供的摘要 class。
{
using System;
public abstract class AbstractQRCode<T>
{
protected QRCodeData qrCodeData;
protected AbstractQRCode(QRCodeData data)
{
qrCodeData = data;
}
public abstract T GetGraphic(int pixelsPerModule);
}
}
这是实现它的子 class;它已经用界面修改了。不是所有的代码,但下面是几种方法,它们都称为 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);
}
这是示例代码(也提供)
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);
这是我在 VBA [这是一个模块]
中的代码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
这是在另一个模块中[我使用这个模块创建带参数的对象]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
我如何修改它才能在 Microsoft Access 2013 中使用? 是另一种没有接口的方法吗? access 是否支持 vba 中的位图? 我对所有这些东西都很陌生,非常感谢。
编辑: 我无法让它工作的原因是 COM VISIBLE 不支持带参数的构造函数和带覆盖的方法。那么答案就是我是如何创建这些图像的。
无法创建您的 COM 对象,因为 class 没有默认构造函数。与其尝试公开原始 API,不如创建一个 class 并使用符合您需要的方法:
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
.网:
[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) {
...
}
}
好吧,在检查、尝试和失败之后,我决定改变我的观点。所以我这样做了
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();
}
}
}
上面的代码生成了我在访问时通过此函数发送的任何内容的 QRCode VBA:
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 控制源生成的图片。 感谢 Florent B. 提供此代码。