Loading [MathJax]/jax/output/CommonHTML/config.js
社区首页 >问答首页 >VB6中对象的分配

VB6中对象的分配
EN

Stack Overflow用户
提问于 2011-01-26 06:12:54
回答 3查看 23.6K关注 0票数 29

我试图通过赋值语句在VB6中创建两个相同的对象;

代码语言:javascript
代码运行次数:0
复制
Dim myobj1 As Class1
Dim myobj2 As Class1

Set myobj1 = New Class1
myobj1.myval = 1
Set myobj2 = myobj1

很明显,这不是创建两个对象,而是创建两个对同一个对象的引用,这不是我所追求的。有没有办法以这种方式创建第二个对象,还是必须一次复制一个对象.

代码语言:javascript
代码运行次数:0
复制
Set myobj2 = new Class1
myobj2.mem1 = myobj1.mem1
...

编辑2 Scott更新了他出色的答案,我已经将他的更改合并到了这个现在工作的代码片段中。

代码语言:javascript
代码运行次数:0
复制
Private Type MyMemento
     Value1 As Integer
     Value2 As String
End Type

Private Memento As MyMemento

Public Property Let myval(ByVal newval As Integer)
Memento.Value1 = newval
End Property

Public Property Get myval() As Integer
myval = Memento.Value1
End Property

Friend Property Let SetMemento(new_memento As MyMemento)
    Memento = new_memento
End Property

Public Function Copy() As Class1
     Dim Result As Class1
     Set Result = New Class1
     Result.SetMemento = Memento
     Set Copy = Result
End Function

然后执行代码中的赋值.

代码语言:javascript
代码运行次数:0
复制
Set mysecondobj = myfirstobj.Copy
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-01-26 06:43:30

与许多现代语言一样,VB6有值类型和引用类型。类定义引用类型。另一方面,您的基本类型(如Integer )是值类型。

基本的区别在于分配:

代码语言:javascript
代码运行次数:0
复制
Dim a as Integer
Dim b as Integer
a = 2
b = a
a = 1

结果是a为1,b为2,这是因为赋值类型的赋值会产生副本。这是因为每个变量都为堆栈上的值分配了空间(对于VB6,一个整数在堆栈上占用2个字节)。

对于类,它的工作方式不同:

代码语言:javascript
代码运行次数:0
复制
Dim a as MyClass
Dim b as MyClass
Set a = New MyClass
a.Value1 = 2
Set b = a
a.Value1 = 1

结果是a.Value1b.Value1都是1,这是因为对象的状态存储在堆中,而不是堆栈上。只有对对象的引用存储在堆栈上,因此Set b = a覆盖引用。有趣的是,VB6通过强制您使用Set关键字明确地说明了这一点。大多数其他现代语言都不需要这样做。

现在,您可以创建自己的值类型(在VB6中,它们被称为用户定义类型,但在大多数其他语言中,它们被称为结构或结构)。这是一个教程

类和用户定义类型(除了类是引用类型和UDT是值类型)之间的区别是,类可以包含UDT不能包含的行为(方法和属性)。如果您只是在寻找一个记录类型的类,那么UDT可能是您的解决方案。

您可以混合使用这些技术。假设您需要一个类,因为您有某些行为和计算,您希望将这些行为和计算与数据一起包括在内。您可以使用记忆模式在UDT中保存对象的状态:

代码语言:javascript
代码运行次数:0
复制
Type MyMemento
    Value1 As Integer
    Value2 As String
End Type

在类中,确保所有内部状态都存储在MyMemento类型的私有成员中。编写属性和方法,以便它们只使用该私有成员变量中的数据。

现在,创建对象的副本很简单。只需在类上编写一个名为Copy()的新方法,该方法将返回类的一个新实例,并使用它自己的备忘录副本初始化它:

代码语言:javascript
代码运行次数:0
复制
Private Memento As MyMemento

Friend Sub SetMemento(NewMemento As MyMemento)
    Memento = NewMemento
End Sub

Public Function Copy() as MyClass
    Dim Result as MyClass
    Set Result = new MyClass
    Call Result.SetMemento(Memento)
    Set Copy = Result
End Function

Friend只对项目之外的东西隐藏它,所以它对隐藏SetMemento子程序没有多大作用,但它是您使用VB6所能做的所有事情。

HTH

票数 41
EN

Stack Overflow用户

发布于 2011-06-26 12:07:06

@,我无法使您的代码工作,但如果它能工作,那就太棒了。

我已经创建了一个普通模块,我在其中输入了

代码语言:javascript
代码运行次数:0
复制
Type MyMemento
    Value1 As Integer
    Value2 As String
End Type

然后用代码创建一个名为MyClass的类模块

代码语言:javascript
代码运行次数:0
复制
Private Memento As MyMemento

Friend Sub SetMemento(NewMemento As MyMemento)
        Memento = NewMemento
End Sub

Public Function Copy() as MyClass
    Dim Result as MyClass
    Set Result = new MyClass
    Result.SetMemento(Memento)
    Set Copy = Result
End Function

最后,我尝试在另一个常规模块中调用复制函数,如下所示

