Форум программистов, компьютерный форум, киберфорум
Pure Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
0 / 0 / 0
Регистрация: 20.12.2016
Сообщений: 4

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

17.07.2017, 10:37. Показов 2647. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вот здесь https://www.cyberforum.ru/pure-basic/thread519745.html нашел реализацию того что мне нужно.
То есть, двойным кликом по своему файлу он открывается в моей программе.
Но данный пример выдает ошибку на синтаксис в строке где стоит "[_/CODE][_CODE_]"
У меня PB4.51, может какие библиотеки нужны для работы этого примера?
Вот сам пример:
PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
If OpenWindow(0, 0, 0, 300, 300, "ExplorerTreeGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    ExplorerTreeGadget(0, 10, 10, 280, 280, "*.*")
    Repeat 
      Event=WaitWindowEvent()
      
      If Event=#PB_Event_Gadget
        If EventGadget()=0
          If EventType()=#PB_EventType_LeftDoubleClick ; Двойной клик левой кнопкой мышки.
            File.s=GetGadgetText(0)
            If FileSize(File)>=0
              RunProgram(File)
            EndIf
          EndIf
        EndIf
      EndIf
      
    Until Event = #PB_Event_CloseWindow
  EndIf[/CODE][CODE]    OpenWindow(0, 0, 0, 300, 300, "ExplorerTreeGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    ExplorerListGadget(0, 10, 10, 280, 280, "*.*")
    Repeat 
      Event=WaitWindowEvent()
      
      If Event=#PB_Event_Gadget
        If EventGadget()=0
          If EventType()=#PB_EventType_LeftDoubleClick ; Двойной клик левой кнопкой мышки.
            Item=GetGadgetState(0)
            If Item>=0
              File.s=GetGadgetText(0)+GetGadgetItemText(0, Item)
              If FileSize(File)>=0
                RunProgram(File)
              EndIf
            EndIf
          EndIf
        EndIf
      EndIf
      
    Until Event = #PB_Event_CloseWindow
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.07.2017, 10:37
Ответы с готовыми решениями:

Открытие файлов своей программой
Добрый день! Такая задача: создал форму, поставил на нее edit, откомпилировал. Теперь нужно сделать так, чтобы при перетаскивании любого...

Связь типа файла со своей программой
Подскажите как связать формат *.jpg со своей программой. Чтобы при нажатии на картинку в моем компьютере, она загружалась через мою...

Перетаскивание файла на форму и авто открытие файла программой
Есть какое нибудь событие, при переносе файла на форму, в котором есть данные о переносимом файле, и не тока на форму а и на TextBox или...

4
Эксперт по электронике
6583 / 3210 / 335
Регистрация: 28.10.2011
Сообщений: 12,531
Записей в блоге: 7
17.07.2017, 10:50
PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
If OpenWindow(0, 0, 0, 300, 300, "ExplorerTreeGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  ExplorerTreeGadget(0, 10, 10, 280, 280, "*.*")
  Repeat 
    Event=WaitWindowEvent()
    
    If Event=#PB_Event_Gadget
      If EventGadget()=0
        If EventType()=#PB_EventType_LeftDoubleClick ; Двойной клик левой кнопкой мышки.
          File.s=GetGadgetText(0)
          If FileSize(File)>=0
            RunProgram(File)
          EndIf
        EndIf
      EndIf
    EndIf
    
  Until Event = #PB_Event_CloseWindow
EndIf
PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
OpenWindow(0, 0, 0, 300, 300, "ExplorerTreeGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ExplorerListGadget(0, 10, 10, 280, 280, "*.*")
Repeat 
  Event=WaitWindowEvent()
  
  If Event=#PB_Event_Gadget
    If EventGadget()=0
      If EventType()=#PB_EventType_LeftDoubleClick ; Двойной клик левой кнопкой мышки.
        Item=GetGadgetState(0)
        If Item>=0
          File.s=GetGadgetText(0)+GetGadgetItemText(0, Item)
          If FileSize(File)>=0
            RunProgram(File)
          EndIf
        EndIf
      EndIf
    EndIf
  EndIf
  
Until Event = #PB_Event_CloseWindow
1
0 / 0 / 0
Регистрация: 20.12.2016
Сообщений: 4
17.07.2017, 11:00  [ТС]
П.С. Если можно, то просьба к модераторам перенести этот вопрос в вышеуказанную тему.

Добавлено через 7 минут
locm, спасибо, честно сказать, я думал этот тэг использовался специально, дабы использовать программу с нормальным запуском, а внутри тега - при запуске через файл.

Но тогда я не понял смысла этого примера, если файл все равно не открывается.
Что просто запустить пример, что через двойной клик по файлу - результат один.

Вопрос- куда вставить команду на открытие, допустим текстового файла, если предположить, что в данном примере есть эдиторгаджет.
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
17.07.2017, 13:13
Цитата Сообщение от svarogdl Посмотреть сообщение
куда вставить команду на открытие, допустим текстового файла
А не проще ли использовать OpenFileRequester - это как раз для открытия файлов.
PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
;{ Windows
Enumeration
  #Window_0
EndEnumeration
;}
;{ Gadgets
Enumeration
  #Editor_0
  #Button_1
EndEnumeration
;}
 
; Эта процедура загружает текст из файла в редактор
Procedure LoadFile(Gadget,FileName.s)
Text.s="" ; Очищаем строковую переменную
 If ReadFile(1,FileName) ; Открываем файл
  Size=Lof(1) ; Узнаём размер файла
  If Size>0
    Text=Space(Size) ; Заполняем переменную числом пробелов, равным размеру файла
    ReadData(1,@Text,Size) ; Читаем данные из файла в строковую переменную "Text"
  EndIf
  SetGadgetText(Gadget,Text) ; Помещаем данные из переменной "Text" в редактор
  CloseFile(1) ; Закрываем файл
 Else
  MessageRequester("Ошибка","Не удалось открыть файл!")
 EndIf
EndProcedure 
 
Procedure OpenWindow_Window_0()
  If OpenWindow(#Window_0, 603, 106, 589, 400, "Редактор", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MinimizeGadget|#PB_Window_TitleBar)
     EditorGadget(#Editor_0, 15, 15, 555, 305)
     ButtonGadget(#Button_1, 25, 330, 95, 40, "Открыть файл")
  
  EndIf
EndProcedure
 
OpenWindow_Window_0()
 
;{- Event loop
Repeat
  Event = WaitWindowEvent()
  Select Event
    ; ///////////////////
    Case #PB_Event_Gadget
      EventGadget = EventGadget()
      EventType = EventType()
      If EventGadget = #Editor_0
      ElseIf EventGadget = #Button_1
  StandardFile$ = ""   
  Pattern$ = "Text (*.txt)|*.txt;*.bat|PureBasic (*.pb)|*.pb|All files (*.*)|*.*"
  Pattern = 0    ; use the first of the three possible patterns as standard
  File$ = OpenFileRequester("Please choose file to load", StandardFile$, Pattern$, Pattern)
  If File$
    LoadFile(#Editor_0, File$)
  EndIf
  
      EndIf
    ; ////////////////////////
    Case #PB_Event_CloseWindow
      EventWindow = EventWindow()
      If EventWindow = #Window_0
        CloseWindow(#Window_0)
        Break
      EndIf
  EndSelect
ForEver
;
;}
Можно конечно и выше указанные коды использовать. Надо вместо RunProgram(File)
использовать процедуру из кода : LoadFile(Gadget,FileName.s), где Gadget соответственно ваш эдиторгаджет

Та же процедура, но только читает текст построчно, что заметно дольше, но иногда так надо для контроля строк или там поиска информации с строках.
PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
Procedure LoadFile(Gadget,FileName.s)
Text.s="" ; Очищаем строковую переменную
 If ReadFile(1,FileName) ; Открываем файл
  While Eof(1)=0 ; Начало цикла While - Wend. Функция Eof() возвращает в качестве результата число 0, до тех пор, пока не будет достигнут конец файла
   Text=Text+ReadString(1)+Chr(13) ; Считываем данные из файла
  Wend ; Конец цикла
  SetGadgetText(Gadget,Text) ; Помещаем данные из переменной "Text" в редактор
  CloseFile(1) ; Закрываем файл
 Else
  MessageRequester("Ошибка","Не удалось открыть файл!")
 EndIf
EndProcedure
1
0 / 0 / 0
Регистрация: 20.12.2016
Сообщений: 4
19.07.2017, 15:28  [ТС]
Pro_grammer,спасибо за пример, но в моей программе так и используется. Пример в первом посте я нашел на этом форуме. И я думал, это то что я и искал. Но ошибся.
Вот теперь нагляднее будет на вашем примере в посте выше.
Принцип работы моей программы таков же, запустил программу, а затем открыл файл в ней.
Но хочется, дабы ускорить процесс работы, так как файл не один, сделать еще и автооткрытие файла в программе двойным кликом по ассоциированному с ней файлу. Вот в этом и вопрос. Дело в том, что файлы на флешке, в папке, и каждый раз тыкать кнопки выбирая флешку, папку, сам файл неудобно. Иначе бы обстояли дела, если я заранее открываю папку с файлами и двойным кликом открывал файл, тем самым запускал программу и она автоматом подхватывала имя файла и открывала его.
Простой пример того что я хочу - Блокнот. Как двойным кликом по текстовому файлу он открывает файл, так и функцией OpenFileRequester мы можем открыть желаемый файл в уже работающем Блокноте.
Программирую сравнительно недавно, и то урывками. С такой задачей ни разу не сталкивался и по-этому даже представить не могу, как это реализовать.
Если в программе указать открытие файла при запуске программы, то возникает вопрос, как программе передать имя открываемого файла. Следовательно, это неверное направление, так пока программа еще не запущена, считать имя мы не можем. Либо я чего-то не понимаю.
Файл в принципе текстовый, но с другим расширением. Суть программы - быстрое редактирование файлов с визуализацией редактирования. Так что целиком ее выкладывать нет смысла, ваш пример вполне это реализовывает.

Добавлено через 8 минут
Подозреваю, что в программе нужно как-то ассоциацию программы с файлом произвести. Это раз. И что-то дописать, чтоб считывать имя ассоциированного запущенного файла. С нетерпением жду подсказок. Заранее благодарен.

Добавлено через 2 часа 5 минут
Всем спасибо за помощь, нашел то что искал в этой теме >> Ассоциировать определенный тип файлов со своим приложением

Добавлено через 2 часа 9 минут
Теперь смежный вопрос:
Как заставить программу открывать второй файл не в копии, а в работающей программе?
Через кнопку ОТКРЫТЬ все работает верно. Но с Мутексом вожусь и не разберусь.
Нужно как-то отправить параметр работающей версии программы, но как, ума не приложу. Помогите пожалуйста.
Кликните здесь для просмотра всего текста
PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
;{ Windows
Enumeration 100
  #Window_0
EndEnumeration
;}
;{ Gadgets
Enumeration 200
  #Editor_0
  #Button_1
  #file
  #panel
  #openFile
EndEnumeration
;}
Global exe.s = "auto_open"
Global x=500
Global y=1000
Declare auto_open()
Declare add_tab()
Global path$
Global name$
 
 ;{ Проверка запуска программы. Если программа уже запущена, выводится соответствующее сообщение
Mutex = CreateMutex_(#Null, #True, exe.s)
If GetLastError_() = #ERROR_ALREADY_EXISTS
  ;MessageBox_(0, "auto_open is running", "Warning", #MB_ICONWARNING)
  EndIf
  ;auto_open()
  Event= #PB_Event_CloseWindow
  
  End
Else
  ReleaseMutex_(Mutex)
EndIf
;} 
 
 
; Эта процедура загружает текст из файла в редактор построчно
Procedure LoadFile(Gadget,FileName.s)
Text.s="" ; Очищаем строковую переменную
 If ReadFile(#file,FileName) ; Открываем файл
  While Eof(#file)=0 ; Начало цикла While - Wend. Функция Eof() возвращает в качестве результата число 0, до тех пор, пока не будет достигнут конец файла
   Text=Text+ReadString(#file)+Chr(13) ; Считываем данные из файла
  Wend ; Конец цикла
  SetGadgetText(y,Text) ; Помещаем данные из переменной "Text" в редактор
  CloseFile(#file) ; Закрываем файл
 Else
  MessageRequester("Ошибка","Не удалось открыть файл!")
 EndIf
EndProcedure
 
Procedure add_tab()
  x+1
  y+1
  
  OpenGadgetList(#openFile)
      AddGadgetItem (#openFile, -1, Mid(name$,Len(name$)-7,8))
      EditorGadget(y, 15, 15, 540, 280)
  CloseGadgetList()   
  LoadFile(y,name$) 
EndProcedure
 
;{Автооткрытие файла двойным кликом по нему
Procedure auto_open()
  Count=CountProgramParameters()-1
For i=0 To Count
  String.s+ProgramParameter(i)
Next i
If String.s=""
Else
  path$=GetPathPart(String.s)
  name$=GetFilePart(String.s)
   add_tab()
  EndIf
EndProcedure
;}
 
 
Procedure OpenWindow_Window_0()
  If OpenWindow(#Window_0, 603, 106, 589, 400, "Редактор", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MinimizeGadget|#PB_Window_TitleBar)
    ;EditorGadget(#Editor_0, 15, 15, 555, 305)
      PanelGadget(#panel, 5,5, 590, 330)
      AddGadgetItem (#panel, -1, "Файл")
      PanelGadget(#openFile, 5,5, 590, 320)
      CloseGadgetList()
      CloseGadgetList()
     ButtonGadget(#Button_1, 25, 330, 95, 40, "Открыть файл")
  
   EndIf
  auto_open()
EndProcedure
 
OpenWindow_Window_0()
 
;{- Event loop
Repeat
  Event = WaitWindowEvent()
  Select Event
    ; ///////////////////
    Case #PB_Event_Gadget
      EventGadget = EventGadget()
      EventType = EventType()
      If EventGadget = #Editor_0
      ElseIf EventGadget = #Button_1
  StandardFile$ = ""   
  Pattern$ = "Text (*.txt)|*.txt;*.bat|PureBasic (*.pb)|*.pb|All files (*.*)|*.*"
  Pattern = 0    ; use the first of the three possible patterns as standard
  name$ = OpenFileRequester("Please choose file to load", StandardFile$, Pattern$, Pattern)
  If name$
    add_tab()
    ;LoadFile(y, name$)
  EndIf
  
      EndIf
    ; ////////////////////////
    Case #PB_Event_CloseWindow
      ;EventWindow = EventWindow()
      ;If EventWindow = #Window_0
        CloseWindow(#Window_0)
        Break
      ;EndIf
  EndSelect
ForEver
;
;}


Добавлено через 8 минут
Ошибся, но уже не могу исправить
PureBasic
1
2
3
4
5
6
7
8
9
10
11
 ;{ Проверка запуска программы. Если программа уже запущена, выводится соответствующее сообщение
Mutex = CreateMutex_(#Null, #True, exe.s)
If GetLastError_() = #ERROR_ALREADY_EXISTS
  ;MessageBox_(0, "auto_open is running", "Warning", #MB_ICONWARNING)
  ;auto_open()
  Event= #PB_Event_CloseWindow
  End
Else
  ReleaseMutex_(Mutex)
EndIf
;}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.07.2017, 15:28
Помогаю со студенческими работами здесь

Как узнать путь файла, который был открыт своей программой
Сразу извиняюсь, если эта тема уже была. У меня есть программа, которая играет (воспроизводит) аудио. Как узнать путь файла, который...

Открытие файла программой
Создали программу, которая сохраняет инфу в файл и открывает. Как сделать так, чтобы можно было открыть файл данной прогой через двойной...

Открытие файла программой по умолчанию
Подскажите пожалуйста, как в си открыть текстовый файл в отдельном окне?

Открытие файла программой по умолчанию
Идея такая: Есть таблица, при выборе определенной строки и нажатии кнопки "Открыть" открывается файл, определенный документ doc. ...

Открытие файла программой по умолчанию
Нужно создать програму которая будет открывать такие типы файлов как dox, txt, jpg, pdf. Пожалуйста помогите...оформить мне сказали чтобы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru