PureBasic - форум

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

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


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


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

Сообщений 31 страница 60 из 990

31

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

Но у меня текст постоянно разной длины будет и поэтому неизвестно какое значение имеет К каждый раз, как мне обойти эту проблему?

Код:
String.s="Hello, I am a split string"
Count=CountString(String," ")+1
String+" "
For k=1 To Count
  tekst.s=StringField(String, k, " ")
  Debug tekst
Next k

0

32

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

Но у меня текст постоянно разной длины будет и поэтому неизвестно какое значение имеет К каждый раз, как мне обойти эту проблему?

Код:
String$="Hello, I am a split string"
n= CountString(String$," ")

For k=1 To n+1
  tekst.s=StringField(String$, k, " ")
  Debug tekst
Next k
goodwen написал(а):

Указать не только один  элемент, по которому буду делить, а к примеру 10 разных эллементов, я пробовал сделать и ни как не получается. Как мне это сделать?

Делить в ручную - разбирать строки на буквы и в зависимости от результата делать определенные действия.
Разбор слов есть тут:
http://pbasic.spb.ru/phpBB2/viewtopic.p … string#278

0

33

ВиниПур, я видимо не корректно поставил вопрос на счёт StringField, я имел в виду, что мне нужно делить текст не только по пробелам, а и по всем знакам препинания и союзам. То есть в этой строке:

Код:
tekst.s=StringField(String$, k, " ")

строка делится только по пробелам, а мне нужно ещё и все знаки препинания и союзы, я могу это записать в одной строке?

0

34

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

строка делится только по пробелам, а мне нужно ещё и все знаки препинания и союзы, я могу это записать в одной строке?

Можно несколько раз применить команду ReplaceString () и заменить все элементы, по которым надо делить строку,  на пробелы (как бы подготовить строку) а потом действовать по предложенной выше схеме…

String$ = ReplaceString(String$, StringToFind$, StringToReplace$ [, Mode [, StartPosition]])
Описание
String$ - это строка.
StringToFind$ - это символ или последовательность символов которые нужно заменить (исходные значения).
StringToReplace$ - это символ или последовательность символов на замену (новые значения).
Ищет в указанной строке String$ символ или последовательность символов которые указаны в StringToFind$, и заменяет их символами указанными в StringToReplace$.
В дополнительном параметре 'StartPosition' указывается с какой позиции начинаемся замена символов. По умолчанию 'StartPosition' имеет значение 1

Отредактировано Lucagin (25.12.2010 00:27:58)

0

35

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

строка делится только по пробелам, а мне нужно ещё и все знаки препинания и союзы, я могу это записать в одной строке?

Нет, но ведь можно все знаки учесть отдельным условием. Союзы отделены пробелами, тут не надо ни каких условий. А знаки препинания пишутся в конце слова, их можно исключать условием. В той теме, что я показал все это уже есть, вот к примеру кусок

Код:
If ReadFile(0,File$ )   
    While Eof(0) = 0 
    Bukva.c=ReadCharacter(0)
    NewSlovo$+Chr(Bukva)
        If Chr(Bukva)=" " ; конец слова
        count+1
         Slovo$(count)=NewSlovo$
         NewSlovo$=""
       EndIf
        If Chr(Bukva)="." Or Chr(Bukva)="!" Or Chr(Bukva)="?" Or Chr(Bukva)=";"Or Chr(Bukva)=":"; конец предложения...

Прочитай, там много способов искать все слова в предложении.

0

36

Ребят, подскажите, как в PB нарисовать сектор? Что-то типа как на рисунке(пусть сектор и круг меньшего диаметра будут разного цвета...)? Понятно что можно нарисовать круг в нем 2-ве линии из центра и закрасить всё вне фрагмента  белым, но если рисовать сразу на сложном фоне, то как именно нарисовать, не закрашивая фон…??

можно конечно так, но при этом не ясно возможна ли будет заливка внутри... ???

