Что нового

Не могу поставить циклический FileOpen из примера на свой скрипт

bulldog5293

Знающий
Сообщения
172
Репутация
10
Собственно название темы и есть моя проблема, на одной из веток форума по своему запросу я получил этот скрипт
Код:
For $i = 1 To 10
    $hFile = FileOpen("test.txt", 0)
    $sText = FileRead($hFile)
    FileClose($hFile)
    MsgBox(0, $i, $sText)
    $sNew = InputBox($i, "Введите что-нибудь")
    If @error = 1 Or $sNew = "" Then ExitLoop
    $sNew = $sText & @CRLF & $sNew
    $hFile = FileOpen("test.txt", 2)
    FileWrite($hFile, $sNew)
    FileClose($hFile)
Next

Пытался скрестить его с этим скриптом
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#Include <GuiListView.au3>
#include <GUIConstants.au3>

$ADDR=@ScriptDir&"\test.txt"
$FILE=FileOpen($ADDR,0)
$NSTR=21 ; Количество строк в файле
While True
 $TEXT=FileReadLine($FILE)
 If @error=-1 Then ExitLoop
 $NSTR+=1

Wend
FileClose($FILE)
$NSTR=Ceiling($NSTR/9) ; Количество строк массива
Dim $ARR[$NSTR][2] ; Массив для ListView
$ROW=0
$COL=0
$TRIGGER=0
$FILE=FileOpen($ADDR,0)
While $ROW<$NSTR
 $ARR[$ROW][$COL]=FileReadLine($FILE)
 If @error=-1 Then ExitLoop
 If $TRIGGER=0 Then
  $COL+=1
  $TRIGGER=1
 ElseIf $TRIGGER=1 Then
  $ROW+=1
  $COL=0
  $TRIGGER=2
 Else
  $TRIGGER=0
 EndIf
WEnd
FileClose($FILE)

$hForm1 = GUICreate("GUICtrlCreateListView ", 600, 400, 300, 150, _
BitOR($WS_SYSMENU,$WS_CAPTION,$WS_POPUP,$WS_POPUPWINDOW,$WS_BORDER,$WS_CLIPSIBLINGS, $WS_EX_ACCEPTFILES))

$hList = GUICtrlCreateListView ( "Сайт      |Логин      ", 0, 0 , 360 , 360, $GUI_SS_DEFAULT_LISTVIEW, _
BitOR($LVS_EX_HEADERDRAGDROP, $LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT ))
$INPUT1=GUICtrlCreateInput("Введите текст",365,10,235,25)
$INPUT2=GUICtrlCreateInput("Введите текст",365,35,235,25)
$INPUT3=GUICtrlCreateInput("Введите текст",365,60,235,25)
GUICtrlSetData($hList,$TEXT)
$BUTTON=GUICtrlCreateButton("Сохранить",365,90,235,25)
_GUICtrlListView_SetColumnWidth($hList, 0, 205)
_GUICtrlListView_SetColumnWidth($hList, 1, 150)

_GUICtrlListView_AddArray($hList, $ARR)

GUICtrlSetState($hList, $GUI_DROPACCEPTED)
GUISetState(@SW_SHOW)


while true

 Switch GUIGetMsg()
   case -3
    exitloop
   case $BUTTON
    $TEXT=$TEXT&"|"&GUICtrlRead($INPUT1)&"|"&GUICtrlRead($INPUT2) ; изменено
    $TEXT=$TEXT&"|"&GUICtrlRead($INPUT3) ; добавлено
    $TEXT=StringReplace($TEXT,"|",@CR )
    $FILE=FileOpen($ADDR,1)
    FileWrite($FILE,$TEXT)
    FileClose($FILE)
  EndSwitch

 wend

Суть моего скрещение в том чтобы поставить цыклическое считование данных. Пробывал на insertbox в начале, но потерпел неудачу в неправельном получение данных, а про чтение данных с инпутов я вобще молчу, там у меня мистика происходит :wacko:, одна надежда на умы форума осталась :'(
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Re: Не могу составить правельный скрипт

bulldog5293 [?]
Собственно название темы и есть моя проблема...

Да, название темы, это большая проблема, т.к. ниочем мне не говорит. Переименуй или тема будет закрыта.

:read_this:
 

snoitaleR

AutoIT Гуру
Сообщения
855
Репутация
223
Re: Не могу поставить FileOpen из на свой скрипт

bulldog5293
Объясни, пожалуйста, вот эти строки:

Код:
$NSTR=21

Код:
$NSTR=Ceiling($NSTR/9)
 
Автор
B

bulldog5293

Знающий
Сообщения
172
Репутация
10
Код:
$NSTR=21 ; Количество строк в файле

тоесть то количество каторое он может прочитать
Код:
$NSTR=Ceiling($NSTR/9) ; Количество строк массива

количество строк которое в принцепе должно отображаться в листе, хотя при изменениях также всё и остаётся
 

snoitaleR

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

Код:
$NSTR=0 ; Количество строк в файле
While True
 $TEXT=FileReadLine($FILE)
 If @error=-1 Then ExitLoop
 $NSTR+=1
Wend


действительно предназначался для подсчета строк в файле...

А поставив начальное значение счетчика 21, тем самым, ты получаешь на 21 одну строку больше, чем есть в файле... :smile:
 
Автор
B

bulldog5293

Знающий
Сообщения
172
Репутация
10
snoitaleR
А поставив начальное значение счетчика 21, тем самым, ты получаешь на 21 одну строку больше, чем есть в файле...
проверял, на это не влияит


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

правда пытался манипулировать с 247 строками, а получил только 32/2, тоесть 16 значений в первом столбике, и 16 во втором :( странно


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

Хотя нет, ошибся строк сколько нада столько и показывает
 
Автор
B

bulldog5293

Знающий
Сообщения
172
Репутация
10
В принцепе радилась идея, с утра попробую, но всё же решил уточнить. Если я на
Код:
$i = 1 To 10
создам три разных цикла поможет это? Лан пойду спать, с утра попробую. Всем доброй ночи


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

ПОЛУЧИЛОСЬ!
Код:
For $i = 1 To 10
    $hFile = FileOpen("test.txt", 0)
    $sText = FileRead($hFile)
    FileClose($hFile)
    MsgBox(0, $i, $sText)
    $sNew = InputBox($i, "Введите что-нибудь")
	If @error = 1 Or $sNew = "" Then ExitLoop
    $sNew = $sText & @CRLF & $sNew
    $hFile = FileOpen("test.txt", 2)
    FileWrite($hFile, $sNew)
    FileClose($hFile)
Next
For $i = 1 To 10
    $hFile = FileOpen("test.txt", 0)
    $sText = FileRead($hFile)
    FileClose($hFile)
    MsgBox(0, $i, $sText)
    $sNew2 = InputBox($i, "Введите что-нибудь")
	If @error = 1 Or $sNew = "" Then ExitLoop
    $sNew = $sText & @CRLF & $sNew
    $hFile = FileOpen("test.txt", 2)
    FileWrite($hFile, $sNew)
    FileClose($hFile)
Next	
for    $i = 1 To 10
    $hFile = FileOpen("test.txt", 0)
    $sText = FileRead($hFile)
    FileClose($hFile)
    MsgBox(0, $i, $sText)
    $sNew3 = InputBox($i, "Введите что-нибудь")
	If @error = 1 Or $sNew = "" Then ExitLoop
    $sNew = $sText & @CRLF & $sNew
    $hFile = FileOpen("test.txt", 2)
    FileWrite($hFile, $sNew)
    FileClose($hFile)
Next

Завтра выложу полный скрипт :IL_AutoIt_1:
 
Автор
B

bulldog5293

Знающий
Сообщения
172
Репутация
10
Немогу поставить на
Код:
$INPUT1=GUICtrlCreateInput("Введите текст",365,10,235,25)
$INPUT2=GUICtrlCreateInput("Введите текст",365,35,235,25)
$INPUT3=GUICtrlCreateInput("Введите текст",365,60,235,25)
$hList = GUICtrlCreateListView ( "Данные1      |Данные2      ", 0, 0 , 360 , 360, $GUI_SS_DEFAULT_LISTVIEW, _
BitOR($LVS_EX_HEADERDRAGDROP, $LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT ))

циклическое чтение файла при нажатии
Код:
$BUTTON=GUICtrlCreateButton("Сохранить",365,90,235,25)

Из-за чего прошу вашей помощи в решении проблемы :'(
 
Автор
B

bulldog5293

Знающий
Сообщения
172
Репутация
10
Собственно, остался вопрос. У меня получилось зделать циклическое обновление в листе. Но проблемма в том что в файл данные не вносятся, в чём моя ошибка?
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#Include <GuiListView.au3>
#include <GUIConstants.au3>
$ADDR=@ScriptDir&"\test.txt"
$FILE=FileOpen($ADDR,0)
For $i = 1 To 10
    $ADDR = FileOpen("test.txt", 0)
    $TEXT = FileRead($FILE)
    FileClose($ADDR)
Next	
$NSTR=21 ; Количество строк в файле
While True
 $TEXT=FileReadLine($FILE)
 If @error=-1 Then ExitLoop
 $NSTR+=1

Wend
$NSTR=Ceiling($NSTR/9) ; Количество строк массива
Dim $ARR[$NSTR][2] ; Массив для ListView
$ROW=0
$COL=0
$TRIGGER=0
$FILE=FileOpen($ADDR,0)
While $ROW<$NSTR
 $ARR[$ROW][$COL]=FileReadLine($FILE)
 If @error=-1 Then ExitLoop
 If $TRIGGER=0 Then
  $COL+=1
  $TRIGGER=1
 ElseIf $TRIGGER=1 Then
  $ROW+=1
  $COL=0
  $TRIGGER=2
 Else
  $TRIGGER=0
 EndIf
WEnd
FileClose($FILE)
$GUI=GUICreate("Сохранение текста в полях",300,220)
 $INPUT1=GUICtrlCreateInput("Введите текст",10,10,280,25)
 $INPUT2=GUICtrlCreateInput("Введите текст",10,35,280,25)
 $INPUT3=GUICtrlCreateInput("Введите текст",10,60,280,25)
 $LIST = GUICtrlCreateListView("1 Данные                |2 Данные               ",10,85,280,100)
$BUTTON=GUICtrlCreateButton("Сохранить",10,185,280,25)
GUISetState()
 $CITEM=0
 $CTEXT=$TEXT

 While $CTEXT<>""
  $CITEM+=1
  $LEN=StringInStr($CTEXT,"|")
  Assign("ITEM"&$CITEM,GUICtrlCreateListViewItem(StringLeft($CTEXT,$LEN-1),$LIST))
  $CTEXT=StringTrimLeft($CTEXT,$LEN)
 WEnd

 while true

  Switch GUIGetMsg()
   case -3
    exitloop
   case $BUTTON
    Assign("ITEM"&$CITEM+1,GUICtrlCreateListViewItem(GUICtrlRead($INPUT1),$LIST))
    Assign("ITEM"&$CITEM+2,GUICtrlCreateListViewItem(GUICtrlRead($INPUT2),$LIST))
    $TEXT=$TEXT&GUICtrlRead($INPUT1)&"|"&GUICtrlRead($INPUT2)&"|"&GUICtrlRead($INPUT3)
    $TEXT=StringReplace($TEXT,"|",@CRLF)
    $FILE=FileOpen($ADDR,1)
    FileWrite($FILE,$TEXT)
    FileClose($FILE)
  EndSwitch

 wend
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
bulldog5293
Ты составил скрипт из разных частей и пытаешься его заставить работать.
К тебе вопросы :
1.Зачем в 1- цикле 10 раз пытаешься читать один и тот же текст ?
Достаточно просто :
Код:
$sText = FileRead($FILE)
2. Зачем нужен 2-й цикл .
В результате ты же получаешь только текст последней строки файла ($TEXT) и кол-во строк ($NSTR). Зачем ?
Для определения кол-ва строк файла есть ф-я :
Код:
_FileCountLines($sFile)

3. Зачем создаешь массив : $ARR[$NSTR][2] , если он в дальнейшем не используется нигде ?
4. Почему не начать скрипт с создания элементов , потом чтение файлов ,запись и т.д.
Сделай отдельную ф-ию чтения файла , отдельно записи ,расставь везде MsgBox и _ArrayDisplay и контролируй работу отдельных частей скрипта.
В качестве примера для определения причины неработы скрипта я поставил только 1 MsgBox и все стало ясно

Код:
while true

  Switch GUIGetMsg()
   case -3
    exitloop
   case $BUTTON
    Assign("ITEM"&$CITEM+1,GUICtrlCreateListViewItem(GUICtrlRead($INPUT1),$LIST))
    Assign("ITEM"&$CITEM+2,GUICtrlCreateListViewItem(GUICtrlRead($INPUT2),$LIST))
    $TEXT=$TEXT&GUICtrlRead($INPUT1)&"|"&GUICtrlRead($INPUT2)&"|"&GUICtrlRead($INPUT3)
    $TEXT=StringReplace($TEXT,"|",@CRLF)
    MsgBox(0,$ADDR, $TEXT); Отсюда видно  ,что $ADDR=2 ,это уже не имя файла , Ты его уже переназначил в 1- цикле .
    $FILE=FileOpen($ADDR,1)
    FileWrite($FILE,$TEXT)
    FileClose($FILE)
  EndSwitch

 wend
 
Автор
B

bulldog5293

Знающий
Сообщения
172
Репутация
10
Я бы с радастью и в отдельные функции всё вывел, но так я не умею


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

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

snoitaleR

AutoIT Гуру
Сообщения
855
Репутация
223
bulldog5293
gregaz прав...
Пытаясь объединить несколько скриптов, ты получил путаницу...
В этом нет ничего страшного...
Давай начнем с начала...
Попробуй выразить назначение скрипта: что должно получиться в результате?
Попытайся объяснить также, какие данные есть в распоряжении скрипта?
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
bulldog5293 [?]
Если не трудно, киньте кто нить хотя бы пример как на подобе можно и окно с данными выводить и много функций использовать, а то я в тупик пришёл уже

Вот пример : (правда я очень смутно понимаю задачу твоего скрипта) , но принцип построения здесь виден
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#Include <GuiListView.au3>
#include <GUIConstants.au3>
#include <file.au3>
#include <Array.au3>
Global $ROW=0,$COL=0,$TRIGGER=0,$NSTR,$CITEM=0,$TEXT
;_ArrayDisplay( $ARR)

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

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

GUISetState()

Read($ADDR); Переход на ф-ию чтения



while true

    Switch GUIGetMsg()
       case -3
            exitloop
       case $BUTTON
            Assign("ITEM"&$CITEM+1,GUICtrlCreateListViewItem(GUICtrlRead($INPUT1),$LIST))
            Assign("ITEM"&$CITEM+2,GUICtrlCreateListViewItem(GUICtrlRead($INPUT2),$LIST))
        $TEXT=$TEXT&GUICtrlRead($INPUT1)&"|"&GUICtrlRead($INPUT2)&"|"&GUICtrlRead($INPUT3)
        $TEXT=StringReplace($TEXT,"|",@CRLF)
        MsgBox(0,'$TEXT',$TEXT)
       Save($TEXT); Переход на ф-ию записи
	   ; $FILE=FileOpen($ADDR,1)
       ; FileWrite($FILE,$TEXT &  @CRLF)
       ; FileClose($FILE)
    EndSwitch

 wend
 

Func Read($FILE)
   ;$sText = FileRead($FILE)
   $FILE=FileOpen($ADDR,0)
   $NSTR=_FileCountLines($ADDR)
   $NSTR=Ceiling($NSTR/9) ; Количество строк массива
   Dim $ARR[$NSTR][2] ; Массив для ListView
   While $ROW<$NSTR
	   $ARR[$ROW][$COL]=FileReadLine($FILE)
	   If @error=-1 Then ExitLoop
	   If $TRIGGER=0 Then
		   $COL+=1
		   $TRIGGER=1
	   ElseIf $TRIGGER=1 Then
		   $ROW+=1
		   $COL=0
		   $TRIGGER=2
	   Else
		   $TRIGGER=0
	   EndIf
   WEnd
   FileClose($FILE)
   _ArrayDisplay($ARR)
   For $i=0 To UBound($ARR,1)-1
	  GUICtrlCreateListViewItem($ARR[$i][0]& '|' & $ARR[$i][1],$LIST)
   Next
EndFunc


Func Save($sText)
   $FILE=FileOpen($ADDR,1)
   FileWrite($FILE,$sText &  @CRLF)
   FileClose($FILE)
EndFunc
 
Автор
B

bulldog5293

Знающий
Сообщения
172
Репутация
10
Не стал открывать новую тему и надеюсь модераторы поймут меня правельно, так как мой вопрос всё равно относится к предыдущему примеру который выложил gregaz. Если файл txt пустой, то как миновать ошибку которая попадает на
Код:
Dim $ARR[$NSTR][2] ; Массив для ListView
 

Yuri

AutoIT Гуру
Сообщения
737
Репутация
282
Попробуй проверкой размера файла.
Пример:
Код:
$myDir = @ScriptDir
$size = FileGetSize($myDir & "\" & "test.txt")
MsgBox(64, "Размер", $size & " Кб")
If $size = 0 Then
	MsgBox(64, "Размер", "Пусто")
Else
	MsgBox(64, "Размер", $size & " Кб => Что-то есть")
EndIf

Файл test.txt должен находиться в той же директории скрипта.
 
Автор
B

bulldog5293

Знающий
Сообщения
172
Репутация
10
Мне конечно не доканца понятна зачем ты мне дал скрипт который показывает что мой файл пустой и весит 0, я просто хотел узнать если файл создан и пустой, как ошибку миновать
 

Yuri

AutoIT Гуру
Сообщения
737
Репутация
282
Сначала создай test.txt и запусти. Увидишь 0 Кб.
Затем открой test.txt, внеси в него что-то, сохрани и закрой.
Теперь опять запусти пример.
Увидишь Не 0 Кб, а больше.


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

если файл создан и пустой
Проверка существования файла.
Если есть, то проверка его веса.
 
Автор
B

bulldog5293

Знающий
Сообщения
172
Репутация
10
Hellp, почему на
Код:
Dim $ARR[$NSTR][2]
падает ошибка при пустом созданном файле и обязательно что бы файл был болеше 0, что бы он открывался?
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
bulldog5293 [?]
падает ошибка при пустом созданном файле и обязательно что бы файл был болеше 0, что бы он открывался?
Запиши :
Код:
If $NSTR<1 Then $NSTR=1
Dim $ARR[$NSTR][2]



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

А Так наверное лучше :
Код:
Func Read($FILE)
   ;$sText = FileRead($FILE)
   ;$FILE=FileOpen($ADDR,0); переместил вниз
   $NSTR=_FileCountLines($ADDR)
   If  $NSTR=0 Then Return
   $FILE=FileOpen($ADDR,0)
;..............................
EndFunc

Если файл пустой , то не надо и читать его и писать в $LIST -Возвращаемся и ждем нажатия кнопки для записи
 
Верх