Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » Перемешивание и сортировка в INI файле

Ответить
Настройки темы
Перемешивание и сортировка в INI файле

Аватара для Centrinar

Старожил


Сообщения: 247
Благодарности: 1

Профиль | Цитировать


Изменения
Автор: Creat0R
Дата: 23-06-2011
Помогите пожалуйста.
Есть INI файл, куда скрипт записывает программы, типа:
[Progs]
prog1=<tetsprog1.exe><........
prog2=<tetsprog2.exe><........
.....
Необходима графическая оболочка с пом. которой можно перемешивать или сортировать программы. Ну например, поменять tetsprog1 и tetsprog1 местами при этом порядковый номер prog* должен остаться!
СПАСИБО!

Отправлено: 22:49, 13-01-2011

 

Аватара для madmasles

Ветеран


Сообщения: 812
Благодарности: 353

Профиль | Отправить PM | Цитировать


Centrinar,
Болванка у меня получилась такая. На Input надо перетащить ини-файл или выбрать его, нажав кнопку "...". В ComboBox загрузятся секции. После выбора секции надо нажать кнопку Загрузить. В ListView загрузятся ключи и значения из выбранной секции. Выделите строку, чтобы ее редактировать. Значения можно удалять или менять местами как угодно между собой, кликнув на строке правой кнопкой мыши, ключи при этом остаются на месте. Можно удалить всю строку.Кнопка Сохранить - сохранить изменения, они запишутся в ини-файл. Кнопка Отменить - отменить все произведенные изменения. Кнопка Очистить - удалить все данные из окна.
Ругается, что символов слишком много.
Первая часть:
читать дальше »
Код: Выделить весь код
#include <GUIConstantsEx.au3>
#include <ComboConstants.au3>
#include <GUIListView.au3>
#include <WindowsConstants.au3>
#include <EditConstants.au3>
#include <GuiMenu.au3>
#include <Misc.au3>

Global $hListView, $iLast_LV_Index, $hGui, $sOld, $sNew, $fLV = False, $iCount

_Singleton(@ScriptName)

$hGui = GUICreate('Редактор ini-файлов', 400, 400, -1, -1, -1, $WS_EX_ACCEPTFILES)
$nInputIni = GUICtrlCreateInput('Перетащите сюда ini-файл', 10, 5, 355, 20, _
        BitOR($GUI_SS_DEFAULT_INPUT, $ES_LEFT, $ES_READONLY))
GUICtrlSetState(-1, $GUI_DROPACCEPTED)
$nButtonIni = GUICtrlCreateButton('...', 368, 4, 22, 22)
$nComboSection = GUICtrlCreateCombo('', 10, 33, 100, 20, _
        BitOR($GUI_SS_DEFAULT_COMBO, $CBS_SIMPLE, $ES_READONLY))

$nButtonGet = GUICtrlCreateButton('Загрузить', 120, 32, 60, 22)
$nButtonSave = GUICtrlCreateButton('Сохранить', 190, 32, 60, 22)
$nButtonDefault = GUICtrlCreateButton('Отменить', 260, 32, 60, 22)
$nButtonDelAll = GUICtrlCreateButton('Очистить', 330, 32, 60, 22)

$nListView = GUICtrlCreateListView('', 10, 60, 380, 330, -1, _
        BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT))
$hListView = GUICtrlGetHandle($nListView)

_GUICtrlListView_AddColumn($hListView, 'Ключ', 100, 2)
_GUICtrlListView_AddColumn($hListView, 'Значение', 270, 2)

For $i = $nComboSection To $nListView
    GUICtrlSetState($i, $GUI_DISABLE)
Next

$nDummyMenu = GUICtrlCreateDummy()
$nContextMenu = GUICtrlCreateContextMenu($nDummyMenu)
$hContextMenu = GUICtrlGetHandle($nContextMenu)
$nSubMenuDel = GUICtrlCreateMenuItem('Удалить значение', $nContextMenu)
$nSubMenuDelAll = GUICtrlCreateMenuItem('Удалить строку', $nContextMenu)

GUISetState()
GUIRegisterMsg($WM_NOTIFY, 'WM_NOTIFY')
Это сообщение посчитали полезным следующие участники:

Отправлено: 08:05, 14-01-2011 | #2



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

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для madmasles

Ветеран


Сообщения: 812
Благодарности: 353

Профиль | Отправить PM | Цитировать


