Необходим свой поиск

Программирование на Visual Basic for Applications
YanMinsk
Начинающий
Начинающий
 
Сообщения: 24
Зарегистрирован: 02.06.2009 (Вт) 1:09

Необходим свой поиск

Сообщение YanMinsk » 02.06.2009 (Вт) 1:12

Необходимо написать макрос осуществляющий поиск по заранее установленным правилам.
Из этого вопрос подскажите как сделать свою форму типа окна поиска.
Т.е. чтобы при ее запуске была возможность редактировать текст документа (UserForm1.Show не получается),но в тоже время окно должно быть всегда поверх текста.
И второе, при нахождении текста окно сдвигалось, если найденный текст под ним.
Короче надо сделать также как ведет себя окно поиска.

arvitaly
Постоялец
Постоялец
 
Сообщения: 485
Зарегистрирован: 12.04.2009 (Вс) 0:30
Откуда: Казань

Re: Необходим свой поиск

Сообщение arvitaly » 02.06.2009 (Вт) 1:19

Во 1 не в тот раздел

Во 2 ты не сказал в какой среде

В 3
Код: Выделить всё
userform1.ShowModal=False


Ну а двигать играться с top left в зависимости от того где(Excel,Word)

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Re: Необходим свой поиск

Сообщение Viper » 02.06.2009 (Вт) 8:08

YanMinsk писал(а):Необходимо написать макрос осуществляющий поиск по заранее установленным правилам....
А что сделал то уже?
Весь мир матрица, а мы в нем потоки байтов!

YanMinsk
Начинающий
Начинающий
 
Сообщения: 24
Зарегистрирован: 02.06.2009 (Вт) 1:09

Re: Необходим свой поиск

Сообщение YanMinsk » 02.06.2009 (Вт) 16:13

Не знаю, может я действительно не сюда написал.....

Пишу на Microsoft VisualBasic 6.3 тот, что стандартно входит в Ворд.

А ShowModal такого метода нет

viter.alex
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 221
Зарегистрирован: 27.07.2008 (Вс) 20:17
Откуда: Montreal

Re: Необходим свой поиск

Сообщение viter.alex » 02.06.2009 (Вт) 20:23

Да, метода ShowModal у формы нет, зато есть такое свойство, которое устанавливается на этапе проектирования. Ну или при вызове формы написать не просто UserForm1.Show, а поставить флаг 0. Т.е.
Код: Выделить всё
UserForm1.Show 0 'Форма будет немодальной. Т.е. редактирование текста будет доступно при открытой форме
UserForm1.Show 1 'Форма будет модальной. Т.е. редактирование текста будет не доступно при открытой форме. Этот режим стоит по умолчанию.

Чтобы расположить форму рядом с найденным текстом нужно воспользоваться методом GetPoint, который возвращает положение выделенного элемента в пикселах на экране, а также ширину и высоту выделения.
Код: Выделить всё
'Переменные для записи координат выделения, и его размеров.
    Dim pLeft As Long
    Dim pTop As Long
    Dim pWidth As Long
    Dim pHeight As Long
'Собственно сама запись в переменные значений выделения.
    ActiveWindow.GetPoint pLeft, pTop, pWidth, pHeight, Selection.Range


Положение формы устанавливается ее параметрами Top и Left. Это нужно делать после каждого поиска. Немного поколдуй с геометрией, чтобы форма никогда не залазила на выделение. Где-то у меня был пример кода, если найду выложу.
Лучше день потерять — потом за пять минут долететь!

arvitaly
Постоялец
Постоялец
 
Сообщения: 485
Зарегистрирован: 12.04.2009 (Вс) 0:30
Откуда: Казань

Re: Необходим свой поиск

Сообщение arvitaly » 03.06.2009 (Ср) 12:26

Может конечно у нас разные версии... Хатя басик 6.3
Вложения
shm.JPG
shm.JPG (88.39 Кб) Просмотров: 4000

YanMinsk
Начинающий
Начинающий
 
Сообщения: 24
Зарегистрирован: 02.06.2009 (Вт) 1:09

Re: Необходим свой поиск