Код:
 If StartDrawing(ImageOutput(0))
      For Angle = 0 To 120
        Plot(100+Cos(Angle*#PI/180)*90,100+Sin(Angle*#PI/180)*90, RGB(255,0,0))
      Next Angle
      StopDrawing() 
      ImageGadget(0, 0, 0, 200, 200, ImageID(0))
    EndIf

Отредактировано Lucagin (25.12.2010 00:41:18)

0

37

Ну кат-то так

Код:
If OpenWindow(0, 0, 0, 200, 200, "2DDrawing Example", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  If CreateImage(0, 200, 200) And StartDrawing(ImageOutput(0))
    Box(0, 0, 200, 200, RGB(255, 255, 255))
    DrawingMode(#PB_2DDrawing_Outlined)
    Circle(100, 100, 80, RGB(Random(255), Random(255), Random(255)))
    For Angle = 50 To 130
      LineXY(Angle, 10, 100, 130, $0000FF)
    Next Angle
    StopDrawing() 
    ImageGadget(0, 0, 0, 200, 200, ImageID(0))
  EndIf
  
  Repeat
    Event = WaitWindowEvent()
  Until Event = #PB_Event_CloseWindow
EndIf

0

38

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

Ну кат-то так

Точно, можно из линий сделать полукруг сектора...

Спасибо!!!! :cool:

Отредактировано Lucagin (25.12.2010 00:58:36)

0

39

Здравствуйте, у меня вот такой вопрос, сейчас возможно скачать только демо-версию PureBasic, или уже где-то можно скачать полную версию?

0

40

А просто поискать на этом форуме в самой последней теме лень? Или хотя бы погуглить - Google -> "Purebasic 4.51 скачать"

0

41

ВиниПур, 4.51 я скачал с сайта разработчика, мне не лень это сделать, как ты выразился, но там написано, что это демо-версия, вот я и спрашиваю, а есть ли полная версия? Где нет всяких там ограничений на 800 строк кода.

0

42

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

ВиниПур, 4.51 я скачал с сайта разработчика, мне не лень это сделать, как ты выразился, но там написано, что это демо-версия, вот я и спрашиваю, а есть ли полная версия? Где нет всяких там ограничений на 800 строк кода.

ВиниПур всё правильно сказал, смотри внимательно!!! В самой последней теме форума всё есть....

Отредактировано Lucagin (26.12.2010 14:10:05)

0

43

goodwen

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

я скачал с сайта разработчика, мне не лень это сделать, как ты выразился, но там написано, что это демо-версия, вот я и спрашиваю, а есть ли полная версия?

А что, сайт разработчика и последняя тема ЭТОГО форума как то связаны? Или на оф. сайте должны были написать, типа если не хотите покупать нашу программ за кучу евро, то скачайте пиратскую версию с форума на "mybb". А мы тут на форуме открытым текстом должны выложить на первой странице ссылку на эту пиратку :D
Тебе и так уже сказали, больше, чем были должны.

0

44

ВиниПур, извиняюсь, разобрался, буду знать.

0

45

Доброго времени суток друзья! Помогите с такой вот задачей, как отследить скорость входящего/исходящего траффика! Как это сделать? Будет замечательно если еще и с более менее подробными комментариями...ибо хочется не только реализовать , но и понять как это всё реализовывается! Заранее спасибо! :-)

0

46

Дмитрий написал(а):

как отследить скорость входящего/исходящего траффика!

Вот программа с исходником http://pure-basic.narod.ru/project/CountTraffic.html
Для компиляции нужно библиотека Droopy Library и версия PureBasic 4.00 или 4.10

За подсчёт получение данных о трафике отвечает процедура:

Код:
Procedure.l Traffic(*TrafDownload, *TrafUpload,*Speed) 
Protected TrafDownload.q=0, TrafUpload.q=0,Speed.l=0 
Static i.l, Size.l, FLibHandle.l, Table.TMibIfTable, *GetIfTable 
Size = SizeOf(TMibIfTable) 
 If GetIfTable_(@Table,@Size,#False) = 0 
;  Debug Table\dwNumEntries
  For i = 0 To (Table\dwNumEntries - 1) 
   If Table\Table\Array[i]\dwType=23 And GetMAC(@Table\Table\Array[i]\bPhysAddr, Table\Table\Array[i]\dwPhysAddrLen) <> "00-00-00-00-00-00" 
    TrafDownload.q = Table\Table\Array[i]\dwInOctets 
    TrafUpload.q = Table\Table\Array[i]\dwOutOctets 
    Speed = Table\Table\Array[i]\dwSpeed 
    Break
   EndIf 
  Next 
 EndIf 
;Debug  Table\Table\Array[i]\dwInOctets 
PokeQ(*TrafDownload,TrafDownload) 
PokeQ(*TrafUpload, TrafUpload) 
PokeL(*Speed, Speed) 

ProcedureReturn #True 
EndProcedure

0

47

Можно ли загрузить файл из интернета непосредственно в выделенную область памяти программы а не на диск? И если да то как? Делитесь знаниями :-)

0

48

У тебя КодАрхив есть?
Если нет - скачай.
Посмотри пример КодАрхив\Internet&Co\Download\DownloadToMem.pb

0

49

К сожалению нет :-( и с интернетом напряг, так что скачать архив нет возможности! Петр если можешь выложи пожалуйста примерчик!

0

50

Код:
Procedure.l DownloadToMem ( URL.s, *lpRam, ramsize.l ) 
  Protected agent.s, hInet.l, hData.l, Bytes.l 
  
  ;  #INTERNET_OPEN_TYPE_DIRECT    = 1 
  ;  #INTERNET_DEFAULT_HTTP_PORT   = 80 
  ;  #INTERNET_SERVICE_HTTP        = 3 
  ;  #INTERNET_FLAG_NO_CACHE_WRITE = $4000000 
  ;  #INTERNET_FLAG_RELOAD         = $8000000 

  agent.s = "Mozilla/4.0 (compatible; ST)" 
  hInet.l = InternetOpen_ ( @agent.s,0,0,0,0 ) 
  hData.l = InternetOpenUrl_ ( hInet, @URL.s, "", 0, $8000000, 0 ) 
  
  If hData > 0 : InternetReadFile_ ( hData, *lpRam, ramsize.l, @Bytes.l ) : Else : Bytes = -1 : EndIf 
  
  InternetCloseHandle_ (hInet) 
  InternetCloseHandle_ (hFile) 
  InternetCloseHandle_ (hData) 
  
  ProcedureReturn Bytes.l 
EndProcedure 

; Bsp: 
UseJPEGImageDecoder() 
mem.s = Space(63000) 
;CallDebugger
If DownloadToMem ( "http://www.purearea.net/pb/pics/purearea4.jpg", @mem, 63000 ) 
  If CatchImage(0, @mem) 
    hWnd = OpenWindow(0, 0, 0, ImageWidth(0), ImageHeight(0), "PB-Logo" , #PB_Window_ScreenCentered | #PB_Window_SystemMenu) 
    CreateGadgetList( hWnd ) 
    ImageGadget(0, 0, 0, WindowWidth(0), WindowHeight(0), ImageID(0)) 
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow 
  EndIf 
EndIf

0

51

Петр спасибо! Ты как всегда :-)

0

52

Ребят помогите разораться. Объясните на пальцах, как работает функции CustomGradient(@GradientCallback())
Что нужно писать внутри процедуры GradientCallback()???

У меня есть ImageGadget(0, 10, 20, 510, 40, ImageID(0)) мне нужно загрузить в него цвета в виде градиента, от цвета RGB(500,0,0)до RGB(500,255.0). Чтобы показать все 255 цветов при изменении зеленого спектра.
Могу это сделать так:

Код:
Enumeration
  #Window_0
EndEnumeration

;- Gadget Constants
;
Enumeration
  #Image_0  
EndEnumeration

Procedure Line255()
  For a=0 To 510 Step 2
    If StartDrawing(ImageOutput(#Image_0))
      LineXY(a,0,a,40,RGB(500,a/2,0))
      LineXY(a+1,0,a+1,40,RGB(500,a/2,0))
        StopDrawing() 
      
    EndIf      
       SetGadgetState(#Image_0,ImageID(#Image_0))  
    
  Next   
EndProcedure 




Procedure Open_Window_0()
  If OpenWindow(#Window_0, 216, 0, 755, 530, "New window ( 0 )",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
    If CreateGadgetList(WindowID(#Window_0))
      
      CreateImage(#Image_0,510,40)
      ImageGadget(#Image_0, 110, 80, 510, 40, Image0)
             
    EndIf
  EndIf
EndProcedure



Open_Window_0()
Line255() 

Repeat : event=WaitWindowEvent()
  
Until event=#PB_Event_CloseWindow

Однако, хотелось бы разобраться с функциями 2D-рисования, в частности с  CustomGradient(@GradientCallback()). Она может сделать подобное...???

Отредактировано Lucagin (30.12.2010 05:22:57)

0

53

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

от цвета RGB(500,0,0)до RGB(500,255.0)

Начнем с того, что такого цвета не бывает -  RGB(500,0,0) - значения RGB могут изменятся от 0 до 255 (когда справку уже будем читать?).
Второе. СustomGradient(@GradientCallback()) - тут функция GradientCallback() должна описывать формулу фигуры, по которой будет производиться градиентная заливка. У тебя должен быть залит обыкновенный прямоугольник. Эту функцию использовать нет смысла - для прямоугольников есть Box(), и твой пример будет выглядеть примерно так:

Код:
If OpenWindow(0, 0, 0, 400, 200, "2DDrawing Example", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    If CreateImage(0, 400, 200) And StartDrawing(ImageOutput(0))
      Box(0, 0, 400, 200, $FFFFFF)
      
      DrawingMode(#PB_2DDrawing_Gradient)      
      BackColor($000000) ; от черного
      FrontColor($00FF00) ; до зеленого
      
      LinearGradient(10, 70, 300, 50)    
      Box(10,70,300,50)
      StopDrawing() 
      ImageGadget(0, 0, 0, 400, 200, ImageID(0))
    EndIf
    
    Repeat
      Event = WaitWindowEvent()
    Until Event = #PB_Event_CloseWindow
  EndIf

Пример так же из справки, только я Circle заменил на Box.
В той же справке есть пример использования  СustomGradient(@GradientCallback()), на случай, если хочешь разобраться.
Если примера мало, то вот ещё одна иллюстрация применения:

Код:
#Image=0 
#Window=0 
#Gadget=0 
	 
	
Structure SpiralGradient 
	px.f 
	py.f 
	radius.f 
	loop.i 
EndStructure 

	Procedure.f SpiralGradientCallback(x, y) 
	Shared SpiralGradient.SpiralGradient 
	 
	Protected.f px, py, d, dx, dy, c1, c2, c3, a, value 
	dx=(x-SpiralGradient\px) 
	dy=(y-SpiralGradient\py) 
	d=Sqr(dx*dx+dy*dy) 
	a=ATan2(dx, dy) 
	value=(Cos(2*#PI*d/(SpiralGradient\radius/SpiralGradient\loop)+a)+1)/2 
	 
	ProcedureReturn value 
EndProcedure 

	Procedure SpiralGradient(x, y, radius, loop) 
	Shared SpiralGradient.SpiralGradient 
	SpiralGradient\px=x 
	SpiralGradient\py=y 
	SpiralGradient\radius=radius 
	SpiralGradient\loop=loop 
	CustomGradient(@SpiralGradientCallback()) 
	EndProcedure 
	 
	If OpenWindow(#Window, 0, 0, 300, 300, "Spiral Gradient", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) 
	 
	If CreateImage(#Image, 300, 300) 
	If StartDrawing(ImageOutput(#Image)) 
	DrawingMode(#PB_2DDrawing_Gradient) 
	GradientColor(0.00, $FFFF0000) 
	GradientColor(0.20, $FFFFFF00) 
	GradientColor(0.50, $FF00FF00) 
	GradientColor(0.80, $FF00FFFF) 
	GradientColor(1.00, $FF0000FF) 
	SpiralGradient(150, 150, 150, 3) 
	Circle(150, 150, 150) 
	StopDrawing() 
	EndIf 
	 
	ImageGadget(#Gadget, 0, 0, 300, 300, ImageID(#Image)) 
	EndIf 
	 
	Repeat : Until WaitWindowEvent()=#PB_Event_CloseWindow 
	EndIf

0

54

ВиниПур написал(а):

Начнем с того, что такого цвета не бывает -  RGB(500,0,0) - значения RGB могут изменятся от 0 до 255 (когда справку уже будем читать?).

Эко меня переклинило, ну конечно такого цвета нет, ну давай считать, что я имел ввиду (245,0,0). Просто дело было ночью, большая часть мозга уже спала...  :crazy:  :nope:  :blush:

Спасибо тебе за примеры!!!  :cool: Как-то команда LinearGradient() проскользнула мимо меня, хотя она именно то, что надо..:о)). :blush:
Из справки, честно говоря,  CustomGradient () до конца  не уяснил. Вычислительной мощности не хватило, чтобы понять, что за фигуру описывает уравнение:  Sin(x * 0.1) * Sin(y * 0.1) Здесь функция вызывается  для каждого пикселя изображения, а перебор идет сверху вниз или справа на лево? :question:

Отредактировано Lucagin (30.12.2010 14:32:44)

0

55

Совсем запутался: как сделать в окне фоновое изображение(как ни пытался ничего не работает), как сделать на экране квадрат который будет двигаться при нажатии клавиш?

0

56

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

как сделать в окне фоновое изображение

Код:
UseJPEGImageDecoder()
OpenWindow(1,0,0,374,500,"",#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered|#PB_Window_Invisible)
  
  CatchImage(1,?M1, ?M2-?M1) ; Загружаем рисунок из памяти
  ImageGadget(1,0,0,374,500, ImageID(1) ) ; Отображаем его
  DisableGadget(1, #True)
  
  ButtonGadget(2, 200,100,100,24,"Кнопка")
  
HideWindow(1,0)  
Repeat ; Начало главного цикла Repeat-Until
 Event=WaitWindowEvent() ; Получаем текущий идентификатор события
 
Until Event=#PB_Event_CloseWindow ; Прерываем цикл при попытке закрыть окно (щелчёк по крестику в заголовке окна)
End ; Завершаем работу программы

DataSection
 M1:
  IncludeBinary "PB4-Developer.jpg"
 M2:
EndDataSectio
Niset написал(а):

как сделать на экране квадрат который будет двигаться при нажатии клавиш?

Тенис на рабочем столе

Код:
ExamineDesktops() 

W = DesktopWidth(0) 
H = DesktopHeight(0) 

Bx.f = 40 
By.f = H/2 - 10 

Mx.f = 10
My.f = 0 

;- Fenster oeffnen 
OpenWindow(0,   Bx,   By,  20,   20, "Desktop Tennis", #PB_Window_BorderLess) 

OpenWindow(2,   20, H-20, W-20,   20, "", #PB_Window_BorderLess, WindowID(0)) 
OpenWindow(3,    0,   20,   20, H-20, "", #PB_Window_BorderLess, WindowID(0)) 
OpenWindow(4, W-40,   50,   20,  H/5, "", #PB_Window_BorderLess, WindowID(0)) 
OpenWindow(1,    0,    0,    W,   20, "", #PB_Window_BorderLess, WindowID(0)) 

 Y = DesktopMouseY() - H/10 
 Sm = Y 

;- Hauptschleife 

Repeat 

 ;- Eventhandling 
 Event = WindowEvent() 
  
 If Event = #PB_Event_MoveWindow And EventWindow() = 2 And WindowY(2) <> H-20 
  ResizeWindow(2, 20, H-20, #PB_Ignore, #PB_Ignore) 
  ;Debug "Move" 
 EndIf 
  
 Bx + Mx 
 By + My 
  
 If Mx > 0 And Bx > W-60 And By > Y And By < Y+H/5 : Mx = (Mx+1)* -1 : My - Sm/15 
 ElseIf My > 0 And By > H-40 : My * -1 : Punkte + 10 
 ElseIf Mx < 0 And Bx <   20 : Mx * -1 : Punkte - 1 
 ElseIf My < 0 And By <   20 : My * -1 : Punkte + 10 
 Else 
  Y = DesktopMouseY() - H/10 
  Sm = Y - Oy : Oy = Y 
    
  ResizeWindow(4, W-40,  Y, #PB_Ignore, #PB_Ignore) 
  ResizeWindow(0,  Bx, By, #PB_Ignore, #PB_Ignore) 
  If Mx > 0 And Bx > W 
   Event = 333 
   Break 
  EndIf 
  
 EndIf 
  
 ;- Fenster Fдrben 
 For i=0 To 4 
  StartDrawing(WindowOutput(i)) 
   Box(0, 0, WindowWidth(i), WindowHeight(i), PeekL(?Col + i*4)) 
   If i=1 
    FrontColor(RGB($EA, $EB, $15)) : BackColor(RGB($23, $73, $DC))
    Circle(10, 10, 9) 
    DrawText(W-150, 2, "Punkte: "+Str(Punkte)) 
   EndIf 
  StopDrawing() 
 Next 
  
 Delay(20) 
  
 If DesktopMouseX() < 20 And DesktopMouseY() < 20 
  If MessageRequester("Beenden?", "Sie wollen also das Spiel vorzeitig beenden?", 1) = 1 : End : EndIf 
 EndIf 
  
ForEver 

For i=0 To 4 
 CloseWindow(i) 
Next 

;- Highscore 
OpenWindow(0, 1, 1, 330, 320,  "Highscore", #PB_Window_ScreenCentered) 
 CreateGadgetList(WindowID(0)) 
  OpenFile(0, "Highscore.dat") 
  If Lof(0) < 15 
   For i=1 To 10 : WriteLong(0, -10-i) : WriteStringN(0, "Niemand") : Next 
   FileSeek(0, 0) 
  EndIf    
  
  For i=1 To 10 
   Points = ReadLong(0) 
   Name.s = ReadString(0) 
   If Punkte > Points 
    TextGadget  (10+i,  20, 25*i,  80, 20, Str(Punkte), #PB_Text_Center) : Punkte = -11111 
    StringGadget(   i, 110, 25*i, 200, 20,          "", #PB_String_BorderLess) 
    Activate = i 
    i+1 
   EndIf 
   TextGadget  (10+i,  20, 25*i,  80, 20, Str(Points), #PB_Text_Center) 
   StringGadget(   i, 110, 25*i, 200, 20,        Name, #PB_String_BorderLess | #PB_String_ReadOnly) 
  Next 
  ButtonGadget (   0, 115, 290, 100, 20, "Eintragen") 
  
  CloseFile(0) 
  SetActiveGadget(Activate) 
  
  
 Repeat 
 Until WaitWindowEvent() = #PB_Event_Gadget And EventGadget() = 0 

 CreateFile(0, "Highscore.dat") 
  
 For i=1 To 10 
  WriteLong    (0, Val(GetGadgetText(10+i))) 
  WriteStringN (0,     GetGadgetText(   i) ) 
 Next 
  
DataSection 
 Col: 
 Data.l $4A16B5, $DC7323, $DC7323, $DC7323, $9BBD31 
EndDataSection

0

57

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

Тенис на рабочем столе

Ух ты)) СПС

0

58

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

Ух ты)) СПС

Это из КодАрхива.
Находится в КодАрхив\Games\LittleGames\DesktopTennis.pb

0

59

У меня этот Tennis даже в linuxe работает :cool:

0

60

Всем привет!
Возможно ли в ButtonGadget изменять текст? Если да, то киньте пожалуйста пример.
Заранее спасибо!

0


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