Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB6 > Текст: Как "снять" слово с текста на метке


Автор: Сувор 23.10.2004, 13:44
Label1.Caption =длинный текст
Я хочу щелкнуть на каком-то слове и получить его. Как? - Я конечно могу снять координаты мыши, но ширина-то букв разная и, кроме того, автоматические переносы! -С ума свихнешся пересчитывать! С другой стороны очень многие программы это умеют. Нет ли для этого какой спец.функции? Спасиба!

Автор: -Mikle- 23.10.2004, 19:14
Вряд ли они это делают с Label'ом... лучше использовать для этого TextBox...
Тебе для какой цели надо это? Объясни, найдем чего-нить...:)

Автор: Сувор 24.10.2004, 11:19
TextBox так TextBox! Просто я где-то читал что при отсутствии нужды всегда лучше пользовать label. А цель -показать перевод или, может, установить плеер на это место.

Автор: -Mikle- 24.10.2004, 12:35
Цитата
Просто я где-то читал что при отсутствии нужды всегда лучше пользовать label

Конечно лучше! Label ведь менее ресурсоемкий, чем TextBox. Но ведь нужда в использовании TextBox есть, с ним это сделать проще... Ну или можешь пересчитывать все положения слов в Label :)

Автор: Guest 24.10.2004, 16:54
Конечно ,если постараться можно и гвоздь забить в стену шляпкой вперед.

Автор: ~FoX~ 25.10.2004, 13:13
1. Определять координаты каждого слова, как предложил -Mikle-
2. Опять же как предложил -Mikle- сипользовать текстбокс или мемо
3. Разбивать строку на слова и каждое слово запихивать в отдельный лэйбл (естственно лэблы строить run-time).

Цитата

С другой стороны очень многие программы это умеют.

В этих программах слова (сокрее всего) есть отделтные компаненты со своими свойствами, методами и событиями. Более того в большенстве программ слово, строка, обзац и т.д. есть также объекты не имеющие ни какого отношения к лэблам!

Автор: Сувор 26.10.2004, 09:54
Ничего не имею против перехода к TextBox! (про label я просто так к слову вякнул) -- Но, как сделать-то? С текстбоксом?
А про программы -я имел в виду переводчик Stylus в частности. Там открываешь текст из любого документа (ну правда конвертацию он делает вроде бы) и при подводе мышки появляется перевод. Как-то я был бы резко удивлен если бы каждое слово или даже строка были отдельными обьектами!

Автор: ~FoX~ 26.10.2004, 10:10
Сувор
А ты попробуй покодить на ВБА в ворде и поймешь, что к чему - там обзац - объект, слово - объек, даже буква объект.

По сабжу:
Split тебе поможет аминь :D

Автор: Staruha 26.10.2004, 19:39
Может тебе просто ListBox нужен?

Автор: -Mikle- 26.10.2004, 20:06
Цитата

А ты попробуй покодить на ВБА в ворде и поймешь, что к чему

точно... я как-то давно писал свой контрол, который выводил текст в форматированом виде, и делал без объектов, в массиве хранил структуру параметров слова... :)
потом потом попытался добавить туда всплывающие подсказки, при наведении на определенное слово, потом захотел сделать события, которые возникают при нажатии на слово, потом мне захотелось чтобы каждое слово имело свой индент... и короче получился такой запутанный код, что уследить за его логикой даже мне было уже сложно :) соответственно проглядеть все возможные ошибки тоже оказалось уже сложным :) и пришел я к выводу: что надо это все похерить, и сделать класс для слова :) которые собрать потом в коллекции...

Цитата
Как-то я был бы резко удивлен если бы каждое слово или даже строка были отдельными обьектами!

Просто ты представляешь себе это как нечто большое, жрущее ресурсы и громоздкое :)
На самом деле все намного компактнее...

PS: Ой... что-то я кажется уже флейм пишу... пива напился блин... сорри... :stena

Автор: -Mikle- 26.10.2004, 20:52
Цитата

Ничего не имею против перехода к TextBox! (про label я просто так к слову вякнул) -- Но, как сделать-то? С текстбоксом?

Например так:
Код
Private Sub Text1_Click()
  MsgBox GetWord(Text1.Text, Text1.SelStart)
End Sub

Function GetWord(Expr As String, pos As Long) As String
  Const DELIMITERS = " ,.?!@#$%^&:;'""()+-*/\=~" & vbCrLf & vbTab
  Dim bw As Long, ew As Long
  Dim ls As Long
 
  For i = pos To 1 Step -1
     If InStr(1, DELIMITERS, Mid$(Expr, i, 1)) Then Exit For
  Next
  bw = IIf(i < 1, 1, i + 1)
 
  ls = Len(Expr)
  For i = bw To ls
     If InStr(1, DELIMITERS, Mid$(Expr, i, 1)) Then Exit For
  Next
  ew = IIf(i > ls, ls + 1, i)
 
  If bw <= ew Then
     GetWord = Mid$(Expr, bw, ew - bw)
  Else
     GetWord = ""
  End If
End Function


Автор: Staruha 26.10.2004, 21:56
А может попроще ,а?
Код
Private Sub Text1_Click()
Text2.Text = Text1.SelText
End Sub

Здесь выделенное ручками слово отражается в другом Text2.
Остается выделить программно типа сосчитать сколько символов от курсора до пробела.

Автор: -Mikle- 27.10.2004, 06:59
а не то же самое сделал что ли? :)
просто не выделяю, а работаю с переменной... зачем выделять? для этого есть ф-ия Mid$
Цитата

Остается выделить программно типа сосчитать сколько символов от курсора до пробела

ты кинь сюда свой вариант, который считает все это, при этом разделитель может быть не только пробел, как в моем варианте, и позиция курсора может оказаться внутри подрят идущих разделителей ("Hello!!!!!" между восклицательными знаками например). В этой ф-ии я учел все варианты положения курсора, также когда слово последнее, и после него не идет никаких разделителей... или первое, перед ним нет разделителей не думаю что твой вариант будет меньше по кол-ву строк :)

Автор: -Mikle- 27.10.2004, 07:09
PS: перед тем как использовать
Код
Text2.Text = Text1.SelText
тебе надо будет полюбому написать например
Код
Text1.selstart=5
Text1.sellength=7
а это, есть эквивалент
Код
Text2.Text = mid$(text1.text, 5, 7)
только без выделения

Автор: Сувор 27.10.2004, 10:34
Mikle! I thank you very much! И твой код великолепен! Хотя можно было передо мной бисер и не метать, а просто ткнуть меня носом в атрибут .selstart -кстати какого дьявола его нет в панели свойств ? (а следовательно и его расшифровки)! Но код великолепен! Thank you once more!
Кстати интересно- при просмотре on line я увидел только начало твоего кода (четыре строчки)
а после сохранения на диск проявилось остальное! Это так и надо? Или это баг какой?

Автор: -Mikle- 27.10.2004, 14:11
Цитата

Mikle! I thank you very much! И твой код великолепен!

незачто, было не трудно :)

Цитата

кстати какого дьявола его нет в панели свойств ?

Естественно... как ты будешь управлять этим свойством в дизайн-тайме? :)
Цитата

Кстати интересно- при просмотре on line я увидел только начало твоего кода (четыре строчки)
а после сохранения на диск проявилось остальное! Это так и надо? Или это баг какой?

если я правильно тебя понял, то баг какой-то...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)