Вторая часть:
читать дальше »
Код: Выделить весь код
While 1
    $nMsg = GUIGetMsg()

    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $GUI_EVENT_DROPPED
            If StringRight(@GUI_DragFile, 4) <> '.ini' Then
                GUICtrlSetData($nInputIni, 'Это не ini-файл')
            Else
                FileCopy(@GUI_DragFile, @TempDir & '\' & _
                        StringRegExpReplace(@GUI_DragFile, '^.*\\', ''), 1)
                $fLV = False
                _GUICtrlListView_DeleteAllItems($hListView)
                GUICtrlSetData($nComboSection, '')
                GUICtrlSetData($nInputIni, '')
                For $i = $nComboSection To $nListView
                    GUICtrlSetState($i, $GUI_DISABLE)
                Next
                GUICtrlSetData($nInputIni, @GUI_DragFile)
                GUICtrlSetState($nComboSection, $GUI_ENABLE)
                GUICtrlSetState($nButtonGet, $GUI_ENABLE)
                $aIniTemp = IniReadSectionNames(GUICtrlRead($nInputIni))
                If Not @error Then
                    $sData = ''
                    For $i = 1 To $aIniTemp[0]
                        $sData &= $aIniTemp[$i] & '|'
                    Next
                    $sData = StringTrimRight($sData, 1)
                    GUICtrlSetData($nComboSection, $sData, $aIniTemp[$aIniTemp[0]])
                EndIf
                $aIniTemp = 0
            EndIf
        Case $nButtonIni
            $sFileIni = FileOpenDialog('Выберите ini-файл', _
                    @ScriptDir & '\', 'ini-файл (*.ini)', 1)
            If Not @error Then
                FileCopy($sFileIni, @TempDir & '\' & _
                        StringRegExpReplace($sFileIni, '^.*\\', ''), 1)
                $fLV = False
                _GUICtrlListView_DeleteAllItems($hListView)
                GUICtrlSetData($nComboSection, '')
                GUICtrlSetData($nInputIni, '')
                For $i = $nComboSection To $nListView
                    GUICtrlSetState($i, $GUI_DISABLE)
                Next
                GUICtrlSetData($nInputIni, $sFileIni)
                GUICtrlSetState($nComboSection, $GUI_ENABLE)
                GUICtrlSetState($nButtonGet, $GUI_ENABLE)
                $aIniTemp = IniReadSectionNames($sFileIni)
                If Not @error Then
                    $sData = ''
                    For $i = 1 To $aIniTemp[0]
                        $sData &= $aIniTemp[$i] & '|'
                    Next
                    $sData = StringTrimRight($sData, 1)
                    GUICtrlSetData($nComboSection, $sData, $aIniTemp[$aIniTemp[0]])
                EndIf
                $aIniTemp = 0
            Else
                GUICtrlSetData($nInputIni, 'Вы не выбрали ini-файл')
            EndIf
        Case $nButtonGet
            $aIniTemp = IniReadSection(GUICtrlRead($nInputIni), GUICtrlRead($nComboSection))
            If Not @error Then
                GUICtrlSetState($nSubMenuDelAll, $GUI_ENABLE)
                GUICtrlSetState($nComboSection, $GUI_DISABLE)
                GUICtrlSetState($nButtonGet, $GUI_DISABLE)
                _GUICtrlListView_DeleteAllItems($hListView)
                _GUICtrlMenu_DeleteMenu($hContextMenu, 2)
                $nSubMenu = GUICtrlCreateMenu('Поменять значение местами с', $nContextMenu)
                Dim $aSB_Item[$aIniTemp[0][0]]
                $iCount = $aIniTemp[0][0] - 1
                For $i = 1 To $iCount + 1
                    GUICtrlCreateListViewItem($aIniTemp[$i][0] & _
                            '|' & $aIniTemp[$i][1], $nListView)
                    $aSB_Item[$i - 1] = GUICtrlCreateMenuItem($aIniTemp[$i][1], $nSubMenu)
                Next
                GUICtrlSetState($nListView, $GUI_ENABLE)
                GUICtrlSetState($nButtonSave, $GUI_ENABLE)
                GUICtrlSetState($nButtonDefault, $GUI_ENABLE)
                GUICtrlSetState($nButtonDelAll, $GUI_ENABLE)
                $fLV = True
            EndIf
        Case $nButtonDefault
            $aIniTemp = IniReadSection(@TempDir & '\' & _
                    StringRegExpReplace(GUICtrlRead($nInputIni), '^.*\\', ''), _
                    GUICtrlRead($nComboSection))
            If Not @error Then
                GUICtrlSetState($nSubMenuDelAll, $GUI_ENABLE)
                _GUICtrlListView_DeleteAllItems($hListView)
                _GUICtrlMenu_DeleteMenu($hContextMenu, 2)
                $nSubMenu = GUICtrlCreateMenu('Поменять значение местами с', $nContextMenu)
                Dim $aSB_Item[$aIniTemp[0][0]]
                $iCount = $aIniTemp[0][0] - 1
                For $i = 1 To $iCount + 1
                    GUICtrlCreateListViewItem($aIniTemp[$i][0] & _
                            '|' & $aIniTemp[$i][1], $nListView)
                    $aSB_Item[$i - 1] = GUICtrlCreateMenuItem($aIniTemp[$i][1], $nSubMenu)
                Next
            EndIf
        Case $nButtonDelAll
            $fLV = False
            _GUICtrlListView_DeleteAllItems($hListView)
            GUICtrlSetData($nComboSection, '')
            GUICtrlSetData($nInputIni, '')
            GUICtrlSetState($nSubMenuDelAll, $GUI_ENABLE)
            For $i = $nComboSection To $nListView
                GUICtrlSetState($i, $GUI_DISABLE)
            Next
        Case $nButtonSave
            GUICtrlSetState($nSubMenuDelAll, $GUI_ENABLE)
            $iLV = _GUICtrlListView_GetItemCount($hListView)
            If $iLV Then
                For $i = 0 To $iLV - 1
                    IniWrite(GUICtrlRead($nInputIni), GUICtrlRead($nComboSection), _
                            _GUICtrlListView_GetItemText($hListView, $i), _
                            _GUICtrlListView_GetItemText($hListView, $i, 1))
                Next
            EndIf
        Case $nSubMenuDel
            _GUICtrlListView_SetItemText($hListView, $iLast_LV_Index, 0, 1)
            For $i = 0 To $iCount
                GUICtrlSetData($aSB_Item[$i], _
                        _GUICtrlListView_GetItemText($hListView, $i, 1))
            Next
        Case $nSubMenuDelAll
            _GUICtrlListView_DeleteItem($hListView, $iLast_LV_Index)
            $iCount = _GUICtrlListView_GetItemCount($hListView) - 1
            If $iCount > 0 Then
                _GUICtrlMenu_DeleteMenu($hContextMenu, 2)
                $nSubMenu = GUICtrlCreateMenu('Поменять значение местами с', $nContextMenu)
                Dim $aSB_Item[$iCount + 1]
                For $i = 0 To $iCount
                    $aSB_Item[$i] = GUICtrlCreateMenuItem(_GUICtrlListView_GetItemText( _
                            $hListView, $i, 1), $nSubMenu)
                Next
            Else
                GUICtrlSetState($nSubMenuDelAll, $GUI_DISABLE)
                _GUICtrlMenu_DeleteMenu($hContextMenu, 2)
                $nSubMenu = GUICtrlCreateMenu('Поменять значение местами с', $nContextMenu)
                Dim $aSB_Item[1]
                $aSB_Item[0] = GUICtrlCreateMenuItem(_GUICtrlListView_GetItemText( _
                        $hListView, 0, 1), $nSubMenu)
            EndIf

Последний раз редактировалось madmasles, 14-01-2011 в 08:55.

Это сообщение посчитали полезным следующие участники:

Отправлено: 08:12, 14-01-2011 | #3


Аватара для madmasles

Ветеран


Сообщения: 812
Благодарности: 353

Профиль | Отправить PM | Цитировать


Третья часть:
читать дальше »
Код: Выделить весь код
Case Else
            If $fLV Then
                For $i = 0 To $iCount
                    If $nMsg = $aSB_Item[$i] Then
                        $sOld = _GUICtrlListView_GetItemText($hListView, $iLast_LV_Index, 1)
                        $sNew = _GUICtrlListView_GetItemText($hListView, $i, 1)
                        _GUICtrlListView_SetItemText($hListView, $i, $sOld, 1)
                        _GUICtrlListView_SetItemText($hListView, $iLast_LV_Index, $sNew, 1)
                        For $i = 0 To $iCount
                            GUICtrlSetData($aSB_Item[$i], _
                                    _GUICtrlListView_GetItemText($hListView, $i, 1))
                        Next
                    EndIf
                Next
            EndIf
    EndSwitch
WEnd

Func ShowMenu($hWnd, $nContextID, $nContextControlID, $iMouse = 0)
    Local $hMenu = GUICtrlGetHandle($nContextID)
    Local $iCtrlPos = ControlGetPos($hWnd, '', $nContextControlID)
    Local $X = $iCtrlPos[0]
    Local $Y = $iCtrlPos[1] + $iCtrlPos[3]
    ClientToScreen($hWnd, $X, $Y)
    If $iMouse Then
        $X = MouseGetPos(0)
        $Y = MouseGetPos(1)
    EndIf
    DllCall('user32.dll', 'int', 'TrackPopupMenuEx', 'hwnd', $hMenu, 'int', 0, 'int', _
            $X, 'int', $Y, 'hwnd', $hWnd, 'ptr', 0)
EndFunc   ;==>ShowMenu

Func ClientToScreen($hWnd, ByRef $X, ByRef $Y)
    Local $stPoint = DllStructCreate('int;int')

    DllStructSetData($stPoint, 1, $X)
    DllStructSetData($stPoint, 2, $Y)
    DllCall('user32.dll', 'int', 'ClientToScreen', 'hwnd', $hWnd, 'ptr', _
            DllStructGetPtr($stPoint))
    $X = DllStructGetData($stPoint, 1)
    $Y = DllStructGetData($stPoint, 2)
    $stPoint = 0
EndFunc   ;==>ClientToScreen

Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    Local $hWndFrom, $iCode, $tNMHDR, $hWndListView, $tInfo

    $hWndListView = $hListView
    If Not IsHWnd($hListView) Then $hWndListView = GUICtrlGetHandle($hListView)

    $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, 'hWndFrom'))
    $iCode = DllStructGetData($tNMHDR, 'Code')

    Switch $hWndFrom
        Case $hWndListView
            Switch $iCode
                Case $NM_RCLICK
                    $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
                    $iIndex = DllStructGetData($tInfo, 'Index')
                    For $i = 0 To $iCount
                        GUICtrlSetState($aSB_Item[$i], $GUI_ENABLE)
                    Next
                    If $iIndex <> -1 Then
                        $iLast_LV_Index = $iIndex
                        GUICtrlSetState($aSB_Item[$iIndex], $GUI_DISABLE)
                        ShowMenu($hWnd, $nContextMenu, $hListView, 1)
                    EndIf
            EndSwitch
    EndSwitch

    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY


Все три части надо собрать в один скрипт: 1-ая - под ней 2-ая - под ней 3-ья. На всякий случай скрипт в прикрепленном архиве.

Последний раз редактировалось madmasles, 13-08-2011 в 14:30.

Это сообщение посчитали полезным следующие участники:

Отправлено: 08:18, 14-01-2011 | #4


Аватара для Centrinar

Старожил


Сообщения: 247
Благодарности: 1

Профиль | Цитировать


Еще маленький вопросик, а как добавить кнопку УДАЛИТЬ строку, что бы при этом он поднимал все остальные, т.е. если я удаляю prog1 то значение prog2 автоматически поднимается и становиться prog1. СПАСИБО!

Отправлено: 00:49, 17-01-2011 | #5


Аватара для madmasles

Ветеран


Сообщения: 812
Благодарности: 353

Профиль | Отправить PM | Цитировать


Centrinar,
Если кликнуть левой кнопкой мыши по заголовку ListView Ключи, то в появившемся контекстном меню можно изменить нумерацию ключей. Число или в начале ключа, или в конце.

Последний раз редактировалось madmasles, 13-08-2014 в 08:44.

Это сообщение посчитали полезным следующие участники:

Отправлено: 10:35, 17-01-2011 | #6


Аватара для Centrinar

