PureBasic - форум

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

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


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


Вопросы новичка (продолжение…)

Сообщений 841 страница 870 из 961

841

Спасибо огромное!

0

842

В Пурике есть команда "GetCurrentDirectory". Но дело в том, что она ведет корневой каталог от диска С, а мне нужно, что бы она вела его от моего файла. То есть: не C:\Users\User\Desktop...бла-бла-бла, а примерно вот так: MD/SystemDrive/. Как это сделать?

0

843

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

что бы она вела его от моего файла.


Папка, из которой запущена программа:

Код:
Debug GetPathPart(ProgramFilename())

0

844

Всем привет!
Подскажите, кому не жалко, как запретить повторный запуск уже открытого exe.
И еще вопрос: я использовал несколько картинок в программе в качестве логотипа. Они скомпиллируются в exe и будут доступны на чужом компьютере или их нужно переносить отдельно или засунуть в dll?

0

845

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

Подскажите, кому не жалко, как запретить повторный запуск уже открытого exe.

;---------Запрет на запуск программы более одного раза--------
;{------------------------------------------------------------
a = CreateSemaphore_(#Null,0,1,"ИМЯ ПРОГИ")
If a<>0 And GetLastError_()= #ERROR_ALREADY_EXISTS
  CloseHandle_(a)
    If MessageRequester("MS-2", "Программа уже запущена!", #MB_OK|#MB_ICONWARNING)=#IDOK
     End
   EndIf
EndIf
;}---------------------------------------------------------------

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

я использовал несколько картинок в программе в качестве логотипа. Они скомпиллируются в exe и будут доступны на чужом компьютере

Если загруженны через DataSection EndDataSection, то да.

0

846

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

И еще вопрос: я использовал несколько картинок в программе в качестве логотипа. Они скомпиллируются в exe и будут доступны на чужом компьютере или их нужно переносить отдельно или засунуть в dll?

Это зависит от кода. Можно сделать все перечисленные варианты.

0

847

max, Пётр, спасибо что откликнулись!
С запретом на повторный запуск я всё понял, а вот с тем, чтобы зашить рисунок в exe - возникли проблемы.

DataSection
  Logo: IncludeBinary "c:/..."
EndDataSection

Этот кусок кода пропадает каждый раз, когда я делаю пробный запуск.

0

848

Что значит пропадает?
Без кода сложно сказать что сделано не так.

0

849

Читаю файл построчно. К примеру, в файле 3000 строк. Не знаю как объяснить, но надо определять строки под номерами:
31, 61, 91, 121 и т.д.
Т.е. как бы с шагом в 30, прибавляя 1.

Или например, с 1 до 3 с тем же шагом в 30, т.е.:
31 32 33, 61 62 63, 91 92 93, 121 122 123 и т.д.

Как такое лучше сделать?

Код:
EnableExplicit

Enumeration
  #f_data
EndEnumeration

#f_path = "D:\file.txt"

#step = 30

If ReadFile(#f_data, #f_path)
  While Eof(#f_data) = 0
    Define string_num.i
    string_num + 1
    Debug string_num
    
    Define current_string.s = ReadString(#f_data)
  Wend
  CloseFile(#f_data)
EndIf

0

850

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

31, 61, 91, 121 и т.д.

Код:
For i=1 To 200
  If i>30 And i % 30 = 1
    Debug i
  EndIf
Next i
Paranoia написал(а):

31 32 33, 61 62 63, 91 92 93, 121 122 123 и т.д.

Код:
For i=0 To 200
  x=i % 30
  If i>30 And x>=1 And x<=3
    Debug i
  EndIf
Next i

0

851

Как заставить консоль проверять сразу два и более условий?
Пример - простая программа цветовых ассоциаций:

Код:
OpenConsole()
Repeat
Print("Введите название цвета: ")
If Input() = "красный"
  PrintN("Кровь, клубника, тревога")
EndIf
Print("Введите название цвета: ")
If Input() = "синий"
  PrintN("Небо, слива")
EndIf
Print("Введите название цвета: ")
If Input() = "зелёный"
  PrintN("Трава, стереотипно выглядящие радиоактивные отходы")
EndIf
Until RawKey() = 13

При If проверяется только одно - либо "красный", либо "синий", либо "зелёный".

0

852

Здравствуйте !!! Подскажите пожалуйста ,

Имеется ini файл - в нём несколько групп  - возможно ли удалить ключ не зная имени группы ??? (удаление по имени ключа)

Заранее спасибо

0

853

Да можно.

Код:
FileName.s = "C:\boot.ini"

If OpenPreferences(FileName)
  
  If ExaminePreferenceGroups()
    While NextPreferenceGroup()
      If  ExaminePreferenceKeys()
        While NextPreferenceKey()
          Debug PreferenceKeyName()
        Wend
      EndIf
    Wend
  EndIf
  
  ClosePreferences()
Else
  MessageRequester("", "Нет файла", #MB_OK|#MB_ICONERROR)
EndIf

+1

854

Пётр

Спасибо !!! Но у меня либо удаляются все ключи :) либо последний из перечисленых  -  я код приведу в божеский вид и выложу чтоб было вам виднее что я хочу . Ещё раз спасибо

0

855

Пётр доброго времени суток , вот код - там я пометил где не хочет работать RemovePreferenceKey(Preference_KeyName())  - подскажите как это сделать . Заранее спасибо !!!

Код:
Enumeration
  #Window_0
EndEnumeration
 
 
Enumeration
  #Text_0
  #String_0
  #Button_0
  #Text_1
  #Tree_0
  #Text_2
  #String_1
EndEnumeration
 
Global NewList Preference_KeyName.s()
 


Define.l Event, EventWindow, EventGadget, EventType, EventMenu 


Procedure ScanINI_File(FileName.s)
  PosList=0
  ;SetGadgetText(#String_1,"")
  ClearGadgetItems(#Tree_0)
  ClearList(Preference_KeyName())
  If OpenPreferences(FileName)
    If ExaminePreferenceGroups()
      While NextPreferenceGroup()
        AddGadgetItem(#Tree_0,-1,PreferenceGroupName(),0,0)
        If  ExaminePreferenceKeys()
          While NextPreferenceKey()
            AddGadgetItem(#Tree_0,-1,PreferenceKeyValue(),0,1)
            AddElement(Preference_KeyName())
            Preference_KeyName()=PreferenceKeyName()
            SetGadgetItemData(#Tree_0, CountGadgetItems(#Tree_0)-1, PosList)
            PosList+1
          Wend
        EndIf
      Wend
    EndIf
    
    x=0
    PreferenceGroup("")
    If ExaminePreferenceKeys()
      While NextPreferenceKey()
        If x=0
          AddGadgetItem(#Tree_0,-1,"Разное",0,0)
          x=1
        EndIf
        AddGadgetItem(#Tree_0,-1,PreferenceKeyValue(),0,1)
        AddElement(Preference_KeyName())
        Preference_KeyName()=PreferenceKeyName()
        SetGadgetItemData(#Tree_0, CountGadgetItems(#Tree_0)-1, PosList)
        PosList+1
      Wend
    EndIf
    ClosePreferences()
  Else
    MessageRequester("", "Нет файла", #MB_OK|#MB_ICONERROR)
  EndIf
EndProcedure


If CreatePopupMenu(111) 
  MenuItem(1,"Перейти") 
   MenuBar()
  MenuItem(2,"Удалить") 
EndIf


Procedure Open_Window_0()
   hWnd.l=OpenWindow(#Window_0, 303, 234, 290, 400, "",  #PB_Window_MinimizeGadget  | #PB_Window_TitleBar | #PB_Window_ScreenCentered )
     StickyWindow(#Window_0,1)
      TextGadget(#Text_1, 5, 35, 100, 15, "Закладки:")
      TreeGadget(#Tree_0, 5, 50, 280, 340, #PB_Tree_NoLines)
       
      
      File.s="bookmarks.ini"
      If File<>"" And FileSize(File)>0
        
        ScanINI_File(File)
      Else
        
        If FileSize("bookmarks.ini")=>0
        SetGadgetText(#String_0,"")
        SetGadgetText(#String_1,"")
       
      EndIf
      EndIf
      
    
EndProcedure



 
Open_Window_0()
 
Repeat
        
    EventID.l=WaitWindowEvent() 
  Select EventID 
  Case #PB_Event_Gadget 
    Select EventGadget() 
    Case #Tree_0 
      MB.l=EventType()  
    GetCursorPos_(@var.TV_HITTESTINFO\pt) 
      ScreenToClient_(GadgetID(#Tree_0),@var.TV_HITTESTINFO\pt)  
      SendMessage_(GadgetID(#Tree_0),#TVM_HITTEST,0,var) 
      SendMessage_(GadgetID(#Tree_0),#TVM_SELECTITEM,#TVGN_CARET,var\hItem)
      itemsel=GetGadgetState(#Tree_0) 
      Select MB 
      
      Case #PB_EventType_RightClick 
        Pos=GetGadgetState(#Tree_0)
        
        If GetGadgetItemAttribute(#Tree_0,Pos, #PB_Tree_SubLevel)=1
        
          DisplayPopupMenu(111,WindowID(#Window_0)) 
          
          EndIf
      Case #PB_EventType_LeftDoubleClick 
        Pos=GetGadgetState(#Tree_0)
        
        
        If GetGadgetItemAttribute(#Tree_0,Pos, #PB_Tree_SubLevel)=1
          PosList=GetGadgetItemData(#Tree_0, Pos)
          SelectElement(Preference_KeyName(), PosList)
          RunProgram(Preference_KeyName())
          
        EndIf
        
            
          EndSelect 
    EndSelect 
    
  Case #PB_Event_Menu 
    Select EventMenu() 
        
       Case 1
                  
         Pos=GetGadgetState(#Tree_0)
        If GetGadgetItemAttribute(#Tree_0,Pos, #PB_Tree_SubLevel)=1
          PosList=GetGadgetItemData(#Tree_0, Pos)
          SelectElement(Preference_KeyName(), PosList)
          RunProgram(Preference_KeyName())
        EndIf
         
         
      Case 2
       
        Pos=GetGadgetState(#Tree_0)
        If GetGadgetItemAttribute(#Tree_0,Pos, #PB_Tree_SubLevel)=1
          PosList=GetGadgetItemData(#Tree_0, Pos)
          SelectElement(Preference_KeyName(), PosList)
          Debug Preference_KeyName()
          
          RemovePreferenceKey(Preference_KeyName())  ;  ВОТ ЗДЕСЬ У МЕНЯ НЕ РАБОТАЕТ !!!
        EndIf
                 

          

        
    EndSelect 
EndSelect 

Until EventID=#PB_Event_CloseWindow

0

856

Нужно сначала выбрать группу PreferenceGroup() в которой находится удаляемый ключ.
Кроме того, необходимо открыть файл.

0

857

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

Нужно сначала выбрать группу PreferenceGroup() в которой находится удаляемый ключ.
Кроме того, необходимо открыть файл.


Вот в том то и вопрос что не могу определить PreferenceGroup()   :dontknow:
а сам файл я и открывал и закрывал --- вот застрял в том что не могу  определить группу в дереве - почему ведь я и задал первый вопрос

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

возможно ли удалить ключ не зная имени группы ???

Подскажите пожалуйста !!!

Отредактировано kaaamid (06.04.2014 23:01:38)

0

858

Или записывай в список имена групп, или бери имя группы из TreeGadget.

0

859

Спасибо ! буду думать - правда уже голову поломал:) - не много не могу понять - я ведь  пытаюсь удалить элемент из подгруппы #PB_Tree_SubLevel  а вот как определить к чему это подгруппа относится  :dontknow:

0

860

Вариант

Код:
Global IniFileName$="bookmarks.ini"

добавил в дерево для наглядности

Код:
AddGadgetItem(#Tree_0,-1,PreferenceKeyName()+"="+PreferenceKeyValue(),0,1)

обработка удаления

Код:
Case #PopUpMenu2 ;Удалить
        	
  Pos=GetGadgetState(#Tree_0)
  If GetGadgetItemAttribute(#Tree_0,Pos, #PB_Tree_SubLevel)=1
  Debug Str(pos)+":"+Preference_KeyName()
  ;найти имя группы и удалить
  pos2=pos
  While pos2>-1 ;самая первая позиция 0
    pos2-1
    If GetGadgetItemAttribute(#Tree_0,Pos2, #PB_Tree_SubLevel)=0
      GroupeName$=GetGadgetItemText(#Tree_0, Pos2 )
      Debug GroupeName$
      KeyName$=StringField(GetGadgetItemText(#Tree_0, Pos ), 1, "=")
      Debug KeyName$
      If OpenPreferences(IniFileName$) ;открыть файл
        PreferenceGroup(GroupeName$) ;задать группу
        RemovePreferenceKey(KeyName$) ;удалить ключ
        ClosePreferences() ;закрыть файл
        RemoveGadgetItem(#Tree_0, pos) ;удалить элемент из дерева
      EndIf
      Break
    EndIf
  Wend
            
EndIf

и никакой LinkedList не нужен и SetGadgetItemData

+1

861

SadStar
Спасибо огромное !!! Вечером попробую - отпишусь  :flag:

Не вытерпел до вечера :) - Огромное спасибо - то что и нужно !!!

ps:  только

Код:
AddGadgetItem(#Tree_0,-1,PreferenceKeyName()+"="+PreferenceKeyValue(),0,1)

оставил прежним - а то не красиво отображается в TreeGadget это всё таки  ссылки :)

а  в месте удаления лучше работает

Код:
RemovePreferenceKey(Preference_KeyName())

Ещё раз огромное Спасибо !!!

Отредактировано kaaamid (07.04.2014 09:42:53)

0

862

Здравствуйте !!!

Есть код написанный на Autoit -е  - всё бы ни чего - можно  его запускать в программе написанной на  PureBasic - нО есть НО скрипт Autoit-а работает медленней чем код программы - одним словом данные в ini файле созданные скриптом Autoit-а появляются позже чем надо .  #PB_Program_Wait и паузы  - не помогают - наоборот каким то образом тормозят работу скрипта  - так вот вопрос в том можно ли переписать код Autoit-а  на PureBasic ???  - если можно - помогите плиз . Заранее СПАСИБО !!!

код Autoit-а

Код:
#include <Array.au3>


$Ret = OpenGetURL("", -1, 1, "Opera")
_ArrayDisplay($Ret, "Opera")

;===============================================================================
;
; Function Name:  OpenGetURL()
;
; Parameter(s):     $sURL           [optional] Address of page to open,
;                                   if this is empty string (default), then returned Url from address field of particular tab.
;                   $hWin           [optional] Number of tab:
;                                       -1 = Current tab.
;                                       0 = New tab (when opening).
;                   $RetType        [optional] Definds returned value:
;                                       0 = String with Title and URL address.
;                                       1 = Array with 3 elements...
;                                           [0] = Title
;                                           [1] = URL address
;                                           [2] = String with Title And URL address.
;                   $Server         [optional] Serever to open/get Url in/from.
;                   $iWait          [optional] Waiting Timeout in milliseconds, on overload will return an error.
;
; Requirement(s):   None
; Return Value(s):  On Success -  See 'Parameter(s)'.
;                   On Failure -  Empty string and set @error as following:
;                       1 = Error to open Dll (user32.dll)
;                       2 = Error Initializing DDE (@extended include more details about the returned value from DllCall).
;                       3 = Other DDE Errors (@extended include more details about the returned value from DllCall).
; Author(s):        amel27
;
;=====================================================================
Func OpenGetURL($sURL = "", $hWin = -1, $RetType = 0, $Server="IExplore", $iWait = 10000)
    Local $ret, $err, $uIdInst = DllStructCreate("int")
    Local $hServer[1], $hTopic[1], $hItem[1], $hConv[1], $hData[1], $sData[1]
    Local $sTopic = "WWW_OpenURL", $sItem = $sURL & ',,0x' & Hex($hWin)
    
    If $sURL = '' Then
        $sTopic = "WWW_GetWindowInfo"
        $sItem = "0x" & Hex($hWin)
    EndIf
    
    Local $hDll = DllOpen("user32.dll")
    If $hDll=-1 Then Return SetError(1, 0, "") ; Error to open Dll
    $ret = DllCall("user32.dll", "int", "DdeInitialize", "ptr", DllStructGetPtr($uIdInst), "ptr", 0, "int", 0, "int", 0)
    If $ret[0] Then Return SetError(2, $ret[0], "") ; Error Initializing DDE
    $hServer = DllCall($hDll, "int", "DdeCreateStringHandle", "int", DllStructGetData($uIdInst,1), "str", $Server, "int", 1004)
    
    If $hServer[0] Then
        $hTopic = DllCall($hDll, "int", "DdeCreateStringHandle", "int", DllStructGetData($uIdInst,1), "str", $sTopic, "int", 1004)
        If $hTopic[0] Then
            $hItem = DllCall($hDll, "int", "DdeCreateStringHandle", "int", DllStructGetData($uIdInst,1), "str", $sItem, "int", 1004)
            If $hItem[0] Then
                $hConv = DllCall($hDll, "int", "DdeConnect", "int", _
                    DllStructGetData($uIdInst,1), "int", $hServer[0], "int", $hTopic[0], "int", 0)
                If $hConv[0] Then
                    $hData = DllCall($hDll, "int", "DdeClientTransaction", "ptr", 0, "int", 0, _
                        "int", $hConv[0], "int", $hItem[0], "int", 1, "int", 0x20B0, "int", $iWait, "ptr", 0)
                    If $hData[0] Then $sData = DllCall($hDll, "str", "DdeAccessData", "int", $hData[0], "ptr", 0)
                EndIf
            EndIf
        EndIf
    EndIf
    
    $iErr = DllCall($hDll, "int", "DdeGetLastError", "int", DllStructGetData($uIdInst, 1))
    If $hData[0] Then DllCall($hDll, "int", "DdeFreeDataHandle", "int", $hData[0])
    If $hConv[0] Then DllCall($hDll, "int", "DdeFreeDataHandle", "int", $hConv[0])
    If $hItem[0] Then DllCall($hDll, "int", "DdeFreeDataHandle", "int", $hItem[0])
    If $hTopic[0] Then DllCall($hDll, "int", "DdeFreeDataHandle", "int", $hTopic[0])
    If $hServer[0] Then DllCall($hDll, "int", "DdeFreeDataHandle", "int", $hServer[0])
    If $iErr[0] Then Return SetError(3, $iErr[0], "") ; Othe DDE Errors
    DllCall($hDll, "int", "DdeUninitialize", "int", DllStructGetData($uIdInst, 1))
    DllClose($hDll)
    
    $sData[0] = StringRegExpReplace($sData[0], ',""$', '')
    If $sURL = '' Then $sURL = StringRegExpReplace($sData[0], '^"([^"]*)",.*', '\1')
    
    Local $iRetTitle = StringRegExpReplace($sData[0], '^.*","([^"]*)"$', '\1')
    Local $RetURL[3] = [$sData[0], $sURL, $iRetTitle]
    
	$sPath_ini=@ScriptDir & "\\Temp.ini"

; Записывает значение 'Это новое значение' в параметр 'Key' в секцию 'Section'.
IniWrite($sPath_ini, "Section", $iRetTitle, $sURL)
	
	If $RetType = 1 Then Return $RetURL
    Return $sData[0]
EndFunc

Отредактировано kaaamid (17.04.2014 09:27:59)

0

863

Переписать можно. В коде в основном WinAPI вызовы и код на PureBasic получится даже проще.

0

864

Пётр
Пожалуйста , если можно  , сам я не справлюсь . Заранее Спасибо !

Забыл добавить , этот код работает для оперы старых версий  до того как они перешли на движок хрома  ( но он мне нужен так сам сижу на старой версии оперы)
Для новых версий начиная с 16 - х я снимал url  с окна а в последней версии  они полностью перешли на хром - этого сделать нет возможности :(

PS:  такой код есть на Delphi , на AutoIt - а Purebasic  нет  :dontknow:  - надо бы пробел заполнить :)

Отредактировано kaaamid (18.04.2014 19:40:59)

0

865

Здравствуйте, подскажите, пожалуйста, как  консольной программе под Windows передать один  параметр вида  - "Вася" и "Петя". Т.е. в параметре имеем как кавычки, так и пробелы.
Вроде как, надо бы всё в кавычки, а те, что внутри как-то экранировать. Но ни бэкслэш, ни дополнительные кавычки, ни "^" экранировать не хотят! :( Консоль - стандартная cmd.

PS А под cygwin и вообще работать отказывается, даже если параметры без причуд! :)
Правда, там у меня раскраска в стиле conio, может, поэтому... Под виндой-то, "нормальные параметры" работают....

Отредактировано Илена (03.07.2014 18:48:59)

0

866

Имеется в виду передача текста через командную строку при запуске исполняемого файла?
Можно получить текст используя функцию GetCommandLine_().

Код:
Command.s = PeekS(GetCommandLine_())
Debug Command

И в коде разбирать текст как требуется.

0

867

"Мама, у меня получилось!" :)

Да, спасибо большое, Пётр. Исхитриться что-нибудь хорошее получить с  ProgramParameter(0) .. ProgramParameter(много-много), в общем случае, так и не вышло.
Ну, а при разборе строки после GetCommandLine() у меня вообще тривиальный случай - первый параметр всегда "нормальный", а возможный "кривой" второй
легко берётся до конца строки без всякого экранирования...

0

868

Илена написал(а):

Исхитриться что-нибудь хорошее получить с  ProgramParameter(0) .. ProgramParameter(много-много), в общем случае, так и не вышло.

ProgramParameter() считает разделителем пробел при учете что строка не в кавычках. Это связанно с особенностями передачи команд и является стандартом.
Наличие нескольких кавычек в одной команде, это отклонение от стандарта.

0

869

Да, благодарю.

Свернутый текст

Вообще, язык интересный весьма. Правда, странный и непривычный синтаксис массивов и структур, но это дело такое...
Работает, действительно, быстро, и размер небольшой.
К удивлению, не нашлось сходу функций типа printf()/fprintf()... Разок-то, можно сформатировать строку и в WriteString(), скажем, с помощью Space() и нужной длины поля, но постоянно так делать не сильно удобно...
Правда, второй день только смотрю, может, какие библиотеки ещё отыщутся, народу-то, не так уж мало... Но, в общем, уже очевидно, что язык небесполезный.

0

870

Илена написал(а):

К удивлению, не нашлось сходу функций типа printf()/fprintf()

Есть они.

Код:
ImportC ""
  printf(Format.s, Param)
EndImport

CompilerIf #PB_Compiler_ExecutableFormat<>#PB_Compiler_Console
  CompilerError "Формат исполняемого файла должен быть 'Console'"
CompilerEndIf


OpenConsole()
printf("%i parrots", 38)
Input()

0


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