Что нового

GUICtrlSetData не эфективен

kolosov

Новичок
Сообщения
137
Репутация
0
Добрый вечер форумчани)
обычно пользовался GUICtrlSetData чтобы выводить содержимое переменной в окно программы.
Но то были цифры. Сейчас пытаюсь сделать тоже самое со строками,та и их 6 и обновляются они довольно быстро(В теории)
вроде такого:
Код:
$5Checkbox = FileReadLine(@ScriptDir & '\s.txt',$ONum5)
		GUICtrlRead($5Checkbox)
		GUICtrlSetData($Checkbox5,$5Checkbox)

Но дело в том что программа,не всегда выводит значение переменной(Строки) в окно
к примеру за 10 циклов,из 6 строк обновляется только 1-2(
Есть другая альтернатива? Или можно что-то придумать,чтобы не было провисаний?
Заранее благодарю за ответы)не один час мучаюсь с решением (
 
A

Alofa

Гость
kolosov сказал(а):
Код:
$5Checkbox = FileReadLine(@ScriptDir & '\s.txt',$ONum5)
		GUICtrlRead($5Checkbox)
		GUICtrlSetData($Checkbox5,$5Checkbox)
OffTopic:
Ну вот пять додумывать, что за GUI элемент обновляется, что там в "s.txt", какую роль тут играет "GUICtrlRead()", придумывать пример работоспособного кода и т.д...
Пойду ка лучше посплю.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
OffTopic:
и не просто поспи. а еще попытайся развить способности экстрасенса. ибо ... ибо... ибо справка прошлый век, а соцсети отбивают у людей способность правильно излагать свои мысли
 
Автор
K

kolosov

Новичок
Сообщения
137
Репутация
0
Код:
#Region    ************ Includes ************
#Include <StaticConstants.au3>
#include <ComboConstants.au3>
#include <GUIConstantsEx.au3>
#include <file.au3>
#EndRegion ************ Includes ************
Global $file = "s.txt"
Global $Num = 0
Global $SlovoInHeb = "Поучимся?"
Global $Otvet = "Начать"
Global $1Checkbox = "Учись"
Global $2Checkbox = "Учись"
Global $3Checkbox = "Учись"
Global $4Checkbox = "Учись"
Global $5Checkbox = "Учись"
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Hebrew Teacher", 389, 292, -1, -1)
$Label1 = GUICtrlCreateLabel($SlovoInHeb, 4, 28, 370, 53,$SS_CENTER)
GUICtrlSetFont(-1, 24, 400, 0, "MS Sans Serif")
$Spisok = GUICtrlCreateCombo("На выбор", 0, 0, 145, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL))
GUICtrlSetData(-1, "Существительные ")
$Group1 = GUICtrlCreateGroup("Варианты ответа:", 4, 92, 165, 137)
GUICtrlSetFont(-1, 12, 400, 0, "MS Sans Serif")
$Checkbox1 = GUICtrlCreateCheckbox($1Checkbox, 12, 120, 97, 17)
$Checkbox2 = GUICtrlCreateCheckbox($2Checkbox, 12, 140, 97, 17)
$Checkbox3 = GUICtrlCreateCheckbox($3Checkbox, 12, 160, 97, 17)
$Checkbox4 = GUICtrlCreateCheckbox($4Checkbox, 12, 180, 97, 17)
$Checkbox5 = GUICtrlCreateCheckbox($5Checkbox, 12, 200, 97, 17)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Group2 = GUICtrlCreateGroup("Статистика", 172, 92, 205, 77)
GUICtrlSetFont(-1, 12, 400, 0, "MS Sans Serif")
$Label2 = GUICtrlCreateLabel("Правельных ответов:", 180, 120, 113, 17)
$Label3 = GUICtrlCreateLabel("Не правельных ответов :", 180, 144, 131, 17)
$Label4 = GUICtrlCreateLabel("0", 320, 120, 42, 17)
$Label5 = GUICtrlCreateLabel("0", 320, 144, 42, 17)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Button1 = GUICtrlCreateButton($Otvet, 172, 172, 207, 57)
GUICtrlSetFont(-1, 10, 400, 0, "MS Sans Serif")
$Label6 = GUICtrlCreateLabel("Результат", 4, 236, 374, 41,$SS_CENTER)
GUICtrlSetFont(-1, 24, 800, 0, "MS Sans Serif")
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
$hFile = FileOpen(@ScriptDir & '\s.txt', 0)
If $hFile = -1 Then
    MsgBox(4096, "Ошибка", "Невозможно открыть файл.")
    Exit
EndIf
While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $Button1
			Start()
			$Otvet = "Проверить ответ"
			GUICtrlSetData($Button1,$Otvet)
	EndSwitch
WEnd

Func Start()
	read()
	Dim $ONum1 = 0
	Dim $ONum2 = 0
	Dim $ONum3 = 0
	Dim $ONum4 = 0
	Dim $ONum5 = 0
	$Num = Random(1,_FileCountLines($file),1)
	If Mod($Num,2) =0 Then
		$ONum1 = Random(1,_FileCountLines($file),1)
	If Mod($ONum1,2) =0 Then
		GUICtrlRead($ONum1)
		$1Checkbox = FileReadLine(@ScriptDir & '\s.txt',$ONum1)
		GUICtrlRead($1Checkbox)
		GUICtrlSetData($Checkbox1,$1Checkbox)
		IniWrite("Data.ini","Data","1Checkbox",$1Checkbox)
	EndIf
	$ONum2 = Random(1,_FileCountLines($file),1)
	If Mod($ONum2,2) =0 Then
		GUICtrlRead($ONum2)
		$2Checkbox = FileReadLine(@ScriptDir & '\s.txt',$ONum2)
		GUICtrlRead($2Checkbox)
		GUICtrlSetData($Checkbox2,$2Checkbox)
		IniWrite("Data.ini","Data","2Checkbox",$2Checkbox)
	EndIf
	$ONum3 = Random(1,_FileCountLines($file),1)
	If Mod($ONum3,2) =0 Then
		GUICtrlRead($ONum3)
		$3Checkbox = FileReadLine(@ScriptDir & '\s.txt',$ONum3)
		GUICtrlRead($3Checkbox)
		GUICtrlSetData($Checkbox3,$3Checkbox)
		IniWrite("Data.ini","Data","3Checkbox",$3Checkbox)
	EndIf
	$ONum4 = Random(1,_FileCountLines($file),1)
	If Mod($ONum4,2) =0 Then
		GUICtrlRead($ONum4)
		$4Checkbox = FileReadLine(@ScriptDir & '\s.txt',$ONum4)
		GUICtrlRead($4Checkbox)
		GUICtrlSetData($Checkbox4,$4Checkbox)
		IniWrite("Data.ini","Data","4Checkbox",$4Checkbox)
	EndIf
	$ONum5 = Random(1,_FileCountLines($file),1)
	If Mod($ONum5,2) =0 Then
		GUICtrlRead($ONum5)
		$5Checkbox = FileReadLine(@ScriptDir & '\s.txt',$ONum5)
		GUICtrlRead($5Checkbox)
		GUICtrlSetData($Checkbox5,$5Checkbox)
		IniWrite("Data.ini","Data","5Checkbox",$5Checkbox)
	EndIf
	
	Else
	GUICtrlRead($Num)
$SlovoInHeb = FileReadLine(@ScriptDir & '\s.txt',$Num)
	GUICtrlSetData($Label1, $SlovoInHeb)
IniWrite("Data.ini","Data","Slovo",$SlovoInHeb)
	EndIf
	EndFunc

Func Read()
	$1Checkbox = IniRead("Data.ini","Data","1Checkbox","Учись")
	$2Checkbox = IniRead("Data.ini","Data","2Checkbox","Учись")
	$3Checkbox = IniRead("Data.ini","Data","3Checkbox","Учись")
	$4Checkbox = IniRead("Data.ini","Data","4Checkbox","Учись")
	$5Checkbox = IniRead("Data.ini","Data","5Checkbox","Учись")
	$SlovoInHeb = IniRead("Data.ini","Data","Slovo","Поучимся?")
	GUICtrlSetData($Checkbox1,$1Checkbox)
	GUICtrlSetData($Checkbox2,$2Checkbox)
	GUICtrlSetData($Checkbox3,$3Checkbox)
	GUICtrlSetData($Checkbox4,$4Checkbox)
	GUICtrlSetData($Checkbox5,$5Checkbox)
	GUICtrlSetData($Label1, $SlovoInHeb)
	EndFunc


в тхт файле идёт типа строчка вопрос,строчка ответ)
 

hedji

Продвинутый
Сообщения
409
Репутация
94
1) Файл ответов считать целиком в массив перед началом бесконечного цикла
2) Генерить номера и читать не строки из файла, а ячейки массива (исключить обращения к диску)
3) Переключить gui в режим OnEvent
 
Автор
K

kolosov

Новичок
Сообщения
137
Репутация
0
Спасибо,буду пробовать,напишу о результатах )
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
kolosov
за 10 циклов,из 6 строк обновляется только 1-2
Насколько я понял, строки у вас читаются (и обновляются) только, если случайное число - чётное. А если нечётное? То ничего не происходит. Вот и посчитайте, какова вероятность выпадения всех шести чисел - чётных? ;)
 
Автор
K

kolosov

Новичок
Сообщения
137
Репутация
0
InnI сказал(а):
kolosov
за 10 циклов,из 6 строк обновляется только 1-2
Насколько я понял, строки у вас читаются (и обновляются) только, если случайное число - чётное. А если нечётное? То ничего не происходит. Вот и посчитайте, какова вероятность выпадения всех шести чисел - чётных? ;)
Программа читает одно нечётное число и 5 чётных, в файле сейчас 164 числа. И объявляет эти 6 чисел всегда, в независимости какое из них будет


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

hedji сказал(а):
1) Файл ответов считать целиком в массив перед началом бесконечного цикла
2) Генерить номера и читать не строки из файла, а ячейки массива (исключить обращения к диску)
3) Переключить gui в режим OnEvent
1,2) Цыкла как такового нету,просто каждый раз как в окне нажимаешь кнопку, должна включиться функция и дойдя до конца закончиться. После все ещё n раз(Столько сколько раз будет нажиматься кнопка )Я сейчас почитал про массивы, как мне это сделать? Я так посмотрел и не понял, если я имею в файле 5000 строк, нужно все эти строки писать в коде? или есть способ по проще?и если есть то как мне потом обратиться к нужной строке?
3)Перевёл,пока изменений нету( :(
:IL_AutoIt_1:
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
kolosov
Программа читает одно нечётное число и 5 чётных
Я не знаю, что читает какая-то там программа, но работа этого скрипта зависит только от количества строк в файле
Код:
...
  $Num = Random(1, _FileCountLines($file), 1) ; случайное число от 1 до количества строк в файле
  If Mod($Num, 2) = 0 Then ; если $Num чётное
    $ONum1 = Random(1, _FileCountLines($file), 1) ; случайное число от 1 до количества строк в файле
    If Mod($ONum1, 2) = 0 Then ; если $ONum1 чётное
    ; и т.д.
    ...
  Else ; если $Num нечётное
    GUICtrlRead($Num)
    $SlovoInHeb = FileReadLine(@ScriptDir & '\s.txt', $Num)
    GUICtrlSetData($Label1, $SlovoInHeb)
    IniWrite("Data.ini", "Data", "Slovo", $SlovoInHeb)
  EndIf
...
 
Автор
K

kolosov

Новичок
Сообщения
137
Репутация
0
Строк в файле,на данный момент 146 вроде,а прога за раз только к шести обращается
Да и дело не в том к с кальки строкам обращается программа,а в том что в окне они обновляются через раз ,а то и более
Код:
GuiCtrlSetData




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

kolosov сказал(а):
Строк в файле,на данный момент 146 вроде,а прога за раз только к шести обращается
Да и дело не в том к с кальки строкам обращается программа,а в том что в окне они обновляются через раз ,а то и более
Код:
GuiCtrlSetData
П.С Числом я называл номер строки в файле
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
kolosov
а в том что в окне они обновляются через раз
Вы моё сообщение, которое под #6, читали?
строки у вас читаются (и обновляются) только, если случайное число - чётное

Числа $ONum1, $ONum2 и т.д. вы получаете, как случайное от 1 до количества строк в файле. Далее идёт проверка этого числа на чётность
Код:
If Mod($ONum1, 2) = 0 Then
и все остальные действия - чтение и обновление - происходят только, если число чётное. Если выпадет, например, число 111, как случайное от 1 до 164, то обновления $Checkbox1 не будет. А если при нажатии кнопки нечётным выпадет $Num, то обновится только $Label1 и всё.
 
Автор
K

kolosov

Новичок
Сообщения
137
Репутация
0
А! Вот где я накасячил :scratch:. Сейчас попробую вставить в цикл до момента пока не будет не чётного числа )И напишу о результатах


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

В смысле ЧЁТНОГО числа (Ошибся)


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

Сделал цикл, чтобы рандомила строки пока не выпадет чётное,так:
Код:
$ONum1 = Random(1,_FileCountLines($file),1)
		For $Proverka1 = 0 To $Proverka1 = 1
	If Mod($ONum1,2) =0 Then
		GUICtrlRead($ONum1)
		$1Checkbox = FileReadLine(@ScriptDir & '\s.txt',$ONum1)
		GUICtrlRead($1Checkbox)
		GUICtrlSetData($Checkbox1,$1Checkbox)
		IniWrite("Data.ini","Data","1Checkbox",$1Checkbox)
		$Proverka1 =+1
	EndIf
	Next


но не помогло!(


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

Заметил что начало цикла идёт уже после рандома,исправил,но проблема таже
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
kolosov
пока не выпадет чётное
Код:
$Lines = _FileCountLines($file)
    Do
      $ONum1 = Random(1, $Lines, 1)
    Until Mod($ONum1, 2) = 0
    GUICtrlRead($ONum1)
    $1Checkbox = FileReadLine(@ScriptDir & '\s.txt', $ONum1)
    GUICtrlRead($1Checkbox)
    GUICtrlSetData($Checkbox1, $1Checkbox)
    IniWrite("Data.ini", "Data", "1Checkbox", $1Checkbox)
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
kolosov
Потому что генерацию переменной $Num тоже надо переделать. Иначе обновления будут только, если она чётная. Что у вас и происходит.
 
Автор
K

kolosov

Новичок
Сообщения
137
Репутация
0
Сейчас переделаю и напишу о результате
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Выбор пяти случайных чётных строк - это я понял. Но что вы с нечётными делаете? Тоже случайным образом выбрать, только одну? Так?
Код:
Func Start()
  Read()
  Dim $ONum1 = 0
  Dim $ONum2 = 0
  Dim $ONum3 = 0
  Dim $ONum4 = 0
  Dim $ONum5 = 0
  Dim $Lines = _FileCountLines($file)
  Do
    $Num = Random(1, $Lines, 1)
  Until Not Mod($Num, 2)
  GUICtrlRead($Num)
  $SlovoInHeb = FileReadLine(@ScriptDir & '\s.txt', $Num)
  GUICtrlSetData($Label1, $SlovoInHeb)
  IniWrite("Data.ini", "Data", "Slovo", $SlovoInHeb)
  Do
    $ONum1 = Random(1, $Lines, 1)
  Until Mod($ONum1, 2) = 0
  GUICtrlRead($ONum1)
  $1Checkbox = FileReadLine(@ScriptDir & '\s.txt', $ONum1)
  GUICtrlRead($1Checkbox)
  GUICtrlSetData($Checkbox1, $1Checkbox)
  IniWrite("Data.ini", "Data", "1Checkbox", $1Checkbox)
  Do
    $ONum2 = Random(1, $Lines, 1)
  Until Mod($ONum2, 2) = 0
  GUICtrlRead($ONum2)
  $2Checkbox = FileReadLine(@ScriptDir & '\s.txt', $ONum2)
  GUICtrlRead($2Checkbox)
  GUICtrlSetData($Checkbox2, $2Checkbox)
  IniWrite("Data.ini", "Data", "2Checkbox", $2Checkbox)
  Do
    $ONum3 = Random(1, $Lines, 1)
  Until Mod($ONum3, 2) = 0
  GUICtrlRead($ONum3)
  $3Checkbox = FileReadLine(@ScriptDir & '\s.txt', $ONum3)
  GUICtrlRead($3Checkbox)
  GUICtrlSetData($Checkbox3, $3Checkbox)
  IniWrite("Data.ini", "Data", "3Checkbox", $3Checkbox)
  Do
    $ONum4 = Random(1, $Lines, 1)
  Until Mod($ONum4, 2) = 0
  GUICtrlRead($ONum4)
  $4Checkbox = FileReadLine(@ScriptDir & '\s.txt', $ONum4)
  GUICtrlRead($4Checkbox)
  GUICtrlSetData($Checkbox4, $4Checkbox)
  IniWrite("Data.ini", "Data", "4Checkbox", $4Checkbox)
  Do
    $ONum5 = Random(1, $Lines, 1)
  Until Mod($ONum5, 2) = 0
  GUICtrlRead($ONum5)
  $5Checkbox = FileReadLine(@ScriptDir & '\s.txt', $ONum5)
  GUICtrlRead($5Checkbox)
  GUICtrlSetData($Checkbox5, $5Checkbox)
  IniWrite("Data.ini", "Data", "5Checkbox", $5Checkbox)
EndFunc   ;==>Start
 
Автор
K

kolosov

Новичок
Сообщения
137
Репутация
0
Тока переписал код,а ты ты его тоже сюда написал ) Вобщем да. не чётное только одно и 5 чётных. Спасибо тебе большое за терпение и помощь,на конец-то заработало как положено,
 
Верх