Старожил


Сообщения: 247
Благодарности: 1

Профиль | Цитировать


Просто при команде Удалить строку он ее утоляет не при сохранении она остается.

Отправлено: 10:50, 17-01-2011 | #7


Аватара для madmasles

Ветеран


Сообщения: 812
Благодарности: 353

Профиль | Отправить PM | Цитировать


Цитата Centrinar:
при сохранении она остается. »
Поправил. Файл поменял.
Это сообщение посчитали полезным следующие участники:

Отправлено: 11:26, 17-01-2011 | #8


Аватара для Centrinar

Старожил


Сообщения: 247
Благодарности: 1

Профиль | Цитировать


Подскажите как правильно прописать конкретный ИНИ т.е. убрать возможность выбора, сам пробовал постоянно ошибки. Сппасиюо

Отправлено: 15:25, 03-02-2011 | #9


Аватара для madmasles

Ветеран


Сообщения: 812
Благодарности: 353

Профиль | Отправить PM | Цитировать


Centrinar,

Последний раз редактировалось madmasles, 13-08-2011 в 14:30.

Это сообщение посчитали полезным следующие участники:

Отправлено: 16:22, 03-02-2011 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » Перемешивание и сортировка в INI файле

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - Изменить настройки в *.ini файле через *.bat CyberMaster Скриптовые языки администрирования Windows 53 13-10-2017 23:09
Система - Что у Вас в файле Finish.ini для GUI интегратора? wolkow70 Наборы обновлений для Windows XP/2003/Windows 7 13 15-01-2011 02:07
CMD/BAT - [решено] Поиск и изменение содержимого в INI файле avb_trader Скриптовые языки администрирования Windows 6 11-10-2010 08:20
[решено] Скрипт для удаления нужных слов в ini файле Pozia AutoIt 23 27-10-2009 18:42
Решено | Можно ли задать параметры в файле boot.ini пред инсталляцией? botvin Автоматическая установка Windows 2000/XP/2003 2 15-04-2006 02:46




 
Переход