PureBasic - форум

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

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


Вы здесь » PureBasic - форум » PureBasic для Windows » Результаты ознакомительного периода


Результаты ознакомительного периода

Сообщений 1 страница 6 из 6

1

Для знакомства с Пуриком переписал под него пару старых программ

1. Утилитка FileNameChanger FNC.exe 45к

2.Логическая игра "Японский сканворд" Japan_with_Draw.sfx.exe 3.3M
Самораспаковывающийся архив. Можно играть без муз.файла.  Тогда на диске займет около 1.8М.
Лучше прочитать текстовую пояснялку.

Что мне не понравилось в Пурике (что успел записать в процессе ознакомления) или я не врубился толком

Нет ByRef
работа с массивами
Dim ar(0) - удаляет массив?
Dim ar(1) - создает массив из 2 элементов
если Вы используете Dim(10), у массива будет 11 элементов, элементы от 0 до 10.
Т.е. ArraySize(Array() [, Dimension]) - максимальный индекс а не количество элементов

"Only the last dimension of an array can be changed with ReDim"

Модульности нет? По крайней мере - привычной мне.
Кавычки только двойные
GetDatabaseBlob() описан неправильно в Хелпе(по крайней мере - для SQlite3)

Не понял - как организован перехват событий.
Но ImageGadget не пропускал LMAUSEDOWN. Пришлось заменять на DrawImage.

Help с косяками и вообще учиться по нему нелегко