Сообщение YanMinsk » 05.06.2009 (Пт) 20:32

Спасибо, огромное за подсказку.
Буду работать в этом направлении :)

YanMinsk
Начинающий
Начинающий
 
Сообщения: 24
Зарегистрирован: 02.06.2009 (Вт) 1:09

Re: Необходим свой поиск

Сообщение YanMinsk » 09.06.2009 (Вт) 0:13

viter.alex писал(а):Положение формы устанавливается ее параметрами Top и Left. Это нужно делать после каждого поиска. Немного поколдуй с геометрией, чтобы форма никогда не залазила на выделение. Где-то у меня был пример кода, если найду выложу.


Что-то никак не могу победить геометрию :( .

Код: Выделить всё
  ActiveWindow.GetPoint pLeft, pTop, pWidth, pHeight, Selection.Range
   
        l = UserForm1.Left
        t = UserForm1.Top
        w = UserForm1.Width
        h = UserForm1.Height


Всегда появляются какие-то поправочные коэфф. в зависимости от масштаба страница или положения текста на странице.

Никак не могу найти зависимость, если не трудно выложите код

viter.alex
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 221
Зарегистрирован: 27.07.2008 (Вс) 20:17
Откуда: Montreal

Re: Необходим свой поиск

Сообщение viter.alex » 09.06.2009 (Вт) 16:58

Выложу, как только до дома доберусь.
Лучше день потерять — потом за пять минут долететь!

YanMinsk
Начинающий
Начинающий
 
Сообщения: 24
Зарегистрирован: 02.06.2009 (Вт) 1:09

Re: Необходим свой поиск

Сообщение YanMinsk » 09.06.2009 (Вт) 20:31

Заранее спасибо, надеюсь долго не загуляете :D

YanMinsk
Начинающий
Начинающий
 
Сообщения: 24
Зарегистрирован: 02.06.2009 (Вт) 1:09

Re: Необходим свой поиск

Сообщение YanMinsk » 17.06.2009 (Ср) 11:18

To viter.alex
Видимо забыли про мою просьбу :(

viter.alex
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 221
Зарегистрирован: 27.07.2008 (Вс) 20:17
Откуда: Montreal

Re: Необходим свой поиск

Сообщение viter.alex » 17.06.2009 (Ср) 15:49

На самом деле просто винт у меня полетел, а там все, что нажито … Кроме фильмов, музыки и фоток.
Создай форму и пропиши в ней эту процедуру. В свойсвах формы поставь StartUpPosition=Manual, ShowModal=False:
Код: Выделить всё
Private Sub UserForm_Initialize()
  Dim pLeft As Long
  Dim pTop As Long
  Dim pWidth As Long
  Dim pHeight As Long
  Dim Xres As Long: Xres = System.HorizontalResolution
  Dim Yres As Long: Yres = System.VerticalResolution
 
'Собственно сама запись в переменные значений выделения.
  ActiveWindow.GetPoint pLeft, pTop, pWidth, pHeight, Selection.Range
  With Me
    'если форма помещается между выделением и нижним краем экрана
    If pTop + pHeight + .Height <= Yres Then
      'Располагаем форму по левому краю выделения сразу под ним.
      .Left = pLeft: .Top = pTop
    'Если форма не помещается под выделением, то размещаем ее над ним.
    ElseIf pTop - .Height > 0 Then
      .Left = pLeft: .Top = pTop - .Height
    End If
  End With
End Sub

Аналогично можно проанализировать помещается ли форма справа или слева выделения, только вместо верхней координаты выделения, его высоты и высоты формы нужно использовать левую координату выделения, его ширину и ширину формы.
Лучше день потерять — потом за пять минут долететь!

YanMinsk
Начинающий
Начинающий
 
Сообщения: 24
Зарегистрирован: 02.06.2009 (Вт) 1:09

Re: Необходим свой поиск

Сообщение YanMinsk » 18.06.2009 (Чт) 22:30

В принципе я так и делал,и по теории должно все работать но... тут появляются неточности (или я что-то не так делаю). Для эксперимента выделяю текст и подвожу под него форму и клик
Код: Выделить всё
Private Sub CommandButton7_Click()
      Dim pLeft As Long
      Dim pTop As Long
      Dim pWidth As Long
      Dim pHeight As Long
      Dim рр As Long
ActiveWindow.GetPoint pLeft, pTop, pWidth, pHeight, Selection.Range
hh = Me.Top + pHeight
End Sub


И вот, что интересно если выделенный текст был вверху окна(первая видимая строка, под верхней линейкой) и масштаб 100% то hh=pTop, если масштаб например 130 % то моя форма должна практически полностью перекрывать выделенный текст для того чтобы hh=pTop. Если же выделенный текст находится в середине окна, то даже при 100% для того чтобы hh=pTop, необходимо форму опустить вниз примерно на две строчки. Надеюсь изложил ясно. Из всего вышесказанного делаю вывод, что необходимо вводить в расчеты масштаб и положение выделенного текста относительно положения на экране. Вот это я и не могу осилить.

YanMinsk
Начинающий
Начинающий
 
Сообщения: 24
Зарегистрирован: 02.06.2009 (Вт) 1:09

Re: Необходим свой поиск

Сообщение YanMinsk » 18.06.2009 (Чт) 22:51

А для подгонки значений можно так. Тут pTop приблизно равно Me.Top + pHeight
Код: Выделить всё
Private Sub CommandButton7_Click()
 
          Dim pLeft As Long
          Dim pTop As Long
          Dim pWidth As Long
          Dim pHeight As Long
          Dim рр As Long
         
    ActiveWindow.GetPoint pLeft, pTop, pWidth, pHeight, Selection.Range
   
    While Me.Top + pHeight > pTop
      Me.Top = Me.Top - 0.1
    Wend

    While Me.Top + pHeight < pTop
      Me.Top = Me.Top + 0.1
    Wend

End Sub

YanMinsk
Начинающий
Начинающий
 
Сообщения: 24
Зарегистрирован: 02.06.2009 (Вт) 1:09

Re: Необходим свой поиск

Сообщение YanMinsk » 23.06.2009 (Вт) 1:59

Неужели никто не знает? :cry:
Как-то это же можно сделать.....

viter.alex
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 221
Зарегистрирован: 27.07.2008 (Вс) 20:17
Откуда: Montreal

Re: Необходим свой поиск

Сообщение viter.alex » 23.06.2009 (Вт) 8:16

А что Вам еще нужно? Форму за Вас нарисовать? Как расположить форму возле найденного текста вам объяснили. Что еще?
Лучше день потерять — потом за пять минут долететь!

GDK
Обычный пользователь
Обычный пользователь
 
Сообщения: 80
Зарегистрирован: 23.10.2008 (Чт) 16:15

Re: Необходим свой поиск

Сообщение GDK » 24.06.2009 (Ср) 13:48

А единицы измерения совпадают? В справке не судьба посмотреть? Или в "МСДН".

YanMinsk
Начинающий
Начинающий
 
Сообщения: 24
Зарегистрирован: 02.06.2009 (Вт) 1:09

Re: Необходим свой поиск

Сообщение YanMinsk » 29.06.2009 (Пн) 12:48

Точно, единицы измерения не те.
Спасибо, сразу не посмотрел :)
Поискал по форуму, но так нигде и не нашел. Как перевести пикселы в поинты?

viter.alex
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 221
Зарегистрирован: 27.07.2008 (Вс) 20:17
Откуда: Montreal

Re: Необходим свой поиск

Сообщение viter.alex » 29.06.2009 (Пн) 13:03

YanMinsk писал(а):…Поискал по форуму, но так нигде и не нашел. Как перевести пикселы в поинты?

Искать нужно было в справке.
Встроенная функция. Есть и обратная. Там их целый набор.
PixelsToPoints
Лучше день потерять — потом за пять минут долететь!

YanMinsk
Начинающий
Начинающий
 
Сообщения: 24
Зарегистрирован: 02.06.2009 (Вт) 1:09

Re: Необходим свой поиск

Сообщение YanMinsk » 30.06.2009 (Вт) 22:36

Всем огромное спасибо, то что надо


Вернуться в VBA

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7

    TopList