Что нового

Элементы GUI Переместить строки из ListBox 1 в ListBox 2

aptyp

Новичок
Сообщения
36
Репутация
0
Есть 2 ListBox.
Есть кнопка, которая перемещает строчку из ListBox 1 в ListBox 2.

Проблемка, что перемещается индекс, а не текст.

Код:
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <GUIListBox.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 615, 437, 192, 124)
$Button1 = GUICtrlCreateButton(">>>", 264, 56, 75, 25)
$Button2 = GUICtrlCreateButton("<<<", 264, 96, 75, 25)
GUICtrlSetState(-1, $GUI_DISABLE)
$Button3 = GUICtrlCreateButton("Random", 264, 136, 75, 25)
GUICtrlSetState(-1, $GUI_DISABLE)

$List1 = GUICtrlCreateList("", 8, 16, 201, 253)
GUICtrlSetData($List1, "A|B|C|D|E")
; Добавляем строчки в список.

$List2 = GUICtrlCreateList("", 408, 16, 201, 253)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit

        Case $Button1
            $selectedItem = _GUICtrlListBox_GetCurSel($List1)
            _GUICtrlListBox_AddString($List2, $selectedItem)
            _GUICtrlListBox_DeleteString($List1, $selectedItem)

    EndSwitch
WEnd
 

Khaibit

Осваивающий
Сообщения
103
Репутация
25
Код:
$selectedItem =_GUICtrlListBox_GetText($List1, _GUICtrlListBox_GetCurSel($List1))
 
Автор
aptyp

aptyp

Новичок
Сообщения
36
Репутация
0
Круто. )

Но теперь перемещённая строка не удаляется из ListBox 1

Пока сделал так.
Или можно проще?

Код:
$selectedItem =_GUICtrlListBox_GetText($List1, _GUICtrlListBox_GetCurSel($List1))
_GUICtrlListBox_AddString($List2, $selectedItem)
$selectedItem = _GUICtrlListBox_GetCurSel($List1)
_GUICtrlListBox_DeleteString($List1, $selectedItem)
 

Khaibit

Осваивающий
Сообщения
103
Репутация
25
Код:
$selectedItem = _GUICtrlListBox_GetCurSel($List1)
$selectedItemText = _GUICtrlListBox_GetText($List1, $selectedItem)
_GUICtrlListBox_AddString($List2, $selectedItemText)
_GUICtrlListBox_DeleteString($List1, $selectedItem)
 
Автор
aptyp

aptyp

Новичок
Сообщения
36
Репутация
0
Создам тут же вопрос про баг.

Есть 2 ListBox.
Есть кнопка Random, которая перемещает несколько случайных строчек из ListBox 1 в ListBox 2.

Но опять есть аналогичная проблемка,
Часто, как можно проследить по многократному нажатию, вместо случайной строчки в ListBox 2 вставляется ноль и эта строчка не удаляется из ListBox 1.

Код:
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <GUIListBox.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 615, 437, 192, 124)
$Button1 = GUICtrlCreateButton(">>>", 264, 56, 75, 25)
GUICtrlSetState(-1, $GUI_DISABLE)
$Button2 = GUICtrlCreateButton("<<<", 264, 96, 75, 25)
GUICtrlSetState(-1, $GUI_DISABLE)
$Button3 = GUICtrlCreateButton("Random", 264, 136, 75, 25)
$Button4 = GUICtrlCreateButton("RESET", 264, 208, 75, 25)
GUICtrlSetState(-1, $GUI_DISABLE)

$List1 = GUICtrlCreateList("", 8, 16, 201, 253)
$setData = "A|B|C|D|E"
GUICtrlSetData($List1, $setData)
; Добавляем строчки в список.

$List2 = GUICtrlCreateList("", 408, 16, 201, 253, BitOR($LBS_NOTIFY,$WS_VSCROLL))
; BitOR отключает опции по умолчанию: 1. $LBS_SORT Сортировку в алафитном порядке 2. $WS_BORDER Двойные границы поля.

GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit

        Case $Button3
            _GUICtrlListBox_ResetContent($List1)
            _GUICtrlListBox_ResetContent($List2)
            GUICtrlSetData($List1, $setData)

            $totalItems = _GUICtrlListBox_GetCount($List1)
; Найти количество строк.

            For $i = 0 To 2
                $randomItem = Random(0, $totalItems - 1, 1)
                _GUICtrlListBox_AddString($List2, _GUICtrlListBox_GetText($List1, $randomItem))
                _GUICtrlListBox_DeleteString($List1, $randomItem)
            Next

    EndSwitch
WEnd
 
Последнее редактирование:

vovsla

Осваивающий
Сообщения
607
Репутация
36
Это не глюк, всё правильно, у Вас же получение $totalItems вне цикла, поэтому после первого прохождения цикла там уже неактуальные данные
Так работает без нолей
Код:
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <GUIListBox.au3>
#include <WindowsConstants.au3>
#include <Array.au3>
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 615, 437, 192, 124)
$Button1 = GUICtrlCreateButton(">>>", 264, 56, 75, 25)
GUICtrlSetState(-1, $GUI_DISABLE)
$Button2 = GUICtrlCreateButton("<<<", 264, 96, 75, 25)
GUICtrlSetState(-1, $GUI_DISABLE)
$Button3 = GUICtrlCreateButton("Random", 264, 136, 75, 25)
$Button4 = GUICtrlCreateButton("RESET", 264, 208, 75, 25)
GUICtrlSetState(-1, $GUI_DISABLE)

$List1 = GUICtrlCreateList("", 8, 16, 201, 253)
$setData = "A|B|C|D|E"
GUICtrlSetData($List1, $setData)
; Добавляем строчки в список.

$List2 = GUICtrlCreateList("", 408, 16, 201, 253, BitOR($LBS_NOTIFY,$WS_VSCROLL))
; BitOR отключает опции по умолчанию: 1. $LBS_SORT Сортировку в алафитном порядке 2. $WS_BORDER Двойные границы поля.

GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit

        Case $Button3
            _GUICtrlListBox_ResetContent($List1)
            _GUICtrlListBox_ResetContent($List2)
            GUICtrlSetData($List1, $setData)

; Найти количество строк.

            For $i = 0 To 2
                $totalItems = _GUICtrlListBox_GetCount($List1)
                $randomItem = Random(0, $totalItems - 1, 1)
                ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $randomItem = ' & $randomItem & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
                $arr = _GUICtrlListBox_GetText($List1, $randomItem)
                ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $arr = ' & $arr & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console

                _GUICtrlListBox_AddString($List2, $arr)
                _GUICtrlListBox_DeleteString($List1, $randomItem)
            Next

    EndSwitch
WEnd

Сообщение автоматически объединено:

И еще, не по теме. Если забивать цикл While WEnd обработкой событий GUI, то с этим неудобно работать, лучше сделать обработку по событиям.
А еще лучше обратить внимание на GUIRegisterMsg: WM_COMMAND, WM_NCLBUTTONDOWN, WM_NOTIFY. Они дают больше возможностей, чем GUICtrlSetOnEvent

Код:
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
Opt("GUIOnEventMode", 1)
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 615, 437, 192, 124)
GUISetOnEvent($GUI_EVENT_CLOSE, "Form1Close")
$Button1 = GUICtrlCreateButton("Button1", 64, 28, 75, 25)
GUICtrlSetOnEvent(-1, "Button1Click")
$Button2 = GUICtrlCreateButton("Button2", 92, 80, 75, 25)
GUICtrlSetOnEvent(-1, "Button2Click")
$Button3 = GUICtrlCreateButton("Button3", 116, 152, 75, 25)
GUICtrlSetOnEvent(-1, "Button3Click")
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
    Sleep(100)
WEnd

Func Button1Click()

EndFunc
Func Button2Click()

EndFunc
Func Button3Click()

EndFunc
Func Form1Close()
    Exit
EndFunc
 
Последнее редактирование:
Верх