代码语言:javascript
代码运行次数:0
复制
Sub Pruebas()
    Dim Primero As MyClass, segundo As MyClass
    Set Primero = New MyClass
    Set segundo = New MyClass
    Set segundo = Primero.Copy
End Sub

我得到的信息(下图):Error de编译程序: El tipo de agumento de ByRef

下面是一张图片(短于10点,下面是链接):http://i.stack.imgur.com/KPdBR.gif

我没能收到英文留言,我住在西班牙。

你能在VBA Excel中提供一个例子吗?我一直在努力使这个工作。

谢谢你的工作

===============================================

编辑:问题解决:

问题是在线"Result.SetMemento(Memento)",在VBA中它需要用“调用”来调用。

代码语言:javascript
代码运行次数:0
复制
Public Function Copy() As MyClass
    Dim Result As MyClass
    Set Result = New MyClass
    Call Result.SetMemento(Memento)
    Set Copy = Result
End Function

很好,谢谢斯科特惠特洛克,你是个天才

票数 3
EN

Stack Overflow用户

发布于 2011-01-26 06:20:53

或者我必须一次复制一个成员的对象..。

很不幸是的。

用C++编写COM服务器是可能的(但在技术上非常困难)--使用IDispatch接口--可以复制每个属性的值,但实际上这是高殿编程,如果我必须这样做,我不知道我是否可以这样做,但我需要看大约10天的工作(我知道COM是如何在C++中实现的,我还需要调查看看ATL框架是否有任何帮助等等)。

我在Vb3上工作了大约10年(一周5天,一周5天),除了手动实现像Mementos和Save&Store这样的序列化模式之外,我一直没有找到一个好的方法,这些模式实际上只是简单地归结为一次复制每个成员的奇妙方法。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4805475

