Вот набросал прогу, создающую такие гиганские текстовые файлы.
Так это скорее в Opensorse отдел. Хороший пример. А Scintilla не тестировал?
PureBasic - форум |
Привет, Гость! Войдите или зарегистрируйтесь.
Вы здесь » PureBasic - форум » Вопросы по PureBasic » Вопросы новичка
Вот набросал прогу, создающую такие гиганские текстовые файлы.
Так это скорее в Opensorse отдел. Хороший пример. А Scintilla не тестировал?
А Scintilla не тестировал?
А редактор пурика по твоему это что?
Это и есть Scintilla
Я считал edirtorgadget и Scintilla разными вещами
Отредактировано haav (31.01.2010 22:10:41)
Я считал edirtorgadget и Scintilla разными вещами
Я имел в виду редактор IDE пурика, а там использован ScintillaGadget
Размер в 30 Мб грузил не так быстро, но загрузил. А вот на 40 подвис. Вот я скомпил прогу, добавил иконку и некоторые названия переписал. Вышло 37 кб
Скачать
Вот я скомпил прогу
Нормально!
А вот на 40 подвис
А нельзя как нибудь программно грузить не весь файл целиком, а к примеру по 1 мб. То есть обойти эту проблему с висяком
Добавил поддержку открытия файлов через командню строку и открытия файлов перетаскиванием их на окно проги. http://depositfiles.com/files/5b0odhsf4
открытия файлов перетаскиванием их на окно проги
Удобно. Вообще много можно почерпнуть из этого редактора. В дальнейшем, думается мне, я еще не один раз воспользуюсь этим примером.
Отредактировано haav (01.02.2010 20:20:38)
Не подскажете как ограничить ToolBar снизу. Ну чтобы она со всех сторон была ограничина границей. В смесле сверху граничит с меню а снизу ни с чем. Вот такая проблемка. Надеюсь поняли.
Тулбар снизу тоже ограничен, просто не вижно этого ограничителя.
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Или нужно визуальное ограничение?
Или нужно визуальное ограничение?
вышенаписанный пример тоже пригодился, но я чуть чуть другое имел ввиду: что то типа рамки для ToolBar со всех сторон. В делфи просто свойства менял и она как бы "Borde-лас" визуально сверху и снизу. Сверху она автоматически граничит с меню, а снизу ни с чем
Можно самому дорисовать линию внизу тулбара
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Можно самому дорисовать линию внизу тулбара
то, что надо
Сенкс
Визуальное ограничение, при наличии библиотеки.
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)
Вот набросал прогу, создающую такие гиганские текстовые файлы.
Дорогой Петр!
Ты видно сильно куда то торопился, составляя код. У меня он не работает. Вот немного подправил:
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Случайно не на эту строку компилятор ругается
PokeA(*mem+i, x)
Насколько я понял, пока ты печатал Punto Switcher тебя подвел
:
x.a=Random(255)
PokeA(*mem+i, x)
Кстати редактор виснет при больших файлах на строчке:
SetGadgetText(1, PeekS(*mem)) ; Загрузка текста в редактор.
Есть ли возможность найти альтернативу? Может API как нибудь для загрузки текста использовать? Ты вроде как хорошо API знаешь. На данный момент конечно вроде как мне не надо, но вдруг в будующем понадобиться загружать в свой редактор большие объемы текста
пока ты печатал Punto Switcher тебя подвел
У меня его нет.
Попробуй запустить прогу в PB 4.40
Попробуй запустить прогу в PB 4.40
Извиняюсь за поспешный и неверный вывод, я запускал в 4.31.
Просто в PB 4.40 появился новый тип переменной Ascii.

Вопрос не по Purebasic , а по форуму:
Закачивать свои файлы ( rar) нельзя, давать ссылку.
Очень удобный просмотр последних тем на http://purebasic.info/ на заглавной страницы. Не плохо было бы
такое организовать и здесь.
При выделении кода не работает скролинг с верху - вниз ( Opera и Firefox), но это движок форума, придется мирится.
Может чуть изменить цвет кода, отличный от основного текста, но это дело вкуса.
Отредактировано mirashic (05.02.2010 01:48:36)
Даже не представляю как всё это можно сделать.
Очень интересный получился разговор про блокнот. Спасибо всем участникам!
Вот еще один вопрос. Если в читаемом файле несколько групп нулевых полей, то файл стандартной процедурой
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)
Добавил поддержку открытия файлов через командню строку и открытия файлов перетаскиванием их на окно проги. http://depositfiles.com/files/5b0odhsf4
Хотел посмотреть файл, но его там нет. Нельзя ли еще раз закачать?
Хотел посмотреть файл, но его там нет. Нельзя ли еще раз закачать?
Вот его код:
; 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 это конец строки.
Вообще, двоичные файлы нужно редактировать не в тектовых редакторах, а в так называемых HEX-редакторах.
Файл читается весь.
Но отображается не весь по той причине, что 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 сохранить нельзя, т. к. именно этот код используется для обозначения конца строки. Собственно, из-за этого и теряется текст.
Логичнее в этом случае использовать данные, хранящиеся в памяти, на начало которой указывает указатель *mem.
Вот пример побайтового чтения файла.
Компилировать только в 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| Вопросы новичка (продолжение…) | Вопросы по PureBasic | 29.06.2024 |
| Скорее, это теоретический вопрос о правах в директории. | OffTop | 16.09.2022 |
| Вопрос по отладке | Вопросы по PureBasic | 26.01.2017 |
| Три вопроса по созданию браузера. | Вопросы по PureBasic | 01.11.2010 |
| вопрос о точности типов данных | Вопросы по PureBasic | 20.05.2021 |
Вы здесь » PureBasic - форум » Вопросы по PureBasic » Вопросы новичка