<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ko">
	<id>https://devcafe.co.kr/w/index.php?action=history&amp;feed=atom&amp;title=Ini_%ED%85%8D%EC%8A%A4%ED%8A%B8_%EA%B2%80%EC%83%89</id>
	<title>Ini 텍스트 검색 - 편집 역사</title>
	<link rel="self" type="application/atom+xml" href="https://devcafe.co.kr/w/index.php?action=history&amp;feed=atom&amp;title=Ini_%ED%85%8D%EC%8A%A4%ED%8A%B8_%EA%B2%80%EC%83%89"/>
	<link rel="alternate" type="text/html" href="https://devcafe.co.kr/w/index.php?title=Ini_%ED%85%8D%EC%8A%A4%ED%8A%B8_%EA%B2%80%EC%83%89&amp;action=history"/>
	<updated>2026-04-04T05:50:16Z</updated>
	<subtitle>이 문서의 편집 역사</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://devcafe.co.kr/w/index.php?title=Ini_%ED%85%8D%EC%8A%A4%ED%8A%B8_%EA%B2%80%EC%83%89&amp;diff=2313&amp;oldid=prev</id>
		<title>Devcafe: 새 문서: &lt;source lang=autoit&gt;  #Region ;**** Directives created by AutoIt3Wrapper_GUI **** #AutoIt3Wrapper_Icon=config.ico #AutoIt3Wrapper_Res_Comment=Config INI Viewer #AutoIt3Wrapper_Res_Description=INI 파일 키-값 뷰어 #AutoIt3Wrapper_Res_Fileversion=1.0.0.0 #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****  #include &lt;ButtonConstants.au3&gt; #include &lt;EditConstants.au3&gt; #include &lt;GUIConstantsEx.au3&gt; #include &lt;ListViewConstants.au3&gt; #include &lt;WindowsConstants.au3&gt; #inclu...</title>
		<link rel="alternate" type="text/html" href="https://devcafe.co.kr/w/index.php?title=Ini_%ED%85%8D%EC%8A%A4%ED%8A%B8_%EA%B2%80%EC%83%89&amp;diff=2313&amp;oldid=prev"/>
		<updated>2025-09-24T05:46:29Z</updated>

		<summary type="html">&lt;p&gt;새 문서: &amp;lt;source lang=autoit&amp;gt;  #Region ;**** Directives created by AutoIt3Wrapper_GUI **** #AutoIt3Wrapper_Icon=config.ico #AutoIt3Wrapper_Res_Comment=Config INI Viewer #AutoIt3Wrapper_Res_Description=INI 파일 키-값 뷰어 #AutoIt3Wrapper_Res_Fileversion=1.0.0.0 #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****  #include &amp;lt;ButtonConstants.au3&amp;gt; #include &amp;lt;EditConstants.au3&amp;gt; #include &amp;lt;GUIConstantsEx.au3&amp;gt; #include &amp;lt;ListViewConstants.au3&amp;gt; #include &amp;lt;WindowsConstants.au3&amp;gt; #inclu...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;새 문서&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;source lang=autoit&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****&lt;br /&gt;
#AutoIt3Wrapper_Icon=config.ico&lt;br /&gt;
#AutoIt3Wrapper_Res_Comment=Config INI Viewer&lt;br /&gt;
#AutoIt3Wrapper_Res_Description=INI 파일 키-값 뷰어&lt;br /&gt;
#AutoIt3Wrapper_Res_Fileversion=1.0.0.0&lt;br /&gt;
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;ButtonConstants.au3&amp;gt;&lt;br /&gt;
#include &amp;lt;EditConstants.au3&amp;gt;&lt;br /&gt;
#include &amp;lt;GUIConstantsEx.au3&amp;gt;&lt;br /&gt;
#include &amp;lt;ListViewConstants.au3&amp;gt;&lt;br /&gt;
#include &amp;lt;WindowsConstants.au3&amp;gt;&lt;br /&gt;
#include &amp;lt;GuiListView.au3&amp;gt;&lt;br /&gt;
#include &amp;lt;File.au3&amp;gt;&lt;br /&gt;
#include &amp;lt;Array.au3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; ================================================================&lt;br /&gt;
; Config.ini Viewer - INI 파일 키-값 검색 및 표시 프로그램&lt;br /&gt;
; ================================================================&lt;br /&gt;
&lt;br /&gt;
Global $hGUI, $idListView, $idSearchInput, $idFileInput&lt;br /&gt;
Global $idBtnBrowse, $idBtnLoad, $idBtnSearch, $idBtnClear, $idBtnExport, $idBtnEdit, $idBtnRefresh&lt;br /&gt;
Global $idStatusLabel, $idChkCaseSensitive, $idComboSection&lt;br /&gt;
Global $sCurrentFile = &amp;quot;&amp;quot;&lt;br /&gt;
Global $aOriginalData[0][3] ; Section, Key, Value 저장&lt;br /&gt;
Global $iDataCount = 0&lt;br /&gt;
&lt;br /&gt;
Main()&lt;br /&gt;
&lt;br /&gt;
Func Main()&lt;br /&gt;
    CreateGUI()&lt;br /&gt;
    GUISetState(@SW_SHOW, $hGUI)&lt;br /&gt;
    &lt;br /&gt;
    While 1&lt;br /&gt;
        Local $nMsg = GUIGetMsg()&lt;br /&gt;
        &lt;br /&gt;
        Switch $nMsg&lt;br /&gt;
            Case $GUI_EVENT_CLOSE&lt;br /&gt;
                ExitProgram()&lt;br /&gt;
            &lt;br /&gt;
            Case $idBtnBrowse&lt;br /&gt;
                BrowseFile()&lt;br /&gt;
            &lt;br /&gt;
            Case $idBtnLoad&lt;br /&gt;
                LoadINIFile()&lt;br /&gt;
            &lt;br /&gt;
            Case $idBtnSearch&lt;br /&gt;
                SearchData()&lt;br /&gt;
            &lt;br /&gt;
            Case $idBtnClear&lt;br /&gt;
                ClearSearch()&lt;br /&gt;
            &lt;br /&gt;
            Case $idBtnExport&lt;br /&gt;
                ExportToCSV()&lt;br /&gt;
            &lt;br /&gt;
            Case $idBtnEdit&lt;br /&gt;
                EditSelectedItem()&lt;br /&gt;
            &lt;br /&gt;
            Case $idBtnRefresh&lt;br /&gt;
                RefreshData()&lt;br /&gt;
            &lt;br /&gt;
            Case $idComboSection&lt;br /&gt;
                FilterBySection()&lt;br /&gt;
            &lt;br /&gt;
        EndSwitch&lt;br /&gt;
    WEnd&lt;br /&gt;
