Что нового

как в GUICtrlCreateListView отобразить _WinAPI_CreateFile

bulldog5293

Знающий
Сообщения
172
Репутация
10
Приветствую! Помогите разобраться с примером
Код:
#include <WinAPI.au3>
#include <GUIConstants.au3>

Global $sFile, $hFile, $sText, $nBytes, $tBuffer

GUICreate("My GUI")  ; will create a dialog box that when displayed is centered
GUICtrlCreateListView ("", 1, 1, 399, 399)
GUISetState (@SW_SHOW)       ; will display an empty dialog box
; 1) create file and write data to it
$sFile = @ScriptDir & '\test.txt'
$sText = 'abcdefghijklmnopqrstuvwxyz'
$tBuffer = DllStructCreate("byte[" & StringLen($sText) & "]")
DllStructSetData($tBuffer, 1, $sText)
$hFile = _WinAPI_CreateFile($sFile, 1)
_WinAPI_WriteFile($hFile, DllStructGetPtr($tBuffer), StringLen($sText), $nBytes)
_WinAPI_CloseHandle($hFile)
ConsoleWrite('1) ' & FileRead($sFile) & @CRLF)

FileDelete($sfile)

While 1
    $msg = GUIGetMsg()
    
    If $msg = $GUI_EVENT_CLOSE Then ExitLoop
Wend

Чтоб в list попадала строка $sText = 'abcdefghijklmnopqrstuvwxyz' , как самаму зделать не поёму :IL_AutoIt_1:
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Вот пример:
Код:
#include <GUIConstantsEx.au3>
#include <ListViewConstants.au3>
#include <WindowsConstants.au3>

Dim $sText = "Содержимое колонки Text!"

#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Пример", 454, 190, 192, 114)
$ListView1 = GUICtrlCreateListView("Text", 0, 0, 453, 150)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, 448)
$ListView1_0 = GUICtrlCreateListViewItem("", $ListView1)
$Button1 = GUICtrlCreateButton("Отправить", 370, 158, 75, 25, 0)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $Button1
			GUICtrlSetData($ListView1_0,$sText)
	EndSwitch
WEnd
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Или вот:
Код:
#include <GUIConstants.au3>
#include <Array.au3>

$sNumber = ""
$aString = StringSplit('abcdefghijklmnopqrstuvwxyz', "")
$sString = _ArrayToString($aString, "|", 1)
For $i = 1 To $aString[0]
	$sNumber &= $i & "|"
Next
GUICreate("My GUI")
$listview = GUICtrlCreateListView($sNumber, 1, 1, 399, 399)
$item1 = GUICtrlCreateListViewItem($sString, $listview)
GUISetState()
; ...
While 1
	$msg = GUIGetMsg()

	If $msg = $GUI_EVENT_CLOSE Then ExitLoop
WEnd
 
Автор
B

bulldog5293

Знающий
Сообщения
172
Репутация
10
Нет, мне нужна именно _WinAPI_CreateFile, а скрипт я приводил в пример что бы потом через него понять как связь строится, мой скрипт отличается тем что там input записывается через fileopen в txt\ini файл и вывестись должен сразу в list. _WinAPI_CreateFile собираюсь использовать, т.к. fileopen неможет одновременно выполнить и чтение и запись
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
bulldog5293 [?]
Чтоб в list попадала строка $sText = 'abcdefghijklmnopqrstuvwxyz'
Это же Ваш вопрос. Вы бы поконкретнее объяснили, что Вы хотите.
 
Автор
B

bulldog5293

Знающий
Сообщения
172
Репутация
10
Если поконкретнее то я хочу понять как заставить работать этот скрипт
Код:
Func _GUI() 
$main2 = GUICreate("Редактор аков от букс", 490, 480, -1, -1) 
GUICtrlCreateLabel("", 340, 22, 62, 17)
$answer= GUICtrlCreateInput("", 390, 22, 92, 17)
GUICtrlCreateLabel("", 340, 60, 62, 17)
$sPass = GUICtrlCreateInput("", 390, 60, 92, 17)
$Button_add = GUICtrlCreateButton("Сохранить", 340, 145, 60, 23, $WS_GROUP)
$LIST=GUICtrlCreateList("",0,0,200,300)
GUISetState() 
$File = FileOpen ("text.txt", 1)
$iFileSize = FileGetSize($File)
 $tBuffer = DllStructCreate("byte[" & $iFileSize & "]")
$hFile = _WinAPI_CreateFile($File, 2, 2, 6)
_WinAPI_ReadFile($hFile, DllStructGetPtr($tBuffer), $iFileSize, $nBytes)
While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
		Case $GUI_EVENT_CLOSE
	    Case $Button_add
            FileWriteLine ( $file, GUICtrlRead ( $answer) & @CRLF)
            FileWriteLine ( $file, GUICtrlRead ( $sPass) & @CRLF)
    EndSwitch
