powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / undo
51 сообщений из 51, показаны все 3 страниц
undo
    #37183134
undote
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Приветствую.

Есть код:
Код: plaintext
1.
Me.Text0.SetFocus
SendKeys "^{z}"
который возвращает полностью то состояние записи, которое было сохранено до новых изменений.
А как можно сделать, чтобы undo работала как в Ворде , т.е. возвращала запись пошагово до прежнего состояния?
...
Рейтинг: 0 / 0
undo
    #37183499
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
undote,

Конечно. Сохраняйте все промежуточные значения.
...
Рейтинг: 0 / 0
undo
    #37183518
undote
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Proundote,

Конечно. Сохраняйте все промежуточные значения.А подробнее с кодом?
...
Рейтинг: 0 / 0
undo
    #37183530
Фотография VSVLAD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Например: создать массив который будет хранить стринг, и при каждом событии TextBox_Change - добавлять новый элемент и записывать значение текстового поля. при отмене действия - идти обратно по массиву и брать нужные элементы.

отмену лучше делать так:
Код: plaintext
1.
2.
3.
4.
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Const EM_UNDO = &HC7

'Use
SendMessage Text1.hWnd, EM_UNDO, &H0, &H0
...
Рейтинг: 0 / 0
undo
    #37183689
undote
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
VSVLADНапример: создать массив который будет хранить стринг, и при каждом событии TextBox_Change - добавлять новый элемент и записывать значение текстового поля. при отмене действия - идти обратно по массиву и брать нужные элементы.

отмену лучше делать так:
Код: plaintext
1.
2.
3.
4.
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Const EM_UNDO = &HC7

'Use
SendMessage Text1.hWnd, EM_UNDO, &H0, &H0
Есть функция Функция GUIDFromString преобразует текстовую строку в код GUID, который является массивом типа Byte.
Вы это имеете ввиду?
...
Рейтинг: 0 / 0
undo
    #37183701
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
undote,

нет, не это

у вас хотя бы начальные знания есть по VB? или по нулям?
...
Рейтинг: 0 / 0
undo
    #37183709
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
короче, как-то так
...
Рейтинг: 0 / 0
undo
    #37183710
undote
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Proundote,

нет, не это

у вас хотя бы начальные знания есть по VB? или по нулям?Небольшие.
Речь идет о БД на Аксессе.
...
Рейтинг: 0 / 0
undo
    #37183711
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
undoteРечь идет о БД на Аксессе.
это надо было писать:
а) в первом посте
б) в форуме по аксессу

ну да ладно - см. мой пример - переделывай под свои нужды
...
Рейтинг: 0 / 0
undo
    #37183723
undote
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Proкороче, как-то такРугается на Undo() As String

Пишет:
"Compile error:
Member already exists in an object module from which this object module derives"
...
Рейтинг: 0 / 0
undo
    #37183741
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
undoteShocker.Proкороче, как-то такРугается на Undo() As String

Пишет:
"Compile error:
Member already exists in an object module from which this object module derives"

Ну назовите его Undodo, какая разница
...
Рейтинг: 0 / 0
undo
    #37183758
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот для аксесса вариант
там есть мелкое изменение
...
Рейтинг: 0 / 0
undo
    #37183778
undote
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Proвот для аксесса вариант
там есть мелкое изменениеНе могу открыть Ваш файл. Пишет, что невозможно открыть файл из-за возможных проблем с безопасностью...
Может лучше его заархивировать, а затем прикрепить к сообщению?
Спасибо.
...
Рейтинг: 0 / 0
undo
    #37183783
Фотография VSVLAD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Разрешите скачивать файл если пользуетесь IE. Разрешите доступ к макросам в настройке безопасности Access
...
Рейтинг: 0 / 0
undo
    #37183784
undote
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сейчас открылся - пришлось его сначала заархивировать, а затем открыть из архива.
Спасибо, работает. Буду разбираться.
...
Рейтинг: 0 / 0
undo
    #37184499
sizesub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Приветствую.

Осталась еще одна проблема, как заставить курсор следовать за "undo"
Можно, конечно сделать что-то вроде:
Код: plaintext
1.
Me.Text0.SelStart = pos -  1 
pos = Me.Text0.SelStart
Но это будет работать только в одну сторону.
А если нужно и влево и вправо вперемешку?
...
Рейтинг: 0 / 0
undo
    #37184585
