1

Тема: Форма HTA для выбора данных

Всем добрый день. Нужна форма Hta - для выбора данных с одного лист бокса и помещения их в другой. Начинаю печатать в текст боксе - тутже это должно отображатся в листбоксе1 (позиционироватся)
(немного знаю только VBS)
Вот примерный код

<HTML> 
<HEAD> 
<TITLE>HTA Demo</TITLE> 
<HTA:APPLICATION ID="oHTA" 
    APPLICATIONNAME="myApp" 
    BORDER="thin" 
    BORDERSTYLE="normal" 
    CAPTION="yes" 
    ICON="" 
    MAXIMIZEBUTTON="yes" 
    MINIMIZEBUTTON="yes" 
    SHOWINTASKBAR="yes" 
    SINGLEINSTANCE="no" 
    SYSMENU="yes" 
    VERSION="1.0" 
    WINDOWSTATE="maximize"/> 
</HEAD> 

<Form Name="Frm">
 <OBJECT ID="TextBox1"
     CLASSID="CLSID:8BD21D10-EC42-11CE-9E0D-00AA006002F3" STYLE="TOP:27pt;LEFT:94pt;WIDTH:66pt;HEIGHT:16pt;TABINDEX:0;ZINDEX:0;">
        <PARAM NAME="VariousPropertyBits" VALUE="746604571">
        <PARAM NAME="Size" VALUE="2328;564">
        <PARAM NAME="Value" VALUE="">
        <PARAM NAME="FontCharSet" VALUE="0">
        <PARAM NAME="FontPitchAndFamily" VALUE="2">
        <PARAM NAME="FontWeight" VALUE="0">
    </OBJECT>
<p>    
<OBJECT ID="ListBox1"
CLASSID="CLSID:8BD21D20-EC42-11CE-9E0D-00AA006002F3" STYLE="TOP:10pt;LEFT:25pt;WIDTH:700pt;HEIGHT:200pt;ZINDEX:1;"> 
<PARAM NAME="ScrollBars" VALUE="0"> 
<PARAM NAME="DisplayStyle" VALUE="2"> 
<PARAM NAME="Size" VALUE="20000;10000"> 
<PARAM NAME="MatchEntry" VALUE="0"> 
<PARAM NAME="FontCharSet" VALUE="0"> 
<PARAM NAME="FontPitchAndFamily" VALUE="2"> 
</OBJECT>
<p>
<OBJECT ID="ListBox2"
CLASSID="CLSID:8BD21D20-EC42-11CE-9E0D-00AA006002F3" STYLE="TOP:10pt;LEFT:25pt;WIDTH:700pt;HEIGHT:200pt;ZINDEX:1;"> 
<PARAM NAME="ScrollBars" VALUE="0"> 
<PARAM NAME="DisplayStyle" VALUE="2"> 
<PARAM NAME="Size" VALUE="20000;10000"> 
<PARAM NAME="MatchEntry" VALUE="0"> 
<PARAM NAME="FontCharSet" VALUE="0"> 
<PARAM NAME="FontPitchAndFamily" VALUE="2"> 
</OBJECT>
</Form>

<BODY SCROLL="no"> 

<script language="VBScript"> 
Dim ISK

Sub Window_OnLoad
Set FSO = CreateObject("Scripting.FileSystemObject")
Set File = FSO.GetFile("D:\1Html\PolnOst.txt")
Set TextStream = File.OpenAsTextStream(1)
Str = vbNullString
While Not TextStream.AtEndOfStream
    Str = TextStream.ReadLine()
    Document.Frm.ListBox1.addItem Str
Wend
TextStream.Close
ISK=""
End sub

Sub TextBox1_OnKeyDown
    dim S , I, C
    ISK=Document.Frm.TextBox1.Text
    C=Document.Frm.ListBox1.ListCount-1
    S= ISK
    for i=0 to C
        if LCase(Trim(Mid(Document.Frm.ListBox1.List(i),2,Len(s))))=LCase(s) Then
            Document.Frm.ListBox1.ListIndex=i
            exit sub
        End If
    Next
End Sub

</script>

</BODY> 
</HTML>

Проблема установки фокуса позиционирования на объекте ListBox1 при наборе в текстбоксе.
Большая просьба помочь в реализации или подсказать куда копать.

2

Re: Форма HTA для выбора данных

Интересно, а где я должен взять образец файла «D:\1Html\PolnOst.txt»?

3

Re: Форма HTA для выбора данных