EndFunc&lt;br /&gt;
&lt;br /&gt;
Func CreateGUI()&lt;br /&gt;
    ; 메인 윈도우 생성&lt;br /&gt;
    $hGUI = GUICreate(&amp;quot;Config.ini Viewer v1.0&amp;quot;, 900, 600, -1, -1, $WS_OVERLAPPEDWINDOW)&lt;br /&gt;
    &lt;br /&gt;
    ; 파일 선택 영역&lt;br /&gt;
    GUICtrlCreateGroup(&amp;quot;INI 파일 선택&amp;quot;, 10, 10, 880, 60)&lt;br /&gt;
    &lt;br /&gt;
    GUICtrlCreateLabel(&amp;quot;파일 경로:&amp;quot;, 20, 30, 60, 20)&lt;br /&gt;
    $idFileInput = GUICtrlCreateInput(&amp;quot;&amp;quot;, 85, 28, 650, 22, $ES_READONLY)&lt;br /&gt;
    $idBtnBrowse = GUICtrlCreateButton(&amp;quot;파일 선택&amp;quot;, 745, 27, 70, 25)&lt;br /&gt;
    $idBtnLoad = GUICtrlCreateButton(&amp;quot;불러오기&amp;quot;, 825, 27, 60, 25)&lt;br /&gt;
    GUICtrlSetFont($idBtnLoad, 9, 600)&lt;br /&gt;
    &lt;br /&gt;
    GUICtrlCreateGroup(&amp;quot;&amp;quot;, -99, -99, 1, 1)&lt;br /&gt;
    &lt;br /&gt;
    ; 검색 및 필터 영역&lt;br /&gt;
    GUICtrlCreateGroup(&amp;quot;검색 및 필터&amp;quot;, 10, 80, 880, 60)&lt;br /&gt;
    &lt;br /&gt;
    GUICtrlCreateLabel(&amp;quot;검색:&amp;quot;, 20, 105, 40, 20)&lt;br /&gt;
    $idSearchInput = GUICtrlCreateInput(&amp;quot;&amp;quot;, 65, 102, 300, 22)&lt;br /&gt;
    $idBtnSearch = GUICtrlCreateButton(&amp;quot;검색&amp;quot;, 375, 101, 60, 25)&lt;br /&gt;
    $idBtnClear = GUICtrlCreateButton(&amp;quot;초기화&amp;quot;, 445, 101, 60, 25)&lt;br /&gt;
    &lt;br /&gt;
    GUICtrlCreateLabel(&amp;quot;섹션:&amp;quot;, 530, 105, 40, 20)&lt;br /&gt;
    $idComboSection = GUICtrlCreateCombo(&amp;quot;&amp;quot;, 575, 102, 150, 20, $CBS_DROPDOWNLIST)&lt;br /&gt;
    GUICtrlSetData($idComboSection, &amp;quot;전체 섹션&amp;quot;)&lt;br /&gt;
    GUICtrlSetState($idComboSection, $GUI_DISABLE)&lt;br /&gt;
    &lt;br /&gt;
    $idChkCaseSensitive = GUICtrlCreateCheckbox(&amp;quot;대소문자 구분&amp;quot;, 740, 104, 100, 20)&lt;br /&gt;
    &lt;br /&gt;
    GUICtrlCreateGroup(&amp;quot;&amp;quot;, -99, -99, 1, 1)&lt;br /&gt;
    &lt;br /&gt;
    ; ListView 생성&lt;br /&gt;
    GUICtrlCreateGroup(&amp;quot;검색 결과&amp;quot;, 10, 150, 880, 390)&lt;br /&gt;
    &lt;br /&gt;
    $idListView = GUICtrlCreateListView(&amp;quot;섹션|키|값&amp;quot;, 20, 170, 860, 330, $LVS_REPORT + $LVS_GRIDLINES + $LVS_FULLROWSELECT, $LVS_EX_GRIDLINES + $LVS_EX_FULLROWSELECT)&lt;br /&gt;
    &lt;br /&gt;
    ; 컬럼 너비 설정&lt;br /&gt;
    _GUICtrlListView_SetColumnWidth($idListView, 0, 200)  ; 섹션&lt;br /&gt;
    _GUICtrlListView_SetColumnWidth($idListView, 1, 250)  ; 키&lt;br /&gt;
    _GUICtrlListView_SetColumnWidth($idListView, 2, 400)  ; 값&lt;br /&gt;
    &lt;br /&gt;
    GUICtrlCreateGroup(&amp;quot;&amp;quot;, -99, -99, 1, 1)&lt;br /&gt;
    &lt;br /&gt;
    ; 하단 버튼 영역&lt;br /&gt;
    $idBtnRefresh = GUICtrlCreateButton(&amp;quot;새로고침&amp;quot;, 20, 555, 80, 30)&lt;br /&gt;
    $idBtnEdit = GUICtrlCreateButton(&amp;quot;값 수정&amp;quot;, 110, 555, 80, 30)&lt;br /&gt;
    $idBtnExport = GUICtrlCreateButton(&amp;quot;CSV 내보내기&amp;quot;, 200, 555, 100, 30)&lt;br /&gt;
    &lt;br /&gt;
    ; 상태 표시&lt;br /&gt;
    $idStatusLabel = GUICtrlCreateLabel(&amp;quot;INI 파일을 선택하세요.&amp;quot;, 320, 562, 550, 20)&lt;br /&gt;
    GUICtrlSetColor($idStatusLabel, 0x0000FF)&lt;br /&gt;
    &lt;br /&gt;
    ; 더블클릭으로 값 수정&lt;br /&gt;
    GUISetOnEvent($GUI_EVENT_PRIMARYDOWN, &amp;quot;OnListViewDoubleClick&amp;quot;)&lt;br /&gt;
EndFunc&lt;br /&gt;
&lt;br /&gt;
Func BrowseFile()&lt;br /&gt;
    Local $sFile = FileOpenDialog(&amp;quot;INI 파일 선택&amp;quot;, @ScriptDir, &amp;quot;INI 파일 (*.ini)|모든 파일 (*.*)&amp;quot;, 1)&lt;br /&gt;
    &lt;br /&gt;
    If Not @error And $sFile &amp;lt;&amp;gt; &amp;quot;&amp;quot; Then&lt;br /&gt;
        GUICtrlSetData($idFileInput, $sFile)&lt;br /&gt;
        $sCurrentFile = $sFile&lt;br /&gt;
        UpdateStatus(&amp;quot;파일이 선택되었습니다: &amp;quot; &amp;amp; $sFile)&lt;br /&gt;
    EndIf&lt;br /&gt;