timtim
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sizesub,

Код: plaintext
Len
?
...
Рейтинг: 0 / 0
undo
    #37184598
Фотография VSVLAD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пусть массив будет хранить структуру, в которой также будет сохраняться позиция символа.
Код: plaintext
1.
2.
3.
4.
Private Type uUNDO_STR
     sText As String
     iCursorPos As Long
End Type
...
Рейтинг: 0 / 0
undo
    #37185015
sizesub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
VSVLADПусть массив будет хранить структуру, в которой также будет сохраняться позиция символа.
Код: plaintext
1.
2.
3.
4.
Private Type uUNDO_STR
     sText As String
     iCursorPos As Long
End Type

Так... понимаю... А как мне правильно записать iCursorPos с функцией UBound, которая используется в примере от Shocker.Pro ?
...
Рейтинг: 0 / 0
undo
    #37185259
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sizesub,

Точно так же, как и сохранение текста в этот же момент.

Но есть нюанс. будет сохраняться та позиция курсора, которая возникла ПОСЛЕ редактирования. Чтобы сделать сохранение позиции ДО изменения, придется усложнить код, отслеживать действия пользователя с клавиатуры и мыши.
...
Рейтинг: 0 / 0
undo
    #37185716
sizesub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Prosizesub,

Точно так же, как и сохранение текста в этот же момент.

Но есть нюанс. будет сохраняться та позиция курсора, которая возникла ПОСЛЕ редактирования. Чтобы сделать сохранение позиции ДО изменения, придется усложнить код, отслеживать действия пользователя с клавиатуры и мыши.Что-то не могу сообразить, как это записать. С текстом понятно. Но как с курсором быть, пока не понятно...
...
Рейтинг: 0 / 0
undo
    #37185722
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sizesubЧто-то не могу сообразить, как это записать. С текстом понятно. Но как с курсором быть, пока не понятно...
позиция курсора - .SelStart
...
Рейтинг: 0 / 0
undo
    #37185790
sizesub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.ProsizesubЧто-то не могу сообразить, как это записать. С текстом понятно. Но как с курсором быть, пока не понятно...
позиция курсора - .SelStartЭто я знаю.
Тут была попытка учесть позицию курсора:
...
Рейтинг: 0 / 0
undo
    #37185795
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sizesubЭто я знаю.
После этого был совет от VSVLAD - он реализован?
...
Рейтинг: 0 / 0
undo
    #37185838
sizesub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.ProsizesubЭто я знаю.
После этого был совет от VSVLAD - он реализован?Нет, пока не понимаю как...
...
Рейтинг: 0 / 0
undo
    #37185850
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sizesubНет, пока не понимаю как...

Как работает мой код, ты понимаешь или нет?

Ты определись: если хочешь разобраться и научиться - это одно.
Если хочешь, чтобы за тебя все сделали - так и скажи, мол разбираться не хочу, сделайте мне. Как правило, кто-то делает, когда такой простой пример.
...
Рейтинг: 0 / 0
undo
    #37185927
sizesub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.ProsizesubНет, пока не понимаю как...

Как работает мой код, ты понимаешь или нет?

Ты определись: если хочешь разобраться и научиться - это одно.
Если хочешь, чтобы за тебя все сделали - так и скажи, мол разбираться не хочу, сделайте мне. Как правило, кто-то делает, когда такой простой пример.Конечно, хочу разобраться.
В Вашем примере используется функция UBound для работы с массивами.
Синтаксис:
UBound(arrayname[, dimension])

Если функция возвращает 0, то ничего не происходит, иначе запоминаются все шаги изменения.

Как мне запомнить изменение положения курсора, чтобы он двигался в нужную сторону, я пока не понимаю.
...
Рейтинг: 0 / 0
undo
    #37185963
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нужно запоминать позицию курсора, в которой он был ДО того момента, как произошли изменения. Для этого надо отслеживать события клавиатуры и мыши KeyUp, MouseUp и запоминать позицию курсора в какой-то временной переменной. Как только возникает событие Change, в массив вместе с новым значением текста заносить и позицию курсора. А при откате - восстанавливать.
...
Рейтинг: 0 / 0
undo
    #37186082
