Вот набросал прогу, создающую такие гиганские текстовые файлы.
Так это скорее в 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 » Вопросы новичка