EndFunc&lt;br /&gt;
&lt;br /&gt;
Func LoadINIFile()&lt;br /&gt;
    Local $sFile = GUICtrlRead($idFileInput)&lt;br /&gt;
    &lt;br /&gt;
    If $sFile = &amp;quot;&amp;quot; Then&lt;br /&gt;
        MsgBox(48, &amp;quot;알림&amp;quot;, &amp;quot;INI 파일을 먼저 선택해주세요.&amp;quot;)&lt;br /&gt;
        Return&lt;br /&gt;
    EndIf&lt;br /&gt;
    &lt;br /&gt;
    If Not FileExists($sFile) Then&lt;br /&gt;
        MsgBox(16, &amp;quot;오류&amp;quot;, &amp;quot;파일을 찾을 수 없습니다: &amp;quot; &amp;amp; $sFile)&lt;br /&gt;
        Return&lt;br /&gt;
    EndIf&lt;br /&gt;
    &lt;br /&gt;
    ; 기존 데이터 초기화&lt;br /&gt;
    _GUICtrlListView_DeleteAllItems($idListView)&lt;br /&gt;
    ReDim $aOriginalData[0][3]&lt;br /&gt;
    $iDataCount = 0&lt;br /&gt;
    &lt;br /&gt;
    UpdateStatus(&amp;quot;파일을 읽는 중...&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    ; INI 파일 읽기&lt;br /&gt;
    Local $aSections = IniReadSectionNames($sFile)&lt;br /&gt;
    &lt;br /&gt;
    If @error Then&lt;br /&gt;
        MsgBox(16, &amp;quot;오류&amp;quot;, &amp;quot;INI 파일을 읽을 수 없습니다.&amp;quot;)&lt;br /&gt;
        UpdateStatus(&amp;quot;오류: INI 파일을 읽을 수 없습니다.&amp;quot;)&lt;br /&gt;
        Return&lt;br /&gt;
    EndIf&lt;br /&gt;
    &lt;br /&gt;
    ; 섹션 콤보박스 업데이트&lt;br /&gt;
    GUICtrlSetData($idComboSection, &amp;quot;전체 섹션&amp;quot;)&lt;br /&gt;
    For $i = 1 To $aSections[0]&lt;br /&gt;
        GUICtrlSetData($idComboSection, $aSections[$i])&lt;br /&gt;
    Next&lt;br /&gt;
    GUICtrlSetState($idComboSection, $GUI_ENABLE)&lt;br /&gt;
    &lt;br /&gt;
    ; 각 섹션별로 키-값 읽기&lt;br /&gt;
    Local $iTotalItems = 0&lt;br /&gt;
    &lt;br /&gt;
    For $i = 1 To $aSections[0]&lt;br /&gt;
        Local $aKeys = IniReadSection($sFile, $aSections[$i])&lt;br /&gt;
        &lt;br /&gt;
        If Not @error Then&lt;br /&gt;
            For $j = 1 To $aKeys[0][0]&lt;br /&gt;
                ; 배열에 데이터 저장&lt;br /&gt;
                ReDim $aOriginalData[$iDataCount + 1][3]&lt;br /&gt;
                $aOriginalData[$iDataCount][0] = $aSections[$i]&lt;br /&gt;
                $aOriginalData[$iDataCount][1] = $aKeys[$j][0]&lt;br /&gt;
                $aOriginalData[$iDataCount][2] = $aKeys[$j][1]&lt;br /&gt;
                $iDataCount += 1&lt;br /&gt;
                &lt;br /&gt;
                ; ListView에 추가&lt;br /&gt;
                Local $iIndex = _GUICtrlListView_AddItem($idListView, $aSections[$i])&lt;br /&gt;
                _GUICtrlListView_AddSubItem($idListView, $iIndex, $aKeys[$j][0], 1)&lt;br /&gt;
                _GUICtrlListView_AddSubItem($idListView, $iIndex, $aKeys[$j][1], 2)&lt;br /&gt;
                &lt;br /&gt;
                $iTotalItems += 1&lt;br /&gt;
            Next&lt;br /&gt;
        EndIf&lt;br /&gt;
    Next&lt;br /&gt;
    &lt;br /&gt;
    UpdateStatus(&amp;quot;총 &amp;quot; &amp;amp; $iTotalItems &amp;amp; &amp;quot;개 항목을 불러왔습니다. (섹션: &amp;quot; &amp;amp; $aSections[0] &amp;amp; &amp;quot;개)&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    ; 검색 입력란 활성화&lt;br /&gt;
    GUICtrlSetState($idSearchInput, $GUI_ENABLE)&lt;br /&gt;
    GUICtrlSetState($idBtnSearch, $GUI_ENABLE)&lt;br /&gt;
EndFunc&lt;br /&gt;
&lt;br /&gt;
Func SearchData()&lt;br /&gt;
    Local $sSearchText = GUICtrlRead($idSearchInput)&lt;br /&gt;
    Local $bCaseSensitive = (GUICtrlRead($idChkCaseSensitive) = $GUI_CHECKED)&lt;br /&gt;
    &lt;br /&gt;
    If $sSearchText = &amp;quot;&amp;quot; Then&lt;br /&gt;
        MsgBox(48, &amp;quot;알림&amp;quot;, &amp;quot;검색할 텍스트를 입력하세요.&amp;quot;)&lt;br /&gt;
        Return&lt;br /&gt;
    EndIf&lt;br /&gt;
    &lt;br /&gt;
    ; ListView 초기화&lt;br /&gt;
    _GUICtrlListView_DeleteAllItems($idListView)&lt;br /&gt;
    &lt;br /&gt;
    Local $iFoundCount = 0&lt;br /&gt;
    &lt;br /&gt;
    ; 원본 데이터에서 검색&lt;br /&gt;
    For $i = 0 To $iDataCount - 1&lt;br /&gt;
        Local $sSection = $aOriginalData[$i][0]&lt;br /&gt;
        Local $sKey = $aOriginalData[$i][1]&lt;br /&gt;
        Local $sValue = $aOriginalData[$i][2]&lt;br /&gt;
        &lt;br /&gt;
        Local $bFound = False&lt;br /&gt;
        &lt;br /&gt;
        If $bCaseSensitive Then&lt;br /&gt;
            ; 대소문자 구분&lt;br /&gt;
            If StringInStr($sSection, $sSearchText) Or _&lt;br /&gt;
               StringInStr($sKey, $sSearchText) Or _&lt;br /&gt;
               StringInStr($sValue, $sSearchText) Then&lt;br /&gt;
                $bFound = True&lt;br /&gt;
            EndIf&lt;br /&gt;
        Else&lt;br /&gt;
            ; 대소문자 무시&lt;br /&gt;
            If StringInStr($sSection, $sSearchText, 0) Or _&lt;br /&gt;
               StringInStr($sKey, $sSearchText, 0) Or _&lt;br /&gt;
               StringInStr($sValue, $sSearchText, 0) Then&lt;br /&gt;
                $bFound = True&lt;br /&gt;
            EndIf&lt;br /&gt;
        EndIf&lt;br /&gt;
        &lt;br /&gt;
        If $bFound Then&lt;br /&gt;
            Local $iIndex = _GUICtrlListView_AddItem($idListView, $sSection)&lt;br /&gt;
            _GUICtrlListView_AddSubItem($idListView, $iIndex, $sKey, 1)&lt;br /&gt;
            _GUICtrlListView_AddSubItem($idListView, $iIndex, $sValue, 2)&lt;br /&gt;
            $iFoundCount += 1&lt;br /&gt;
        EndIf&lt;br /&gt;
    Next&lt;br /&gt;
    &lt;br /&gt;
    If $iFoundCount &amp;gt; 0 Then&lt;br /&gt;
        UpdateStatus($iFoundCount &amp;amp; &amp;quot;개 항목을 찾았습니다. (검색어: &amp;#039;&amp;quot; &amp;amp; $sSearchText &amp;amp; &amp;quot;&amp;#039;)&amp;quot;)&lt;br /&gt;
    Else&lt;br /&gt;
        UpdateStatus(&amp;quot;검색 결과가 없습니다.&amp;quot;)&lt;br /&gt;
        MsgBox(64, &amp;quot;검색 결과&amp;quot;, &amp;quot;&amp;#039;&amp;quot; &amp;amp; $sSearchText &amp;amp; &amp;quot;&amp;#039;에 대한 검색 결과가 없습니다.&amp;quot;)&lt;br /&gt;
    EndIf&lt;br /&gt;
EndFunc&lt;br /&gt;
&lt;br /&gt;
Func ClearSearch()&lt;br /&gt;
    ; 검색 초기화 및 전체 데이터 표시&lt;br /&gt;
    GUICtrlSetData($idSearchInput, &amp;quot;&amp;quot;)&lt;br /&gt;
    GUICtrlSetData($idComboSection, &amp;quot;전체 섹션&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    _GUICtrlListView_DeleteAllItems($idListView)&lt;br /&gt;
    &lt;br /&gt;
    ; 전체 데이터 다시 표시&lt;br /&gt;
    For $i = 0 To $iDataCount - 1&lt;br /&gt;
        Local $iIndex = _GUICtrlListView_AddItem($idListView, $aOriginalData[$i][0])&lt;br /&gt;
        _GUICtrlListView_AddSubItem($idListView, $iIndex, $aOriginalData[$i][1], 1)&lt;br /&gt;
        _GUICtrlListView_AddSubItem($idListView, $iIndex, $aOriginalData[$i][2], 2)&lt;br /&gt;
    Next&lt;br /&gt;
    &lt;br /&gt;
    UpdateStatus(&amp;quot;전체 &amp;quot; &amp;amp; $iDataCount &amp;amp; &amp;quot;개 항목을 표시합니다.&amp;quot;)&lt;br /&gt;
EndFunc&lt;br /&gt;
&lt;br /&gt;
Func FilterBySection()&lt;br /&gt;
    Local $sSelectedSection = GUICtrlRead($idComboSection)&lt;br /&gt;
    &lt;br /&gt;
    If $sSelectedSection = &amp;quot;전체 섹션&amp;quot; Or $sSelectedSection = &amp;quot;&amp;quot; Then&lt;br /&gt;
        ClearSearch()&lt;br /&gt;
        Return&lt;br /&gt;
    EndIf&lt;br /&gt;
    &lt;br /&gt;
    ; ListView 초기화&lt;br /&gt;
    _GUICtrlListView_DeleteAllItems($idListView)&lt;br /&gt;
    &lt;br /&gt;
    Local $iFoundCount = 0&lt;br /&gt;
    &lt;br /&gt;
    ; 선택된 섹션만 표시&lt;br /&gt;
    For $i = 0 To $iDataCount - 1&lt;br /&gt;
        If $aOriginalData[$i][0] = $sSelectedSection Then&lt;br /&gt;
            Local $iIndex = _GUICtrlListView_AddItem($idListView, $aOriginalData[$i][0])&lt;br /&gt;
            _GUICtrlListView_AddSubItem($idListView, $iIndex, $aOriginalData[$i][1], 1)&lt;br /&gt;
            _GUICtrlListView_AddSubItem($idListView, $iIndex, $aOriginalData[$i][2], 2)&lt;br /&gt;
            $iFoundCount += 1&lt;br /&gt;
        EndIf&lt;br /&gt;
    Next&lt;br /&gt;
    &lt;br /&gt;
    UpdateStatus(&amp;quot;&amp;#039;&amp;quot; &amp;amp; $sSelectedSection &amp;amp; &amp;quot;&amp;#039; 섹션: &amp;quot; &amp;amp; $iFoundCount &amp;amp; &amp;quot;개 항목&amp;quot;)&lt;br /&gt;
EndFunc&lt;br /&gt;
&lt;br /&gt;
Func EditSelectedItem()&lt;br /&gt;
    Local $iSelected = _GUICtrlListView_GetSelectedIndices($idListView)&lt;br /&gt;
    &lt;br /&gt;
    If $iSelected = &amp;quot;&amp;quot; Then&lt;br /&gt;
        MsgBox(48, &amp;quot;알림&amp;quot;, &amp;quot;수정할 항목을 선택하세요.&amp;quot;)&lt;br /&gt;
        Return&lt;br /&gt;
    EndIf&lt;br /&gt;
    &lt;br /&gt;
    ; 선택된 항목 정보 가져오기&lt;br /&gt;
    Local $sSection = _GUICtrlListView_GetItemText($idListView, $iSelected, 0)&lt;br /&gt;
    Local $sKey = _GUICtrlListView_GetItemText($idListView, $iSelected, 1)&lt;br /&gt;
    Local $sValue = _GUICtrlListView_GetItemText($idListView, $iSelected, 2)&lt;br /&gt;
    &lt;br /&gt;
    ; 새 값 입력받기&lt;br /&gt;
    Local $sNewValue = InputBox(&amp;quot;값 수정&amp;quot;, &amp;quot;새로운 값을 입력하세요:&amp;quot; &amp;amp; @CRLF &amp;amp; @CRLF &amp;amp; _&lt;br /&gt;
                                &amp;quot;섹션: &amp;quot; &amp;amp; $sSection &amp;amp; @CRLF &amp;amp; _&lt;br /&gt;
                                &amp;quot;키: &amp;quot; &amp;amp; $sKey, $sValue, &amp;quot;&amp;quot;, 400, 200)&lt;br /&gt;
    &lt;br /&gt;
    If @error Then Return&lt;br /&gt;
    &lt;br /&gt;
    ; INI 파일에 저장&lt;br /&gt;
    If IniWrite($sCurrentFile, $sSection, $sKey, $sNewValue) Then&lt;br /&gt;
        ; ListView 업데이트&lt;br /&gt;
        _GUICtrlListView_SetItemText($idListView, $iSelected, $sNewValue, 2)&lt;br /&gt;
        &lt;br /&gt;
        ; 원본 데이터 배열 업데이트&lt;br /&gt;
        For $i = 0 To $iDataCount - 1&lt;br /&gt;
            If $aOriginalData[$i][0] = $sSection And $aOriginalData[$i][1] = $sKey Then&lt;br /&gt;
                $aOriginalData[$i][2] = $sNewValue&lt;br /&gt;
                ExitLoop&lt;br /&gt;
            EndIf&lt;br /&gt;
        Next&lt;br /&gt;
        &lt;br /&gt;
        UpdateStatus(&amp;quot;값이 성공적으로 수정되었습니다.&amp;quot;)&lt;br /&gt;
        MsgBox(64, &amp;quot;성공&amp;quot;, &amp;quot;값이 성공적으로 수정되었습니다.&amp;quot;)&lt;br /&gt;
    Else&lt;br /&gt;
        MsgBox(16, &amp;quot;오류&amp;quot;, &amp;quot;값을 수정하는데 실패했습니다.&amp;quot;)&lt;br /&gt;
    EndIf&lt;br /&gt;
EndFunc&lt;br /&gt;
&lt;br /&gt;
Func RefreshData()&lt;br /&gt;
    ; 현재 파일 다시 불러오기&lt;br /&gt;
    If $sCurrentFile &amp;lt;&amp;gt; &amp;quot;&amp;quot; And FileExists($sCurrentFile) Then&lt;br /&gt;
        LoadINIFile()&lt;br /&gt;
        UpdateStatus(&amp;quot;데이터를 새로고침했습니다.&amp;quot;)&lt;br /&gt;
    Else&lt;br /&gt;
        MsgBox(48, &amp;quot;알림&amp;quot;, &amp;quot;불러온 파일이 없습니다.&amp;quot;)&lt;br /&gt;
    EndIf&lt;br /&gt;
EndFunc&lt;br /&gt;
&lt;br /&gt;
Func ExportToCSV()&lt;br /&gt;
    Local $iItemCount = _GUICtrlListView_GetItemCount($idListView)&lt;br /&gt;
    &lt;br /&gt;
    If $iItemCount = 0 Then&lt;br /&gt;
        MsgBox(48, &amp;quot;알림&amp;quot;, &amp;quot;내보낼 데이터가 없습니다.&amp;quot;)&lt;br /&gt;
        Return&lt;br /&gt;
    EndIf&lt;br /&gt;
    &lt;br /&gt;
    Local $sFile = FileSaveDialog(&amp;quot;CSV로 저장&amp;quot;, @DesktopDir, &amp;quot;CSV 파일 (*.csv)&amp;quot;, 16, &amp;quot;config_export.csv&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    If @error Or $sFile = &amp;quot;&amp;quot; Then Return&lt;br /&gt;
    &lt;br /&gt;
    ; CSV 파일 생성&lt;br /&gt;
    Local $hFile = FileOpen($sFile, 2)  ; 덮어쓰기 모드&lt;br /&gt;
    &lt;br /&gt;
    If $hFile = -1 Then&lt;br /&gt;
        MsgBox(16, &amp;quot;오류&amp;quot;, &amp;quot;파일을 생성할 수 없습니다.&amp;quot;)&lt;br /&gt;
        Return&lt;br /&gt;
    EndIf&lt;br /&gt;
    &lt;br /&gt;
    ; 헤더 쓰기&lt;br /&gt;
    FileWriteLine($hFile, &amp;quot;섹션,키,값&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    ; 데이터 쓰기&lt;br /&gt;
    For $i = 0 To $iItemCount - 1&lt;br /&gt;
        Local $sSection = _GUICtrlListView_GetItemText($idListView, $i, 0)&lt;br /&gt;
        Local $sKey = _GUICtrlListView_GetItemText($idListView, $i, 1)&lt;br /&gt;
        Local $sValue = _GUICtrlListView_GetItemText($idListView, $i, 2)&lt;br /&gt;
        &lt;br /&gt;
        ; CSV 형식으로 쓰기 (값에 쉼표가 있을 경우 따옴표로 감싸기)&lt;br /&gt;
        If StringInStr($sValue, &amp;quot;,&amp;quot;) Then&lt;br /&gt;
            FileWriteLine($hFile, &amp;#039;&amp;quot;&amp;#039; &amp;amp; $sSection &amp;amp; &amp;#039;&amp;quot;,&amp;quot;&amp;#039; &amp;amp; $sKey &amp;amp; &amp;#039;&amp;quot;,&amp;quot;&amp;#039; &amp;amp; $sValue &amp;amp; &amp;#039;&amp;quot;&amp;#039;)&lt;br /&gt;
        Else&lt;br /&gt;
            FileWriteLine($hFile, $sSection &amp;amp; &amp;quot;,&amp;quot; &amp;amp; $sKey &amp;amp; &amp;quot;,&amp;quot; &amp;amp; $sValue)&lt;br /&gt;
        EndIf&lt;br /&gt;
    Next&lt;br /&gt;
    &lt;br /&gt;
    FileClose($hFile)&lt;br /&gt;
    &lt;br /&gt;
    UpdateStatus($iItemCount &amp;amp; &amp;quot;개 항목을 CSV 파일로 저장했습니다: &amp;quot; &amp;amp; $sFile)&lt;br /&gt;
    &lt;br /&gt;
    ; 파일 열기 여부 확인&lt;br /&gt;
    If MsgBox(36, &amp;quot;완료&amp;quot;, &amp;quot;CSV 파일로 내보내기가 완료되었습니다.&amp;quot; &amp;amp; @CRLF &amp;amp; @CRLF &amp;amp; &amp;quot;파일을 여시겠습니까?&amp;quot;) = 6 Then&lt;br /&gt;
        ShellExecute($sFile)&lt;br /&gt;
    EndIf&lt;br /&gt;
EndFunc&lt;br /&gt;
&lt;br /&gt;
Func OnListViewDoubleClick()&lt;br /&gt;
    ; ListView 더블클릭시 값 수정&lt;br /&gt;
    If @GUI_CtrlId = $idListView Then&lt;br /&gt;
        EditSelectedItem()&lt;br /&gt;
    EndIf&lt;br /&gt;
EndFunc&lt;br /&gt;
&lt;br /&gt;
Func UpdateStatus($sMessage)&lt;br /&gt;
    GUICtrlSetData($idStatusLabel, $sMessage)&lt;br /&gt;
    GUICtrlSetColor($idStatusLabel, 0x000000)&lt;br /&gt;
EndFunc&lt;br /&gt;
&lt;br /&gt;
Func ExitProgram()&lt;br /&gt;
    Exit&lt;br /&gt;
EndFunc&lt;br /&gt;
&lt;br /&gt;
; 추가 유틸리티 함수들&lt;br /&gt;
&lt;br /&gt;
Func CreateSampleINI()&lt;br /&gt;
    ; 샘플 INI 파일 생성 (테스트용)&lt;br /&gt;
    Local $sSampleFile = @ScriptDir &amp;amp; &amp;quot;\sample_config.ini&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    If FileExists($sSampleFile) Then Return $sSampleFile&lt;br /&gt;
    &lt;br /&gt;
    IniWrite($sSampleFile, &amp;quot;Database&amp;quot;, &amp;quot;Host&amp;quot;, &amp;quot;localhost&amp;quot;)&lt;br /&gt;
    IniWrite($sSampleFile, &amp;quot;Database&amp;quot;, &amp;quot;Port&amp;quot;, &amp;quot;3306&amp;quot;)&lt;br /&gt;
    IniWrite($sSampleFile, &amp;quot;Database&amp;quot;, &amp;quot;Username&amp;quot;, &amp;quot;admin&amp;quot;)&lt;br /&gt;
    IniWrite($sSampleFile, &amp;quot;Database&amp;quot;, &amp;quot;Password&amp;quot;, &amp;quot;password123&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    IniWrite($sSampleFile, &amp;quot;Application&amp;quot;, &amp;quot;Version&amp;quot;, &amp;quot;1.0.0&amp;quot;)&lt;br /&gt;
    IniWrite($sSampleFile, &amp;quot;Application&amp;quot;, &amp;quot;Language&amp;quot;, &amp;quot;Korean&amp;quot;)&lt;br /&gt;
    IniWrite($sSampleFile, &amp;quot;Application&amp;quot;, &amp;quot;Theme&amp;quot;, &amp;quot;Dark&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    IniWrite($sSampleFile, &amp;quot;Paths&amp;quot;, &amp;quot;DataDir&amp;quot;, &amp;quot;C:\Data&amp;quot;)&lt;br /&gt;
    IniWrite($sSampleFile, &amp;quot;Paths&amp;quot;, &amp;quot;LogDir&amp;quot;, &amp;quot;C:\Logs&amp;quot;)&lt;br /&gt;
    IniWrite($sSampleFile, &amp;quot;Paths&amp;quot;, &amp;quot;TempDir&amp;quot;, &amp;quot;C:\Temp&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    Return $sSampleFile&lt;br /&gt;
EndFunc&lt;br /&gt;
&lt;br /&gt;
; 컨텍스트 메뉴 추가 (선택적)&lt;br /&gt;
Func CreateContextMenu()&lt;br /&gt;
    Local $hMenu = GUICtrlCreateContextMenu($idListView)&lt;br /&gt;
    GUICtrlCreateMenuItem(&amp;quot;값 수정&amp;quot;, $hMenu)&lt;br /&gt;
    GUICtrlCreateMenuItem(&amp;quot;행 복사&amp;quot;, $hMenu)&lt;br /&gt;
    GUICtrlCreateMenuItem(&amp;quot;-&amp;quot;, $hMenu)&lt;br /&gt;
    GUICtrlCreateMenuItem(&amp;quot;삭제&amp;quot;, $hMenu)&lt;br /&gt;
EndFunc&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Devcafe</name></author>
	</entry>
</feed>