sizesub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.ProНужно запоминать позицию курсора, в которой он был ДО того момента, как произошли изменения. Для этого надо отслеживать события клавиатуры и мыши KeyUp, MouseUp и запоминать позицию курсора в какой-то временной переменной. Как только возникает событие Change, в массив вместе с новым значением текста заносить и позицию курсора. А при откате - восстанавливать.Так, хорошо...
Такой вопрос, как мне записать в массив вместе с текстом позицию курсора?
Синтаксис...
...
Рейтинг: 0 / 0
undo
    #37186121
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: sizesub
> Такой вопрос, как мне записать в массив вместе с текстом позицию курсора?


Как обычно:
Код: plaintext
1.
arrPositionCursor(IndexFirstFreeElement) = txt.SelStart
arrTextCursor(IndexFirstFreeElement) = txt.Text


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
undo
    #37186165
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sizesubТак, хорошо...
Такой вопрос, как мне записать в массив вместе с текстом позицию курсора?
Синтаксис...

С помощью оператора присваивания: "="

Я ж спросил - понятно, как работает мой код? Ответ был "понятно".
VSVLAD предложил использовать структуры (Type в синтаксисе VB), ответ был "Так... понимаю."
Можно использовать и два массива, как предлолжил Игорь.

Что сейчас-то вопросы вызывает? Давай все-таки определись, может все-таки учебник почитать про то, что такое массивы и вообще по основам синтаксиса? "Хочу разобраться"...
...
Рейтинг: 0 / 0
undo
    #37186350
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Shocker.Pro
> Можно использовать и два массива, как предлолжил Игорь.

Я не предлагал
я дал кусочек кода иллюстрирующий как присваивать данные

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
undo
    #37186378
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Игорь Горбонос


Сбили меня тут. Я хотел сказать, что для себя я "завернул" это все в класс и использовал бы его. Навернул бы его
подпиской на интересующие события нужного контрола и регистрировал все в них, наружу выставил бы только методы Undo и
Redo, добавил бы ещё необязательный параметр количества отменяемых шагов(если нужно)

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
undo
    #37186911
sizesub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.ProЧто сейчас-то вопросы вызывает?
Пытаюсь попробовать вариант с двумя массивами:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
Option Compare Database
Option Explicit

Dim Undoing As Boolean
Dim arrText() As String
Dim arrCurs() As String

Private Sub Form_Load()

ReDim arrText( 0 )
arrText( 0 ) = Me.Text0

ReDim arrCurs( 0 )
arrCurs( 0 ) = Me.Text0.SelStart

End Sub


Private Sub Label2_Click()

If UBound(arrText) =  0  Then
  Beep

Else
  ReDim Preserve arrText(UBound(arrText) -  1 )
  
  ReDim Preserve arrCurs(UBound(arrCurs) -  1 )
  
  Undoing = True
  
  Me.Text0 = arrText(UBound(arrText))
  
  Me.Text0.SelStart = arrCurs(UBound(arrCurs))

  Undoing = False
  
End If


End Sub

Private Sub Text0_Change()

If Undoing Then Exit Sub

ReDim Preserve arrText(UBound(arrText) +  1 )
arrText(UBound(arrText)) = Me.Text0.Text

ReDim Preserve arrCurs(UBound(arrCurs) +  1 )
arrCurs(UBound(arrCurs)) = Me.Text0.SelStart

End Sub

Частично работает. Что тут неправильно?
...
Рейтинг: 0 / 0
undo
    #37187084
Ципихович Эндрю
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sizesub, этой строкой
Option Compare Database
что делается?
...
Рейтинг: 0 / 0
undo
    #37187085
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sizesubЧастично работает. Что тут неправильно?

Почему ты определил второй массив как строковой?
Это неправильно, но на функционал в данном случае не влияет.

10434216
10431856
...
Рейтинг: 0 / 0
undo
    #37187110
хе-хе-хе
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Автору уже дали интересное решение с коллекциями. И совершенно непонятно, почему он им пренебрег
undo
...
Рейтинг: 0 / 0
undo
    #37187220
sizesub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.ProsizesubЧастично работает. Что тут неправильно?

