PureBasic - форум

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

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


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


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

Сообщений 61 страница 90 из 1000

61

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

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

Так это скорее в Opensorse отдел. Хороший пример. А Scintilla не тестировал?

0

62

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

А Scintilla не тестировал?

А редактор пурика по твоему это что?
Это и есть Scintilla

0

63

Я считал edirtorgadget и Scintilla разными вещами

Отредактировано haav (31.01.2010 22:10:41)

0

64

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

Я считал edirtorgadget и Scintilla разными вещами

Я имел  в виду редактор IDE пурика, а там использован ScintillaGadget

0

65

Размер в 30 Мб грузил не так быстро, но загрузил. А вот на 40 подвис. Вот я скомпил прогу, добавил иконку и некоторые названия переписал. Вышло 37 кб
Скачать

0

66

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

Вот я скомпил прогу

Нормально!

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

А вот на 40 подвис

А нельзя как нибудь программно грузить не весь файл целиком, а к примеру по 1 мб. То есть обойти эту проблему с висяком

0

67

Добавил поддержку открытия файлов через командню строку и открытия файлов перетаскиванием их на окно проги. http://depositfiles.com/files/5b0odhsf4

0

68

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

открытия файлов перетаскиванием их на окно проги

Удобно. Вообще много можно почерпнуть из этого редактора. В дальнейшем, думается мне, я еще не один раз воспользуюсь этим примером.

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

0

69

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

0

70

Тулбар снизу тоже ограничен, просто не вижно этого ограничителя.

