PureBasic - форум

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

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


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


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

Сообщений 871 страница 900 из 961

871

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

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


Да, работают такие функции, правда, только в ANSI...
И потом, функция fprintf() не хочет понимать идентификатор PureBasic из OpenFile().
Да и функции эти, вообще говоря, с переменным числом аргументов, как их объявить-то, по-правильному? Уж Бейсик, коли, дык мог бы и перегрузить их на край...
А то у меня какие-то совсем затеи некошерные! :(

Код:
ImportC "" 
  printf3(Format.s, Param1, Param2, Param3) As "_printf"
  printf2(Format.s, Param1, Param2) As "_printf"
  printf1(Format.s, Param1) As "_printf"
  ;printf(Format.s, ...)
  fprintf(Param0, Format.s, Param1, Param2, Param3) As "_fprintf"
  puts(String.s)
  fopen(String.s, mode.s) As "_fopen"
  fclose(file) As "_fclose"
EndImport

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

OpenConsole()

printf1("%s" + #CRLF$, @"parrots")
printf2("%d %s" + #CRLF$, 38, @"parrots")
printf3("%s, %d %s" + #CRLF$, @"Hello", 38, @"parrots")

puts("Hello, 38 parrots")

;OpenFile(0, "test.txt", #PB_File_Append)
; запись в файл не прошла, хоть сам файл, конечно, создался
file = fopen("test.txt", "a")
fprintf(file, "%s, %d %s" + #CRLF$, @"Hello", 38, @"parrots")
fclose(file)
;CloseFile(0)

Input()

Отредактировано Илена (06.07.2014 01:26:23)

0

872

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

Да и функции эти, вообще говоря, с переменным числом аргументов, как их объявить-то, по-правильному?

Объявить можно как угодно. Главное как вызвать.

Код:
ImportC "" 
  printf1(Format.s, Param1) As "_printf"
  fprintf(Param0, Format.s, Param1, Param2, Param3) As "_fprintf"
  puts(String.s)
  fopen(String.s, mode.s) As "_fopen"
  fclose(file) As "_fclose"
EndImport

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

OpenConsole()

CallCFunctionFast(@printf1(), @"%s ", @"parrots")
CallCFunctionFast(@printf1(), @"%d %s ", 38, @"parrots")
CallCFunctionFast(@printf1(), @"%s, %d %s ", @"Hello", 38, @"parrots")

puts("Hello, 38 parrots")

;OpenFile(0, "test.txt", #PB_File_Append)
; запись в файл не прошла, хоть сам файл, конечно, создался
file = fopen("test.txt", "a")
fprintf(file, "%s, %d %s" + #CRLF$, @"Hello", 38, @"parrots")
fclose(file)
;CloseFile(0)

Input()

0

873

Да уж... Экие нынче по весне уродились Бейсики, и указатели всякие знают, а уж ежели указатель на функцию, так и вообще - только дай!..
А можно как-нибудь точно узнать, какие функции можно импортировать, а какие нет?
Вот скажем, textbkcolor() из немайкрософтовских conio.h не получается, а, к примеру, system() из stdlib.h - легко:

Код:
ImportC ""
   system(String.s) As "_system"
EndImport 
OpenConsole()
;кодировка ANSI
;RunProgram("chcp 1251 > nul")
system("chcp 1251 > nul")

PrintN("Привет, мир!")
PrintN("Hellowrot!")
Input()

ЗЫ
Ну, вообще, доступные имена, смотрю, выдираются примерно так:

Код:
OpenLibrary(0, "msvcrt.dll")
ExamineLibraryFunctions(0)
count = CountLibraryFunctions(0)
OpenFile(0, "test_c.txt")
For i = 0 To count
  WriteStringN(0, LibraryFunctionName())
  NextLibraryFunction()
Next
CloseFile(0)

Вопрос в том, будут ли все эти функции работать...

Отредактировано Илена (07.07.2014 00:48:32)

0

874

Эти Сишные функции импортируются из рантайма msvcrt.dll через файл msvcrt.lib.

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

Вопрос в том, будут ли все эти функции работать...

Должны работать.

0

875

Угу, спасибо. Возможностей у языка совсем немало, как выясняется. Чем больше смотришь, тем не меньше. Случайно так нарваться! Возможное применение даже ограничить как-то сложно сходу...
Вообще, с FASM ассоциировались обычно проекты MenuetOs/Kolibri (до сих пор живы, что интересно!). Оказывается, ещё есть с чем ассоциировать..

0

876

Доброго времени суток, господа и дамы!
Прошу разъяснения и\или подсказки по моему вопросу. В данный момент пишу программу, которая предполагает ввод достаточно большого числа различных данных. В силу особенностей алгоритма, ввод данных должен быть последовательно-параллельным. Таким образом, пользователь в процессе выполнения будет заполнять поля StringGadget() в открывающихся окнах. Окон ввода очень много. Думаю, что больше 100. Кол-во гаджетов в каждом окне может быть больше 10. Кроме того, в процессе эволюции программы, вероятно появится необходимость введения промежуточных окон. Сначала я думал ввести следующую нумерацию окон. Пример: Window2040(). 2-номер модуля программы; 04-номер окна в модуле; следующий регистр нужен для возможного добавления дополнительных окон. И нумерация гаджетов предполагалась простая. Пример: TextGadget(204013, .............). Здесь 2040 - номер окна, а 13 - номер гаджета в окне. Но, как оказалось, Purebasic выдает ошибку в случае, если номер гаджета>10 000. Какие, по Вашему мнению возможны варианты выхода из сложившейся ситуации?
Или я чего-то недопонимаю? Например #Button_upGO235. Можно так пронумеровать гаджет?

Заранее благодарен за рациональные подсказки!

Отредактировано Рома из Харькова (08.12.2014 00:17:57)

0

877

Можно сделать например так.

Код:
Enumeration
  #Window
EndEnumeration

Enumeration
  #Panel_1
  #Panel_2
  #Button_1
  #Button_2
EndEnumeration

OpenWindow(#Window, 0, 0, 322, 220, "PanelGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
PanelGadget(#Panel_1, 8, 8, 306, 203)
AddGadgetItem(#Panel_1, -1, "Panel 1")
PanelGadget(#Panel_2, 5, 5, 290, 166)
AddGadgetItem(#Panel_2, -1, "Sub-Panel 1")
AddGadgetItem(#Panel_2, -1, "Sub-Panel 2")
AddGadgetItem(#Panel_2, -1, "Sub-Panel 3")
CloseGadgetList()
AddGadgetItem (#Panel_1, -1,"Panel 2")
ButtonGadget(#Button_1, 10, 15, 80, 24,"Button 1")
ButtonGadget(#Button_2, 95, 15, 80, 24,"Button 2")
CloseGadgetList()
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow

Можно также явно не задавать идентификатор, указав в место него #PB_Any и тогда функция сама сгенерирует идентификатор и его необходимо будет где-то сохранить.

0

878

Т.е. достаточно обозначить понятным для себя идентификатором гаджета, вроде #Txtgdt204001 ? Просто чтобы они не повторялись в листинге программы. Правильно я понял?

0

879

Рома из Харькова написал(а):

Т.е. достаточно обозначить понятным для себя идентификатором гаджета, вроде #Txtgdt204001 ? Просто чтобы они не повторялись в листинге программы. Правильно я понял?


Ну если ты задашь двум или более гаджетам один и тот же идентификатор, то из всех них будет работать только один гаджет.

0

880

Дело не в именах констант, а в их значениях. Оператор Enumeration позволяет присвоить константам разные значения.

Код:
Enumeration
  #Panel_1
  #Panel_2
  #Button_1
  #Button_2
EndEnumeration

Debug #Panel_1
Debug #Panel_2
Debug #Button_1
Debug #Button_2

0

881

День добрый!

Подскажите, как избавиться от зависания формы? Delay или что-то эквивалентное должно остаться.
Тестовый пример:

Код:
  If OpenWindow(0, 0, 0, 230, 90, "Event handling example...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

   ButtonGadget  (1, 10, 10, 200, 20, "Click me")

   Repeat
     Event = WaitWindowEvent()
     ;Debug event
     Select Event
     
       Case #PB_Event_Gadget
         Select EventGadget()
           Case 1 : Debug "Button 1 clicked!" :
             ; действие А
             Delay(10000)
             ; действие В
         EndSelect
           
     EndSelect
   Until Event = #PB_Event_CloseWindow
 EndIf

0

882

Лучше выполнять действия по таймеру или в отдельном потоке.
Пример с использованием таймера.

Код:
If OpenWindow(0, 0, 0, 230, 90, "Event handling example...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  
  ButtonGadget  (1, 10, 10, 200, 20, "Click me")
  
  Repeat
    Event = WaitWindowEvent()
    ;Debug event
    Select Event
        
      Case #PB_Event_Gadget
        Select EventGadget()
          Case 1 : Debug "Button 1 clicked!" :
            Debug "действие А"
            AddWindowTimer(0, 0, 10000)
        EndSelect
        
      Case #PB_Event_Timer
        If EventTimer()=0
          Debug "действие В"
          RemoveWindowTimer(0, 0)
        EndIf
    EndSelect
  Until Event = #PB_Event_CloseWindow
EndIf

0

883

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

с использованием таймера.


Я, видимо, сильно упростил пример. У меня до десятка таких действий, причем с уходом в процедуры. С таймерами, наверное, программа станет совсем нечитаемой. А можно посмотреть пример с потоками, может он подойдет больше?

0

884

Код:
CompilerIf #PB_Compiler_Thread=0
  CompilerError "Включите поддержку потоков"
CompilerEndIf

Global Click=#False

Procedure Thread(*x)
  Repeat
    
    If Click=#True
      Click=#False
      Debug "действие А"
      Delay(10000)
      Debug "действие В"
    EndIf
    
    Delay(100)
  ForEver
EndProcedure

If OpenWindow(0, 0, 0, 230, 90, "Event handling example...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  
  ButtonGadget  (1, 10, 10, 200, 20, "Click me")
  
  CreateThread(@Thread(), 0)
  
  Repeat
    Event = WaitWindowEvent()
    ;Debug event
    Select Event
        
      Case #PB_Event_Gadget
        Select EventGadget()
          Case 1 : Debug "Button 1 clicked!" :
            Click=#True
        EndSelect
        
    EndSelect
  Until Event = #PB_Event_CloseWindow
EndIf

+1

885

Пётр, спасибо. Вот так в результате получилось. Или с флагами более правильно?

Код:
CompilerIf #PB_Compiler_Thread=0
  CompilerError "Включите поддержку потоков"
CompilerEndIf

Global Click=#False

Procedure Thread(*x)

      Debug "действие A"
      Delay(10000)
      Debug "действие B"

EndProcedure

If OpenWindow(0, 0, 0, 230, 90, "Event handling example...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  
  ButtonGadget  (1, 10, 10, 200, 20, "Click me")


 Repeat  
  Event = WaitWindowEvent() 
  
      Select Event
     
       Case #PB_Event_Gadget
         Select EventGadget()
           Case 1 : Debug "Button 1 clicked!" :
                    CreateThread(@Thread(), 0)
       EndSelect 
  
  EndSelect 
    
 Until   Event = #PB_Event_CloseWindow
 
 EndIf

Отредактировано Civil (09.12.2014 21:39:31)

0

886

Можно и так, но в этом случае нужно блокировать кнопку, иначе если во время работы текущего запущенного потока нажать еще пару раз на кнопку, то запустятся еще несколько потоков.

Код:
CompilerIf #PB_Compiler_Thread=0
  CompilerError "Включите поддержку потоков"
CompilerEndIf

Global Click=#False

Procedure Thread(*x)
  
  Debug "действие A"
  Delay(10000)
  Debug "действие B"
  DisableGadget(1, 0)
  
EndProcedure

If OpenWindow(0, 0, 0, 230, 90, "Event handling example...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  
  ButtonGadget  (1, 10, 10, 200, 20, "Click me")
  
  Repeat  
    Event = WaitWindowEvent() 
    
    Select Event
        
      Case #PB_Event_Gadget
        Select EventGadget()
          Case 1 : Debug "Button 1 clicked!" :
            CreateThread(@Thread(), 0)
            DisableGadget(1, 1)
        EndSelect 
        
    EndSelect 
    
  Until   Event = #PB_Event_CloseWindow
  
EndIf

0

887

Пётр, Ste1nS, большое спасибо за участие! Пётр, Ваш второй код полностью расставил мне всё по полочкам. Еще раз большое спасибо!

0

888

Вопрос снят. Разобрался.

Отредактировано Civil (25.12.2014 18:24:18)

0

889

Здравствуйте. Программа на Паскале.
Нужно перевести программу на Бейсик.
Как это сделать?
program days;
var
day : array[1..7] of string[11];
i = integer;
Begin
day[1] := 'Понедельник';
day[2] := 'Вторник';
day[3] := 'Среда';
day[4] := 'Четверг';
day[5] := 'Пятница';
day[6] := 'Суббота';
day[7] := 'Воскресенье';
for I := 1 TO 7 do
writeln(I, '   ', day[i]);
End.

0

890

Как-то так:

Код:
DayOfWeek_str.s

Day_dig=DayOfWeek(Date())
    Select Day_dig
      Case 0 : DayOfWeek_str = "воскресенье"            
      Case 1 : DayOfWeek_str = "понедельник"
      Case 2 : DayOfWeek_str = "  вторник  "
      Case 3 : DayOfWeek_str = "   среда   "
      Case 4 : DayOfWeek_str = "  четверг  "
      Case 5 : DayOfWeek_str = "  пятница  "
      Case 6 : DayOfWeek_str = "  суббота  "          
    EndSelect
    
    Debug DayOfWeek_str

Отредактировано max (13.02.2015 18:20:58)

0

891

Здравствуйте max.
Вы написали на Purebasic.
Надо перевести на Qbasic.
Того, кто не задумывается о далеких трудностях, ожидают близкие неприятности.
Это Вы о чём или о ком?

0

892

Рита написал(а):

Здравствуйте max.
Вы написали на Purebasic.
Надо перевести на Qbasic.

Форум по Purebasic, поэтому и программа на Purebasic.

Рита написал(а):

Того, кто не задумывается о далеких трудностях, ожидают близкие неприятности.
Это Вы о чём или о ком?

Это моя подпись.

0

893

Благодарю Вас Max.

0

894

Ребят подскажите, как перезаписать вот этот bat код
:return
echo: hello world!
pause
goto return
в exe. только без всяких "Bat to exe converter" мне нужен именно exe код  . И можно ли это сделать в PureBasic

0

895

Толку от такой проги мало.

Код:
OpenConsole()
Repeat
  Print("hello world!")
  Input()
ForEver

0

896

Вы меня не поняли!!!  Я хочу написать программу на PureBasic которая компилирует bat  exe. Это возможно???

0

897

Конечно возможно. Но разработка компилятора требует соответствующих знаний.

0

898

А где найти литературу на эту тему???

0

899

Поищи эту книгу. https://ru.wikipedia.org/wiki/Компилято … нструменты

0

900

Ребят подскажите, вот код
If CreateFile(0,"D:\File.bat")
WriteString(0,"Текст")
CloseFile(0)
EndIf
End
здесь программа создает файл записывает в него текст а потом его закрывает. Мне нужно чтобы после закрытия файла программа выполнила этот BAT  файл,
какая нужна функция.
И второе :
SetGadgetText(#Text_0,"")
мне нужно записать  в этот гаджет текст : "Text" вот  этот текст вместе с кавычками.
выглядеть это будет так
SetGadgetText(#Text_0,""Text"") получаются двойные кавычки и программа выдает ошибку . Как это сделать???
Заранее спасибо!!!

0


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