Почему ты определил второй массив как строковой?
Это неправильно, но на функционал в данном случае не влияет.Да, в этом было все дело. Сейчас все хорошо работает.
Единственное, после того, как последнее изменение было возвращено, курсор убегает в начало текста, а не остается рядом с последним возвращенным знаком.
...
Рейтинг: 0 / 0
undo
    #37187226
sizesub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
хе-хе-хеАвтору уже дали интересное решение с коллекциями. И совершенно непонятно, почему он им пренебрег
undo Не пренебрегает, а хочет попробовать и другие способы решения.
...
Рейтинг: 0 / 0
undo
    #37195864
sizesub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.

В продолжении темы.

Подскажите, как решить обратную задачу - REDO?

Спасибо.
...
Рейтинг: 0 / 0
undo
    #37195887
Ципихович Эндрю
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sizesub, так а Вы решили undo? Выложите код пожалуйста, а в чём трудность наоборот?
...
Рейтинг: 0 / 0
undo
    #37195894
sizesub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ципихович Эндрюsizesub, так а Вы решили undo? Выложите код пожалуйста, а в чём трудность наоборот?Так рабочий код выложен - смотрите выше.

Как после undo сделать redo, пока не могу сообразить.
Вы знаете как?
...
Рейтинг: 0 / 0
undo
    #37195938
Ципихович Эндрю
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sizesub, рабочий код выложен - смотрите выше - там много чего выложено, где именно дата, время сообщения в котором выложен???
...
Рейтинг: 0 / 0
undo
    #37195979
sizesub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ципихович Эндрюsizesub, рабочий код выложен - смотрите выше - там много чего выложено, где именно дата, время сообщения в котором выложен???
код
...
Рейтинг: 0 / 0
undo
    #37195990
Ципихович Эндрю
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sizesub, форма на ней лейбл2, так?, а что такое Text0 TextBox????
...
Рейтинг: 0 / 0
undo
    #37195996
sizesub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ципихович Эндрюsizesub, форма на ней лейбл2, так?, а что такое Text0 TextBox????Да, TextBox
...
Рейтинг: 0 / 0
undo
    #37196023
Ципихович Эндрю
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sizesub, у меня на этой строке:
ReDim Preserve arrText(UBound(arrText) + 1) ошибка 9 и я Васспрашивал не знаю, что делает строка
Option Compare Database её выделяет красным её я заремарчил
...
Рейтинг: 0 / 0
undo
    #37196029
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sizesub,

Рекомендую не поддерживать разговор с местным клоуном, дабы не плодить бессмысленные посты.
Модератору же предлагаю быть последовательным.


По сути вопроса - надо просто не уменьшать размер массива в момент Undo, а вместо Ubound завести переменную - указатель на массив, который будет определять текущее положение состояния отмены. Тогда передвигать этот указатель можно будет как назад (Undo), так и вперед (Redo).
...
Рейтинг: 0 / 0
undo
    #37196053
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем - вот так.
Я модифицировал свой собственный первоначальный пример (без позиционирования курсора)
...
Рейтинг: 0 / 0
undo
    #37196067
Ципихович Эндрю
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro, спасибо, лично мне всё понятно:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
Option Explicit

Dim Undo1() As String
Dim Undoing As Boolean
Dim Pointer As Integer


Private Sub Form_Load()

ReDim Undo1( 0 )
Undo1( 0 ) = Me.Text1
Pointer =  0 

End Sub
Private Sub Text1_Change()

If Undoing Then Exit Sub
Pointer = Pointer +  1 
If Pointer > UBound(Undo1) Then
  ReDim Preserve Undo1(Pointer)
End If
Undo1(Pointer) = Me.Text1.Text

End Sub
Private Sub Command1_Click()

If Pointer =  0  Then
  Beep
Else
  Pointer = Pointer -  1 
  Undoing = True
  Me.Text1 = Undo1(Pointer)
  Undoing = False
End If

End Sub
Private Sub Command2_Click()

If Pointer = UBound(Undo1) Then
  Beep
Else
  Pointer = Pointer +  1 
  Undoing = True
  Me.Text1 = Undo1(Pointer)
  Undoing = False
End If

End Sub
...
Рейтинг: 0 / 0
undo
    #37196076
sizesub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

Спасибо.
...
Рейтинг: 0 / 0
51 сообщений из 51, показаны все 3 страниц
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / undo
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]