Код:
If OpenWindow(0, 0, 0, 150, 58, "ToolBar", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    If CreateToolBar(0, WindowID(0))
      ToolBarStandardButton(0, #PB_ToolBarIcon_New)
      ToolBarStandardButton(1, #PB_ToolBarIcon_Open)
      ToolBarStandardButton(2, #PB_ToolBarIcon_Save)
      ToolBarHeight=ToolBarHeight(0)
      Debug "Высота ТулБара - "+Str(ToolBarHeight)
    EndIf
    
    StringGadget(1,4,ToolBarHeight,142,20,"")
    Repeat
      Event = WaitWindowEvent()
      If Event = #PB_Event_Menu
        Debug "ToolBar ID: "+Str(EventMenu())
      EndIf
    Until Event = #PB_Event_CloseWindow 
EndIf

Или нужно визуальное ограничение?

0

71

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

Или нужно визуальное ограничение?

вышенаписанный пример тоже пригодился, но я чуть чуть другое имел ввиду: что то типа рамки для ToolBar со всех сторон. В делфи просто свойства менял и она как бы "Borde-лас" визуально сверху и снизу. Сверху она автоматически граничит с меню, а снизу ни с чем

0

72

Можно самому дорисовать линию внизу тулбара

Код:
Procedure LineGadget(Gadget, x, y ,Width)
Protected Image
Image=CreateImage(#PB_Any, Width, 2)
If Image
  If StartDrawing(ImageOutput(Image)) 
   Line(0, 0, Width, 1, RGB(150,150,150))
   Line(0, 1, Width, 1, $FFFFFF)
   StopDrawing() 
   ImageGadget(Gadget, x, y ,Width, 2, ImageID(Image))
  EndIf
EndIf
EndProcedure


If OpenWindow(0, 0, 0, 150, 58, "ToolBar", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    If CreateToolBar(0, WindowID(0))
      ToolBarStandardButton(0, #PB_ToolBarIcon_New)
      ToolBarStandardButton(1, #PB_ToolBarIcon_Open)
      ToolBarStandardButton(2, #PB_ToolBarIcon_Save)
      ToolBarHeight=ToolBarHeight(0)
      Debug "Высота ТулБара - "+Str(ToolBarHeight)
    EndIf
    LineGadget(0, 0, ToolBarHeight ,150)
    
    Repeat
      Event = WaitWindowEvent()
      If Event = #PB_Event_Menu
        Debug "ToolBar ID: "+Str(EventMenu())
      EndIf
    Until Event = #PB_Event_CloseWindow 
EndIf

А можно создать контейнер и поместить туда тулбар

Код:
If OpenWindow(0, 0, 0, 150, 58, "ToolBar", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    
    ContainerGadget(1,1,1,148,28,#PB_Container_Flat)
    CloseGadgetList()

    If CreateToolBar(0, GadgetID(1))
      ToolBarStandardButton(0, #PB_ToolBarIcon_New)
      ToolBarStandardButton(1, #PB_ToolBarIcon_Open)
      ToolBarStandardButton(2, #PB_ToolBarIcon_Save)
    EndIf
    
    Repeat
      Event = WaitWindowEvent()
      If Event = #PB_Event_Menu
        Debug "ToolBar ID: "+Str(EventMenu())
      EndIf
    Until Event = #PB_Event_CloseWindow 
EndIf

0

73

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

Можно самому дорисовать линию внизу тулбара

то, что надо  :cool:  Сенкс

0

74

Визуальное ограничение, при наличии библиотеки.

Код:
UsePNGImageDecoder() 
UseJPEGImageDecoder()

CatchImage(1, ?Im, ?ImEnd-?Im)



If OpenWindow(0, 0, 0, 300, 150, "ToolBar", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
SetWinBackgroundImage(WindowID(0), ImageID(1) ) 

    If CreateToolBar(0, WindowID(0))
      ToolBarStandardButton(0, #PB_ToolBarIcon_New)
      ToolBarStandardButton(1, #PB_ToolBarIcon_Open)
      ToolBarStandardButton(2, #PB_ToolBarIcon_Save)
      ToolBarHeight=ToolBarHeight(0)
     
    EndIf
    
    StringGadget(1,4,ToolBarHeight,142,20,"")
    Repeat
      Event = WaitWindowEvent()
      If Event = #PB_Event_Menu
        
      EndIf
    Until Event = #PB_Event_CloseWindow 
EndIf



DataSection
 Im:
 IncludeBinary "fon.png"
 ImEnd:
EndDataSection

Отредактировано mirashic (02.02.2010 18:12:46)

0

75

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

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

Дорогой Петр!
Ты видно сильно куда то торопился, составляя код. У меня он не работает. Вот немного подправил:

Код:
If CreateFile(1,"C:\test.txt")
  
  *mem=AllocateMemory(20000001)
  For i=0 To 20000000
x1:
    x=Random(255)
    y.s=Str(x)
    PokeS(*mem+i, y)
  Next i
  WriteData(1,*mem,20000000)
  CloseFile(1)
  FreeMemory(*mem)
  MessageRequester("", "Файл создан", #MB_OK|#MB_ICONINFORMATION)
EndIf

0

76

Случайно не на эту строку компилятор ругается

Код:
PokeA(*mem+i, x)

0

77

Насколько я понял, пока ты печатал Punto Switcher тебя подвел   :D :

x.a=Random(255)

PokeA(*mem+i, x)

Кстати редактор виснет при больших файлах на строчке:

SetGadgetText(1, PeekS(*mem)) ; Загрузка текста в редактор.

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

0

78

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

пока ты печатал Punto Switcher тебя подвел

У меня его нет.
Попробуй запустить прогу в PB 4.40

0

79

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

Попробуй запустить прогу в PB 4.40

Извиняюсь за поспешный и неверный вывод, я запускал в 4.31.

0

80

Просто в PB 4.40 появился новый тип переменной Ascii.

http://s002.radikal.ru/i199/1002/dc/8206e1c0bc46.png

0

81

Вопрос не по Purebasic , а по форуму:
Закачивать свои файлы ( rar) нельзя, давать ссылку.
Очень удобный просмотр последних тем на http://purebasic.info/ на заглавной страницы. Не плохо было бы
такое организовать и здесь.
При выделении кода не работает скролинг с верху - вниз ( Opera и Firefox), но это движок форума, придется мирится.
Может чуть изменить цвет кода, отличный от основного текста, но это дело вкуса.

Отредактировано mirashic (05.02.2010 01:48:36)

0

82

Даже не представляю как всё это можно сделать.

0

83

Очень интересный получился разговор про блокнот. Спасибо всем участникам!

Вот еще один вопрос. Если в читаемом файле несколько групп нулевых полей, то файл  стандартной процедурой

Код:
  
    If ReadFile(0, File)
    FileSize=Lof(0).
    *mem=AllocateMemory(FileSize+1) 
    ReadData(0, *mem, FileSize) 
    SetGadgetText(1, PeekS(*mem)) 
    FreeMemory(*mem)
    CloseFile(0)
 Else
    MessageRequester("Ошибка", "Не удалось открыть файл")    
 EndIf

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

Отредактировано TovSax (17.03.2010 16:06:05)

0

84

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

Добавил поддержку открытия файлов через командню строку и открытия файлов перетаскиванием их на окно проги. http://depositfiles.com/files/5b0odhsf4

Хотел посмотреть файл, но его там нет. Нельзя ли еще раз закачать?

0

85

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

Хотел посмотреть файл, но его там нет. Нельзя ли еще раз закачать?

Вот его код:

Код:
  ; 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

      
    EndIf
EndProcedure

Procedure Open_Window_1()
  If OpenWindow(#Window_1, 370, 270, 240, 86, "О программе",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
    
      TextGadget(0, 10,  10, 250, 20, "Это окно О программе (Left)")
   
  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

86

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

Вот его код:

Спасибо!

0

87

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

читается только до первой группы нулей,  а нужно прочитать весь файл

Файл читается весь.
Но отображается не весь по той причине, что 0 это конец строки.
Вообще, двоичные файлы нужно редактировать не в тектовых редакторах, а в так называемых HEX-редакторах.

0

88

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

Файл читается весь.
Но отображается не весь по той причине, что 0 это конец строки.
Вообще, двоичные файлы нужно редактировать не в тектовых редакторах, а в так называемых HEX-редакторах.

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

Код:
  If ReadFile(0, File)
    FileSize=Lof(0).
    *mem=AllocateMemory(FileSize+1) 
    ReadData(0, *mem, FileSize) 

Debug "*mem = " + PeekS(*mem, FileSize) 
    
    Text$=PeekS(*mem, FileSize)

Debug "Text$ = " + Str(Text$)
 
    FreeMemory(*mem)
    CloseFile(0)
 Else
    MessageRequester("Ошибка", "Не удалось открыть файл")    
 EndIf

Мне нужно загнать весь файл или, хотя бы строки без нулевых байтов, в переменную Text$ для последующей обработки.

Отредактировано TovSax (17.03.2010 17:50:49)

0

89

В строковой переменной, код 0 сохранить нельзя, т. к. именно этот код используется для обозначения конца строки. Собственно, из-за этого и теряется текст.
Логичнее в этом случае использовать данные, хранящиеся в памяти, на начало которой указывает указатель *mem.

0

90

Вот пример побайтового чтения файла.
Компилировать только в ASCII формате! В формате юникода, нужно заменить функцию PeekC на PeekA (появилась в PureBasic 4.40)

Код:
File.s=OpenFileRequester("","","Всё файлы|*.*",0)
If File
 If ReadFile(0,File)
   FileSize=Lof(0)
   *mem=AllocateMemory(FileSize+1)
   ReadData(0, *mem, FileSize)
   CloseFile(0)
   
   If FileSize>100
     FileSize=100 ; Это чтобы не отображать весь файл. Это займёт много времни
   EndIf
   
   For i=0 To FileSize
     Debug PeekC(*mem+i)
   Next i
   FreeMemory(*mem)
 EndIf
EndIf

0


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