Страница: 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 и аналогично вставить в базу данных? Заранее благодарен за ответы!
Ответы
Всего ответов: 16
Номер ответа: 1
Автор ответа:
Администратор
ICQ: 278109632
Вопросов: 42
Ответов: 3949
Web-сайт:
Профиль | | #1
Добавлено: 28.05.08 18:35
А что, обязательно через буфер обмена винды?
Номер ответа: 2
Автор ответа: Abriel
Вопросов: 18
Ответов: 37
Профиль | | #2
Добавлено: 28.05.08 18:41
Желательно! Хотя... если возможно, назовите еще некоторые способы, плиз!
Номер ответа: 3
Автор ответа: Abriel
Вопросов: 18
Ответов: 37
Профиль | | #3
Добавлено: 28.05.08 18:44
Хотя бы, как возможно скопировать в буфер MyClass, чтобы прочитав все его свойства, я смог бы создать новый аналогичный Item в ListView...
Номер ответа: 4
Автор ответа:
Администратор
ICQ: 278109632
Вопросов: 42
Ответов: 3949
Web-сайт:
Профиль | | #4
Добавлено: 28.05.08 19:05
Ну преобразуй в XML и скопируй. Или регистрируй свой класс данных буфера.
Номер ответа: 5
Автор ответа: Abriel
Вопросов: 18
Ответов: 37
Профиль | | #5
Добавлено: 28.05.08 19:11
А если регистрирую свой класс данных буфера... то при вставке - Clipboard возвращает его как тип Object, как мне преобразовать его обратно в MyClass?
Номер ответа: 6
Автор ответа:
Администратор
ICQ: 278109632
Вопросов: 42
Ответов: 3949
Web-сайт:
Профиль | | #6
Добавлено: 29.05.08 00:23
на дотнете - не знаю
Да и не важно тебе, объект класса - он и в Африке объект класса.
Номер ответа: 7
Автор ответа: Abriel
Вопросов: 18
Ответов: 37
Профиль | | #7
Добавлено: 29.05.08 18:33
Ребята, ну подскажите, как копировать через буфер обмена винды, между 2-мя приложениями набор свойств (переменных) нужного объекта???
Номер ответа: 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 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
Номер ответа: 10
Автор ответа: Holsten
Вопросов: 5
Ответов: 100
Профиль | | #10
Добавлено: 29.05.08 20:00
ну кончено, если обьект поддерживает сериализацию, то как два байта перслать
Номер ответа: 11
Автор ответа: HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #11
Добавлено: 01.06.08 00:01
Вообще уж где-где, а пытаться сделать сериализацию объекта на вб6 имхо бредовая затея.
Holsten, не проверял твой пример, но думаю он копирует в буфер огромный кусок памяти, равный LanB(Class). Огромный всмысле со всеми функциями этом класее, короче там будет очено много лишнего. А сериализация это по сути просто упаковка private переменных, и затем востановления их. Так что на VB6 лучше самому сделать именно упаковку private переменных, а затем предусмотреть механизм инстализации этих переменных в классе.
Номер ответа: 12
Автор ответа: Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #12
Добавлено: 01.06.08 09:17
Что, правда что ли?
Номер ответа: 13
Автор ответа: Holsten
Вопросов: 5
Ответов: 100
Профиль | | #13
Добавлено: 01.06.08 11:11
Да не же, мой пример просто копирует две приватные long. И я его написал больше для того чтоб показать регистрацию своего формата буфера обмена.
Номер ответа: 14
Автор ответа: HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #14
Добавлено: 04.06.08 03:41
Я имею ввиду по размеру класса. Чем больше там методов будет, тем больше оно и копировать будет... Жаль васика нема, немогу проверить...
Номер ответа: 15
Автор ответа: Holsten
Вопросов: 5
Ответов: 100
Профиль | | #15
Добавлено: 04.06.08 05:52
Зачем копировать методы? Как ты сам написал