Это простой список по строкам, я думаю он не имеет значения, т.к. вопрос в позиционировании (для пробы можно создать любой тхт и в нем по строкам слова)

4

Re: Форма HTA для выбора данных

Вот и выложите образец. Проще всего — RGhost.

5 (изменено: alexii, 2012-09-26 15:09:13)

Re: Форма HTA для выбора данных

Файл http://rghost.ru/private/40583009/0f979 … 78b60b3c7e.

6

Re: Форма HTA для выбора данных

alexii просьба подсказать вы не знаете как установить фокус на нужный Item Listboxa Focus в объекте не работает...

7 (изменено: Rom5, 2012-09-26 17:16:16)

Re: Форма HTA для выбора данных

Lexx32 пишет:

Проблема установки фокуса позиционирования на объекте ListBox1 при наборе в текстбоксе.
Большая просьба помочь в реализации или подсказать куда копать.

Добавьте себе временно в разметку страницы элемент, в котором будете во время работы своей процедуры "TextBox1_OnKeyDown", менять содержимое для некоего понимания происходящего.

Например:

<div id="div_debug"></div>

А в процедуру добавляйте через команду "document.all.div_debug.innerHTML =..." отображение отладочных значений.

Sub TextBox1_OnKeyDown
    dim S , I, C
    ISK=Document.Frm.TextBox1.Text
    C=Document.Frm.ListBox1.ListCount-1
    S= ISK
    'for i=0 to C
    '    if LCase(Trim(Mid(Document.Frm.ListBox1.List(i),2,Len(s))))=LCase(s) Then
    '        Document.Frm.ListBox1.ListIndex=i
    '        exit sub
    '    End If
   ' Next
		'--- готовим искомую строку'
		Dim sText1
		sText1 = Document.Frm.TextBox1.Text
		' Если код нажатой клавиши = пробел и более, то добавляем к текущему значению еще и введенный символ'
		If window.event.keyCode>=32 Then sText1 = sText1 & Chr(window.event.keyCode)
		' Отображаем полученную строку
		document.all.div_debug.innerHTML = sText1 '''''' debug
		'--- поиск: искомый текст должен начинаться с первой позиции, регистр при сравнении игнорируется'
    for i=0 to C
        if InStr(1,Document.Frm.ListBox1.List(i),sText1,1)=1 Then
            Document.Frm.ListBox1.ListIndex=i
            EXIT FOR
        End If
    Next
End Sub

ИМХО, событие onkeydown - как-то не сильно подходит.

-------
Добавлю еще.

Внес в "<OBJECT ID="TextBox1" свое событие

onkeypress="ue_tb1_presskey();return true;"

Вашу TextBox1_OnKeyDown закомментировал и добавил саму функцию события:

Function ue_tb1_presskey()
		'--- готовим искомую строку'
		Dim sText1
		sText1 = Document.Frm.TextBox1.Text
		' Если код нажатой клавиши = пробел и более, то добавляем к текущему значению еще и введенный символ'
		If window.event.keyCode>=32 Then sText1 = sText1 & Chr(window.event.keyCode)
		' Отображаем полученную строку
		document.all.div_debug.innerHTML = sText1 '''''' debug
		'--- поиск: искомый текст должен начинаться с первой позиции, регистр при сравнении игнорируется'
    dim i
    for i=0 to Document.Frm.ListBox1.ListCount-1
        if InStr(1,Document.Frm.ListBox1.List(i),sText1,1)=1 Then
            Document.Frm.ListBox1.ListIndex=i
            EXIT FOR
        End If
    Next
End FUNCTION

Наче работает, но думаю, что нужно еще покопать - как правильно пользоваться событиями.

WBR. Roman

8

Re: Форма HTA для выбора данных

Rom5 Агромное Вам спасибо.

9 (изменено: alexii, 2012-09-27 09:51:58)

Re: Форма HTA для выбора данных

Уважаемый Rom5,  пытаюсь отловить событие в change

Sub TextBox1_Change
    A=ue_tb1_presskey
End Sub

Function ue_tb1_presskey()
        '--- готовим искомую строку'
        Dim sText1
        sText1 = Document.Frm.TextBox1.Text ' сдесь ошибка - что Document.Frm.TextBox1 не поддерживает этот метод или свойство

подскажите в чем причина???

10 (изменено: Rom5, 2012-09-27 10:22:04)

Re: Форма HTA для выбора данных

Lexx32 пишет:
        sText1 = Document.Frm.TextBox1.Text ' сдесь ошибка - что Document.Frm.TextBox1 не поддерживает этот метод или свойство

