Текст из ListBox

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Гость

Сообщение Гость »

Добрый день. Есть листбокс:

LIST,AT(244,68,100,12),USE(?Del),DROP(2),FROM('Удалять!Не удалять')

Требуется получить текущий выбранный текст. Подскажите с помощью какой проперти это можно сделать?

С уважением, Ставич Олег
Укрсиббанк г.Харьков
oldstav@ukrsibbank.com

(Добавление)

Просто надо задействовать Use-переменную

Del String(10)

LIST,AT(244,68,100,12),USE(Del),DROP(2),FROM('Удалять!Не удалять')

If Del='Удалять'
....

---------------------------------------
C уважением,
Юрий Философов,
Главный программист
Корпорация "Диполь", Саратов
E-mail yufil@tacis-dipol.ru (служ)
yufil@mail.ru (дом)
ICQ#75924439

Hi,

PROP:Selected

[...] It also identifies the currently highlighted entry in a LIST or COMBO control (usually coded as PROP:Selected for this purpose).

WBR, Nick Tsigouro. MailTo:Nick@arsis.ru
Написал: ClaList(2)
Гость

Сообщение Гость »

на С4 такой проперти нет :(, так что пришлось воспользоваться советом Юрия.

C уважением, Ставич Олег

Ну тогда

CHOICE( [control] )
CHOICE Returns a user selection number.
control A field equate label of a LIST, COMBO, SHEET, or OPTION control.

The CHOICE procedure returns the sequence number of a selected item in an OPTION structure, SHEET structure, LIST box, or COMBO control

WBR, Nick Tsigouro. MailTo:Nick@arsis.ru

Блин, ну читайте вопрос, требовалось получить ТЕКСТ, а не номер.
CHOICE(?List) возвращает НОМЕР.

С уважением, Ставич Олег

Result = !
CHOOSE(CHOICE(?List)=1, !
SUB(?list{prop:from},1,INSTRING('!',?list{prop:from},1,1)-1), !

SUB(?list{prop:from},INSTRING('!',?list{prop:from},1,1)+1,LEN(?list{prop:fro
m})))

Andrew Myalin
andrew@arsis.ru
http://mavcla.arsis.ru (MAV Direct ODBC)
IRC: IRC.RINET.RU:6669, Channel #Clarion, AndrewM
ICQ: 10659412
Yahoo group: clarion@yahoogroups.com

Ну это типа вместо
?List{PROP:что-то}

Муторно и не удобно. Я пока обошелся USE-переменной.

С уважением, Ставич Олег

интеренсо, а как ? просто у меня есть схожие мес та, я решаю через выбор номера и по нему получаю текст.

--
Best regards,
Курко Максим mailto:ClaList@enigmasoft.com.ua
ICQ: <164766643>

Во первых номер отдельно, текст отдельно. Номер используется как параметр для вызова, ну скажем, определенной процедуры. Текст же нужен для того, что
бы записать в лог, в каком режиме эта процедура вызывается. В лог просто пишется с экрана:

WriteLog(?Promp1{Prop:text} & ' ' & Тут_текст_из_ListBox1)
WriteLog(?Promp2{Prop:text} & ' ' & Тут_текст_из_ListBox2)
...
WriteLog(?PrompN{Prop:text} & ' ' & Тут_текст_из_ListBoxN)

Просто раньше вместо List был Combo (без Use-переменной), и для него хватало
Prop:ScreenText:

WriteLog(?Promp1{Prop:text} & ' ' & ?Combo1{Prop:ScreenText})

сейчас же я полностью отказался от использования Combo. И был несколько расстроен, что старая конструкция перестала работать. Но спасибо Юре, подсказал простое решение проблемы. Скажем так, наличие лишней переменной, меня нисколько не смущает. Хотя конечно хотелось бы обойтись без нее, при этом оставив простоту текста программы.

С уважением, Ставич Олег
Result = !
CHOOSE(CHOICE(?List)=1, !
SUB(?list{prop:from},1,INSTRING('!',?list{prop:from},1,1)-1), !

SUB(?list{prop:from},INSTRING('!',?list{prop:from},1,1)+1,LEN(?list{prop:fro
m})))
Вот это вот последнее m}))) сильно похоже на издевательский смайлик.
А делов-то всего переменную завести.

Михаил

(Добавление)
LIST,AT(244,68,100,12),USE(?Del),DROP(2),FROM('Удалять!Не удалять')
choice(?Del)

--
Best regards,
Курко Максим

Хм, это по моему даст номер, а не текст...

OldStav
choice(?Del)
согласен, можно попробовать так :
tempvar1 = 'Удалять'
tempvar2 = 'Не удалять'
tempvar0 = clip(tempvar1)&'!'&clip(tempvar2)
LIST,AT(244,68,100,12),USE(?Del),DROP(2),FROM(tempvar0)

