Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 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-сайт: domkratt.com
 Профиль | | #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-сайт: domkratt.com
 Профиль | | #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-сайт: domkratt.com
 Профиль | | #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 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 = _
            ;DataFormats.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-сайт: sharpc.livejournal.com
 Профиль | | #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
Зачем копировать методы? Как ты сам написал
сериализация это по сути просто упаковка private переменных

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам