Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] Скрипт создания файла данных через диологовое окно. как? (http://forum.oszone.net/showthread.php?t=161046)

Pozia 21-12-2009 20:50 1301058

Скрипт создания файла данных через диологовое окно. как?
 
Помогите создать скрипт который бы создовал файл с расширением exp (обычный текстовый файл только с переименованным расширением). При этом нужно чтобы в файл вносились данные по определенному алгоритму.
Пример файла который нужно получить:

Код:

[mm]p9=128
[mm]p10=133
[mm]p11=137
[mm]p12=25
[mm]p13=65
[mm]p14=60
[mm]p15=8
[mm]p16=89
[mm]p17=17

и так далее...

При запуске скрипта должно выскачить окно в котором можно ввести данные. Пример окна:

Код:

Диаметр окружности впадин зубьев, df            128
Делительный диаметр, d                          133
Диаметр окружности вершин зубьев, da            137
Ширина, b                                        25
Диаметр ступицы, dst                            65
Длина ступицы, Lst                              60
Толщина венца, hv                                8
Диаметр расположения отверстий, dro              89
Диаметр отверстий, do                            17

То что текстом - это пояснения, а для цифр должно быть поле для их ввода. При этом каждой фразе пояснения должно автоматически подставлятся [mm]p17=. Но не по порядку как в примере. Фраза в скобках и цифра после p может быть любая, заранее мною определенная для каждой фразы пояснения. После того как все данные введены нажимаем OK и должен получится нужный файл.

kaster 21-12-2009 22:58 1301166

Код:

#include <GUIConstantsEx.au3>
$hWrite = FileOpen(@ScriptDir & '\file.ext', 2)
$hGUI = GUICreate('I''m a crasy dentist', 300, 300)
$hButton = GUICtrlCreateButton('Create file', 10, 260, 70, 30)
Local $hLabel[9][2], $sLabel[9], $hInput[9]
$sLabel[0] = 'Диаметр окружности впадин зубьев, df'
$sLabel[1] = 'Делительный диаметр, d'
$sLabel[2] = 'Диаметр окружности вершин зубьев, da'
$sLabel[3] = 'Ширина, b'
$sLabel[4] = 'Диаметр ступицы, dst'
$sLabel[5] = 'Длина ступицы, Lst'
$sLabel[6] = 'Толщина венца, hv'
$sLabel[7] = 'Диаметр расположения отверстий, dro'
$sLabel[8] = 'Диаметр отверстий, do'

$hLabel[0][1] = '[mm]p9='
$hLabel[1][1] = '[mm]p10='
$hLabel[2][1] = '[mm]p11='
$hLabel[3][1] = '[mm]p12='
$hLabel[4][1] = '[mm]p13='
$hLabel[5][1] = '[mm]p14='
$hLabel[6][1] = '[mm]p15='
$hLabel[7][1] = '[mm]p16='
$hLabel[8][1] = '[mm]p17='

For $i = 0 to 8
    $hLabel[$i][0] = GUICtrlCreateLabel($sLabel[$i], 10, 10 + $i * 28, 180, 15)
    $hInput[$i] = GUICtrlCreateInput($i, 230, 10 + $i * 28, 50, 15)
Next
GUISetState()
While 1
    $Msg = GUIGetMsg()
    Switch $Msg
        Case $GUI_EVENT_CLOSE
            GUIDelete($hGUI)
            ExitLoop
        Case
$hButton
            For $i = 0 to 8
                FileWriteLine($hWrite, $hLabel[$i][1] & GUICtrlRead($hInput[$i]))
            Next
            FileClose($hWrite)
    EndSwitch
WEnd


Pozia 21-12-2009 23:32 1301185

kaster, а можно чтобы скрипт отслеживал введенные значения по полученному файлу?

kaster 21-12-2009 23:45 1301202

в чем проявляется слежение? и какой вид имеет полученный файл?

Pozia 21-12-2009 23:48 1301205

Цитата:

Цитата kaster
какой вид имеет полученный файл? »

полученный файл имеет вид как нужно. Все работает ок. Объясню подробнее. вот допустим я ввел данные. Когда в следующий раз запущу скрипт то в ячейках будут цифры по умолчанию. А хотелось бы чтоб цифры там были из последнего сеанса запуска, тобишь из файла file.ext

и зашитые по умолчанию цифры 1 2 3 4 5 ... как поменять на нужные не понял я что то

kaster 22-12-2009 00:09 1301221

а. понял. последние введенные данные.
а выходной файл может иметь вид следующий?
Код:

[settings]
[mm]p9=128
[mm]p10=133
[mm]p11=137
[mm]p12=25
[mm]p13=65
[mm]p14=60
[mm]p15=8
[mm]p16=89
[mm]p17=17

ну или любое другое значение вместо [settings]? просто в таком случае это получится ini файл для парсинга которого есть встроенные средства. в противном случае есть два варианта
1. длинный, и не совсем понятный для тебя судя по вопросам, код
2. создание вспомогательного файла, который будет практически дублировать file.ext но с заголовком [settings]

Creat0R 22-12-2009 00:18 1301226

Код:

#include <GUIConstantsEx.au3>
#include <EditConstants.au3>

$hGUI = GUICreate('I''m a crasy dentist', 300, 300)
$hButton = GUICtrlCreateButton('Create file', 10, 260, 70, 30)

Local $hLabel[9][2], $sLabel[9], $hInput[9]
$sLabel[0] = 'Диаметр окружности впадин зубьев, df'
$sLabel[1] = 'Делительный диаметр, d'
$sLabel[2] = 'Диаметр окружности вершин зубьев, da'
$sLabel[3] = 'Ширина, b'
$sLabel[4] = 'Диаметр ступицы, dst'
$sLabel[5] = 'Длина ступицы, Lst'
$sLabel[6] = 'Толщина венца, hv'
$sLabel[7] = 'Диаметр расположения отверстий, dro'
$sLabel[8] = 'Диаметр отверстий, do'

$hLabel[0][1] = '[mm]p9='
$hLabel[1][1] = '[mm]p10='
$hLabel[2][1] = '[mm]p11='
$hLabel[3][1] = '[mm]p12='
$hLabel[4][1] = '[mm]p13='
$hLabel[5][1] = '[mm]p14='
$hLabel[6][1] = '[mm]p15='
$hLabel[7][1] = '[mm]p16='
$hLabel[8][1] = '[mm]p17='

For $i = 0 To 8
    $sInput_Val = StringRegExpReplace(FileReadLine(@ScriptDir & '\file.ext', $i + 1), "^.*=(.*)$", "\1")
    If $sInput_Val = "" Then $sInput_Val = $i

    $hLabel
[$i][0] = GUICtrlCreateLabel($sLabel[$i], 10, 10 + $i * 28, 180, 15)
    $hInput[$i] = GUICtrlCreateInput($sInput_Val, 230, 10 + $i * 28, 50, 17, $ES_NUMBER)
Next

GUISetState()

While 1
    $Msg = GUIGetMsg()

    Switch $Msg
        Case $GUI_EVENT_CLOSE
            GUIDelete($hGUI)
            ExitLoop
        Case $hButton
            $hWrite
= FileOpen(@ScriptDir & '\file.ext', 2)

            For $i = 0 To 8
                FileWriteLine($hWrite, $hLabel[$i][1] & GUICtrlRead($hInput[$i]))
            Next

            FileClose($hWrite)
    EndSwitch
WEnd


Pozia 22-12-2009 00:18 1301228

Цитата:

Цитата kaster
а выходной файл может иметь вид следующий? »

не, не может. прога ругается на данную строку, или любую другую. Ошибка вроде не критическая, но рисковать мне нельзя (запороть проект 3D не хочу).
Цитата:

Цитата kaster
длинный, и не совсем понятный для тебя судя по вопросам, код »

если есть лишнее время то можете предложить, но наверное лучше
Цитата:

Цитата kaster
создание вспомогательного файла, который будет практически дублировать file.ext но с заголовком [settings] »

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

kaster, Вас опередили. Creat0R, все работает как нельзя лучше. Если мне нужно увеличить количество параметров то я меняю:

Код:

$sLabel[9] = 'Диаметр отверстий, do'
.....

Код:

$hLabel[9][1] = '[mm]p17='
....

Код:

For $i = 0 To 9
Код:

For $i = 0 To 9
Код:

Local $hLabel[10][2], $sLabel[10], $hInput[10]


Верно?

Creat0R 22-12-2009 00:46 1301251

Цитата:

Цитата Pozia
Верно? »

Да. Но я бы для удобства сделал так:

Код:

#include <GUIConstantsEx.au3>
#include <EditConstants.au3>

$hGUI = GUICreate('I''m a crasy dentist', 300, 350)
$hButton = GUICtrlCreateButton('Create file', 10, 310, 70, 30)

Global $aLabels, $aInput_Vals, $aiInputs, $iCount

$aLabels
&= 'Диаметр окружности впадин зубьев, df|'
$aLabels &= 'Делительный диаметр, d|'
$aLabels &= 'Диаметр окружности вершин зубьев, da|'
$aLabels &= 'Ширина, b|'
$aLabels &= 'Диаметр ступицы, dst|'
$aLabels &= 'Длина ступицы, Lst|'
$aLabels &= 'Толщина венца, hv|'
$aLabels &= 'Диаметр расположения отверстий, dro|'
$aLabels &= 'Диаметр отверстий, do|'

$aInput_Vals &= '[mm]p9=|'
$aInput_Vals &= '[mm]p10=|'
$aInput_Vals &= '[mm]p11=|'
$aInput_Vals &= '[mm]p12=|'
$aInput_Vals &= '[mm]p13=|'
$aInput_Vals &= '[mm]p14=|'
$aInput_Vals &= '[mm]p15=|'
$aInput_Vals &= '[mm]p16=|'
$aInput_Vals &= '[mm]p17=|'

$aLabels = StringRegExpReplace($aLabels, '\|$', '')
$aLabels = StringSplit($aLabels, '|')

$aInput_Vals = StringRegExpReplace($aInput_Vals, '\|$', '')
$aInput_Vals = StringSplit($aInput_Vals, '|')

Dim $iCount = $aInput_Vals[0]
Dim $aiInputs[$iCount+1]

For $i = 1 To $iCount
    $sVal
= StringRegExpReplace(FileReadLine(@ScriptDir & '\file.ext', $i), "^.*=(.*)$", "\1")
    If $sVal = "" Then $sVal = $i

    GUICtrlCreateLabel($aLabels[$i], 10, 10 + ($i-1) * 28, 180, 15)
    $aiInputs[$i] = GUICtrlCreateInput($sVal, 230, 10 + ($i-1) * 28, 50, 17, $ES_NUMBER)
Next

GUISetState()

While 1
    $Msg = GUIGetMsg()

    Switch $Msg
        Case $GUI_EVENT_CLOSE
            GUIDelete($hGUI)
            ExitLoop
        Case $hButton
            $hWrite
= FileOpen(@ScriptDir & '\file.ext', 2)

            For $i = 1 To $iCount
                FileWriteLine($hWrite, $aInput_Vals[$i] & GUICtrlRead($aiInputs[$i]))
            Next

            FileClose($hWrite)
    EndSwitch
WEnd

Добавлять так:

Код:

$aLabels &= 'Диаметр отверстий, do|'
...

Код:

$aInput_Vals &= '[mm]p17=|'
...


kaster 22-12-2009 00:48 1301254

Цитата:

Цитата Pozia
Верно? »

да. надо переобъявить массивы и изменить верхний предел циклов

Pozia 22-12-2009 01:05 1301261

Creat0R, ну да, так удобнее :) Спасибо всем за помощь! Сильно облегчили мне жизнь в проектировании.

Creat0R, ща глянул а файл что мне нужно получить имеет большое количество параметров. В связи с этим вопрос как изменить интервал между строками и можно ли как то окно сделать в два или даже три столбца?

Pozia 22-12-2009 02:50 1301304

Creat0R, как менять разные расстояния понял а как сделать в два (три) столбца нет. Помогите пожалуйста

Creat0R 22-12-2009 03:18 1301315

Цитата:

Цитата Pozia
В связи с этим вопрос как изменить интервал между строками и можно ли как то окно сделать в два или даже три столбца? »

Как раз для таких случаев есть _GUIScrollBars*:

Код:

#include <GUIConstantsEx.au3>
#include <EditConstants.au3>
#include <WindowsConstants.au3>
#include <ScrollBarConstants.au3>
#include <GUIScrollBars.au3>

$hGUI = GUICreate('I''m a crasy dentist', 300, 350)
$hButton = GUICtrlCreateButton('Create file', 5, 317, 70, 25)

Global $aLabels, $aInput_Vals, $aiInputs, $iCount, $iScroll_Max
Global $sFile = @ScriptDir & '\file.ext'

$aLabels &= 'Диаметр окружности впадин зубьев, df|'
$aLabels &= 'Делительный диаметр, d|'
$aLabels &= 'Диаметр окружности вершин зубьев, da|'
$aLabels &= 'Ширина, b|'
$aLabels &= 'Диаметр ступицы, dst|'
$aLabels &= 'Длина ступицы, Lst|'
$aLabels &= 'Толщина венца, hv|'
$aLabels &= 'Диаметр расположения отверстий, dro|'
$aLabels &= 'Диаметр отверстий, do|'

$aInput_Vals &= '[mm]p9=|'
$aInput_Vals &= '[mm]p10=|'
$aInput_Vals &= '[mm]p11=|'
$aInput_Vals &= '[mm]p12=|'
$aInput_Vals &= '[mm]p13=|'
$aInput_Vals &= '[mm]p14=|'
$aInput_Vals &= '[mm]p15=|'
$aInput_Vals &= '[mm]p16=|'
$aInput_Vals &= '[mm]p17=|'

$aLabels = StringRegExpReplace($aLabels, '\|$', '')
$aLabels = StringSplit($aLabels, '|')

$aInput_Vals = StringRegExpReplace($aInput_Vals, '\|$', '')
$aInput_Vals = StringSplit($aInput_Vals, '|')

Dim $iCount = $aInput_Vals[0]
Dim $aiInputs[$iCount+1]

$hData_GUI = GUICreate("Data GUI", 290, 300, 0, 0, $WS_CHILD, $WS_EX_CLIENTEDGE+$WS_EX_DLGMODALFRAME, $hGUI)

For $i = 1 To $iCount
    $sVal
= StringRegExpReplace(FileReadLine($sFile, $i), "^.*=(.*)$", "\1")
    If $sVal = "" Then $sVal = $i

    GUICtrlCreateLabel($aLabels[$i], 10, 10 + ($i-1) * 28, 180, 15)
    $aiInputs[$i] = GUICtrlCreateInput($sVal, 220, 10 + ($i-1) * 28, 50, 17, $ES_NUMBER)
Next

GUIRegisterMsg($WM_VSCROLL, "WM_VSCROLL")

_GUIScrollBars_Init($hData_GUI)
_GUIScrollBars_SetScrollInfoMax($hData_GUI, $SB_HORZ, 0)
_GUIScrollBars_SetScrollInfoMax($hData_GUI, $SB_VERT, $iCount * 2)

GUISetState(@SW_SHOW, $hData_GUI)
GUISetState(@SW_SHOW, $hGUI)

GUISwitch($hGUI)

While 1
    $Msg = GUIGetMsg()

    Switch $Msg
        Case $GUI_EVENT_CLOSE
            GUIDelete($hGUI)
            ExitLoop
        Case $hButton
            $hWrite
= FileOpen($sFile, 2)

            For $i = 1 To $iCount
                FileWriteLine($hWrite, $aInput_Vals[$i] & GUICtrlRead($aiInputs[$i]))
            Next

            FileClose($hWrite)
    EndSwitch
WEnd

Func WM_VSCROLL($hWnd, $Msg, $wParam, $lParam)
    #forceref $Msg, $wParam, $lParam
    Local $nScrollCode = BitAND($wParam, 0x0000FFFF)
    Local $index = -1, $yChar, $yPos
    Local $Min, $Max, $Page, $Pos, $TrackPos

    For $x = 0 To UBound($aSB_WindowInfo) - 1
        If $aSB_WindowInfo[$x][0] = $hWnd Then
            $index = $x
            $yChar
= $aSB_WindowInfo[$index][3]
            ExitLoop
        EndIf
    Next
    If $index = -1 Then Return 0

    ; Get all the vertial scroll bar information
    Local $tSCROLLINFO = _GUIScrollBars_GetScrollInfoEx($hWnd, $SB_VERT)
    $Min = DllStructGetData($tSCROLLINFO, "nMin")
    $Max = DllStructGetData($tSCROLLINFO, "nMax")
    $Page = DllStructGetData($tSCROLLINFO, "nPage")
    ; Save the position for comparison later on
    $yPos = DllStructGetData($tSCROLLINFO, "nPos")
    $Pos = $yPos
    $TrackPos
= DllStructGetData($tSCROLLINFO, "nTrackPos")

    Switch $nScrollCode
        Case $SB_TOP ; user clicked the HOME keyboard key
            DllStructSetData($tSCROLLINFO, "nPos", $Min)

        Case $SB_BOTTOM ; user clicked the END keyboard key
            DllStructSetData($tSCROLLINFO, "nPos", $Max)

        Case $SB_LINEUP ; user clicked the top arrow
            DllStructSetData($tSCROLLINFO, "nPos", $Pos - 1)

        Case $SB_LINEDOWN ; user clicked the bottom arrow
            DllStructSetData($tSCROLLINFO, "nPos", $Pos + 1)

        Case $SB_PAGEUP ; user clicked the scroll bar shaft above the scroll box
            DllStructSetData($tSCROLLINFO, "nPos", $Pos - $Page)

        Case $SB_PAGEDOWN ; user clicked the scroll bar shaft below the scroll box
            DllStructSetData($tSCROLLINFO, "nPos", $Pos + $Page)

        Case $SB_THUMBTRACK ; user dragged the scroll box
            DllStructSetData($tSCROLLINFO, "nPos", $TrackPos)
    EndSwitch

;~    // Set the position and then retrieve it.  Due to adjustments
;~    //  by Windows it may not be the same as the value set.


    DllStructSetData($tSCROLLINFO, "fMask", $SIF_POS)
    _GUIScrollBars_SetScrollInfo($hWnd, $SB_VERT, $tSCROLLINFO)
    _GUIScrollBars_GetScrollInfo($hWnd, $SB_VERT, $tSCROLLINFO)
    ;// If the position has changed, scroll the window and update it
    $Pos = DllStructGetData($tSCROLLINFO, "nPos")

    If ($Pos <> $yPos) Then
        _GUIScrollBars_ScrollWindow($hWnd, 0, $yChar * ($yPos - $Pos))
        $yPos = $Pos
    EndIf

    Return $GUI_RUNDEFMSG
EndFunc  ;==>WM_VSCROLL


Pozia 22-12-2009 03:58 1301337

Вроде все отлично. если возникнут еще вопросы спрошу.
PS Не обязательно но для удобства: Как сделать чтобы данное окно было поверх всех окон?
Можно ли как то задать определенные координаты появления окна? (как пример - верхний левый угол)

Pozia 22-12-2009 10:58 1301479

Creat0R, пока спал пришла мысль. может ли автоит вытянуть параметры что я ввожу руками в Вами предложенный скрипт из файла EXCEL. Суть такова: EXCEL файл считает мне кучу параметров и потом сводит их в один столбец. В соседнем столбце могут быть:
Код:

[mm]p9=
[mm]p10=
[mm]p11=
[mm]p12=
[mm]p13=
[mm]p14=
[mm]p15=
[mm]p16=
[mm]p17=

то есть получится два столбца с параметрами и значениями. Может ли автоит скрипт залезть в EXCEL, вытянуть эти параметры и сделать файл с расширением exp?

HORRIBLE 22-12-2009 14:22 1301632

Pozia, можно:
Код:

#include <GUIConstantsEx.au3>
#include <EditConstants.au3>
#include <WindowsConstants.au3>
#include <ScrollBarConstants.au3>
#include <GUIScrollBars.au3>
#include <Excel.au3>

$hGUI = GUICreate('I''m a crasy dentist', 300, 350)
$hButton = GUICtrlCreateButton('Create file', 5, 317, 70, 25)
$hButton_excel = GUICtrlCreateButton('Из EXCEL', 225, 317, 70, 25)

;----- Для EXCEL ------------------------------------------------
Global  $sFileExcel = @ScriptDir & "\book.xls" ; имя файла
Global  $num_row = 12 ; номер строки с которого начинаются нужные значения
Global  $num_col = 8  ; номер столбца в котором находятся значения
;-----------------------------------------------------------------

Global $aLabels, $aInput_Vals, $aiInputs, $iCount, $iScroll_Max
Global $sFile = @ScriptDir & '\file.ext'

$aLabels &= 'Диаметр окружности впадин зубьев, df|'
$aLabels &= 'Делительный диаметр, d|'
$aLabels &= 'Диаметр окружности вершин зубьев, da|'
$aLabels &= 'Ширина, b|'
$aLabels &= 'Диаметр ступицы, dst|'
$aLabels &= 'Длина ступицы, Lst|'
$aLabels &= 'Толщина венца, hv|'
$aLabels &= 'Диаметр расположения отверстий, dro|'
$aLabels &= 'Диаметр отверстий, do|'

$aInput_Vals &= '[mm]p9=|'
$aInput_Vals &= '[mm]p10=|'
$aInput_Vals &= '[mm]p11=|'
$aInput_Vals &= '[mm]p12=|'
$aInput_Vals &= '[mm]p13=|'
$aInput_Vals &= '[mm]p14=|'
$aInput_Vals &= '[mm]p15=|'
$aInput_Vals &= '[mm]p16=|'
$aInput_Vals &= '[mm]p17=|'

$aLabels = StringRegExpReplace($aLabels, '\|$', '')
$aLabels = StringSplit($aLabels, '|')

$aInput_Vals = StringRegExpReplace($aInput_Vals, '\|$', '')
$aInput_Vals = StringSplit($aInput_Vals, '|')

Dim $iCount = $aInput_Vals[0]
Dim $aiInputs[$iCount+1]

$hData_GUI = GUICreate("Data GUI", 290, 300, 0, 0, $WS_CHILD, $WS_EX_CLIENTEDGE+$WS_EX_DLGMODALFRAME, $hGUI)

For $i = 1 To $iCount
    $sVal = StringRegExpReplace(FileReadLine($sFile, $i), "^.*=(.*)$", "\1")
    If $sVal = "" Then $sVal = $i

    GUICtrlCreateLabel($aLabels[$i], 10, 10 + ($i-1) * 28, 180, 15)
    $aiInputs[$i] = GUICtrlCreateInput($sVal, 220, 10 + ($i-1) * 28, 50, 17, $ES_NUMBER)
Next

GUIRegisterMsg($WM_VSCROLL, "WM_VSCROLL")

_GUIScrollBars_Init($hData_GUI)
_GUIScrollBars_SetScrollInfoMax($hData_GUI, $SB_HORZ, 0)
_GUIScrollBars_SetScrollInfoMax($hData_GUI, $SB_VERT, $iCount * 2)

GUISetState(@SW_SHOW, $hData_GUI)
GUISetState(@SW_SHOW, $hGUI)

GUISwitch($hGUI)

While 1
    $Msg = GUIGetMsg()

    Switch $Msg
        Case $GUI_EVENT_CLOSE
            GUIDelete($hGUI)
            ExitLoop
        Case $hButton
            $hWrite = FileOpen($sFile, 2)

            For $i = 1 To $iCount
                FileWriteLine($hWrite, $aInput_Vals[$i] & GUICtrlRead($aiInputs[$i]))
            Next

            FileClose($hWrite)
                       
        Case $hButton_excel
                               
        $oExcel = _ExcelBookOpen($sFileExcel)
                       
        If        @error = 1 Then
                MsgBox(0, "Error!", "Unable to Create the Excel Object")
        ElseIf        @error = 2 Then
                MsgBox(0, "Error!", "File does not exist - Shame on you!")
        Else                       
              For $i = 1 to Ubound($aiInputs)-1
                    $sCellValue = _ExcelReadCell($oExcel, $i+($num_row-1), $num_col)
                    GUICtrlSetData($aiInputs[$i], $sCellValue)
              Next
                               
            _ExcelBookClose($oExcel)
        EndIf
    EndSwitch
WEnd

Func WM_VSCROLL($hWnd, $Msg, $wParam, $lParam)
    #forceref $Msg, $wParam, $lParam
    Local $nScrollCode = BitAND($wParam, 0x0000FFFF)
    Local $index = -1, $yChar, $yPos
    Local $Min, $Max, $Page, $Pos, $TrackPos

    For $x = 0 To UBound($aSB_WindowInfo) - 1
        If $aSB_WindowInfo[$x][0] = $hWnd Then
            $index = $x
            $yChar = $aSB_WindowInfo[$index][3]
            ExitLoop
        EndIf
    Next
    If $index = -1 Then Return 0

    ; Get all the vertial scroll bar information
    Local $tSCROLLINFO = _GUIScrollBars_GetScrollInfoEx($hWnd, $SB_VERT)
    $Min = DllStructGetData($tSCROLLINFO, "nMin")
    $Max = DllStructGetData($tSCROLLINFO, "nMax")
    $Page = DllStructGetData($tSCROLLINFO, "nPage")
    ; Save the position for comparison later on
    $yPos = DllStructGetData($tSCROLLINFO, "nPos")
    $Pos = $yPos
    $TrackPos = DllStructGetData($tSCROLLINFO, "nTrackPos")

    Switch $nScrollCode
        Case $SB_TOP ; user clicked the HOME keyboard key
            DllStructSetData($tSCROLLINFO, "nPos", $Min)

        Case $SB_BOTTOM ; user clicked the END keyboard key
            DllStructSetData($tSCROLLINFO, "nPos", $Max)

        Case $SB_LINEUP ; user clicked the top arrow
            DllStructSetData($tSCROLLINFO, "nPos", $Pos - 1)

        Case $SB_LINEDOWN ; user clicked the bottom arrow
            DllStructSetData($tSCROLLINFO, "nPos", $Pos + 1)

        Case $SB_PAGEUP ; user clicked the scroll bar shaft above the scroll box
            DllStructSetData($tSCROLLINFO, "nPos", $Pos - $Page)

        Case $SB_PAGEDOWN ; user clicked the scroll bar shaft below the scroll box
            DllStructSetData($tSCROLLINFO, "nPos", $Pos + $Page)

        Case $SB_THUMBTRACK ; user dragged the scroll box
            DllStructSetData($tSCROLLINFO, "nPos", $TrackPos)
    EndSwitch

;~    // Set the position and then retrieve it.  Due to adjustments
;~    //  by Windows it may not be the same as the value set.

    DllStructSetData($tSCROLLINFO, "fMask", $SIF_POS)
    _GUIScrollBars_SetScrollInfo($hWnd, $SB_VERT, $tSCROLLINFO)
    _GUIScrollBars_GetScrollInfo($hWnd, $SB_VERT, $tSCROLLINFO)
    ;// If the position has changed, scroll the window and update it
    $Pos = DllStructGetData($tSCROLLINFO, "nPos")

    If ($Pos <> $yPos) Then
        _GUIScrollBars_ScrollWindow($hWnd, 0, $yChar * ($yPos - $Pos))
        $yPos = $Pos
    EndIf

    Return $GUI_RUNDEFMSG
EndFunc  ;==>WM_VSCROLL

Я сделал файл book.xls нужные значения начинались со строки 12 и столбца 8 (почему такие числа, так просто)

Pozia 22-12-2009 14:34 1301644

HORRIBLE, у меня положение двух столбцов с параметрами и значениями находятся не вверху а ниже, где то на 50 строке. Как это учесть? И можно ли сделать без запуска экселя?

HORRIBLE 22-12-2009 15:13 1301674

Pozia, это учитывается здесь:
$num_row = номер строки, в вашем примере видимо это будет число 50
$num_col = номер столбца, вытащил эти строки в начала кода....


И можно ли сделать без запуска экселя? Не могу ответить, открываемое окно можно скрыть просто. Для этого нужно: $oExcel = _ExcelBookOpen($sFileExcel) заменить на $oExcel = _ExcelBookOpen($sFileExcel,0)

kaster 22-12-2009 15:45 1301702

Цитата:

Цитата HORRIBLE
И можно ли сделать без запуска экселя? »

нет. в любом случае нужна программа для открытия xls файла. либо Excel, либо oOO Calc, и т.д. если бы можно было читать оттуда данные без каких-либо программ, то не было бы смысла ставить Office. я думаю, это очевидно.

Pozia 22-12-2009 18:33 1301833

Цитата:

Цитата HORRIBLE
$num_row = номер строки, в вашем примере видимо это будет число 50
$num_col = номер столбца, вытащил эти строки в начала кода.... »

я сразу там и вставлял нужные цифры но не так понял пояснения.
Еще есть пожелание. Было бы хорошо, чтобы скрипт помимо самих значений еще и параметры типа:
Код:

[mm]p9=
[mm]p10=
[mm]p11=
[mm]p12=
[mm]p13=
[mm]p14=
[mm]p15=
[mm]p16=
[mm]p17=

вытягивал из экселя. То есть в экселе у меня столбец параметров и рядом столбец чисел. Серипт должен их оттуда вытянуть и в принципе диалог мне не нужен. Просто пусть выскочит окно с кнопкой "ОК" что файл создан. А в скрипте хотелось бы только задать начало и конец столбца параметров и столбца чисел. Кстати если страниц несколько в эксель файле то как скрипт знает с какой страницы ему открыть числа?

HORRIBLE 22-12-2009 22:10 1301995

Pozia,
Код:

#include <Excel.au3>

        $sheet = "Лист1" ; Название листа на котором находятся данные
        $num_row_start        = 6 ; начальная строка
        $num_col_start        = 2 ; начальный столбец
        $num_row_end        = $num_row_start+8 ; конечная строка

$sFile = @ScriptDir & '\file.ext'
$sFilePath1 = @ScriptDir & "\book.xls"
$oExcel = _ExcelBookOpen($sFilePath1,0)

If @error = 1 Then
    MsgBox(0, "Error!", "Unable to Create the Excel Object")
    Exit
ElseIf @error = 2 Then
    MsgBox(0, "Error!", "File does not exist - Shame on you!")
    Exit
EndIf

_ExcelSheetActivate($oExcel, $sheet)

If @error = 1 Then
    MsgBox(0, "Error!", "Specified object does not exist")
    Exit
ElseIf @error = 2 Then
    MsgBox(0, "Error!", "Specified sheet number does not exist")
    Exit
ElseIf @error = 3 Then
    MsgBox(0, "Error!", "Specified sheet name does not exist")
    Exit
EndIf
$hWrite = FileOpen($sFile, 2)
       
        For $i = 0 to ($num_row_end - $num_row_start)
       
                $sCellValue_t = _ExcelReadCell($oExcel, $num_row_start + $i, $num_col_start) ; название ячейки
                $sCellValue_d = _ExcelReadCell($oExcel, $num_row_start + $i, $num_col_start+1);значение ячейки       
       
                FileWriteLine($hWrite, $sCellValue_t & $sCellValue_d)

        Next

FileClose($hWrite)
_ExcelBookClose($oExcel, 0, 0)
MsgBox(0,"", "Файл записан",3)


Pozia 22-12-2009 22:38 1302022

HORRIBLE, добавте еще закрытие экселя после отработки скрипта пожалуйста и его скрытие. И мне в принципе не нужно окно диалога ввода данных после запуска екселя. я их один раз в скрипт задам и мне нормально. Просто нужен запуск скрипта и получения данных из экселя в файл. Спасибо!

HORRIBLE 22-12-2009 22:59 1302047

Pozia, изменил как просили.


Время: 02:55.

Время: 02:55.
© OSzone.net 2001-