复制
相关文章
一系列令人敬畏的.NET核心库,工具,框架和软件[通俗易懂]
原文地址:https://github.com/thangchung/awesome-dotnet-core
全栈程序员站长
2022/09/13
18.8K0
前后端分离项目模板
进入 demo-backend/src/main/resources 打开 application.yaml 文件修改数据源配置:
浪漫主义狗
2023/09/04
1880
前后端分离项目模板
Java 后端开发实践 - 项目模板
整理出一套公共性的项目模板,旨在尽量多地包含日常开发所需,减少开发者的重复性工作以及提供一些最佳实践。
芋道源码
2020/12/08
6480
Java 后端开发实践 - 项目模板
Blazor资源大全,很棒的Blazor(1)
Blazor允许您使用C#而不是JavaScript构建交互式Web用户界面。Blazor应用程序由使用C#、HTML和CSS实现的可重用的Web用户界面组件组成。客户端和服务器代码都是用C#编写的,允许您共享代码和库。 更多信息请参阅官方Blazor网站[22]。
用户10786849
2023/10/13
5660
Blazor资源大全,很棒的Blazor(1)
创建API服务最小只要4行代码!!!尝新体验ASP.NET Core 6预览版本中的最小Web API(minimal APIS)新特性
本文首发于《创建API服务最小只要4行代码!!!尝新体验ASP.NET Core 6预览版本中的最小Web API(minimal APIS)新特性》
Rector
2021/08/19
5.2K0
创建API服务最小只要4行代码!!!尝新体验ASP.NET Core 6预览版本中的最小Web API(minimal APIS)新特性
后端开发实践:Spring Boot项目模板
在我的工作中,我从零开始搭建了不少软件项目,其中包含了基础代码框架和持续集成基础设施等,这些内容在敏捷开发中通常被称为“第0个迭代”要做的事情。但是,当项目运行了一段时间之后再来反观,我总会发现一些不足的地方,要么测试分类没有分好,要么基本的编码架子没有考虑周全。
Java团长
2019/07/19
1.6K0
后端开发实践:Spring Boot项目模板
React项目配置6(前后端分离如何控制用户权限)
本教程总共6篇,每日更新一篇,请关注我们!你可以进入历史消息查看以往文章,也敬请期待我们的新文章! 1、React项目配置1(如何管理项目公共js方法)---2018.01.11 2、React项目配置2(自己封装Ajax)---2018.01.12 3、React项目配置3(如何管理项目API接口)---2018.01.15 4、React项目配置4(如何在开发时跨域获取api请求)---2018.01.16 5、React项目配置5(引入MockJs,实现假接口开发)---2018.01.17 6、R
前端人人
2018/04/11
1.6K0
Rainbond 中Vue、React项目如何调用后端接口
通常我们会在项目的全局配置文件.env.production中直接写入后端ip,例如:
曾庆国
2020/11/19
1.5K0
.NET Core快速入门教程 3、我的第一个.NET Core App (CentOS篇)
一、前言 本篇开发环境? 1、操作系统:CentOS7(因为ken比较偏爱CentOS7) 2、SDK版本:.NET Core 2.0 Preview 你可能需要的前置知识 1、了解如何通过Hyper-V安装CentOS虚拟机 2、了解CentOS7基础命令/常用命令 二、安装 .NET Core SDK 1、安装必要依赖 sudo yum -y install libunwind libicu 2、下载(SDK列表) cd /home/downloads curl -sSL -o dotnet-
KenTalk
2018/09/11
1.6K0
.NET Core快速入门教程 2、我的第一个.NET Core App(Windows篇)
一、前言 本篇开发环境? 1、操作系统: Windows 10 X64 2、SDK: .NET Core 2.0 Preview 二、安装 .NET Core SDK 1、下载 .NET Core 下载地址:https://www.microsoft.com/net/download/core 根据自己电脑情况选择对应版本即可 .NET CORE 2.0下载地址:https://aka.ms/dotnet-sdk-2.0.0-preview2-win-x64 2、安装 微软出品,一键安装,只需一步,看图
KenTalk
2018/09/11
1.6K0
.NET Core快速入门教程 2、我的第一个.NET Core App(Windows篇)
后端开发实践系列——Spring Boot项目模板
在我的工作中,我从零开始搭建了不少软件项目,其中包含了基础代码框架和持续集成基础设施等,这些内容在敏捷开发中通常被称为“第0个迭代”要做的事情。但是,当项目运行了一段时间之后再来反观,我总会发现一些不足的地方,要么测试分类没有分好,要么基本的编码架子没有考虑周全。
好好学java
2019/12/05
4390
后端开发实践系列——Spring Boot项目模板
别了,JavaScript;你好,Blazor
Web开发与JavaScript开发向来是同义词。直到WebAssembly的横空出世,WebAssembly (Wasm)是一种在浏览器中可以执行的二进制指令。 WebAssembly 的 官方工具链 能够编译 C/C++ 代码,但许多社区也提供了不同语言的编译器,如 Rust,Python,Java 和 Blazor(C#)。特别是 Rust 社区非常活跃,可以开始看到完整的前端框架,如 Yew 和 Dodrio,这为基于浏览器的应用带来了更多新的可能性,只要测试一些使用 WebAssembly 构建的优秀应用,就可知道基于浏览器的近乎原生的应用现在已经成为现实,例如 Sketchup 或 Magnum。
张善友
2020/06/19
3.1K0
别了,JavaScript;你好,Blazor
ApiTemplate:.net后端项目模板完善与总结
ApiTemplate后端项目开发模板,发布也有一段时间了。为了补充应用场景,以及详细说明本人总结的一些开发经验,现已常见的《用户/登录权限验证》功能模块来进行详细的讲解。我会以为开发此模拟的实现路径为主线进行说明,希望能帮助到某些开发朋友。
sam dragon
2020/06/29
5030
ApiTemplate:.net后端项目模板完善与总结
.NET周报【1月第3期 2023-01-20】
https://www.cnblogs.com/InCerry/p/building-a-self-contained-game-in-c-under-8-kilobytes-74c3cf60ea04.html
InCerry
2023/03/08
4.8K0
.NET周报【1月第3期 2023-01-20】
使用.NET Core+Docker 开发微服务
.NET Core发布很久了,因为近几年主要使用java,所以还没使用过.NET Core,今天正好有一个c#写的demo,需要做成服务,不想再转成java来实现,考虑使用.NET CORE来尝下鲜,目标是开发一个微服务,然后部署到Docker swarm集群,供其他应用调用。
JadePeng
2018/09/27
3.2K0
使用.NET Core+Docker 开发微服务
【周一通勤电台 · 特辑】六千字漫谈2022后端框架流行趋势
这篇文章基于我对后端框架的了解以及研究,提供了2021-2022年度以及未来一年内可能流行的后台框架。
翊君
2022/03/15
4.4K0
【周一通勤电台 · 特辑】六千字漫谈2022后端框架流行趋势
Meteor React Native 项目模板更新啦!
之前Spencer Carli曾发布了Meteor+React Native的项目模板,这个模板发布已经有3个多月了,并且有一些过时。作者最近重新构思了这个模板,让它更适合实际的项目而不仅仅是一个De
时见疏星
2018/06/01
9040
.NET周报 【6月第4期 2023-06-25】
https://www.cnblogs.com/eventhorizon/p/17497359.html
InCerry
2023/08/31
2980
.NET周报 【6月第4期 2023-06-25】
《从零开始学ASP.NET CORE MVC》:VS2019创建ASP.NET Core Web程序(三)
步骤1:在Visual Studio 2019中创建新的asp.net Core项目
角落的白板报
2019/05/05
3.9K0
《从零开始学ASP.NET CORE MVC》:VS2019创建ASP.NET Core Web程序(三)
《从零开始学ASP.NET CORE MVC》:VS2017创建ASP.NET Core Web程序(三)
步骤1:在Visual Studio 2017中创建新的asp.net Core项目
角落的白板报
2019/05/05
2.8K0
《从零开始学ASP.NET CORE MVC》:VS2017创建ASP.NET Core Web程序(三)

相似问题

DateTime与时间戳的比较

12

比较DateTime unix时间戳

10

无法将datetime.datetime与int进行比较;将datetime与unix时间戳进行比较

10

.Net DateTime.Now与PostgreSQL时间戳比较

319

MySQL:比较datetime和时间戳

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文