WEnd
EndFunc

что бы по сохранению информация из инпутов выводилась в лист, без кнопок просмотр, а по кнопке сохранить
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
bulldog5293 [?]
я хочу понять как заставить работать этот скрипт
Никак, он не пригоден для использования :'(

Лучше опишите задачу подробнее, и главное, зачем вам «нужна именно _WinAPI_CreateFile»?
 
Автор
B

bulldog5293

Знающий
Сообщения
172
Репутация
10
Уважаемый CreatoR? я долго мучелся с тем что мне нужно вывести в лист сохранёные даные из инпутов, но без повторного сохранения они не выводились, да и выводились с ошибкой и тем более на одной из веток вашего форума я прочитал что FileOpen теперь не может одновременно читать\писать
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
bulldog5293 [?]
прочитал что FileOpen теперь не может одновременно читать\писать
А если без FileOpen? Вы же, наверное, не будете мегабайты текста записывать - читать все время. Вот так у меня работает:
Код:
$sString = 'abcdefghijklmnopqrstuvwxyz'
For $i = 1 To StringLen('abcdefghijklmnopqrstuvwxyz')
	FileWriteLine("test.txt", StringLeft($sString, $i))
	MsgBox(0, $i, FileReadLine("test.txt", $i), 1)
Next
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
bulldog5293 [?]
мне нужно вывести в лист сохранёные даные из инпутов, но без повторного сохранения они не выводились
Сохранения чего?

на одной из веток вашего форума я прочитал что FileOpen теперь не может одновременно читать\писать
Смотря какая задача поставлена (хотя на самом деле всё как раз наоборот, это в последних версиях стало возможным читать и записывать в файл одновременно), мне кажется в вашем случае это не значительно.
 
Автор
B

bulldog5293

Знающий
Сообщения
172
Репутация
10
чёт у меня голова :wacko:б действительно то на старую версию, лан ща ещё попробую через fileopen вывести в лист сразу после добавления, а так вобще сохраняю в txt даные с инпутов, ini мне не очень подходит в моей задаче
 

snoitaleR

AutoIT Гуру
Сообщения
855
Репутация
223
bulldog5293
Я правильно понял твою задачу: нужно сохранить в текстовый файл пункты списка?

Вот мой пример:
Код:
; НАЧАЛО

 $ADDR=@ScriptDir&"\test.txt"

 $FILE=FileOpen($ADDR,2) ; С очисткой

 $GUI=GUICreate("Сохранение текста из полей",300,120)
 $INPUT1=GUICtrlCreateInput("Введите текст",10,10,280,25)
 $INPUT2=GUICtrlCreateInput("Введите текст",10,35,280,25)
 $INPUT3=GUICtrlCreateInput("Введите текст",10,60,280,25)
 $BUTTON=GUICtrlCreateButton("Сохранить",10,85,280,25)

 GUISetState()

 while true

  Switch GUIGetMsg()
   case -3
    exitloop
   case $BUTTON
    FileWriteLine($FILE,GUICtrlRead($INPUT1))
    FileWriteLine($FILE,GUICtrlRead($INPUT2))
    FileWriteLine($FILE,GUICtrlRead($INPUT3))
  EndSwitch

 wend

 FileClose($FILE)

; КОНЕЦ
 
Автор
B

bulldog5293

Знающий
Сообщения
172
Репутация
10
Сохранять то они сохраняются, мне нужно чтоб они в лист сразу же попали
 

snoitaleR

AutoIT Гуру
Сообщения
855
Репутация
223
bulldog5293
Еще вариант с добавлением в список:

Код:
; НАЧАЛО

 $ADDR=@ScriptDir&"\test.txt"

 $FILE=FileOpen($ADDR,1) ; Режим добавления

 $GUI=GUICreate("Сохранение текста в полях",300,220)
 $INPUT1=GUICtrlCreateInput("Введите текст",10,10,280,25)
 $INPUT2=GUICtrlCreateInput("Введите текст",10,35,280,25)
 $INPUT3=GUICtrlCreateInput("Введите текст",10,60,280,25)
 $LIST=GUICtrlCreateList("",10,85,280,100)
 $BUTTON=GUICtrlCreateButton("Сохранить",10,185,280,25)

 GUISetState()

 while true

  Switch GUIGetMsg()
   case -3
    exitloop
   case $BUTTON
    FileWriteLine($FILE,GUICtrlRead($INPUT1))
    FileWriteLine($FILE,GUICtrlRead($INPUT2))
    FileWriteLine($FILE,GUICtrlRead($INPUT3))
    GUICtrlSetData($LIST,GUICtrlRead($INPUT1)&"|"&GUICtrlRead($INPUT2)&"|"&GUICtrlRead($INPUT3))
  EndSwitch

 wend

 FileClose($FILE)