подскажите в чем причина???

Хмм, пробуйте так:


sText1 = document.all.Frm.TextBox1.value ' или даже без ".Frm" -- document.all.TextBox1.value

И событие "change", если не ошибаюсь, наступает при изменении значению, но при уходе фокуса с этого контрола куда-то.

WBR. Roman

11

Re: Форма HTA для выбора данных

Убрал вообще <Form Name="Frm"> </Form> чтоб писать без Document.Frm
sText1 = TextBox1.value - так работает
Вообще переделал :

 Sub TextBox1_OnKeyDown
    dim i
    ISK=ISK & TextBox1.value
    for i=0 to ListBox1.ListCount-1
        if Trim(LCase(Mid(ListBox1.List(i),2,Len(ISK)))) = LCase(ISK) Then
            ListBox1.ListIndex=i
            EXIT FOR
        End If
    Next
End Sub

так работает есть позиционирование но оно под списком (его не видно) ???

12 (изменено: Rom5, 2012-09-27 16:26:52)

Re: Форма HTA для выбора данных

Lexx32 пишет:

так работает есть позиционирование но оно под списком (его не видно) ???

У Вас же скролл в объекте "ListBox1" насильно выключен. Попробуйте включить его, например, так:

<PARAM NAME="ScrollBars" VALUE="yes">
WBR. Roman

13

Re: Форма HTA для выбора данных

Да действительно !!! большое спасибо, буду развивать дальше сей проект, думаю получится аналог накладной ...

14

Re: Форма HTA для выбора данных

Rom5 просьба подсказать еще момент, добавил на форму объект ListView, заполняю данными, а никак не могу сделать выбор одной позиции (или обычный перебор)

 
Sub ListView1_onKeyDown
    dim CC
    Dim I
    CC= val(Chr(ListView1.ListItems.Count)) - 1 ' сдесь &HB86 непойму как перевести в нормальное число...
    searchString = "Бал" 'searchString & chr(Key) ' сдесь пока так чтоб ловить отрезок
    For I =0 to CC
        If InStr(1, ListView1.ListItems(i).Caption, searchString) > 0 Then
            ListView1.ListItems(i).Selected=True
            Exit sub
        End If
    Next

End Sub

просьба подсказать...

15

Re: Форма HTA для выбора данных

Lexx32 пишет:
 
    CC= val(Chr(ListView1.ListItems.Count)) - 1 ' сдесь &HB86 непойму как перевести в нормальное число...

просьба подсказать...

Непонятная мне конструкция.
Chr(ListView1.ListItems.Count) - преобразовует число в символ по указанному в параметрах коду (действие обратное Asc()).
Для преобразования числа в строку использую CStr(), для строки в целое число - CInt().

см. функции преобразования:
--8<--
Asc  Возвращает кодовый номер ANSI первого символа в строке.
AscB  То же, но используется для обработки однобайтовых данных. Возвращает результат для первого байта.
AscW  То же, но используется для символов Unicode. Возвращает символ кода Wide, что позволяет преобразование из Unicode в ANSI.
Chr  Возвращает строку символов с соответствующими номерами.
ChrB То же, но используется для обработки однобайтовых данных, содержащихся в строке. Возвращает всегда один байт.
ChrW То же, но используется для символов Unicode. Возвращает символ кода Wide, что позволяет преобразование из Unicode в ANSI.
CBool  Возвращает аргумент, преобразованный в признак логического типа.
CByte  Возвращает аргумент, преобразованный в признак типа "байт".
CDate  Возвращает аргумент, преобразованный в признак типа даты.
CDbl  Возвращает аргумент, преобразованный в признак числа двойной точности.
CInt  Возвращает аргумент, преобразованный в признак целого числа.
CLng  Возвращает аргумент, преобразованный в признак длинного целого.
CSng  Возвращает аргумент, преобразованный в признак числа обычной точности.
CStr  Возвращает аргумент, преобразованный в признак в виде строки.
Fix  Возвращает целую часть числа.
Hex  Возвращает строку, представляющую собой аргумент в шестнацатеричной системе счисления.
Int  Возвращает число, округленное до заданной десятичной позиции.
Oct  Возвращает строку, представляющую собой аргумент в восмеричной системе счисления.
Round  Возвращает число, округленное до заданного числа десятичных позиции.
Sgn  Возвращает целое число, отражающее знак аргумента.
--8<--

WBR. Roman