Result = CreateNetworkServer(#Server, Port [, Mode]) - почему нельзя задать IP-адрес. Не все компы имеют один адрес. Некоторые больше одного.

Что понравилось.
Возможность включать файлы в экзешник в DataSection.
Linked Lists
Автоматически линкуемые библиотеки для прямого доступа к SQLite3.

И др.

Еще попробую FreeBasic для сравнения прежде чем сделать кое-что серьезное .

Отредактировано SadStar (04.10.2011 08:09:49)

0

2

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

Что мне не понравилось в Пурике

Нет ByRef? Да, это потеря для тех, кто привык к VisualBasic.
Компенсируется тем, что хорошо развит механизм указателей и ссылок. Когда овладеете, то эта проблема почти исчезнет.

Т.е. ArraySize(Array() [, Dimension]) - максимальный индекс а не количество элементов

- собственно, если знать о этой особенности, то это тоже уже не проблема.

Но ImageGadget не пропускал LMAUSEDOWN.

ImageGadget - специфический гаджет, да. Но в версии 4.6 введён новый гаджет - CanvasGadget, он поддерживает все мыслимые события.

Модульность? IncludeFile позволяет подключать сколько угодно модулей.
Кавычки только двойные? Нет, есть и одинарные -
'a' равносильно Asc("a")
Chr('a') равносильно "a"

FreeBasic - хороший ЯП, но без знания API для программирования под Винду там делать нечего, готовых библиотек маловато. Один наш форумчанин (Станислав Будинов) написал для него кучу библиотек, повторяющих Пуриковские - очень рекомендую

0

3

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

Нет ByRef

Как нет? Когда убрали? :O
ByRef - это передача по ссылке, а послать мы завсегда можем! :D

Передача строки по ссылке:

Код:
String.String

Procedure Test_ByRef(*String.String)
  *String\s = "Строка текста"
EndProcedure

Test_ByRef(String)

Debug String\s
end

Передача массива по ссылке:

Код:
Procedure fill(Array A.l(1))
  length = ArraySize(A())
  For i = 0 To length
    A(i) = i
  Next i
EndProcedure

Dim A.l(10)
fill(A())

Debug A(5)
Debug A(10)

Передача ассоциативного массива по ссылке:

Код:
NewMap Country.s()

Country("GE") = "Germany"
Country("FR") = "France"
Country("UK") = "United Kingdom"

Procedure DebugMap(Map ParameterMap.s())
  
  ParameterMap("US") = "United States"
  
  ForEach ParameterMap()
    Debug ParameterMap()
  Next
  
EndProcedure

DebugMap(Country())

Передача связанного списка по ссылке:

Код:
NewList Test.l()

Procedure DebugList(c.l, List ParameterList.l())
  AddElement(ParameterList())
  ParameterList() = 1
  AddElement(ParameterList())
  ParameterList() = 2
  AddElement(ParameterList())
  ParameterList() = 3
EndProcedure

DebugList(10, Test())

ForEach Test()
  MessageRequester("List", Str(Test()))
Next
SadStar написал(а):

Dim ar(0) - удаляет массив?

Нет, создает массив с одним элементом

Код:
Dim ar(0)
ar(0)=10
Debug ar(0)

Для удаления массива, следует использовать функцию FreeArray().

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

Кавычки только двойные

Одинарные тоже есть.

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

Не понял - как организован перехват событий.

Смотри описание функции SetWindowCallback() ну и WinAPI SetWindowLong_() и GetWindowLong_() можно использовать.

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

Но ImageGadget не пропускал LMAUSEDOWN.

Чем не подошло событие #PB_EventType_LeftClick?

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

почему нельзя задать IP-адрес. Не все компы имеют один адрес. Некоторые больше одного.

Этож создание сервера!
IP адрес будет такой как и у компа.

0

4

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

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

    Dim ar(0) - удаляет массив?

Нет, создает массив с одним элементом

Я неправильно понял фразу
To delete the content of an array and release its used memory during program flow, call Dim with array name and 0 elements.

Передача массивов и других объемных объектов всегда была ByRef, т.к. создание копий таких объектов для ByVal слишком накладно.
У меня была задача вернуть из процедуры три значения. Я бы сделал это (ByRef ... , ByRef ... , ByRef ...  ).
Здесь использовал три Global что нарушает чистоту функции.

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

Передача строки по ссылке:
Код:

String.String

Procedure Test_ByRef(*String.String)
  *String\s = "Строка текста"
EndProcedure

Test_ByRef(String)

Debug String\s
end

Не пойму кода. Если есть \, значит это структура. Но не вижу знакомого объявления структуры.

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

Чем не подошло событие #PB_EventType_LeftClick?

Тем что LeftClick и LeftDown - разные события. Мне нужно отследить точку нажатия LeftDown и точку отпускания LeftUp.

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

Этож создание сервера!
IP адрес будет такой как и у компа.

Вот именно что сервера. Если комп шлюзовой (в разных подсетках) он имеет минимум по одному адресу в каждой сети.
Мне нужно сделать сервер только для одной сети - например для внутренней. Оптимально задать локальный адрес и порт который он будет слушать.
В текущей реализации CreateNetworkServer(#Server, Port [, Mode]) - занимает заданный порт на всех локальных адресах.
При его использовании нужно городить лишний алгоритм по отсеиванию соединений с ненужных адресов.
А если для разных сетей на одинаковом порту должны работать разные сервисы - нужно сочинять некий диспетчер. И т.п....

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

Одинарные тоже есть.

Что-то у меня компилятор ругался когда я пытался сделать литерал вида '......"'+str(..)+'";'

Любой перехват событий возможен только через хуки.
http://msdn.microsoft.com/en-us/library/windows/desktop/ms632589(v=vs.85).aspx
Я пытался понять что на самом деле делает WaitWindowEvent() и WindowEvent().

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

'a' равносильно Asc("a")
Chr('a') равносильно "a"

О!! Блин! Это надо осознать. Но это не то использование разных кавычек, к которому я привык.

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

Модульность? IncludeFile позволяет подключать сколько угодно модулей.

Так и пришлось делать. Но какая ж это модульность если все модули видят всё нутро других модулей.
Но это только видимость модульности.

Еще раз повторю - многие мои непонятки от недостаточного знания сабжа.

0

5

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

У меня была задача вернуть из процедуры три значения. Я бы сделал это (ByRef ... , ByRef ... , ByRef ...  ).

Когда я говорил о механизме ссылок то как раз это и имел в виду

Код:
Procedure changeByRef(*u.String,*a.String,*b.String) 
  *u\S ="Новая строчка u"
  *a\s = "Новая строчка a"
  *b\s = "Новая сточка b"
  ProcedureReturn 1
EndProcedure

u.String\S="Старая u"
a.String\S="Старая a"
b.String\S="Старая b"

Debug u\S
Debug a\s
Debug b\S

If changeByRef(@u,@a,@b)

Debug u\S
Debug a\S
Debug b\S

EndIf

Многие стандартные структуры типа .String уже объявлены в PureBasic и их можно сразу использовать.
Весь список объявленных структур, констант и интерфейсов можно увидеть по горячим клавишам Alt+S

0

6

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

Здесь использовал три Global что нарушает чистоту функции.

Можно было бы решить проблему в лоб.

Код:
Procedure Test(*Point)
  PokeL(*Point, 1234)
EndProcedure

x.l = 0
Debug x
Test(@x)
Debug x
SadStar написал(а):

Не пойму кода. Если есть \, значит это структура. Но не вижу знакомого объявления структуры.

Была использована структура, объявленная по умолчанию.

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

Тем что LeftClick и LeftDown - разные события. Мне нужно отследить точку нажатия LeftDown и точку отпускания LeftUp.

Тогда перехватываем процедуру обработчика событий ImageGadget и вставляем свою.

Код:
Procedure ImageGadget_CB(hWnd, Msg, wParam, lParam)
  *OldFunc = GetWindowLongPtr_(hWnd,#GWL_USERDATA)
  
  If Msg = #WM_LBUTTONDOWN
    Debug "#WM_LBUTTONDOWN"
  ElseIf Msg = #WM_LBUTTONUP
    Debug "#WM_LBUTTONUP"
  ElseIf Msg = #WM_LBUTTONDBLCLK
    Debug "#WM_LBUTTONDBLCLK"
  EndIf
  
  ProcedureReturn CallWindowProc_(*OldFunc, hWnd, Msg, wParam, lParam)
EndProcedure

  OpenWindow(0, 0, 0, 300, 300, "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))
    For Angle = 0 To 360 Step 45
      DrawRotatedText(100, 100, "Кликни сюда", Angle, RGB(Random(255), Random(255), Random(255)))
    Next Angle
    StopDrawing() 
    hWnd = ImageGadget(0, 50, 50, 200, 200, ImageID(0))
    SetWindowLongPtr_(hWnd, #GWL_USERDATA, SetWindowLongPtr_(hWnd, #GWL_WNDPROC, @ImageGadget_CB()))
  EndIf
  
  Repeat
    Event = WaitWindowEvent()
  Until Event = #PB_Event_CloseWindow
SadStar написал(а):

Что-то у меня компилятор ругался когда я пытался сделать литерал вида '......"'+str(..)+'";'

А что этим хотел сделать? Какой результат ожидал получить?
Строки обрамляются только двойными кавычками, а одинарные используются для превращения строковой константы в эквевалентный числовой код символа - это для более лучшего восприятия.
К примеру, нужен числовой код символа Z. Если в программе записать его как 90, то потом будешь гадать что это за символ, а вот так будет намного нагляднее и понятнее. 'Z'

Код:
Debug 90
Debug 'Z'
SadStar написал(а):

Любой перехват событий возможен только через хуки.

О каких именно событиях идет речь?

0


Вы здесь » PureBasic - форум » PureBasic для Windows » Результаты ознакомительного периода