Страница: 1 | 2 |
|
Вопрос: Copy Class to Clipboard
|
Добавлено: 28.05.08 18:28
|
|
Автор вопроса: Abriel
|
Здравствуйте! Помогите разобраться, как я могу сделать следующее на VB2005 (на подобии копирования файла в Проводнике): имеется класс MyClass с разными свойствами который соответствует определенному Item в ListView. При нажати кнопки "Копировать" - Item (вместе с MyClass) должен скопироваться в Clipboard. Также, при нажатии "Вставить" - Item (и MyClass определяющий дополнительные свойства Itemа) вставляется с Clipboard в ListView. Как это осуществить? Может возможно намного проще? И еще, как возможно скопировать Row в DB Access в Clipboard и аналогично вставить в базу данных? Заранее благодарен за ответы!
Ответить
|
Номер ответа: 8 Автор ответа: Holsten
Вопросов: 5 Ответов: 100
|
Профиль | | #8
|
Добавлено: 29.05.08 19:47
|
Вот, накорябал простой пример.
'форма
Option Explicit
Private Sub Command1_Click()
Dim cls As New Class1
cls.prop1 = 123
cls.prop2 = 456
cls.export
End Sub
Private Sub Command2_Click()
Dim cls As New Class1
cls.import
Debug. Print cls.prop1
Debug. Print cls.prop2
End Sub
-----------------------------
'класс
Option Explicit
Private Declare Function RegisterClipboardFormat Lib "user32" Alias "RegisterClipboardFormatA" ( ByVal lpString As String) As Long
Private Declare Function GetClipboardFormatName Lib "user32" Alias "GetClipboardFormatNameA" ( ByVal wFormat As Long, ByVal lpString As String, ByVal nMaxCount As Long) As Long
Private Declare Function SetClipboardData Lib "user32" ( ByVal wFormat As Long, ByVal hMem As Long) As Long
Private Declare Function GetClipboardData Lib "user32" ( ByVal wFormat As Long) As Long
Private Declare Function OpenClipboard Lib "user32" ( ByVal hwnd As Long) As Long
Private Declare Function CloseClipboard Lib "user32" () As Long
Private Declare Function GlobalAlloc Lib "kernel32" ( ByVal wFlags As Long, ByVal dwBytes As Long) As Long
Private Declare Function GlobalLock Lib "kernel32" ( ByVal hMem As Long) As Long
Private Declare Function GlobalUnlock Lib "kernel32" ( ByVal hMem As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Private Const GMEM_MOVEABLE = &H2
Private mvarprop1 As Long
Private mvarprop2 As Long
Public Property Let prop1( ByVal vData As Long)
mvarprop1 = vData
End Property
Public Property Get prop1() As Long
prop1 = mvarprop1
End Property
Public Property Let prop2( ByVal vData As Long)
mvarprop2 = vData
End Property
Public Property Get prop2() As Long
prop2 = mvarprop2
End Property
Sub export()
Dim fmt As Long
Dim hndl As Long
Dim btnum As Long 'ñêîëüêî áàéò çàíèìàþò âñå äàííûå â êëàññå
Dim lpCopy As Long
Dim op As Long
fmt = RegisterClipboardFormat("myclass1"
If Not CBool(OpenClipboard(0)) Then Exit Sub
btnum = LenB(mvarprop1) + LenB(mvarprop2)
hndl = GlobalAlloc(GMEM_MOVEABLE, btnum)
If Not CBool(hndl) Then
CloseClipboard
Exit Sub
End If
lpCopy = GlobalLock(hndl)
Call CopyMemory( ByVal lpCopy, ByVal VarPtr(mvarprop1), LenB(mvarprop1))
Call CopyMemory( ByVal lpCopy + LenB(mvarprop1), ByVal VarPtr(mvarprop2), LenB(mvarprop2))
GlobalUnlock (hndl)
SetClipboardData fmt, hndl
CloseClipboard
End Sub
Sub import()
Dim fmt As Long
Dim hndl As Long
Dim lpCopy As Long
fmt = RegisterClipboardFormat("myclass1"
If Not CBool(OpenClipboard(0)) Then Exit Sub
hndl = GetClipboardData(fmt)
If Not CBool(hndl) Then
CloseClipboard
Exit Sub
End If
lpCopy = GlobalLock(hndl)
Call CopyMemory(mvarprop1, ByVal lpCopy, LenB(mvarprop1))
Call CopyMemory(mvarprop2, ByVal lpCopy + LenB(mvarprop1), LenB(mvarprop2))
GlobalUnlock (hndl)
CloseClipboard
End Sub
Ответить
|
Номер ответа: 9 Автор ответа: Abriel
Вопросов: 18 Ответов: 37
|
Профиль | | #9
|
Добавлено: 29.05.08 19:52
|
Ого! Ну, не очень то и простой вариант и на VB6. В любом случае, благодарю за способ. А для VB2005 нашел вот в МСДН:
Option Explicit
Option Strict
Imports System
Imports System.Windows.Forms
Public Class MyClass1
Inherits Form
Private textBox1 As TextBox
Public Sub MyClipboardMethod()
' Creates a new data format.
Dim myFormat As DataFormats.Format = _
  ataFormats.GetFormat("myFormat"
' Creates a new object and store it in a DataObject using myFormat
' as the type of format.
Dim myObject As New MyNewObject()
Dim myDataObject As New DataObject(myFormat. Name, myObject)
' Copies myObject into the clipboard.
Clipboard.SetDataObject(myDataObject)
' Performs some processing steps.
' Retrieves the data from the clipboard.
Dim myRetrievedObject As IDataObject = Clipboard.GetDataObject()
' Converts the IDataObject type to MyNewObject type.
Dim myDereferencedObject As MyNewObject = _
CType(myRetrievedObject.GetData(myFormat. Name), MyNewObject)
' Print the value of the Object in a textBox.
textBox1.Text = myDereferencedObject.MyObjectValue
End Sub 'MyClipboardMethod
End Class 'MyClass
' Creates a new type.
<Serializable()> Public Class MyNewObject
Inherits Object
Private myValue As String
' Creates a default constructor for the class.
Public Sub New()
myValue = "This is the value of the class"
End Sub 'New
' Creates a property to retrieve or set the value.
Public Property MyObjectValue() As String
Get
Return myValue
End Get
Set
myValue = value
End Set
End Property
End Class 'MyNewObject
Ответить
|
Номер ответа: 13 Автор ответа: Holsten
Вопросов: 5 Ответов: 100
|
Профиль | | #13
|
Добавлено: 01.06.08 11:11
|
Да не же, мой пример просто копирует две приватные long. И я его написал больше для того чтоб показать регистрацию своего формата буфера обмена.
Ответить
|
Номер ответа: 15 Автор ответа: Holsten
Вопросов: 5 Ответов: 100
|
Профиль | | #15
|
Добавлено: 04.06.08 05:52
|
Зачем копировать методы? Как ты сам написал сериализация это по сути просто упаковка private переменных
Ответить
|
Страница: 1 | 2 |
Поиск по форуму