PureBasic - форум

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

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


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Вопросы новичка


Вопросы новичка

Сообщений 31 страница 60 из 1000

31

только почемуто высота этого поля слишком маленькая. А при изменении значений

Пётр написал(а):

EditorGadget(1,2,30,548,360)

ничего не происходит

0

32

Попробуй так

Код:
EditorGadget(1,2,2,548,360)
Код:
; PureBasic Visual Designer v3.95 build 1485 (PB4Code)


;- Window Constants
;
Enumeration
  #Window_0
  #Window_1
EndEnumeration

;- MenuBar Constants
;
Enumeration
  #MenuBar_0
EndEnumeration

Enumeration
  #MENU_1
  #MENU_2
  #MENU_4
  #MENU_6
  #MENU_3
  #MENU_8
  #MENU_9
EndEnumeration


Procedure Open_Window_0()
  If OpenWindow(#Window_0, 211, 146, 600, 300, "MainForm",  #PB_Window_MinimizeGadget | #PB_Window_SizeGadget | #PB_Window_MaximizeGadget )
    If CreateMenu(#MenuBar_0, WindowID(#Window_0))
      MenuTitle("Файл")
      MenuItem(#MENU_1, "Открыть")
      MenuItem(#MENU_2, "Сохранить")
      MenuBar()
      MenuItem(#MENU_4, "Выход")
      MenuTitle("Помощь")
      MenuItem(#MENU_8, "О программе")
      EndIf

      If CreateGadgetList(WindowID(#Window_0))
        
      EndIf
    EndIf
EndProcedure

Procedure Open_Window_1()
  If OpenWindow(#Window_1, 370, 270, 240, 86, "О программе",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
    If CreateGadgetList(WindowID(#Window_1))
      
    EndIf
  EndIf
EndProcedure

Open_Window_0()

EditorGadget(1,2,2,548,360)
SmartWindowRefresh(#Window_0, 1) ; Это для уменьшения мерцания окна при изменении его размеров

Repeat ; Начало главного цикла Repeat-Until.
  Event=WaitWindowEvent() ; Получаем идентификатор события.
  Gadget=EventGadget() ; Узнаём идентификатор гаджета в котором произошло событие.
  Window=EventWindow() ; Получаем идентификатор окна, в котором произошло событие
  Menu=EventMenu()
  
If Window=#Window_0 ; Обработчик событий для окна "MainForm"
  
     If Event=#PB_Event_Menu ; Произошло событие в меню
       If Menu=#MENU_8 ; Пункт меню "О программе".
         Open_Window_1()
       ElseIf Menu=#MENU_4
         End
       EndIf
     EndIf
     
     If Event=#PB_Event_SizeWindow
       ResizeGadget(1, #PB_Ignore, #PB_Ignore, WindowWidth(#Window_0)-4, WindowHeight(#Window_0)-MenuHeight()-4) 
     EndIf
 
ElseIf Window=#Window_1 ; Обработчик событий для окна "О программе"
    If Event = #PB_Event_CloseWindow
       CloseWindow(#Window_1)
    EndIf
  EndIf

     
Until Event = #PB_Event_CloseWindow And Window=#Window_0 ; Прерываем цикл если в переменной "Event" будет число равное числу в константе.

PS.
Здесь можно найти пример текстового редактора http://pure-basic.narod.ru/docs/MultiOS.html

0

33

Теперь все ок :) Как теперь окно открыти создать под клик "Открыть"? В справке написано Result = OpenWindow(#Window, x, y, InnerWidth, InnerHeight, Title$ [, Flags [, ParentWindowID]])

Отредактировано daiomik (31.01.2010 17:42:29)

0

34

Посмотри справку на функции OpenFileRequester и SaveFileRequester (раздел Requester справки)

0

35

Хм.. снова проблема. Не знаю че писать в данной функции:

Код:
; PureBasic Visual Designer v3.95 build 1485 (PB4Code)


;- Window Constants
;
Enumeration
  #Window_0
  #Window_1
EndEnumeration

;- MenuBar Constants
;
Enumeration
  #MenuBar_0
EndEnumeration

Enumeration
  #MENU_1
  #MENU_2
  #MENU_4
  #MENU_6
  #MENU_3
  #MENU_8
  #MENU_9
EndEnumeration


Procedure Open_Window_0()
  If OpenWindow(#Window_0, 211, 146, 600, 300, "MainForm",  #PB_Window_MinimizeGadget | #PB_Window_SizeGadget | #PB_Window_MaximizeGadget )
    If CreateMenu(#MenuBar_0, WindowID(#Window_0))
      MenuTitle("Файл")
      MenuItem(#MENU_1, "Открыть")
      MenuItem(#MENU_2, "Сохранить")
      MenuBar()
      MenuItem(#MENU_4, "Выход")
      MenuTitle("Помощь")
      MenuItem(#MENU_8, "О программе")
      EndIf

      If CreateGadgetList(WindowID(#Window_0))
        
      EndIf
    EndIf
EndProcedure

Procedure Open_Window_1()
  If OpenWindow(#Window_1, 370, 270, 240, 86, "О программе",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
    If CreateGadgetList(WindowID(#Window_1))
      
    EndIf
  EndIf
EndProcedure

Open_Window_0()

EditorGadget(1,2,2,548,360)
SmartWindowRefresh(#Window_0, 1) ; Это для уменьшения мерцания окна при изменении его размеров

Repeat ; Начало главного цикла Repeat-Until.
  Event=WaitWindowEvent() ; Получаем идентификатор события.
  Gadget=EventGadget() ; Узнаём идентификатор гаджета в котором произошло событие.
  Window=EventWindow() ; Получаем идентификатор окна, в котором произошло событие
  Menu=EventMenu()
  
If Window=#Window_0 ; Обработчик событий для окна "MainForm"
  
     If Event=#PB_Event_Menu ; Произошло событие в меню
       If Menu=#MENU_8 ; Пункт меню "О программе".
         Open_Window_1()
       ElseIf Menu=#MENU_4
         End
       ElseIf Menu=#MENU_1
       OpenFileRequester(Title$, DefaultFile$, Pattern$, PatternPosition [, Flags])
       EndIf
     EndIf
     
     If Event=#PB_Event_SizeWindow
       ResizeGadget(1, #PB_Ignore, #PB_Ignore, WindowWidth(#Window_0)-4, WindowHeight(#Window_0)-MenuHeight()-4) 
     EndIf
 
ElseIf Window=#Window_1 ; Обработчик событий для окна "О программе"
    If Event = #PB_Event_CloseWindow
       CloseWindow(#Window_1)
    EndIf
  EndIf

     
Until Event = #PB_Event_CloseWindow And Window=#Window_0 ; Прерываем цикл если в переменной "Event" будет число равное числу в константе.

0

36

Вот. Заодно добавил процедуру загрузки файла

Код:
; PureBasic Visual Designer v3.95 build 1485 (PB4Code)


;- Window Constants
;
Enumeration
  #Window_0
  #Window_1
EndEnumeration

;- MenuBar Constants
;
Enumeration
  #MenuBar_0
EndEnumeration

Enumeration
  #MENU_1
  #MENU_2
  #MENU_4
  #MENU_6
  #MENU_3
  #MENU_8
  #MENU_9
EndEnumeration


Procedure Open_Window_0()
  If OpenWindow(#Window_0, 211, 146, 600, 300, "MainForm",  #PB_Window_MinimizeGadget | #PB_Window_SizeGadget | #PB_Window_MaximizeGadget )
    If CreateMenu(#MenuBar_0, WindowID(#Window_0))
      MenuTitle("Файл")
      MenuItem(#MENU_1, "Открыть")
      MenuItem(#MENU_2, "Сохранить")
      MenuBar()
      MenuItem(#MENU_4, "Выход")
      MenuTitle("Помощь")
      MenuItem(#MENU_8, "О программе")
      EndIf

      If CreateGadgetList(WindowID(#Window_0))
        
      EndIf
    EndIf
EndProcedure

Procedure Open_Window_1()
  If OpenWindow(#Window_1, 370, 270, 240, 86, "О программе",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
    If CreateGadgetList(WindowID(#Window_1))
      
    EndIf
  EndIf
EndProcedure

   ; Эта процедура открывает файл, указанный в переменной File и загружает данные из него в редактор.
Procedure LoadFile(File.s)
 If ReadFile(0, File) ; Открытие файла.
    FileSize=Lof(0) ; Определение размера файла в байтах.
    *mem=AllocateMemory(FileSize+1) ; Выделение памяти на 1 байт больше размера файла.
    ReadData(0, *mem, FileSize) ; Копирование данных из файла в память.
    SetGadgetText(1, PeekS(*mem)) ; Загрузка текста в редактор.
    FreeMemory(*mem) ; Освобождение памяти.
    CloseFile(0)     ; Закрытие файла.
 Else
    MessageRequester("Ошибка", "Не удалось открыть файл")    
 EndIf
EndProcedure

Open_Window_0()

EditorGadget(1,2,2,548,360)
SmartWindowRefresh(#Window_0, 1) ; Это для уменьшения мерцания окна при изменении его размеров

Repeat ; Начало главного цикла Repeat-Until.
  Event=WaitWindowEvent() ; Получаем идентификатор события.
  Gadget=EventGadget() ; Узнаём идентификатор гаджета в котором произошло событие.
  Window=EventWindow() ; Получаем идентификатор окна, в котором произошло событие
  Menu=EventMenu()
  
If Window=#Window_0 ; Обработчик событий для окна "MainForm"
  
     If Event=#PB_Event_Menu ; Произошло событие в меню
       If Menu=#MENU_8 ; Пункт меню "О программе".
         Open_Window_1()
       ElseIf Menu=#MENU_4
         End
       ElseIf Menu=#MENU_1
         File.s=OpenFileRequester("Открыть файл", "", "Текстовые файлы|*.txt|Все файлы|*.*", 0)
         If File<>""
           LoadFile(File)
         EndIf
       EndIf
     EndIf
     
     If Event=#PB_Event_SizeWindow
       ResizeGadget(1, #PB_Ignore, #PB_Ignore, WindowWidth(#Window_0)-4, WindowHeight(#Window_0)-MenuHeight()-4) 
     EndIf
 
ElseIf Window=#Window_1 ; Обработчик событий для окна "О программе"
    If Event = #PB_Event_CloseWindow
       CloseWindow(#Window_1)
    EndIf
  EndIf

     
Until Event = #PB_Event_CloseWindow And Window=#Window_0 ; Прерываем цикл если в переменной "Event" будет число равное числу в константе.

0

37

А для сохранения это нужно использовать

Код:
File.s=SaveFileRequester("Сохранить файл", "","Текстовые файлы|*.txt|Все файлы|*.*", 0) 
         If File<>""
           SaveFile(File)

0

38

Да, но лучше добавить проверку наличия расширения у сохраняемого файла и его его нет, то добавить.

Код:
File.s=SaveFileRequester("Сохранить файл", "","Текстовые файлы|*.txt|Все файлы|*.*", 0) 
  If File<>""
     If GetExtensionPart(File)="" And SelectedFilePattern()=0 ; Если не заданно расширение файла
         File=File+".txt"                                      ; добавляем его
     EndIf
     SaveFile(File)
  EndIf

0

39

Пишет ошибка:"Строка 97.SaveFile() не Функция, Массив,Макрос или связной поток"

Код:
; PureBasic Visual Designer v3.95 build 1485 (PB4Code)


;- Window Constants
;
Enumeration
  #Window_0
  #Window_1
EndEnumeration

;- MenuBar Constants
;
Enumeration
  #MenuBar_0
EndEnumeration

Enumeration
  #MENU_1
  #MENU_2
  #MENU_4
  #MENU_6
  #MENU_3
  #MENU_8
  #MENU_9
EndEnumeration


Procedure Open_Window_0()
  If OpenWindow(#Window_0, 211, 146, 600, 300, "MainForm",  #PB_Window_MinimizeGadget | #PB_Window_SizeGadget | #PB_Window_MaximizeGadget )
    If CreateMenu(#MenuBar_0, WindowID(#Window_0))
      MenuTitle("Файл")
      MenuItem(#MENU_1, "Открыть")
      MenuItem(#MENU_2, "Сохранить")
      MenuBar()
      MenuItem(#MENU_4, "Выход")
      MenuTitle("Помощь")
      MenuItem(#MENU_8, "О программе")
      EndIf

      If CreateGadgetList(WindowID(#Window_0))
        
      EndIf
    EndIf
EndProcedure

Procedure Open_Window_1()
  If OpenWindow(#Window_1, 370, 270, 240, 86, "О программе",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
    If CreateGadgetList(WindowID(#Window_1))
      
    EndIf
  EndIf
EndProcedure

   ; Эта процедура открывает файл, указанный в переменной File и загружает данные из него в редактор.
Procedure LoadFile(File.s)
 If ReadFile(0, File) ; Открытие файла.
    FileSize=Lof(0) ; Определение размера файла в байтах.
    *mem=AllocateMemory(FileSize+1) ; Выделение памяти на 1 байт больше размера файла.
    ReadData(0, *mem, FileSize) ; Копирование данных из файла в память.
    SetGadgetText(1, PeekS(*mem)) ; Загрузка текста в редактор.
    FreeMemory(*mem) ; Освобождение памяти.
    CloseFile(0)     ; Закрытие файла.
 Else
    MessageRequester("Ошибка", "Не удалось открыть файл")    
 EndIf
EndProcedure

Open_Window_0()

EditorGadget(1,2,2,548,360)
SmartWindowRefresh(#Window_0, 1) ; Это для уменьшения мерцания окна при изменении его размеров

Repeat ; Начало главного цикла Repeat-Until.
  Event=WaitWindowEvent() ; Получаем идентификатор события.
  Gadget=EventGadget() ; Узнаём идентификатор гаджета в котором произошло событие.
  Window=EventWindow() ; Получаем идентификатор окна, в котором произошло событие
  Menu=EventMenu()
  
If Window=#Window_0 ; Обработчик событий для окна "MainForm"
  
     If Event=#PB_Event_Menu ; Произошло событие в меню
       If Menu=#MENU_8 ; Пункт меню "О программе".
         Open_Window_1()
       ElseIf Menu=#MENU_4
         End
       ElseIf Menu=#MENU_1
         File.s=OpenFileRequester("Открыть файл", "", "Текстовые файлы|*.txt|Все файлы|*.*", 0)
         If File<>""
           LoadFile(File)
         EndIf
       ElseIf Menu=#MENU_2
         File.s=SaveFileRequester("Сохранить файл", "","Текстовые файлы|*.txt|Все файлы|*.*", 0) 
         If File<>""
           If GetExtensionPart(File)="" And SelectedFilePattern()=0 ; Если не заданно расширение файла
             File=File+".txt"                                      ; добавляем его
           EndIf
          SaveFile(File)
         EndIf
       EndIf
     
     If Event=#PB_Event_SizeWindow
       ResizeGadget(1, #PB_Ignore, #PB_Ignore, WindowWidth(#Window_0)-4, WindowHeight(#Window_0)-MenuHeight()-4) 
     EndIf
 
ElseIf Window=#Window_1 ; Обработчик событий для окна "О программе"
    If Event = #PB_Event_CloseWindow
       CloseWindow(#Window_1)
    EndIf
  EndIf

     
Until Event = #PB_Event_CloseWindow And Window=#Window_0 ; Прерываем цикл если в переменной "Event" будет число равное числу в константе.

0

40

Добавь процедуру с таким именем, которая будет сохранять данные в файле.

Код:
; PureBasic Visual Designer v3.95 build 1485 (PB4Code)


;- Window Constants
;
Enumeration
  #Window_0
  #Window_1
EndEnumeration

;- MenuBar Constants
;
Enumeration
  #MenuBar_0
EndEnumeration

Enumeration
  #MENU_1
  #MENU_2
  #MENU_4
  #MENU_6
  #MENU_3
  #MENU_8
  #MENU_9
EndEnumeration


Procedure Open_Window_0()
  If OpenWindow(#Window_0, 211, 146, 600, 300, "MainForm",  #PB_Window_MinimizeGadget | #PB_Window_SizeGadget | #PB_Window_MaximizeGadget )
    If CreateMenu(#MenuBar_0, WindowID(#Window_0))
      MenuTitle("Файл")
      MenuItem(#MENU_1, "Открыть")
      MenuItem(#MENU_2, "Сохранить")
      MenuBar()
      MenuItem(#MENU_4, "Выход")
      MenuTitle("Помощь")
      MenuItem(#MENU_8, "О программе")
      EndIf

      If CreateGadgetList(WindowID(#Window_0))
        
      EndIf
    EndIf
EndProcedure

Procedure Open_Window_1()
  If OpenWindow(#Window_1, 370, 270, 240, 86, "О программе",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
    If CreateGadgetList(WindowID(#Window_1))
      
    EndIf
  EndIf
EndProcedure

   ; Эта процедура открывает файл, указанный в переменной File и загружает данные из него в редактор.
Procedure LoadFile(File.s)
 If ReadFile(0, File) ; Открытие файла.
    FileSize=Lof(0) ; Определение размера файла в байтах.
    *mem=AllocateMemory(FileSize+1) ; Выделение памяти на 1 байт больше размера файла.
    ReadData(0, *mem, FileSize) ; Копирование данных из файла в память.
    SetGadgetText(1, PeekS(*mem)) ; Загрузка текста в редактор.
    FreeMemory(*mem) ; Освобождение памяти.
    CloseFile(0)     ; Закрытие файла.
 Else
    MessageRequester("Ошибка", "Не удалось открыть файл")    
 EndIf
EndProcedure

  ; Эта процедура сохраняет данные из редактора в файл.
Procedure SaveFile(File.s)
     If CreateFile(0,File) ; Создание файла на диске
        Text.s=GetGadgetText(1) ; Копирование текста из редактора в строковую переменную Text
        WriteString(0, Text) ; Запись текста в файл
        CloseFile(0) ; Закрытие файла.
     Else
       MessageRequester("Ошибка", "Не удалось сохранить файл")
     EndIf
EndProcedure

Open_Window_0()

EditorGadget(1,2,2,548,360)
SmartWindowRefresh(#Window_0, 1) ; Это для уменьшения мерцания окна при изменении его размеров

Repeat ; Начало главного цикла Repeat-Until.
  Event=WaitWindowEvent() ; Получаем идентификатор события.
  Gadget=EventGadget() ; Узнаём идентификатор гаджета в котором произошло событие.
  Window=EventWindow() ; Получаем идентификатор окна, в котором произошло событие
  Menu=EventMenu()
  
If Window=#Window_0 ; Обработчик событий для окна "MainForm"

     If Event=#PB_Event_SizeWindow
       ResizeGadget(1, #PB_Ignore, #PB_Ignore, WindowWidth(#Window_0)-4, WindowHeight(#Window_0)-MenuHeight()-4) 
     EndIf
  
     If Event=#PB_Event_Menu ; Произошло событие в меню
       If Menu=#MENU_8 ; Пункт меню "О программе".
         Open_Window_1()
       ElseIf Menu=#MENU_4
         End
       ElseIf Menu=#MENU_1
         File.s=OpenFileRequester("Открыть файл", "", "Текстовые файлы|*.txt|Все файлы|*.*", 0)
         If File<>""
           LoadFile(File)
         EndIf
       ElseIf Menu=#MENU_2
         File.s=SaveFileRequester("Сохранить файл", "","Текстовые файлы|*.txt|Все файлы|*.*", 0) 
         If File<>""
           If GetExtensionPart(File)="" And SelectedFilePattern()=0 ; Если не заданно расширение файла
             File=File+".txt"                                      ; добавляем его
           EndIf
          SaveFile(File)
         EndIf
       EndIf
     
     If Event=#PB_Event_SizeWindow
       ResizeGadget(1, #PB_Ignore, #PB_Ignore, WindowWidth(#Window_0)-4, WindowHeight(#Window_0)-MenuHeight()-4) 
     EndIf
 
ElseIf Window=#Window_1 ; Обработчик событий для окна "О программе"
    If Event = #PB_Event_CloseWindow
       CloseWindow(#Window_1)
    EndIf
  EndIf
EndIf

     
Until Event = #PB_Event_CloseWindow And Window=#Window_0 ; Прерываем цикл если в переменной "Event" будет число равное числу в константе.

0

41

С этим разобрался :) Вот теперь хочу добавить надпись во втором окне Опрограмме. Ввожу так, но выводит Синтаксическая ошибка:

Код:
Procedure Open_Window_1()
  If OpenWindow(#Window_1, 370, 270, 240, 86, "О программе",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
    If CreateGadgetList(WindowID(#Window_1))
    TextGadget(0, 10,  10, 250, 20, ""Это окно О программе (Left)")
    EndIf
  EndIf
EndProcedure

0

42

В начале надписи Это окно О программе (Left) есть лишняя кавычка.

0

43

АА, точно. Ток вот опять не могу закрыть окно О программе. Знаю что нужно вставить этот код, но не знаю куда

Код:
If window=1 ; Обработка событий от окна с идентификатором 1 (окно "О программе")
   If Event=#PB_Event_CloseWindow  ; Закрываем окно
    CloseWindow(1)
   EndIf

0

44

Была проблема с закрывающими олператорами EndIf. Один из операторов располагался не там где надо.

Код:
; PureBasic Visual Designer v3.95 build 1485 (PB4Code)


;- Window Constants
;
Enumeration
  #Window_0
  #Window_1
EndEnumeration

;- MenuBar Constants
;
Enumeration
  #MenuBar_0
EndEnumeration

Enumeration
  #MENU_1
  #MENU_2
  #MENU_4
  #MENU_6
  #MENU_3
  #MENU_8
  #MENU_9
EndEnumeration


Procedure Open_Window_0()
  If OpenWindow(#Window_0, 211, 146, 600, 300, "MainForm",  #PB_Window_MinimizeGadget | #PB_Window_SizeGadget | #PB_Window_MaximizeGadget )
    If CreateMenu(#MenuBar_0, WindowID(#Window_0))
      MenuTitle("Файл")
      MenuItem(#MENU_1, "Открыть")
      MenuItem(#MENU_2, "Сохранить")
      MenuBar()
      MenuItem(#MENU_4, "Выход")
      MenuTitle("Помощь")
      MenuItem(#MENU_8, "О программе")
      EndIf

      If CreateGadgetList(WindowID(#Window_0))
        
      EndIf
    EndIf
EndProcedure

Procedure Open_Window_1()
  If OpenWindow(#Window_1, 370, 270, 240, 86, "О программе",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
    If CreateGadgetList(WindowID(#Window_1))
      TextGadget(0, 10,  10, 250, 20, "Это окно О программе (Left)")
    EndIf
  EndIf
EndProcedure

   ; Эта процедура открывает файл, указанный в переменной File и загружает данные из него в редактор.
Procedure LoadFile(File.s)
 If ReadFile(0, File) ; Открытие файла.
    FileSize=Lof(0) ; Определение размера файла в байтах.
    *mem=AllocateMemory(FileSize+1) ; Выделение памяти на 1 байт больше размера файла.
    ReadData(0, *mem, FileSize) ; Копирование данных из файла в память.
    SetGadgetText(1, PeekS(*mem)) ; Загрузка текста в редактор.
    FreeMemory(*mem) ; Освобождение памяти.
    CloseFile(0)     ; Закрытие файла.
 Else
    MessageRequester("Ошибка", "Не удалось открыть файл")    
 EndIf
EndProcedure

  ; Эта процедура сохраняет данные из редактора в файл.
Procedure SaveFile(File.s)
     If CreateFile(0,File) ; Создание файла на диске
        Text.s=GetGadgetText(1) ; Копирование текста из редактора в строковую переменную Text
        WriteString(0, Text) ; Запись текста в файл
        CloseFile(0) ; Закрытие файла.
     Else
       MessageRequester("Ошибка", "Не удалось сохранить файл")
     EndIf
EndProcedure

Open_Window_0()

EditorGadget(1,2,2,548,360)
SmartWindowRefresh(#Window_0, 1) ; Это для уменьшения мерцания окна при изменении его размеров

Repeat ; Начало главного цикла Repeat-Until.
  Event=WaitWindowEvent() ; Получаем идентификатор события.
  Gadget=EventGadget() ; Узнаём идентификатор гаджета в котором произошло событие.
  Window=EventWindow() ; Получаем идентификатор окна, в котором произошло событие
  Menu=EventMenu()
  
If Window=#Window_0 ; Обработчик событий для окна "MainForm"

     If Event=#PB_Event_SizeWindow
       ResizeGadget(1, #PB_Ignore, #PB_Ignore, WindowWidth(#Window_0)-4, WindowHeight(#Window_0)-MenuHeight()-4) 
     EndIf
  
     If Event=#PB_Event_Menu ; Произошло событие в меню
       If Menu=#MENU_8 ; Пункт меню "О программе".
         Open_Window_1()
       ElseIf Menu=#MENU_4
         End
       ElseIf Menu=#MENU_1
         File.s=OpenFileRequester("Открыть файл", "", "Текстовые файлы|*.txt|Все файлы|*.*", 0)
         If File<>""
           LoadFile(File)
         EndIf
       ElseIf Menu=#MENU_2
         File.s=SaveFileRequester("Сохранить файл", "","Текстовые файлы|*.txt|Все файлы|*.*", 0) 
         If File<>""
           If GetExtensionPart(File)="" And SelectedFilePattern()=0 ; Если не заданно расширение файла
             File=File+".txt"                                      ; добавляем его
           EndIf
          SaveFile(File)
         EndIf
       EndIf
     EndIf
     
     If Event=#PB_Event_SizeWindow
       ResizeGadget(1, #PB_Ignore, #PB_Ignore, WindowWidth(#Window_0)-4, WindowHeight(#Window_0)-MenuHeight()-4) 
     EndIf
 
ElseIf Window=#Window_1 ; Обработчик событий для окна "О программе"
    If Event = #PB_Event_CloseWindow
       CloseWindow(#Window_1)
    EndIf
EndIf

     
Until Event = #PB_Event_CloseWindow And Window=#Window_0 ; Прерываем цикл если в переменной "Event" будет число равное числу в константе.

0

45

С блокнотом разобрался полностью. Давайте о другом. В просторах инета нашел примерчик  с отображением времени. Объясните зачем тут идет объявление процедуры? И как она потом вызывается? и зачем "Открываем файл "user32.dll""?

Код:
; Эта процедура вызывается по таймеру два раза в секунду.
Procedure DateStatusBar() 
  Time.s = FormatDate("%hh:%ii:%ss", Date() ) ; Узнаём текущее время
  StatusBarText(0, 0,Time) ; Выводим его на строку состояния
EndProcedure 
; Открываем окно
If OpenWindow(0,0,0,200,100,"Строка состояния",#PB_Window_MinimizeGadget | #PB_Window_ScreenCentered)
 If CreateGadgetList(WindowID(0))
   ; Создаём строку состояния
   CreateStatusBar(0, WindowID(0))
   ; Делим её на области
   AddStatusBarField(80)
   AddStatusBarField(120)
  StatusBarText(0, 1, " Текущее время") ; Выводим строку в область с идентификатором 1.
  
  OpenLibrary(0,"user32.dll") ; Открываем файл "user32.dll"
  CallFunction(0,"SetTimer",WindowID(0), 1, 500, @DateStatusBar() ) ; Вызываем функцию "SetTimer"
    
  Repeat
   Event=WaitWindowEvent()
  Until Event=#PB_Event_CloseWindow
  ; Вызываем функцию "KillTimer"
  CallFunction(0,"KillTimer",WindowID(0),1)
   ; Закрываем файл "user32.dll".
  CloseLibrary(0)
 EndIf
EndIf
End

0

46

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

Объясните зачем тут идет объявление процедуры

Где? Там нет объявления процедуры. Процедура объявляется с помощью оператора Declare если она в исходнике находится ниже чем вызывается (это связанно с использованием однопроходового компилятора).

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

И как она потом вызывается?

Вызывается периодически по таймеру , который создаётся строкой

Код:
CallFunction(0,"SetTimer",WindowID(0), 1, 500, @DateStatusBar() )

При этом, API функции SetTimer передаётся указатель на процедуру ("собака" в начале её имени).

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

и зачем "Открываем файл "user32.dll""?

Это для доступа к API функции SetTimer.
Дело в том, что демо версии PureBasic напрямую не поддерживают API, вот и приходится так извращяться.

А полная версия PureBasic непосредственно поддерживает API, поэтому нет необходимости разбиратся в системными DLLками.

Код:
; Эта процедура вызывается по таймеру два раза в секунду.
Procedure DateStatusBar() 
  Time.s = FormatDate("%hh:%ii:%ss", Date() ) ; Узнаём текущее время
  StatusBarText(0, 0,Time) ; Выводим его на строку состояния
EndProcedure 
; Открываем окно
If OpenWindow(0,0,0,200,100,"Строка состояния",#PB_Window_MinimizeGadget | #PB_Window_ScreenCentered)
 If CreateGadgetList(WindowID(0))
   ; Создаём строку состояния
   CreateStatusBar(0, WindowID(0))
   ; Делим её на области
   AddStatusBarField(80)
   AddStatusBarField(120)
  StatusBarText(0, 1, " Текущее время") ; Выводим строку в область с идентификатором 1.
  
  SetTimer_(WindowID(0), 1, 500, @DateStatusBar() ) ; Вызываем функцию "SetTimer"
    
  Repeat
   Event=WaitWindowEvent()
  Until Event=#PB_Event_CloseWindow
  ; Вызываем функцию "KillTimer"
  KillTimer_(WindowID(0),1)
 
 EndIf
EndIf
End

0

47

Давайте уж, что бы завершить и логически закончить тему доделаем наш редактор и добавим некоторые функции, типа копировать, вставить, работа с мышью и тп... У кого какие есть предложения?

0

48

Сразу говорю это код Петра!

Код:
Procedure IsMouseOver(wnd) 
GetWindowRect_(wnd,re.RECT) 
GetCursorPos_(pt.POINT) 
ProcedureReturn PtInRect_(re,pt\x|(pt\y<<32)) 
EndProcedure 

If OpenWindow(0, 0, 0, 322, 150, "EditorGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) 
 EditorGadget(0, 8, 8, 306, 133) 
  
  If CreatePopupMenu(1) 
   MenuItem(1,"Отменить") 
   MenuItem(2,"Повторить") 
   MenuBar() 
   MenuItem(3,"Вырезать") 
   MenuItem(4,"Копировать") 
   MenuItem(5,"Вставить") 
   MenuItem(6,"Удалить") 
   MenuBar() 
   MenuItem(7,"Выделить всё") 
  EndIf 

    
 Repeat 
   Event=WaitWindowEvent() 
      
      If Event=#WM_RBUTTONUP 
         If IsMouseOver(GadgetID(0)) 
           DisplayPopupMenu(1,WindowID(0)) 
         EndIf 
      EndIf 
      
      If Event=#PB_Event_Menu 
        Menu=EventMenu() 
        Select Menu 
           Case 1 ; "Отменить" 
              SendMessage_(GadgetID(0), #EM_UNDO, #Null, #Null) 
              
           Case 2 ; "Повторить" 
              SendMessage_(GadgetID(0), #EM_REDO, #Null, #Null) 
              
           Case 3, 4 ; "Вырезать", "Копировать" 
              SendMessage_(GadgetID(0), #EM_GETSEL, @Min,@Max) 
        
            If Min<>Max 
             If Min<Max 
               xx=Max-Min 
             Else 
               xx=Min-Max 
             EndIf 
          
              lpText.s=Space(xx) 
              SendMessage_(GadgetID(0), #EM_GETSELTEXT, #Null, @lpText) 
              SetClipboardText(lpText) 
          
              If Menu=3 ; "Вырезать" 
               SendMessage_(GadgetID(0),#EM_REPLACESEL,0,@"") 
              EndIf 
            EndIf 
        
           Case 5 ; "Вставить" 
             Text.s=GetClipboardText() 
             SendMessage_(GadgetID(0),#EM_REPLACESEL,0,@Text) 
              
           Case 6 ; "Удалить" 
             SendMessage_(GadgetID(0),#EM_REPLACESEL,0,@"") 
            
           Case 7 ; "Выделить всё" 
             SendMessage_(GadgetID(0),#EM_SETSEL,0,99999999) 
        EndSelect 
      EndIf 
      
 Until Event = #PB_Event_CloseWindow 
EndIf

Отредактировано haav (31.01.2010 20:05:34)

0

49

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

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

Procedure IsMouseOver(wnd)
GetWindowRect_(wnd,re.RECT)
GetCursorPos_(pt.POINT)
ProcedureReturn PtInRect_(re,pt\x|(pt\y<<32))
EndProcedure

0

50

Эта процедура позволяет узнать находится ли курсор мышки над окном или гаджетом.
Если находится, то процедура возращает число 1, а иначе - 0.

PS.
daiomik, у тебя есть опыт работы с API функциями винды?

0

51

daiomik, у тебя есть опыт работы с API функциями винды?

Увы нет.
Вроде все соединил, но вылазит ошибка при нажатии RightButton. Вот код:

Код:
; PureBasic Visual Designer v3.95 build 1485 (PB4Code)


;- Window Constants
;
Enumeration
  #Window_0
  #Window_1
EndEnumeration

;- MenuBar Constants
;
Enumeration
  #MenuBar_0
EndEnumeration

Enumeration
  #MENU_1
  #MENU_2
  #MENU_4
  #MENU_6
  #MENU_3
  #MENU_8
  #MENU_9
EndEnumeration

Procedure IsMouseOver(wnd) 
GetWindowRect_(wnd,re.RECT) 
GetCursorPos_(pt.POINT) 
ProcedureReturn PtInRect_(re,pt\x|(pt\y<<32)) 
EndProcedure 


Procedure Open_Window_0()
  If OpenWindow(#Window_0, 211, 146, 600, 300, "MainForm",  #PB_Window_MinimizeGadget | #PB_Window_SizeGadget | #PB_Window_MaximizeGadget )
    If CreateMenu(#MenuBar_0, WindowID(#Window_0))
      MenuTitle("Файл")
      MenuItem(#MENU_1, "Открыть")
      MenuItem(#MENU_2, "Сохранить")
      MenuBar()
      MenuItem(#MENU_4, "Выход")
      MenuTitle("Помощь")
      MenuItem(#MENU_8, "О программе")
      EndIf

      If CreateGadgetList(WindowID(#Window_0))
        
      EndIf
    EndIf
EndProcedure

Procedure Open_Window_1()
  If OpenWindow(#Window_1, 370, 270, 240, 86, "О программе",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
    If CreateGadgetList(WindowID(#Window_1))
      TextGadget(0, 10,  10, 250, 20, "Это окно О программе (Left)")
    EndIf
  EndIf
EndProcedure

   ; Эта процедура открывает файл, указанный в переменной File и загружает данные из него в редактор.
Procedure LoadFile(File.s)
 If ReadFile(0, File) ; Открытие файла.
    FileSize=Lof(0) ; Определение размера файла в байтах.
    *mem=AllocateMemory(FileSize+1) ; Выделение памяти на 1 байт больше размера файла.
    ReadData(0, *mem, FileSize) ; Копирование данных из файла в память.
    SetGadgetText(1, PeekS(*mem)) ; Загрузка текста в редактор.
    FreeMemory(*mem) ; Освобождение памяти.
    CloseFile(0)     ; Закрытие файла.
 Else
    MessageRequester("Ошибка", "Не удалось открыть файл")    
 EndIf
EndProcedure

  ; Эта процедура сохраняет данные из редактора в файл.
Procedure SaveFile(File.s)
     If CreateFile(0,File) ; Создание файла на диске
        Text.s=GetGadgetText(1) ; Копирование текста из редактора в строковую переменную Text
        WriteString(0, Text) ; Запись текста в файл
        CloseFile(0) ; Закрытие файла.
     Else
       MessageRequester("Ошибка", "Не удалось сохранить файл")
     EndIf
EndProcedure

Open_Window_0()

EditorGadget(1,2,2,548,360)
SmartWindowRefresh(#Window_0, 1) ; Это для уменьшения мерцания окна при изменении его размеров
If CreatePopupMenu(1) 
   MenuItem(1,"Отменить") 
   MenuItem(2,"Повторить") 
   MenuBar() 
   MenuItem(3,"Вырезать") 
   MenuItem(4,"Копировать") 
   MenuItem(5,"Вставить") 
   MenuItem(6,"Удалить") 
   MenuBar() 
   MenuItem(7,"Выделить всё") 
  EndIf 

Repeat ; Начало главного цикла Repeat-Until.
  Event=WaitWindowEvent() ; Получаем идентификатор события.
  Gadget=EventGadget() ; Узнаём идентификатор гаджета в котором произошло событие.
  Window=EventWindow() ; Получаем идентификатор окна, в котором произошло событие
  Menu=EventMenu()
  
  If Event=#WM_RBUTTONUP 
          If IsMouseOver(GadgetID(0)) 
           DisplayPopupMenu(1,WindowID(0)) 
         EndIf 
      EndIf 
      
      If Event=#PB_Event_Menu 
        Menu=EventMenu() 
        Select Menu 
           Case 1 ; "Отменить" 
              SendMessage_(GadgetID(0), #EM_UNDO, #Null, #Null) 
              
           Case 2 ; "Повторить" 
              SendMessage_(GadgetID(0), #EM_REDO, #Null, #Null) 
              
           Case 3, 4 ; "Вырезать", "Копировать" 
              SendMessage_(GadgetID(0), #EM_GETSEL, @Min,@Max) 
        
            If Min<>Max 
             If Min<Max 
               xx=Max-Min 
             Else 
               xx=Min-Max 
             EndIf 
          
              lpText.s=Space(xx) 
              SendMessage_(GadgetID(0), #EM_GETSELTEXT, #Null, @lpText) 
              SetClipboardText(lpText) 
          
              If Menu=3 ; "Вырезать" 
               SendMessage_(GadgetID(0),#EM_REPLACESEL,0,@"") 
              EndIf 
            EndIf 
        
           Case 5 ; "Вставить" 
             Text.s=GetClipboardText() 
             SendMessage_(GadgetID(0),#EM_REPLACESEL,0,@Text) 
              
           Case 6 ; "Удалить" 
             SendMessage_(GadgetID(0),#EM_REPLACESEL,0,@"") 
            
           Case 7 ; "Выделить всё" 
             SendMessage_(GadgetID(0),#EM_SETSEL,0,99999999) 
        EndSelect 
      EndIf 
  
If Window=#Window_0 ; Обработчик событий для окна "MainForm"

     If Event=#PB_Event_SizeWindow
       ResizeGadget(1, #PB_Ignore, #PB_Ignore, WindowWidth(#Window_0)-4, WindowHeight(#Window_0)-MenuHeight()-4) 
     EndIf
  
     If Event=#PB_Event_Menu ; Произошло событие в меню
       If Menu=#MENU_8 ; Пункт меню "О программе".
         Open_Window_1()
       ElseIf Menu=#MENU_4
         End
       ElseIf Menu=#MENU_1
         File.s=OpenFileRequester("Открыть файл", "", "Текстовые файлы|*.txt|Все файлы|*.*", 0)
         If File<>""
           LoadFile(File)
         EndIf
       ElseIf Menu=#MENU_2
         File.s=SaveFileRequester("Сохранить файл", "","Текстовые файлы|*.txt|Все файлы|*.*", 0) 
         If File<>""
           If GetExtensionPart(File)="" And SelectedFilePattern()=0 ; Если не заданно расширение файла
             File=File+".txt"                                      ; добавляем его
           EndIf
          SaveFile(File)
         EndIf
       EndIf
     EndIf
     
     If Event=#PB_Event_SizeWindow
       ResizeGadget(1, #PB_Ignore, #PB_Ignore, WindowWidth(#Window_0)-4, WindowHeight(#Window_0)-MenuHeight()-4) 
     EndIf
 
ElseIf Window=#Window_1 ; Обработчик событий для окна "О программе"
    If Event = #PB_Event_CloseWindow
       CloseWindow(#Window_1)
    EndIf
EndIf

     
Until Event = #PB_Event_CloseWindow And Window=#Window_0 ; Прерываем цикл если в переменной "Event" будет число равное числу в константе.

Отредактировано daiomik (31.01.2010 20:27:33)

0

52

Вот так  вроде правильно

Код:
; PureBasic Visual Designer v3.95 build 1485 (PB4Code)


;- Window Constants
;
Enumeration
  #Window_0
  #Window_1
EndEnumeration

;- MenuBar Constants
;
Enumeration
  #MenuBar_0
EndEnumeration

Enumeration
  #MENU_1
  #MENU_2
  #MENU_4
  #MENU_6
  #MENU_3
  #MENU_8
  #MENU_9
EndEnumeration

Procedure IsMouseOver(wnd) 
GetWindowRect_(wnd,re.RECT) 
GetCursorPos_(pt.POINT) 
ProcedureReturn PtInRect_(re,pt\x|(pt\y<<32)) 
EndProcedure 


Procedure Open_Window_0()
  If OpenWindow(#Window_0, 211, 146, 600, 300, "MainForm",  #PB_Window_MinimizeGadget | #PB_Window_SizeGadget | #PB_Window_MaximizeGadget )
    If CreateMenu(#MenuBar_0, WindowID(#Window_0))
      MenuTitle("Файл")
      MenuItem(#MENU_1, "Открыть")
      MenuItem(#MENU_2, "Сохранить")
      MenuBar()
      MenuItem(#MENU_4, "Выход")
      MenuTitle("Помощь")
      MenuItem(#MENU_8, "О программе")
      EndIf

      If CreateGadgetList(WindowID(#Window_0))
        
      EndIf
    EndIf
EndProcedure

Procedure Open_Window_1()
  If OpenWindow(#Window_1, 370, 270, 240, 86, "О программе",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
    If CreateGadgetList(WindowID(#Window_1))
      TextGadget(0, 10,  10, 250, 20, "Это окно О программе (Left)")
    EndIf
  EndIf
EndProcedure

   ; Эта процедура открывает файл, указанный в переменной File и загружает данные из него в редактор.
Procedure LoadFile(File.s)
 If ReadFile(0, File) ; Открытие файла.
    FileSize=Lof(0) ; Определение размера файла в байтах.
    *mem=AllocateMemory(FileSize+1) ; Выделение памяти на 1 байт больше размера файла.
    ReadData(0, *mem, FileSize) ; Копирование данных из файла в память.
    SetGadgetText(1, PeekS(*mem)) ; Загрузка текста в редактор.
    FreeMemory(*mem) ; Освобождение памяти.
    CloseFile(0)     ; Закрытие файла.
 Else
    MessageRequester("Ошибка", "Не удалось открыть файл")    
 EndIf
EndProcedure

  ; Эта процедура сохраняет данные из редактора в файл.
Procedure SaveFile(File.s)
     If CreateFile(0,File) ; Создание файла на диске
        Text.s=GetGadgetText(1) ; Копирование текста из редактора в строковую переменную Text
        WriteString(0, Text) ; Запись текста в файл
        CloseFile(0) ; Закрытие файла.
     Else
       MessageRequester("Ошибка", "Не удалось сохранить файл")
     EndIf
EndProcedure

Open_Window_0()

EditorGadget(1,2,2,548,360)
SmartWindowRefresh(#Window_0, 1) ; Это для уменьшения мерцания окна при изменении его размеров
If CreatePopupMenu(1) 
   MenuItem(1,"Отменить") 
   MenuItem(2,"Повторить") 
   MenuBar() 
   MenuItem(3,"Вырезать") 
   MenuItem(4,"Копировать") 
   MenuItem(5,"Вставить") 
   MenuItem(6,"Удалить") 
   MenuBar() 
   MenuItem(7,"Выделить всё") 
  EndIf 

Repeat ; Начало главного цикла Repeat-Until.
  Event=WaitWindowEvent() ; Получаем идентификатор события.
  Gadget=EventGadget() ; Узнаём идентификатор гаджета в котором произошло событие.
  Window=EventWindow() ; Получаем идентификатор окна, в котором произошло событие
  Menu=EventMenu()
  
  If Event=#WM_RBUTTONUP 
          If IsMouseOver(GadgetID(1)) 
           DisplayPopupMenu(1,WindowID(#Window_0)) 
         EndIf 
      EndIf 
      
      If Event=#PB_Event_Menu 
        Menu=EventMenu() 
        Select Menu 
           Case 1 ; "Отменить" 
              SendMessage_(GadgetID(1), #EM_UNDO, #Null, #Null) 
              
           Case 2 ; "Повторить" 
              SendMessage_(GadgetID(1), #EM_REDO, #Null, #Null) 
              
           Case 3, 4 ; "Вырезать", "Копировать" 
              SendMessage_(GadgetID(1), #EM_GETSEL, @Min,@Max) 
        
            If Min<>Max 
             If Min<Max 
               xx=Max-Min 
             Else 
               xx=Min-Max 
             EndIf 
          
              lpText.s=Space(xx) 
              SendMessage_(GadgetID(1), #EM_GETSELTEXT, #Null, @lpText) 
              SetClipboardText(lpText) 
          
              If Menu=3 ; "Вырезать" 
               SendMessage_(GadgetID(0),#EM_REPLACESEL,0,@"") 
              EndIf 
            EndIf 
        
           Case 5 ; "Вставить" 
             Text.s=GetClipboardText() 
             SendMessage_(GadgetID(1),#EM_REPLACESEL,0,@Text) 
              
           Case 6 ; "Удалить" 
             SendMessage_(GadgetID(1),#EM_REPLACESEL,0,@"") 
            
           Case 7 ; "Выделить всё" 
             SendMessage_(GadgetID(1),#EM_SETSEL,0,99999999) 
        EndSelect 
      EndIf 
  
If Window=#Window_0 ; Обработчик событий для окна "MainForm"

     If Event=#PB_Event_SizeWindow
       ResizeGadget(1, #PB_Ignore, #PB_Ignore, WindowWidth(#Window_0)-4, WindowHeight(#Window_0)-MenuHeight()-4) 
     EndIf
  
     If Event=#PB_Event_Menu ; Произошло событие в меню
       If Menu=#MENU_8 ; Пункт меню "О программе".
         Open_Window_1()
       ElseIf Menu=#MENU_4
         End
       ElseIf Menu=#MENU_1
         File.s=OpenFileRequester("Открыть файл", "", "Текстовые файлы|*.txt|Все файлы|*.*", 0)
         If File<>""
           LoadFile(File)
         EndIf
       ElseIf Menu=#MENU_2
         File.s=SaveFileRequester("Сохранить файл", "","Текстовые файлы|*.txt|Все файлы|*.*", 0) 
         If File<>""
           If GetExtensionPart(File)="" And SelectedFilePattern()=0 ; Если не заданно расширение файла
             File=File+".txt"                                      ; добавляем его
           EndIf
          SaveFile(File)
         EndIf
       EndIf
     EndIf
     
     If Event=#PB_Event_SizeWindow
       ResizeGadget(1, #PB_Ignore, #PB_Ignore, WindowWidth(#Window_0)-4, WindowHeight(#Window_0)-MenuHeight()-4) 
     EndIf
 
ElseIf Window=#Window_1 ; Обработчик событий для окна "О программе"
    If Event = #PB_Event_CloseWindow
       CloseWindow(#Window_1)
    EndIf
EndIf

     
Until Event = #PB_Event_CloseWindow And Window=#Window_0 ; Прерываем цикл если в переменной "Event" будет число равное числу в константе.

Отредактировано haav (31.01.2010 20:36:21)

0

53

Так то оно правильно, но вот ошибки всеравно выводит, если на пункты этого меню жать

0

54

Подправил. Да там похоже еще баги остались.....

Отредактировано haav (31.01.2010 20:38:31)

0

55

хм.. странно. При нажатии отменить появляется окно открытия, а при нажатии повторить прога вылетает

0

56

Ошибка потому, что у редактора идентификатор 1, а добавленый код обращался к гаджету с идентификатором 0, которого не существует в проге.
Кроме того, добавил меню "Правка".

Код:
; PureBasic Visual Designer v3.95 build 1485 (PB4Code)


;- Window Constants
;
Enumeration
  #Window_0
  #Window_1
EndEnumeration

;- MenuBar Constants
;
Enumeration
  #MenuBar_0
EndEnumeration

Enumeration 20
  #MENU_1
  #MENU_2
  #MENU_4
  #MENU_6
  #MENU_3
  #MENU_8
  #MENU_9
EndEnumeration

Procedure IsMouseOver(wnd) 
GetWindowRect_(wnd,re.RECT) 
GetCursorPos_(pt.POINT) 
ProcedureReturn PtInRect_(re,pt\x|(pt\y<<32)) 
EndProcedure 


Procedure Open_Window_0()
  If OpenWindow(#Window_0, 211, 146, 600, 300, "MainForm",  #PB_Window_MinimizeGadget | #PB_Window_SizeGadget | #PB_Window_MaximizeGadget )
    If CreateMenu(#MenuBar_0, WindowID(#Window_0))
      MenuTitle("Файл")
        MenuItem(#MENU_1, "Открыть")
        MenuItem(#MENU_2, "Сохранить")
        MenuBar()
        MenuItem(#MENU_4, "Выход")
      MenuTitle("Правка")
        MenuItem(1,"Отменить") 
        MenuItem(2,"Повторить") 
        MenuBar() 
        MenuItem(3,"Вырезать") 
        MenuItem(4,"Копировать") 
        MenuItem(5,"Вставить") 
        MenuItem(6,"Удалить") 
        MenuBar() 
        MenuItem(7,"Выделить всё")
      MenuTitle("Помощь")
        MenuItem(#MENU_8, "О программе")
      EndIf

      If CreateGadgetList(WindowID(#Window_0))
        
      EndIf
    EndIf
EndProcedure

Procedure Open_Window_1()
  If OpenWindow(#Window_1, 370, 270, 240, 86, "О программе",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
    If CreateGadgetList(WindowID(#Window_1))
      TextGadget(0, 10,  10, 250, 20, "Это окно О программе (Left)")
    EndIf
  EndIf
EndProcedure

   ; Эта процедура открывает файл, указанный в переменной File и загружает данные из него в редактор.
Procedure LoadFile(File.s)
 If ReadFile(0, File) ; Открытие файла.
    FileSize=Lof(0) ; Определение размера файла в байтах.
    *mem=AllocateMemory(FileSize+1) ; Выделение памяти на 1 байт больше размера файла.
    ReadData(0, *mem, FileSize) ; Копирование данных из файла в память.
    SetGadgetText(1, PeekS(*mem)) ; Загрузка текста в редактор.
    FreeMemory(*mem) ; Освобождение памяти.
    CloseFile(0)     ; Закрытие файла.
 Else
    MessageRequester("Ошибка", "Не удалось открыть файл")    
 EndIf
EndProcedure

  ; Эта процедура сохраняет данные из редактора в файл.
Procedure SaveFile(File.s)
     If CreateFile(0,File) ; Создание файла на диске
        Text.s=GetGadgetText(1) ; Копирование текста из редактора в строковую переменную Text
        WriteString(0, Text) ; Запись текста в файл
        CloseFile(0) ; Закрытие файла.
     Else
       MessageRequester("Ошибка", "Не удалось сохранить файл")
     EndIf
EndProcedure

Open_Window_0()

EditorGadget(1,2,2,548,360)
SmartWindowRefresh(#Window_0, 1) ; Это для уменьшения мерцания окна при изменении его размеров
If CreatePopupMenu(1) 
   MenuItem(1,"Отменить") 
   MenuItem(2,"Повторить") 
   MenuBar() 
   MenuItem(3,"Вырезать") 
   MenuItem(4,"Копировать") 
   MenuItem(5,"Вставить") 
   MenuItem(6,"Удалить") 
   MenuBar() 
   MenuItem(7,"Выделить всё") 
  EndIf 

Repeat ; Начало главного цикла Repeat-Until.
  Event=WaitWindowEvent() ; Получаем идентификатор события.
  Gadget=EventGadget() ; Узнаём идентификатор гаджета в котором произошло событие.
  Window=EventWindow() ; Получаем идентификатор окна, в котором произошло событие
  Menu=EventMenu()
  
  If Event=#WM_RBUTTONUP 
          If IsMouseOver(GadgetID(1)) 
           DisplayPopupMenu(1,WindowID(#Window_0)) 
         EndIf 
      EndIf 
      
      If Event=#PB_Event_Menu 
        Select Menu 
           Case 1 ; "Отменить" 
              SendMessage_(GadgetID(1), #EM_UNDO, #Null, #Null) 
              
           Case 2 ; "Повторить" 
              SendMessage_(GadgetID(1), #EM_REDO, #Null, #Null) 
              
           Case 3, 4 ; "Вырезать", "Копировать" 
              SendMessage_(GadgetID(1), #EM_GETSEL, @Min,@Max) 
        
            If Min<>Max 
             If Min<Max 
               xx=Max-Min 
             Else 
               xx=Min-Max 
             EndIf 
          
              lpText.s=Space(xx) 
              SendMessage_(GadgetID(1), #EM_GETSELTEXT, #Null, @lpText) 
              SetClipboardText(lpText) 
          
              If Menu=3 ; "Вырезать" 
               SendMessage_(GadgetID(1),#EM_REPLACESEL,0,@"") 
              EndIf 
            EndIf 
        
           Case 5 ; "Вставить" 
             Text.s=GetClipboardText() 
             SendMessage_(GadgetID(1),#EM_REPLACESEL,0,@Text) 
              
           Case 6 ; "Удалить" 
             SendMessage_(GadgetID(1),#EM_REPLACESEL,0,@"") 
            
           Case 7 ; "Выделить всё" 
             SendMessage_(GadgetID(1),#EM_SETSEL,0,-1) 
        EndSelect 
      EndIf 
  
If Window=#Window_0 ; Обработчик событий для окна "MainForm"

     If Event=#PB_Event_SizeWindow
       ResizeGadget(1, #PB_Ignore, #PB_Ignore, WindowWidth(#Window_0)-4, WindowHeight(#Window_0)-MenuHeight()-4) 
     EndIf
  
     If Event=#PB_Event_Menu ; Произошло событие в меню
       If Menu=#MENU_8 ; Пункт меню "О программе".
         Open_Window_1()
       ElseIf Menu=#MENU_4
         End
       ElseIf Menu=#MENU_1
         File.s=OpenFileRequester("Открыть файл", "", "Текстовые файлы|*.txt|Все файлы|*.*", 0)
         If File<>""
           LoadFile(File)
         EndIf
       ElseIf Menu=#MENU_2
         File.s=SaveFileRequester("Сохранить файл", "","Текстовые файлы|*.txt|Все файлы|*.*", 0) 
         If File<>""
           If GetExtensionPart(File)="" And SelectedFilePattern()=0 ; Если не заданно расширение файла
             File=File+".txt"                                      ; добавляем его
           EndIf
          SaveFile(File)
         EndIf
       EndIf
     EndIf
     
     If Event=#PB_Event_SizeWindow
       ResizeGadget(1, #PB_Ignore, #PB_Ignore, WindowWidth(#Window_0)-4, WindowHeight(#Window_0)-MenuHeight()-4) 
     EndIf
 
ElseIf Window=#Window_1 ; Обработчик событий для окна "О программе"
    If Event = #PB_Event_CloseWindow
       CloseWindow(#Window_1)
    EndIf
EndIf

     
Until Event = #PB_Event_CloseWindow And Window=#Window_0 ; Прерываем цикл если в переменной "Event" будет число равное числу в константе.

0

57

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

хм.. странно. При нажатии отменить появляется окно открытия, а при нажатии повторить прога вылетает

А там просто совпали идентификаторы у пунктов меню созданых визуальным редактором и вновь добавленных.
Чтобы избавится от этого с минимумом переделок, сделал так

Код:
Enumeration 20
  #MENU_1
  #MENU_2
  #MENU_4
  #MENU_6
  #MENU_3
  #MENU_8
  #MENU_9
EndEnumeration

При этом нумирация начинается с 20 и конфликтов нет.

0

58

Теперь все четко. Думаю редактор можно назвать оконченным. Все ясно главное

0

59

Сравнил этот редактор по скорости с блокнотом:
При размере текстового файла 1 мб, блокнот проигрывает.
При размере текстового файла 22 мб, редактор виснет, а блокнот открывает где то через 30-40 секунд
Интересно почему он виснет?

0

60

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

При размере текстового файла 22 мб, редактор виснет

Вот набросал прогу, создающую такие гиганские текстовые файлы.

Код:
If CreateFile(1,"E:\test.txt")
  
  *mem=AllocateMemory(20000001)
  For i=0 To 20000000
x1:
    x.a=Random(255)
    If x<32 And (x<>13 Or x<>10)
      Goto x1
    EndIf
    PokeA(*mem+i, x)
  Next i
  WriteData(1,*mem,20000000)
  CloseFile(1)
  FreeMemory(*mem)
  MessageRequester("", "Файл создан", #MB_OK|#MB_ICONINFORMATION)
EndIf

Запускать нужно с отключённым отладчиком, а то нужно будет долго ждать.

Так вот, при открытии таких массивых файлов, виснет также Notepad++, SciTE и редактор пурика.
Так что возможно это как-то с виндой связанно.

0


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Вопросы новичка