PDA

Показать полную графическую версию : Перемешивание и сортировка в INI файле


Страниц : [1] 2

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

madmasles
14-01-2011, 08:05
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')

madmasles
14-01-2011, 08:12
Вторая часть: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:18
Третья часть: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-ья. На всякий случай скрипт в прикрепленном архиве.

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

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

Centrinar
17-01-2011, 10:50
Просто при команде Удалить строку он ее утоляет не при сохранении она остается.

madmasles
17-01-2011, 11:26
при сохранении она остается. »Поправил. Файл поменял.

Centrinar
03-02-2011, 15:25
Подскажите как правильно прописать конкретный ИНИ т.е. убрать возможность выбора, сам пробовал постоянно ошибки. Сппасиюо

madmasles
03-02-2011, 16:22
Centrinar,

Centrinar
03-02-2011, 21:51
Никак не пойму по какому принципу строятся колонки.
Надо что бы вторая колонка отображала только название с возможностью переписать это название т.е.
$aParams = IniReadSection("conf.ini", "Programs")
StringRegExpReplace($aParams, '^.*=', '')
.......
Спасибо!

madmasles
03-02-2011, 22:13
Никак не пойму по какому принципу строятся колонки. »
Вот Ваш ини-файл:[Progs]
prog1=<tetsprog1.exe>
prog2=<tetsprog2.exe>
...
В ComboBox загружаются секции ([Progs] и другие). В ListView левая колонка - ключ (prog1, prog2 и т.д.), правая - значение (<tetsprog1.exe>, <tetsprog2.exe> и т.д.).
Надо что бы вторая колонка отображала только название с возможностью переписать это название т.е.
$aParams = IniReadSection("conf.ini", "Programs")
StringRegExpReplace($aParams, '^.*=', '') »Здесь не понял.

Centrinar
04-02-2011, 01:04
Полный ИНИ выглядет так
prog1=<tetsprog1.exe><Программа 1><Пароль><Ghjdthrf><><><><>
так вот, я хотел сделать что бы он отображал 8 столбцов(По количеству <> ) и при этом была бы возможность переименовывать. т.е. вместо "Программа 1" написать "программа 33" и он бы записал это в ИНИ файл, вместо "Пароль" написать "Пароль5" ну и т.д.Я думал сам справлюсь, но поскольку я с ListView плохо знаком, очень нужна ваша помощь. СПАСИБО

Centrinar
04-02-2011, 17:49
:sorry:

madmasles
04-02-2011, 22:07
Centrinar,
В прикрепленном архиве то, что у меня получилось.
Двойной клик на ячейке или через меню по правой кнопке мыши - редактировать. Левой кнопкой мыши по заголовку первой колонки (ключ) - изменить нумерацию ключей.
Будут косяки - будем исправлять. :)

Centrinar
04-02-2011, 22:42
madmasles большущие спасибо!

madmasles
04-02-2011, 22:58
Centrinar,
Можно сделать, чтобы при перетаскивании ини-файла на иконку скомпилированного скрипта, он загружался в окно.

Centrinar
04-02-2011, 23:05
было бы супер! :yahoo:

madmasles
04-02-2011, 23:53
Centrinar,
Попробуйте.

Centrinar
05-02-2011, 23:27
madmasles верни пож. пункт перемещения строк, ну что бы их можно было сортировать, опускать, поднимать и т.д. СПАСИБО!




© OSzone.net 2001-2012