needtext = choose(choice(?del),tempvar1,tempvar2)

изврат, конечно... :)))
--
Best regards,
Курко Максим

Конечно изврат, если учесть что таких контролов порядка 10

С уважением, Ставич Олег

ну, тогда действительно можно использовать метод, который предложил Andrew Myalin, с небольшой поправкой :

Код: Выделить всё

  
  numstep = choice(?del); start = 1; finish = 1
  loop numstep times
    finish = instringt('!',?list{prop:from},1,start)
    if ~finish then err = 1; break .
    start = finish + 1
  end
  result = sub(?list{prop:from},start-1,finish-start+1)
--
Best regards,
Курко Максим

я так понимаю имеется в виду 10 контролов с двумя значениями в каждом, изврата в мною предложенном варианте не вижу и для 10 контролов код по размеру не шибко пухнет:

Код: Выделить всё

GetListText    FUNCTION(SIGNED Control)
    CODE
 RETURN CHOOSE(CHOICE(Control)=1,!
  SUB(Control{prop:from},1,INSTRING('!',Control{prop:from},1,1)-1),!

SUB(Control{prop:from},INSTRING('!',Control{prop:from},1,1)+1,LEN(Control{pr
op:from})))
чего тут сложного и смайликовского, не вижу.

ЗЫ

PROP:ScreenText не работает в данном контексе
PROP:Selected вернёт то же, что и CHOICE(?List)

переменные плодить применительно к данной задаче, я смысла не вижу немного расширив код (одЫн раз и в одном месте) и он будет универсальный для любого количества позиций в PROP:From


Andrew Myalin
я так понимаю имеется в виду 10 контролов с двумя значениями в каждом,
Это где я сказал, что в контроле 2 значения? Значений могет быть сколько угодно. 2 я привел в примере для простоты.
чего тут сложного и смайликовского, не вижу.
А сможешь, вот так же в одну строку обобщить для произвольного числа значений?
PROP:ScreenText не работает в данном контексе
Угу, не работает. Из-за чего и проблема.
PROP:Selected вернёт то же, что и CHOICE(?List)
Так и есть.

В принципе можно действительно написать функцию, которая будет возвращать текст из List. Только вообщем случае код ее будет не таким простым, как для двух значений.

С уважением, Ставич Олег

почему, тот код, который предложил я будет работать для любого кол-ва значений... loop, он и в африке loop :)

--
Best regards,
Курко Максим

А если у меня листбоксы типа ('Удалять!#1!Не удалять!#0')?

Дуга Михаил <mikeduglas@intercare.ru>
А если у меня листбоксы типа ('Удалять!#1!Не удалять!#0')?
мы читаем или как?
немного расширив код (одЫн раз и в одном месте) и он будет универсальный для любого количества позиций в PROP:From

Код: Выделить всё

GetListText          PROCEDURE  (SIGNED Control)      ! Declare Procedure
loc_Start            LONG
loc_End              LONG
loc_i                LONG
  CODE
 loc_Start = 1
 loc_End   = 0
 LOOP loc_i = 1 TO CHOICE(Control)
  loc_Start = loc_End + 1
  loc_End = INSTRING('!',Control{PROP:From},1,loc_Start)
 END
 RETURN
SUB(Control{PROP:From},loc_Start,CHOOSE(loc_End=0,LEN(Control{PROP:From}) -
loc_Start + 1,loc_End-loc_Start))
Andrew Myalin

Manual (FROM (set listbox data source)):
If a string constant is specified as the source, the individual data elements must be delimited by a vertical bar (!) character. To include a vertical bar as part of one data element, place two adjacent vertical bars in the string (!!), and only one will be displayed.
Надо ещё случай сдвоенных полосок учесть ;)

Михаил

Так и prop:selected тоже даст номер. Если всенепременно хочется текст и всенепременно именно из контрола, то только объявлять переменную, как сказал Юра.

PS. В данном конкретном случае имхо лучше CHECK. Или RADIO.

WBR, Nick Tsigouro

Можно еще попробовать ?Del{PROP:ScreenText}

Удачи!
__________________________________
Владимир Якимченко (ICQ: 16993194)
Хм, это по моему даст номер, а не текст...
- если бы этот текст был введен юзером, то понятно, что нужен именно он... а в данном случае зачем ?

С уважением,
Сергей zap277@softhome.net

Что бы в лог записать.

С уважением, Ставич Олег



(Добавление)
Надо ещё случай сдвоенных полосок учесть ;)
ну может быть, хотя форматом ?List рулю то же я и никогда пока что не было случая когда требовались вот такие символы для отображения

Andrew Myalin
Написал: ClaList(2)
Ответить