PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Вводl данных с клавиатуры с последующей обработкой


Вводl данных с клавиатуры с последующей обработкой

Сообщений 1 страница 22 из 22

1

Здрасти!

Вроде ничо сложного, но обсмотрелся уроков, обчитался helpoв и тупанул:

1. Имеется N-нное (примерно 100) количество текстовых сообщений которые нужно поместить в массив на оределенные дни месяца с атребутами, утро, вечер, день,
2. Каждое текстовое сообщение нужно ввести с клавиатуру по одному, с указанием с какого по какой день месяца расположить + когда(утро, вечер, день)
3. при вводе сообщения ему нужно присвоить с какого по какой день месяца + когда(утро, вечер, день)
4. после ввода нужен просмотр любого дня недели и что в него попало, с возможностью сортировать для удобного восприятия (когда(утро, вечер, день)), и так же возможность смены атрибута посредством галочки напротив текстового сообщения (когда(утро, вечер, день))
5. после заполнения и корректировки, нужно по кнопке  создать отдельно 3 файла *.тхт, на конкретный день месяца для(когда отдльно (утро, вечер, ден)

http://saveimg.ru/pictures/18-04-12/140 … 0a3760.jpg

Отредактировано wvlas (18.04.2012 20:00:42)

0

2

Давай по порядку.
Что из этого уже сделал, а что не получается?

0

3

С дуру стер ВСЁ, пошел в Excel писать, назад потянуло  :blush:

0

4

И чем же тогда помочь?

0

5

Массив например 100 сообщений на 31 день. Атрибут можно сделать в конце сообщения спец символом, или проще, еще один столбец в массиве. Ну типа д-день в-вечер у-утро, по ним сортиовать при прсмотре и выводе и также редактировать изменяя атрибут. Воводил, размещал, а просмотр и редактирование никак.

Отредактировано wvlas (18.04.2012 21:39:06)

0

6

Заготовка.

Код:
; Атрибуты
Enumeration
  #Attr_Morn ; Утро.
  #Attr_Day  ; День.
  #Attr_Evening ; Вечер.
EndEnumeration

Structure MyMessage
  Message.s   ; Текстовое сообщение.
  Day.a       ; День месяца.
  Attribute.b ; Атрибут.
EndStructure

Dim Messages.MyMessage(100)

0

7

Вот начало.

Код:
Enumeration
  #Window_0
  #Option_0
  #Option_1
  #Option_2
  #String_3
  #String_4
  #Button_5
  #String_6
EndEnumeration

Dim stroka.s(12, 31, 100, 3)

If OpenWindow(#Window_0, 7, 136, 1257, 81, "Window_0", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MinimizeGadget|#PB_Window_TitleBar)
    OptionGadget(#Option_0, 5, 10, 50, 17, "Утро")
    OptionGadget(#Option_1, 5, 50, 50, 17, "День")
    OptionGadget(#Option_2, 5, 30, 50, 17, "Вечер")
    StringGadget(#String_3, 60, 10, 20, 17, "1")
    GadgetToolTip(#String_3, "C какой даты")
    StringGadget(#String_4, 60, 32, 20, 17, "31")
    GadgetToolTip(#String_4, "По какую дату")
    ButtonGadget(#Button_5, 60, 50, 20, 17, "Ок")
    StringGadget(#String_6, 90, 10, 1150, 17, "")
    GadgetToolTip(#String_6, "Ввод текста бегущей строки")
    
    SetGadgetState(2, 1)
    
  EndIf
  
Repeat ; Начало цикла Repeat - Until.
  Event  = WaitWindowEvent() ; Узнаём текущее событие в программе.
  Gadget = EventGadget() ; Узнаём идентификатор активного гаджета.
  Type   = EventType()   ; Узнаём тип события.
  
   If Event=#PB_Event_Gadget ; Условие будет выполнено если произойдёт событие в одном из гаджетов
    If Gadget=#Button_5 ; Условие будет выполнено если нажата экранная кнопка "Ok"
     ; Читаем текст из полей ввода данных (StringGadget)
     String3.s=GetGadgetText(#String_3) ;Скакой даты
     String4.s=GetGadgetText(#String_4) ;По какую дату
     String6.s=GetGadgetText(#String_6) ;Текст строки
     day_ot.c=ValF(String3); Преобразовываем текст в числа
     day_do.c=ValF(String4); Преобразовываем текст в числа
                    ; Условие будет выполнено при ошибке в заполнении поля
      If day_ot<1 Or day_ot>31 Or day_do<1 Or day_do>31 Or day_ot>day_do
       MessageRequester("Ошибка","Одно из полей не заполнено или введены некорректные значения!",16)
        Continue 
     EndIf
     Debug day_ot
     Debug day_do
     Debug String6
      StringGadget(#String_6, 90, 10, 1150, 17, "") ;очистка поля ввода строки
   EndIf
   EndIf
 Until Event=#PB_Event_CloseWindow ; Прерываем работу программы при попытке закрыть окно.
 End ; Завершаем работу программы.
 
 Procedure zapisat
  stroka.s(m, d, s, a)=String6
EndProcedure

Отредактировано wvlas (19.04.2012 19:01:43)

0

8

Дальше нужно произвести поиск в массиве на наличие аналогичной записи.
Если такая уже есть, то только информируем пользователя об этом, а если записи нет, то добавляем.
Заготовку структурированного массива, я привел выше. Хотя по моему, тут лучше использовать не массив, а связанный список.

0

9

Думаю все вносить в массив Dim stroka.s(12, 31, 100, 3), максимум 12 мес 31 день 100 записей и 3 варианта утро вечер день. При вводе строки в массив, добавлять строки не последовательно, а в  первую пустую ячейку (образовавшихся после редактирования или удаления строки). Искать пустое место перебором? или есть какой оператор показывающий первую пустую смтроку?

0

10

А почему не вариант со структурой?
Ведь в этом случае, потребуется намного меньше памяти и достаточно 100 элементов массива (по числу сообщений).
Если использовать вариант Dim stroka.s(12, 31, 100, 3) то многие элементы массива не будут использованы!

Со структурой нагляднее.

Код:
; Атрибуты
Enumeration
  #Attr_Morn ; Утро.
  #Attr_Day  ; День.
  #Attr_Evening ; Вечер.
EndEnumeration

Structure MyMessage
  Message.s   ; Текстовое сообщение.
  Day.a       ; День месяца.
  Month.a     ; Месяц.
  Attribute.b ; Атрибут.
EndStructure

Dim Messages.MyMessage(100)

; Добавляем запись.

Messages(0)\Message = "Текст записи"
Messages(0)\Day     = 2    ; Второго
Messages(0)\Month   = 4    ; апреля.
Messages(0)\Attribute = #Attr_Morn ; Утро.

0

11

Не понимаю, не делал так, объясни. Еще не могу отследить какой грыжик активирован утро вечер день

Отредактировано wvlas (19.04.2012 19:42:26)

0

12

wvlas написал(а):

Не понимаю, не делал так, объясни.

Каждый элемент массива Messages содержит в себе структуру MyMessage.
Можно обратится к желаемой структуры по требуемому индексу.
Тут подробнее. http://www.pure-basic.narod.ru/docs/boo … s_List.htm

wvlas написал(а):

какой грыжик активирован утро вечер день

Код:
; Атрибуты
Enumeration
  #Attr_Morn ; Утро.
  #Attr_Day  ; День.
  #Attr_Evening ; Вечер.
EndEnumeration

Structure MyMessage
  Message.s   ; Текстовое сообщение.
  Day.a       ; День месяца.
  Month.a     ; Месяц.
  Attribute.b ; Атрибут.
EndStructure

Dim Messages.MyMessage(100)

; Добавляем запись.
Messages(0)\Message = "Текст записи"
Messages(0)\Day     = 2    ; Второго
Messages(0)\Month   = 4    ; апреля.
Messages(0)\Attribute = #Attr_Morn ; Утро.

Select Messages(0)\Attribute
  Case #Attr_Morn 
    Debug "Утро."
  Case #Attr_Day 
    Debug "День."
  Case #Attr_Evening
    Debug "Вечер."
EndSelect

0

13

Со структурой разобрался.
1. А как например вывести все вечерние строки за 2 апреля, если их там вместе с утренними и дневными штук 100.
2. Как удалить ненужные из выведенных? записать в них нули и пустой текст?
3. Как добавить новую? Искать перебором пустую и на ее место добавлять?

0

14

wvlas написал(а):

1. А как например вывести все вечерние строки за 2 апреля, если их там вместе с утренними и дневными штук 100.

Пройтись в цикле по содержимому массива и найти элементы в структуре которых в Day будет 2, а в Month будет 4. Примерно так:

Код:
; Атрибуты
Enumeration
  #Attr_Morn ; Утро.
  #Attr_Day  ; День.
  #Attr_Evening ; Вечер.
EndEnumeration

Structure MyMessage
  Message.s   ; Текстовое сообщение.
  Day.a       ; День месяца.
  Month.a     ; Месяц.
  Attribute.b ; Атрибут.
EndStructure

Dim Messages.MyMessage(100)

; Добавляем запись.
Messages(0)\Message = "Текст записи"
Messages(0)\Day     = 2    ; Второго
Messages(0)\Month   = 4    ; апреля.
Messages(0)\Attribute = #Attr_Morn ; Утро.

For i=0 To 100
  If Messages(i)\Day = 2 And Messages(i)\Month = 4
    ; Тут окажемся если запись сделана второго апреля.
  EndIf
Next i
wvlas написал(а):

Как удалить ненужные из выведенных? записать в них нули и пустой текст?

Можно и так, но в этом случае, логичнее использовать связанный список. В нем достаточно удалить элемент в уже не нужной записью.

wvlas написал(а):

Как добавить новую? Искать перебором пустую и на ее место добавлять?

С массивом да, а со связанным списком, просто перейти в конец списка и добавить запись.

0

15

Немного вспоминаю, программировал на basice лет 20 назад на spectrume.
Хочу связанный список значит  :idea: . А это как?
И как этот грыжик отловить который нажал во время ввода строки  OptionGadget? Не могу в примерах найти и сам недогоню.
А по скорости работы, ресурсов памяти, массив и список как себя ведут? Ведь будет 100 записей в день*31*365=1131500.   Или с современными машинами это не вопрос?
И как связанный список на HDD  сохранить?

0

16

wvlas написал(а):

Немного вспоминаю, программировал на basice лет 20 назад на spectrume.

Тогда связанных списков не было.
Причитать о нем можно тут (примерно в середине страницы). http://pure-basic.narod.ru/docs/books/s … s_List.htm

wvlas написал(а):

OptionGadget

Код:
If OpenWindow(0, 0, 0, 140, 110, "OptionGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  OptionGadget(0, 30, 20, 60, 20, "Option 1")
  OptionGadget(1, 30, 45, 60, 20, "Option 2")
  OptionGadget(2, 30, 70, 60, 20, "Option 3")
  SetGadgetState(1, 1)   ; set second option as active one
  Repeat 
    Event=WaitWindowEvent()
    
    If Event=#PB_Event_Gadget
      Debug EventGadget()
    EndIf
    
  Until Event = #PB_Event_CloseWindow
EndIf
wvlas написал(а):

А по скорости работы, ресурсов памяти, массив и список как себя ведут? Ведь будет 100 записей в день*31*365=1131500

Я то думал что будет всего 100 записей, а оказывается это по 100 каждый день....
Тогда наверное лучше первоначальный вариант. Dim stroka.s(12, 31, 100, 3)

+1

17

Спасибо!!!

0

18

если Dim stroka.s(12, 31, 100, 3), то искать пустую перебором тоже?

0

19

И как масив на HDD  сохранить?
так правильно?
http://www.purebasic.info/phpBB2/viewtopic.php?t=1379

Отредактировано wvlas (20.04.2012 19:47:48)

0

20

Код:
Enumeration
  #Window_0
  #Option_0
  #Option_1
  #Option_2
  #String_3
  #String_4
  #Button_5
  #String_6
#Spin_7

EndEnumeration

If OpenWindow(#Window_0, 7, 136, 1257, 81, "Window_0", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MinimizeGadget|#PB_Window_TitleBar)
    OptionGadget(#Option_0, 5, 10, 50, 17, "Утро")
    OptionGadget(#Option_1, 5, 50, 50, 17, "День")
    OptionGadget(#Option_2, 5, 30, 50, 17, "Вечер")
    StringGadget(#String_3, 60, 10, 20, 17, "1")
    GadgetToolTip(#String_3, "C какой даты")
    StringGadget(#String_4, 60, 32, 20, 17, "31")
    GadgetToolTip(#String_4, "По какую дату")
    ButtonGadget(#Button_5, 60, 50, 20, 17, "Ок")
    StringGadget(#String_6, 90, 10, 1150, 17, "")
    GadgetToolTip(#String_6, "Ввод текста бегущей строки")
    SetGadgetState(1, 1)
    SpinGadget(#Spin_7, 90, 50, 28, 17, 0, 12, #PB_Spin_Numeric)
    SetGadgetState (#Spin_7, 5)
  EndIf

  
  
Repeat ; Начало цикла Repeat - Until.
  Event  = WaitWindowEvent() ; Узнаём текущее событие в программе.
  Gadget = EventGadget() ; Узнаём идентификатор активного гаджета.
  Type   = EventType()   ; Узнаём тип события.
  
  
   If Event=#PB_Event_Gadget ; Условие будет выполнено если произойдёт событие в одном из гаджетов
     If Gadget=#Option_0
       attr=0
       EndIf
       If Gadget=#Option_1
         attr=1
       EndIf
        If Gadget=#Option_2
         attr=2
       EndIf
     If Gadget=#Button_5 ; Условие будет выполнено если нажата экранная кнопка "Ok"
     ; Читаем текст из полей ввода данных (StringGadget)
     String3.s=GetGadgetText(#String_3) ;Скакой даты
     String4.s=GetGadgetText(#String_4) ;По какую дату
     String6.s=GetGadgetText(#String_6) ;Текст строки
     day_ot.c=ValF(String3); Преобразовываем текст в числа
     day_do.c=ValF(String4); Преобразовываем текст в числа
                    ; Условие будет выполнено при ошибке в заполнении поля
      If day_ot<1 Or day_ot>31 Or day_do<1 Or day_do>31 Or day_ot>day_do
       MessageRequester("Ошибка","Одно из полей не заполнено или введены некорректные значения!",16)
        Continue 
      EndIf
      If String6=""
        MessageRequester("Ошибка","Пустая строка ввода!")
        Continue 
      EndIf  
      If 7=MessageRequester("Занести?", String6 + " с " + String3 + " по " + String4, #PB_MessageRequester_YesNo)
        Continue
     EndIf
      Debug day_ot 
     Debug day_do
     Debug String6
     Debug attr
     MessageRequester ("Занесено", String6+" с "+String3+" по "+ String4)
     
   EndIf
 EndIf
 
 Until Event=#PB_Event_CloseWindow ; Прерываем работу программы при попытке закрыть окно.
 End ; Завершаем работу программы.

Как узнать текущий месяц и по умолчанию поставить при старте?

0

21

wvlas написал(а):

Как узнать текущий месяц и по умолчанию поставить при старте?

Текущий месяц. Аналогично в справке написано и про день и про год.

Код:
Debug Month(Date())

В коде вообще нет упоминания о месяце, формат даты ввода не определен  , элементарная проверка на допустимость числа месяца не корректна, так что "поставить при старте" можно, но вначале определи куда?

+1

22

Код:
Enumeration
  #Window_0
  #Option_0
  #Option_1
  #Option_2
  #String_3
  #String_4
  #Button_5
  #String_6
  #Spin_7
  #Spin_8
EndEnumeration
attr=1
stil=1
mes=Month(Date())
Dim baza.s (12,31,100,1,1)

If OpenWindow(#Window_0, 7, 136, 1257, 81, "Window_0", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MinimizeGadget|#PB_Window_TitleBar)
    OptionGadget(#Option_0, 5, 10, 50, 17, "Утро")
    OptionGadget(#Option_1, 5, 30, 50, 17, "День")
    OptionGadget(#Option_2, 5, 50, 50, 17, "Вечер")
    StringGadget(#String_3, 60, 10, 20, 17, "1")
    GadgetToolTip(#String_3, "C какой даты")
    StringGadget(#String_4, 60, 32, 20, 17, "31")
    GadgetToolTip(#String_4, "По какую дату")
    ButtonGadget(#Button_5, 60, 50, 20, 17, "Ок")
    StringGadget(#String_6, 90, 10, 1150, 17, "")
    GadgetToolTip(#String_6, "Ввод текста бегущей строки")
    SetGadgetState(1, mes)
    SpinGadget(#Spin_7, 90, 50, 28, 17, 0, 12, #PB_Spin_Numeric)
    GadgetToolTip(#Spin_7, "Месяц")
    SetGadgetState (#Spin_7, mes)
    SpinGadget(#Spin_8, 125, 50, 28, 17, 0, 12, #PB_Spin_Numeric)
    GadgetToolTip(#Spin_8, "Стиль")
    SetGadgetState (#Spin_8, 1)
    attr1.s="Утро"
  EndIf

  
  
Repeat ; Начало цикла Repeat - Until.
  Event  = WaitWindowEvent() ; Узнаём текущее событие в программе.
  Gadget = EventGadget() ; Узнаём идентификатор активного гаджета.
  Type   = EventType()   ; Узнаём тип события.
  
  
   If Event=#PB_Event_Gadget ; Условие будет выполнено если произойдёт событие в одном из гаджетов
     If Gadget=#Option_0
       attr=0
       attr1.s="Утро"
       EndIf
       If Gadget=#Option_1
         attr=1
         attr1.s="День"
       EndIf
        If Gadget=#Option_2
          attr=2
          attr1.s="Вечер"
       EndIf
     If Gadget=#Button_5 ; Условие будет выполнено если нажата экранная кнопка "Ok"
     ; Читаем текст из полей ввода данных (StringGadget)
     String3.s=GetGadgetText(#String_3) ;Скакой даты
     String4.s=GetGadgetText(#String_4) ;По какую дату
     String6.s=GetGadgetText(#String_6) ;Текст строки
     mes=GetGadgetState(#Spin_7) 
     stil=GetGadgetState(#Spin_8)
     day_ot.c=ValF(String3); Преобразовываем текст в числа
     day_do.c=ValF(String4); Преобразовываем текст в числа
     mes1.s=Str(mes)
     stil1.s=Str(stil)
                    ; Условие будет выполнено при ошибке в заполнении поля
      If day_ot<1 Or day_ot>31 Or day_do<1 Or day_do>31 Or day_ot>day_do
       MessageRequester("Ошибка","Одно из полей не заполнено или введены некорректные значения!",16)
        Continue 
      EndIf
      If String6=""
        MessageRequester("Ошибка","Пустая строка ввода!")
        Continue 
      EndIf  
      If 7=MessageRequester("Занести?", String6 + " с " + String3 + " по " + String4 + " Месяц " + mes1 + " Стиль "+ stil1 + " " + attr1, #PB_MessageRequester_YesNo)
        Continue
     EndIf
      Debug day_ot
     Debug day_do
     Debug String6
     Debug attr1
     Debug mes
     Debug stil
     For day=day_ot To day_do ;Заполнение массива с какой даты по какую дату
       For nstr=0 To 100
         If baza (mes,day,nstr,attr,stil)="" ; в дате ищем пустое место
           baza (mes,day,nstr,attr,stil)=String6 ;заполняем пустое место
           Debug baza (mes,day,nstr,attr,stil)
           nstr=100
         EndIf
         Next nstr ; проверяем следующую строку на пустость
     Next day ;следующий день
     MessageRequester ("Занесено", String6 + " с " + String3 + " по " + String4 + " Месяц " + mes1 + " Стиль "+ stil1 + " " + attr1)
    
   EndIf
 EndIf
 
 Until Event=#PB_Event_CloseWindow ; Прерываем работу программы при попытке закрыть окно.
 End ; Завершаем работу программы.

C датой ок, а то мне все календарь в справке попадался. Kак масив на HDD  сохранить? Как найтии пустое место для строки в массиве, перебором?

0


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Вводl данных с клавиатуры с последующей обработкой