; КОНЕЦ
 
Автор
B

bulldog5293

Знающий
Сообщения
172
Репутация
10
Пока для моих целей остался один вопрос, как сделать что бы в скрипте
Код:
; НАЧАЛО
 $ADDR=@ScriptDir&"\test.txt"

 $FILE=FileOpen($ADDR,2) ; Режим добавления

 $GUI=GUICreate("Сохранение текста в полях",300,220)
 $INPUT1=GUICtrlCreateInput("Введите текст",10,10,280,25)
 $INPUT2=GUICtrlCreateInput("Введите текст",10,35,280,25)
 $INPUT3=GUICtrlCreateInput("Введите текст",10,60,280,25)
 $LIST=GUICtrlCreateList("",10,85,280,100)
 $BUTTON=GUICtrlCreateButton("Сохранить",10,185,280,25)

 GUISetState()

 while true

  Switch GUIGetMsg()
   case -3
    exitloop
   case $BUTTON
    FileWriteLine($FILE,GUICtrlRead($INPUT1))
    FileWriteLine($FILE,GUICtrlRead($INPUT2))
    FileWriteLine($FILE,GUICtrlRead($INPUT3))
    GUICtrlSetData($LIST,GUICtrlRead($INPUT1)&"|"&GUICtrlRead($INPUT2)&"|"&GUICtrlRead($INPUT3))
  EndSwitch

 wend

 FileClose($FILE)

; КОНЕЦ

инфа выводилась в лист не только по нажатию сохранить, но и по повторному запуску отображалась сразу, заранее спс.
P.S. позже всё равно перейду на _WinAPI_CreateFile и кину готовый пример с применением GUI и ListViev'ом
 

snoitaleR

AutoIT Гуру
Сообщения
855
Репутация
223
bulldog5293
Добавил считывание сохраненных строк в список при открытии скрипта...
Модернизировал добавление строк в список и сохранение списка в файл...

Код:
; НАЧАЛО

 $ADDR=@ScriptDir&"\test.txt"

 $FILE=FileOpen($ADDR,0) ; Режим чтения
 $TEXT=FileRead($FILE)
 FileClose($FILE)
 $TEXT=StringReplace($TEXT,@CRLF,"|")

 $GUI=GUICreate("Сохранение текста в полях",300,220)
 $INPUT1=GUICtrlCreateInput("Введите текст",10,10,280,25)
 $INPUT2=GUICtrlCreateInput("Введите текст",10,35,280,25)
 $INPUT3=GUICtrlCreateInput("Введите текст",10,60,280,25)
 $LIST=GUICtrlCreateList("",10,85,280,100)
 GUICtrlSetData($LIST,$TEXT)
 $BUTTON=GUICtrlCreateButton("Сохранить",10,185,280,25)

 GUISetState()

 while true

  Switch GUIGetMsg()
   case -3
    exitloop
   case $BUTTON
    $TEXT=$TEXT&"|"&GUICtrlRead($INPUT1)&"|"&GUICtrlRead($INPUT2)&"|"&GUICtrlRead($INPUT3)
    GUICtrlSetData($LIST,"|"&$TEXT)
    $TEXT=StringReplace($TEXT,"|",@CRLF)
    $FILE=FileOpen($ADDR,2) ; Режим перезаписи
    FileWrite($FILE,$TEXT)
    FileClose($FILE)
  EndSwitch

 wend

; КОНЕЦ
 
Автор
B

bulldog5293

Знающий
Сообщения
172
Репутация
10
snoitaleR спс ещё раз, буду теперь подстраивать под свой
 
Автор
B

bulldog5293

Знающий
Сообщения
172
Репутация
10
snoitaleR, последний вопрос, как сделать что бы в лист выводилась к примеру 1-я и 2-я строка, то как раньше делал тут не работает и вобще сделать отображение так же как и было сохранено
 

snoitaleR

AutoIT Гуру
Сообщения
855
Репутация
223
bulldog5293
Чтобы лист автоматически не сортировался, нужно отключить стиль сортировки...
Потребуется подключить UDF ListBoxConstants.au3...

Код:
$LIST=GUICtrlCreateList("",10,85,280,100,BitAND($GUI_SS_DEFAULT_LIST,BitNOT($LBS_SORT)))



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

Чтобы вместо добавления текста из трех полей добавлять текст из двух надо заменить строку:

Код:
$TEXT=$TEXT&"|"&GUICtrlRead($INPUT1)&"|"&GUICtrlRead($INPUT2)&"|"&GUICtrlRead($INPUT3)


на строку:

Код:
$TEXT=$TEXT&"|"&GUICtrlRead($INPUT1)&"|"&GUICtrlRead($INPUT2)
 
Верх