Форум программистов, компьютерный форум, киберфорум
Pure Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.67/48: Рейтинг темы: голосов - 48, средняя оценка - 4.67
 Аватар для Power_Basic
46 / 25 / 0
Регистрация: 08.03.2016
Сообщений: 443

Изучение PureBasic с точки зрения новичка

23.02.2023, 19:22. Показов 15401. Ответов 124
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здесь буду задавать вопросы, которые, на мой взгляд, не заслуживают создания отдельной ветки. Ну просто чтобы не плодить кучу тем, не слишком полезных для подавляющего большинства.

Сейчас приступил к изучению "PureBasic - A Beginners Guide" в переводе Станислава Будинова. К сожалению, это книга эпохи версии 4.00.Там довольно подробно рассматриваются функции, содержащиеся в библиотеке OnError Library, а именно: GetErrorNumber(), GetErrorDescription(), GetErrorLineNR() и GetErrorModuleName().
Правильно ли я понимаю, что это уже полный анахронизм, и сейчас всю отладку рекомендуется производить в самом отладчике, поскольку он теперь (на современных компьютерах) стал очень быстрым, и нужда в этих функциях уже полностью отпала?

И кроме того, функция CreateGadgetList() тоже уже устарела, потому что список добавляемых на форму гаджетов создаётся теперь автоматически подобно коллекции Controls в VB?

P.S. Сначала собирался озаглавить эту ветку вот так: "Вопросы новичка, приступившего к изучению PureBasic", но движок форума по какой-то причине цензурирует слово "вопросы". Пришлось как-нибудь перефразировать, чтобы обойтись без этого слова. Получилось не так хорошо, как было задумано, но всё-таки относительно близко к первоначальному варианту.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.02.2023, 19:22
Ответы с готовыми решениями:

Чего не хватает учебнику языкси.рф с точки зрения новичка?
Доброй ночи! Расскажите, пожалуйста, о вашем опыте восприятия контента учебника языкси.рф: что понравилось, что не очень, с чего лучше...

Если два метода выполняют одно и то же - с точки зрения программы, но разное - с точки зрения логики?
void killCh(BCell cKiller, BCell cVictim){ cVictim.setChessman(cKiller.getChessman()); cKiller.setChessman(null); ...

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

124
 Аватар для Power_Basic
46 / 25 / 0
Регистрация: 08.03.2016
Сообщений: 443
12.03.2023, 14:13  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от useful Посмотреть сообщение
вы же в СВОЁМ окне исследуете список гаджетов, вот и организуйте его так как вам удобно, а не цепляйтесь за то, про что написано УСТАРЕЛО.
Вы либо статически каждому присвоили "номер" либо динамически #PB_Any. Ну и соберите их куда хотите массив, список, ...
Ну да, в принципе, в "моём родном" PowerBasic'е точно такое же "самообслуживание"
В том смысле, что надо самому ("ручками") создавать, например, массив контролов, ну и перебирать их в цикле по индексам.
Меня немного ввела в заблуждение фраза из Справки PureBasic:
OpenWindow() теперь неявно создает список гаджетов (GadgetList).
Вообразил себе, что, подобно Визуальному бейсику, автоматически (без участия программиста) создаётся что-то вроде коллекции контролов Controls(), добавляемых на Форму, ну а потом их можно перебирать в цикле приблизительно вот так:

Visual Basic
1
2
3
4
5
Private Sub Command1_Click()
  For Each Control In Controls()
    Control.Move 1000
  Next
End Sub
Теперь вот выяснилось, что смысл той фразы приблизительно такой: "Раньше программист сам должен был явно создавать список гаджетов, теперь это делает за него сам компилятор".

Цитата Сообщение от AZJIO Посмотреть сообщение
PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
Enumeration FormGadget
  #Editor_Original_text
  #Editor_Regular_Expression
  #Editor_Result
  #Button_Parse
  #Checkbox_Flag_1
  #Checkbox_Flag_2
  #Checkbox_Flag_3
  #Checkbox_Flag_4
  #Checkbox_Flag_5
EndEnumeration
For i = #Editor_Original_text To #Checkbox_Flag_5
; ...
Ну да, вы совершенно правильно догадались, что мне это требуется именно для моего Тестера_регулярных_выражений. Вообще-то это мне не особо нужно именно для этой программы, но для тренировки всё-таки решил научить её адаптироваться к различным разрешениям экрана и сохранять пропорции при изменении размеров окна.

Добавлено через 11 минут
Цитата Сообщение от AZJIO Посмотреть сообщение
Если мне надо сгенерировать гаджеты, то иногда добавляю #LastGadget перед EndEnumeration и от него генерирую список. Потом если событие больше или равно #LastGadget, то indexGadget = Event - #LastGadget.
Хитрый приёмчик
0
Эксперт по электронике
6991 / 3307 / 341
Регистрация: 28.10.2011
Сообщений: 12,985
Записей в блоге: 7
12.03.2023, 14:41
Цитата Сообщение от Power_Basic Посмотреть сообщение
создаётся что-то вроде коллекции контролов Controls(), добавляемых на Форму, ну а потом их можно перебирать в цикле
Список создается, но документированных функций доступа к нему нет.
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
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
;-TOP
 
; ***************************************************************************************
;
; Comment : Module System
; Author  : mk-soft
; Version : v1.09.2
; Create  : 30.03.2019
; Update  : 10.12.2021
;
; Link DE : https://www.purebasic.fr/german/viewtopic.php?f=8&t=31380
; Link EN : https://www.purebasic.fr/english/viewtopic.php?f=12&t=72980
;
; OS      : All
;
; ***************************************************************************************
 
DeclareModule System
  ;- Begin of Declare Module
  
  Declare WindowPB(WindowID)
  Declare GadgetPB(GadgetID)
  Declare ImagePB(ImageID)
  Declare FontPB(FontID)
  
  Declare GetParentWindowID(Gadget)
  Declare GetPreviousGadget(Gadget, WindowID)
  Declare GetNextGadget(Gadget, WindowID)
  
  Declare GetWindowList(List Windows())
  Declare GetGadgetList(List Gadgets(), WindowID=0)
  Declare GetImageList(List Images())
  Declare GetFontList(List Fonts())
  
  Declare MouseOver()
  
  ;- End of Declare Module
EndDeclareModule
 
; ---------------------------------------------------------------------------------------
 
Module System
  ;- Begin of Module
  
  EnableExplicit
  
  ;-- Import internal function
  
  ; Force Import Font Objects
  If 0 : LoadFont(0, "", 9) : EndIf
  
  ; ---------------------------------------------------------------------------------------
  
  CompilerIf #PB_Compiler_OS = #PB_OS_Windows
    Import ""
      PB_Object_EnumerateStart(PB_Objects)
      PB_Object_EnumerateNext(PB_Objects, *ID.Integer)
      PB_Object_EnumerateAbort(PB_Objects)
      PB_Object_GetObject(PB_Object , DynamicOrArrayID)
      PB_Window_Objects
      PB_Gadget_Objects
      PB_Image_Objects
      PB_Font_Objects
    EndImport
  CompilerElse
    ImportC ""
      PB_Object_EnumerateStart(PB_Objects)
      PB_Object_EnumerateNext(PB_Objects, *ID.Integer)
      PB_Object_EnumerateAbort(PB_Objects)
      PB_Object_GetObject(PB_Object , DynamicOrArrayID)
      PB_Window_Objects.i
      PB_Gadget_Objects.i
      PB_Image_Objects.i
      PB_Font_Objects.i
    EndImport
  CompilerEndIf
  
  ; ---------------------------------------------------------------------------------------
  
  CompilerIf #PB_Compiler_OS = #PB_OS_MacOS
    ; PB Internal Structure Gadget MacOS
    Structure sdkGadget
      *gadget
      *container
      *vt
      UserData.i
      Window.i
      Type.i
      Flags.i
    EndStructure
  CompilerEndIf
  
  ; ---------------------------------------------------------------------------------------
  
  Procedure WindowPB(WindowID) ; Find pb-id over handle
    Protected result, window
    result = -1
    PB_Object_EnumerateStart(PB_Window_Objects)
    While PB_Object_EnumerateNext(PB_Window_Objects, @window)
      If WindowID = WindowID(window)
        result = window
        Break
      EndIf
    Wend
    PB_Object_EnumerateAbort(PB_Window_Objects)
    ProcedureReturn result
  EndProcedure
  
  ; ---------------------------------------------------------------------------------------
  
  Procedure GadgetPB(GadgetID) ; Find pb-id over handle
    Protected result, gadget
    result = -1
    
    PB_Object_EnumerateStart(PB_Gadget_Objects)
    While PB_Object_EnumerateNext(PB_Gadget_Objects, @gadget)
      If GadgetID = GadgetID(gadget)
        result = gadget
        Break
      EndIf
    Wend
    PB_Object_EnumerateAbort(PB_Gadget_Objects)
    ProcedureReturn result
  EndProcedure
  
  ; ---------------------------------------------------------------------------------------
  
  Procedure ImagePB(ImageID) ; Find pb-id over handle
    Protected result, image
    result = -1
    PB_Object_EnumerateStart(PB_Image_Objects)
    While PB_Object_EnumerateNext(PB_Image_Objects, @image)
      If ImageID = ImageID(image)
        result = image
        Break
      EndIf
    Wend
    PB_Object_EnumerateAbort(PB_Image_Objects)
    ProcedureReturn result
  EndProcedure
  
  ; ---------------------------------------------------------------------------------------
  
  Procedure FontPB(FontID) ; Find pb-id over handle
    Protected result, font
    result = -1
    PB_Object_EnumerateStart(PB_Font_Objects)
    While PB_Object_EnumerateNext(PB_Font_Objects, @font)
      If FontID = FontID(font)
        result = font
        Break
      EndIf
    Wend
    PB_Object_EnumerateAbort(PB_Font_Objects)
    ProcedureReturn result
  EndProcedure
  
  ; ---------------------------------------------------------------------------------------
  
  Procedure GetParentWindowID(Gadget) ; Retval handle
    Protected WindowID
    
    If IsGadget(Gadget)
      CompilerSelect #PB_Compiler_OS
        CompilerCase #PB_OS_MacOS
          Protected *Gadget.sdkGadget = IsGadget(Gadget)
          WindowID = WindowID(*Gadget\Window)
        CompilerCase #PB_OS_Linux
          WindowID = gtk_widget_get_toplevel_(GadgetID(Gadget))
        CompilerCase #PB_OS_Windows           
          WindowID = GetAncestor_(GadgetID(Gadget), #GA_ROOT)
      CompilerEndSelect
    EndIf
    ProcedureReturn WindowID
  EndProcedure
  
  ; ---------------------------------------------------------------------------------------
  
  Procedure GetPreviousGadget(Gadget, WindowID) ; Retval pb-id
    Protected object, prev_id, type
    
    prev_id = -1
    PB_Object_EnumerateStart(PB_Gadget_Objects)
    While PB_Object_EnumerateNext(PB_Gadget_Objects, @object)
      type = GadgetType(object)
      If type <> #PB_GadgetType_Text And type <> #PB_GadgetType_Frame
        If GetParentWindowID(object) = WindowID
          If gadget = object
            If prev_id >= 0
              PB_Object_EnumerateAbort(PB_Gadget_Objects)
              Break
            EndIf
          Else
            prev_id = object
          EndIf
        EndIf
      EndIf
    Wend
    ProcedureReturn prev_id
  EndProcedure
  
  ; ---------------------------------------------------------------------------------------
  
  Procedure GetNextGadget(Gadget, WindowID) ; Retval pb-id
    Protected object, next_id, type
    
    next_id = -1
    PB_Object_EnumerateStart(PB_Gadget_Objects)
    While PB_Object_EnumerateNext(PB_Gadget_Objects, @object)
      type = GadgetType(object)
      If type <> #PB_GadgetType_Text And type <> #PB_GadgetType_Frame
        If GetParentWindowID(object) = WindowID
          If next_id < 0
            next_id = object
          EndIf
          If gadget = object
            If PB_Object_EnumerateNext(PB_Gadget_Objects, @object)
              If GetParentWindowID(object) = WindowID
                next_id = object
                PB_Object_EnumerateAbort(PB_Gadget_Objects)
                Break
              EndIf
            EndIf
          EndIf
        EndIf
      EndIf
    Wend
    ProcedureReturn next_id
  EndProcedure
  
  ; ---------------------------------------------------------------------------------------
  
  Procedure GetWindowList(List Windows()) ; Retval count of windows
    Protected object
    ClearList(Windows())
    PB_Object_EnumerateStart(PB_Window_Objects)
    While PB_Object_EnumerateNext(PB_Window_Objects, @object)
      AddElement(Windows())
      Windows() = object
    Wend
    ProcedureReturn ListSize(Windows())
  EndProcedure
  
  ; ---------------------------------------------------------------------------------------
  
  Procedure GetGadgetList(List Gadgets(), WindowID=0) ; Retval count of gadgets
    Protected object
    ClearList(Gadgets())
    PB_Object_EnumerateStart(PB_Gadget_Objects)
    
    If WindowID = 0
      While PB_Object_EnumerateNext(PB_Gadget_Objects, @object)
        AddElement(Gadgets())
        Gadgets() = object
      Wend
    Else 
      While PB_Object_EnumerateNext(PB_Gadget_Objects, @object)
        If GetParentWindowID(object) = WindowID
          AddElement(Gadgets())
          Gadgets() = object
        EndIf
      Wend
    EndIf
    ProcedureReturn ListSize(Gadgets())
  EndProcedure
  
  ; ---------------------------------------------------------------------------------------
  
  Procedure GetImageList(List Images()) ; Retval count of images
    Protected object
    ClearList(Images())
    PB_Object_EnumerateStart(PB_Image_Objects)
    While PB_Object_EnumerateNext(PB_Image_Objects, @object)
      AddElement(Images())
      Images() = object
    Wend
    ProcedureReturn ListSize(Images())
  EndProcedure
  
  ; ---------------------------------------------------------------------------------------
  
  Procedure GetFontList(List Fonts()) ; Retval count of fonts
    Protected object
    ClearList(Fonts())
    PB_Object_EnumerateStart(PB_Font_Objects)
    While PB_Object_EnumerateNext(PB_Font_Objects, @object)
      AddElement(Fonts())
      Fonts() = object
    Wend
    ProcedureReturn ListSize(Fonts())
  EndProcedure
  
  ; ---------------------------------------------------------------------------------------
  
  Procedure MouseOver() ; Retval handle
    Protected handle, window
    window = GetActiveWindow()
    If window < 0
      ProcedureReturn 0
    EndIf
    ; Get handle under mouse
    CompilerSelect #PB_Compiler_OS
      CompilerCase #PB_OS_Windows
        Protected pt.q
        GetCursorPos_(@pt)
        handle = WindowFromPoint_(pt)
      CompilerCase #PB_OS_MacOS
        Protected win_id, win_cv, pt.NSPoint
        win_id = WindowID(window)
        win_cv = CocoaMessage(0, win_id, "contentView")
        CocoaMessage(@pt, win_id, "mouseLocationOutsideOfEventStream")
        handle = CocoaMessage(0, win_cv, "hitTest:@", @pt)
      CompilerCase #PB_OS_Linux
        Protected desktop_x, desktop_y, *GdkWindow.GdkWindowObject
        *GdkWindow.GdkWindowObject = gdk_window_at_pointer_(@desktop_x,@desktop_y)
        If *GdkWindow
          gdk_window_get_user_data_(*GdkWindow, @handle)
        Else
          handle = 0
        EndIf
    CompilerEndSelect
    ProcedureReturn handle
  EndProcedure
  
  ; ---------------------------------------------------------------------------
  
  ;- End Of Module
  
EndModule
 
 
 
 
 
;- Example
CompilerIf #PB_Compiler_IsMainFile
  
  UseModule System
  
  
  #WindowWidth  = 390
#WindowHeight = 350
 
If OpenWindow(0, 100, 200, #WindowWidth, #WindowHeight, "PureBasic - Gadget Demonstration", #PB_Window_MinimizeGadget)
  
  Top = 10
  GadgetHeight = 24
  
  
  
  StringGadget(0,  20, Top, 200, GadgetHeight, "")
  ButtonGadget(1, 223, Top,  72, GadgetHeight, "Play")
  ButtonGadget(2, 295, Top,  72, GadgetHeight, "Stop")  : Top+35
  DisableGadget(2,1)
  
  GadgetToolTip(1,"Play the current song")
  
  PanelGadget(3, 20, Top, #WindowWidth-50, #WindowHeight-Top-60)
  AddGadgetItem(3, 0, "MP3 PlayList")
  ListViewGadget(4, 6, 10, 230, 148)
  
  For k=0 To 30
    AddGadgetItem(4, -1, "Music Song n° "+Str(k))
  Next
  
  ButtonGadget(5,  250, 10, 80, GadgetHeight, "Add")
  ButtonGadget(6,  250, 38, 80, GadgetHeight, "Remove")
  ButtonGadget(7,  250, 66, 80, GadgetHeight, "Select")
  GadgetToolTip(7, "Select the current song")
  
  TrackBarGadget(17, 10, 168, 310, 25, 0, 100)
  
  AddGadgetItem(3, 1, "Options")
  Top = 10
  CheckBoxGadget(10, 10, Top, 250, GadgetHeight, "Enable low-pass filter") : Top+30
  CheckBoxGadget(11, 10, Top, 250, GadgetHeight, "Enable visual plug-in")  : Top+30
  ComboBoxGadget(12, 10, Top, 250, 21) : Top+30
  AddGadgetItem(12, -1, "FireWorks")
  AddGadgetItem(12, -1, "OpenGL spectrum")
  AddGadgetItem(12, -1, "Bump bass")
  SetGadgetState(12,0)
  DisableGadget(12,1)
  
  OptionGadget(13, 10, Top, 80, GadgetHeight, "640*480") : Top+20
  OptionGadget(14, 10, Top, 80, GadgetHeight, "800*600") : Top+20
  OptionGadget(15, 10, Top, 80, GadgetHeight, "1024*768")
  SetGadgetState(13, 1)
  
  ButtonGadget(16, 150, Top, 80, GadgetHeight, "Info")
  CloseGadgetList()
  
  TextGadget  (9, 10, #WindowHeight-30, 250, 24, "PureBasic - Gadget demonstration")
  ButtonGadget(8, #WindowWidth-100, #WindowHeight-36, 80, 24, "Quit")
  
  SetGadgetState(3, 0)
  
  
  ; Перечисление гаджетов.
  NewList Gadgets()
  GetGadgetList(Gadgets(), WindowID(0))
  
  ForEach Gadgets()
    Debug "Gadget "+Gadgets()+" тип "+GadgetType(Gadgets())
  Next
  
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_CloseWindow
        CloseWindow(0)
        Break
    EndSelect
  ForEver
    
  EndIf
CompilerEndIf
Участок кода с перечислением.
PureBasic
1
2
3
4
5
6
7
; Перечисление гаджетов.
NewList Gadgets()
GetGadgetList(Gadgets(), WindowID(0))
 
ForEach Gadgets()
  Debug "Gadget "+Gadgets()+" тип "+GadgetType(Gadgets())
Next
1
12 / 12 / 0
Регистрация: 02.07.2014
Сообщений: 115
12.03.2023, 14:48
При этом нужно помнить, что не документированное может в следующей версии быть изменено/удалено.
То же самое касается чисел сопоставленных системным константам #PB_ ...
Гарантируется только то, что на уровне исходника они не поменяют смысл, а числовые значения принадлежат автору, как сейчас например в разных системах есть разные значения одной и той же константы.
1
1 / 7 / 0
Регистрация: 19.09.2017
Сообщений: 81
09.06.2023, 12:54
Ребят, подскажите. Если сравнивать обучение новичку между: PureBasic, PowerBASIC, Visual Basic .NET.
С чего было бы лучше начать? (начать и, может, на том и остановиться).
Цель - прикладное программирование для себя (десктоп-приложения), есть интерес также перейти к VBA.
0
Эксперт по электронике
6991 / 3307 / 341
Регистрация: 28.10.2011
Сообщений: 12,985
Записей в блоге: 7
09.06.2023, 13:14
PowerBASIC больше не поддерживается и его разработка приостановлена. Новых версий скорее всего не будет.

PureBasic создает нативные приложения, а Visual Basic.NET только зависимые от .NET.

Если говорить об изучении то на мой взгляд PureBasic изучить проще, т. к. процедурный и нет всех наворотов ООП и .NET. Его можно изучить по справке, а для изучения VB.NET придется прочитать не одну книгу.

Цитата Сообщение от Anyaax Посмотреть сообщение
есть интерес также перейти к VBA.
Тогда возможно лучше сразу изучать VBA.
3
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
09.06.2023, 14:43
Цитата Сообщение от useful Посмотреть сообщение
как сейчас например в разных системах есть разные значения одной и той же константы
А если надо передавать данные по сети, и в какой‐то структуре есть поле, в которую записано #PB_Константа, на другой машине делается Select #PB_Константа, оно не сработает? Вот это прикол!
0
Эксперт по электронике
6991 / 3307 / 341
Регистрация: 28.10.2011
Сообщений: 12,985
Записей в блоге: 7
09.06.2023, 15:01
Цитата Сообщение от Замабувараев Посмотреть сообщение
структуре есть поле, в которую записано #PB_Константа, на другой машине делается Select #PB_Константа, оно не сработает?
Если это что-то типа #PB_Event_CloseWindow то все может быть, только зачем отправлять событие закрытия окна по сети?
С таким же успехом можно отправить #WM_DESTROY и удивляться что это не работает на лине или маке.
0
12 / 12 / 0
Регистрация: 02.07.2014
Сообщений: 115
09.06.2023, 16:23
Это не часто, но встречается точно, у меня брошенный проект ГУИ сервера на подобие например
https://kresin.ru/guisrv.html
Столкнулся несколько раз и для внешних обращений делал таблицу перекодировки, при этом подавляющее количество совпадали, но сам факт наличие хоть одного не совпадения, заставляет задумываться об этом в будущем ибо разных версиях Фред хозяин барин, и совместимость обещана на ровне исходников, а константы в виде живых чисел моветон.
0
0 / 0 / 0
Регистрация: 11.12.2014
Сообщений: 30
26.11.2023, 10:25
Подскажите/покажите пожалуйста код подсчета средней температуры в данной подпрограмме....
Лог файлик в архиве....

Visual Basic
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
StandardFile$ = GetPathPart(ProgramFilename()) + "_logfile.csv"   ; файл по умолчанию в папке программы
       Pattern$ = "Файлы (*.csv)|*.txt;*.csv|Все файлы (*.*)|*.*"
      Pattern = 0    ; use the first of the three possible patterns as standard
      File$ = OpenFileRequester("Выбрать файл архива", StandardFile$, Pattern$, Pattern)
      If File$
    ;MessageRequester("Инфо", "Вы выбрали следующий файл:" + Chr(10) + File$, 0)
  Else
    MessageRequester("Информация", "Действие отменено" + Chr(10) +"   пользователем.", #MB_OK|#MB_ICONWARNING) 
  EndIf
  
  
  
  
   ; узнать количество строк
    If ReadFile(0,File$ )   ; если файл удалось прочитать, продолжаем..
    Count = 0
    While Eof(0) = 0          ; цикл, пока не достигнут «конец файла»
     S$= ReadString(0)            ; отображать построчно в окне отладки
     Count + 1
     
     ShisloT = Val(Mid(S$,18,3)) ;Вытаскиваем нужное число из строки
     
     
    
     Debug ShisloT  ;Результат
      Wend
   
    Debug Count    ;Результат -  кол-во строк....
    
    
    Debug SummaSr ;Среднее значение температуры
 
    
    Else
    MessageRequester("информация","Не удалось открыть файл !!")
    EndIf
Вложения
Тип файла: rar Desktop.rar (3.1 Кб, 5 просмотров)
0
12 / 12 / 0
Регистрация: 02.07.2014
Сообщений: 115
26.11.2023, 12:01
https://obrazovaka.ru/question... uha-125811
0
0 / 0 / 0
Регистрация: 11.12.2014
Сообщений: 30
26.11.2023, 12:08
useful
Теория известна.....
я просил реализацию в коде...
** Подскажите/покажите пожалуйста код подсчета средней температуры в данной подпрограмме....**
0
12 / 12 / 0
Регистрация: 02.07.2014
Сообщений: 115
26.11.2023, 12:19
Приблизительно ...
Visual Basic
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
EnableExplicit
 
Define CountPlus = 0
Define CountMinus = 0
Define TCurent = 0
Define ATPlus = 0
Define ATMinus = 0
Define AverageTemperature.f = 0
 
If ReadFile(0,"_logfile.csv" ) 
    While Eof(0) = 0 
        TCurent = Val(Mid(ReadString(0),18,3))
        If TCurent < 0
            ATMinus + TCurent
            CountMinus + 1
        Else
            ATPlus + TCurent
            CountPlus + 1
        EndIf   
    Wend
    If (CountMinus > 0) 
        If (Abs(ATMinus) > Abs(ATPlus))
            AverageTemperature = - (Abs(ATMinus) - Abs(ATPlus)) / (CountMinus + CountPlus)
        Else 
            AverageTemperature = (ATPlus + ATMinus) / (CountMinus + CountPlus)
        EndIf   
    Else
        AverageTemperature = ATPlus / (CountMinus + CountPlus)
    EndIf   
    
    Debug ATMinus
    Debug CountMinus
    
    Debug ATPlus
    Debug CountPlus
    Debug AverageTemperature
Else
    MessageRequester("информация","Не удалось открыть файл !!")
EndIf
0
0 / 0 / 0
Регистрация: 11.12.2014
Сообщений: 30
26.11.2023, 13:14
useful
Спасибо
0
0 / 0 / 0
Регистрация: 16.11.2019
Сообщений: 1
08.12.2023, 17:47
Всем привет!
Через TCP общается ПК и МК. Весь обмен выводится в EditorGadget. Как сделать, что бы исходящий пакет, и входящий отражался разными цветами.
Вот как у геркулеса ?
0
Эксперт по электронике
6991 / 3307 / 341
Регистрация: 28.10.2011
Сообщений: 12,985
Записей в блоге: 7
08.12.2023, 21:28
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
; English forum: http://www.purebasic.fr/english/viewtopic.php?t=6872&highlight=
; Author: PWS32 (updated for PB4.00 by blbltheworm)
; Date: 11. July 2003
; OS: Windows
; Demo: No
 
; Selects Text inside an EditorGadget 
; Line numbers range from 0 to CountGadgetItems(#Gadget)-1 
; Char numbers range from 1 to the length of a line 
; Set Line numbers to -1 to indicate the last line, and Char 
; numbers to -1 to indicate the end of a line 
; selecting from 0,1 to -1, -1 selects all. 
 
 
Procedure Editor_Select(Gadget, LineStart.l, CharStart.l, LineEnd.l, CharEnd.l)    
  sel.CHARRANGE 
  sel\cpMin = SendMessage_(GadgetID(Gadget), #EM_LINEINDEX, LineStart, 0) + CharStart - 1 
  
  If LineEnd = -1 
    LineEnd = SendMessage_(GadgetID(Gadget), #EM_GETLINECOUNT, 0, 0)-1 
  EndIf 
  sel\cpMax = SendMessage_(GadgetID(Gadget), #EM_LINEINDEX, LineEnd, 0) 
  
  If CharEnd = -1 
    sel\cpMax + SendMessage_(GadgetID(Gadget), #EM_LINELENGTH, sel\cpMax, 0) 
  Else 
    sel\cpMax + CharEnd - 1 
  EndIf 
  SendMessage_(GadgetID(Gadget), #EM_EXSETSEL, 0, @sel) 
EndProcedure 
 
; Set the Text color for the Selection 
; in RGB format 
Procedure Editor_Color(Gadget, Color.l) 
  format.CHARFORMAT 
  format\cbSize = SizeOf(CHARFORMAT) 
  format\dwMask = #CFM_COLOR 
  format\crTextColor = Color 
  SendMessage_(GadgetID(Gadget), #EM_SETCHARFORMAT, #SCF_SELECTION, @format) 
EndProcedure 
 
; Set Font Size for the Selection 
; in pt 
Procedure Editor_FontSize(Gadget, Fontsize.l) 
  format.CHARFORMAT 
  format\cbSize = SizeOf(CHARFORMAT) 
  format\dwMask = #CFM_SIZE 
  format\yHeight = FontSize*20 
  SendMessage_(GadgetID(Gadget), #EM_SETCHARFORMAT, #SCF_SELECTION, @format) 
EndProcedure 
 
; Set Font for the Selection 
; You must specify a font name, the font doesn't need 
; to be loaded 
Procedure Editor_Font(Gadget, FontName.s) 
  format.CHARFORMAT 
  format\cbSize = SizeOf(CHARFORMAT) 
  format\dwMask = #CFM_FACE 
  PokeS(@format\szFaceName, FontName) 
  SendMessage_(GadgetID(Gadget), #EM_SETCHARFORMAT, #SCF_SELECTION, @format) 
EndProcedure 
 
; Set Format of the Selection. This can be a combination of 
; the following values: 
; #CFM_BOLD 
; #CFM_ITALIC 
; #CFM_UNDERLINE 
; #CFM_STRIKEOUT 
Procedure Editor_Format(Gadget, Flags.l) 
  format.CHARFORMAT 
  format\cbSize = SizeOf(CHARFORMAT) 
  format\dwMask = #CFM_ITALIC|#CFM_BOLD|#CFM_STRIKEOUT|#CFM_UNDERLINE 
  format\dwEffects = Flags 
  SendMessage_(GadgetID(Gadget), #EM_SETCHARFORMAT, #SCF_SELECTION, @format) 
EndProcedure 
 
 
; ------------------------------------------------------------- 
; Source Example: 
 
 
#Editor = 1 
 
If OpenWindow(0, 0, 0, 500, 500, "EditorGadget", #PB_Window_SystemMenu|#PB_Window_ScreenCentered) 
    
    EditorGadget(#Editor, 10, 10, 480, 480) 
    SendMessage_(GadgetID(#Editor), #EM_SETTEXTMODE, #TM_RICHTEXT, 0)
    
    AddGadgetItem(#Editor, 0, "Line 1")      
    AddGadgetItem(#Editor, 1, "Line 2")    
    AddGadgetItem(#Editor, 2, "Line 3") 
    AddGadgetItem(#Editor, 3, "Line 4") 
    
    SendMessage_(GadgetID(#EDITOR),#EM_SETBKGNDCOLOR,0,RGB($FF,$FF,$BF)) 
    
    Editor_Select(#Editor, 0, 1, 0, -1)  ; select line 1 
    Editor_Color(#Editor, RGB(0,0,255)) 
    Editor_FontSize(#Editor, 18) 
    Editor_Format(#Editor, #CFM_UNDERLINE) 
    
    Editor_Select(#Editor, 1, 0, 1, -1)  ; select line 2 
    Editor_Color(#Editor, RGB(255,0,0)) 
    Editor_Font(#Editor, "Times New Roman") 
    Editor_Format(#Editor, #CFM_ITALIC|#CFM_STRIKEOUT) 
    
    Editor_Select(#Editor, 2, 0, 2, -1)  ; select line 3 
    Editor_Color(#Editor, RGB(255,0,0)) 
    Editor_Font(#Editor, "Times New Roman") 
    Editor_FontSize(#Editor, 18) 
    Editor_Format(#Editor, #CFM_BOLD) 
    
    Editor_Select(#Editor, 3, 0, 3, -1)  ; select line 4 
                                         ;Editor_Color(#Editor, RGB(255,0,0)) 
    Editor_Font(#Editor, "Times New Roman") 
    Editor_FontSize(#Editor, 10) 
    Editor_Format(#Editor, #CFM_BOLD) 
    
    Editor_Select(#Editor, 0, 0, 0, 0)   ; select nothing again 
    
    
    Repeat 
    Until WaitWindowEvent() = #PB_Event_CloseWindow 
EndIf 
 
End
1
0 / 0 / 0
Регистрация: 11.12.2014
Сообщений: 30
17.03.2024, 18:18
Доброго времени !!!
ListIconGadget заполнен N..м количеством записей.
Подскажите/покажите как подсчитать сумму по каждому столбцу
и вывести результат в статус бар...

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
;{ Windows
Enumeration
   #Window_0
EndEnumeration
;}
;{  Gadgets
Enumeration
  #StatusBar
EndEnumeration
;}
;/////////////////////////
If OpenWindow(#Window_0, 100, 100, 610, 240, "Пример Гаджета", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  
  CreateStatusBar(#StatusBar, WindowID(#Window_0))
  AddStatusBarField(50)
  AddStatusBarField(90)
  AddStatusBarField(90)
  AddStatusBarField(90) ;4 колонка
  AddStatusBarField(90) ;5 колонка
  AddStatusBarField(100) ;6 колонка
  AddStatusBarField(90)  ;7 колонка
  
  StatusBarText(#StatusBar, 3, "Итого  :", #PB_StatusBar_Right)
  StatusBarText(#StatusBar, 4, "15000", #PB_StatusBar_Center)
  StatusBarText(#StatusBar, 5, "17000", #PB_StatusBar_Center)
  StatusBarText(#StatusBar, 6, "29000", #PB_StatusBar_Center)
 
   ListIconGadget(0, 5, 5, 600, 205, "№", 50, #PB_ListIcon_FullRowSelect | #PB_ListIcon_AlwaysShowSelection)
   AddGadgetColumn(0, 1, "Колонка 1", 90)
   AddGadgetColumn(0, 2, "Колонка 2", 90)
   AddGadgetColumn(0, 3, "Колонка 3", 90)
   AddGadgetColumn(0, 4, "Колонка 4", 90)
   AddGadgetColumn(0, 5, "Колонка 5", 90)
   AddGadgetColumn(0, 6, "Колонка 6", 90)
   
   AddGadgetItem(0, -1, "№1"+Chr(10)+"Тест"+Chr(10)+"Тест"+Chr(10)+"Тест"+Chr(10)+"1000"+Chr(10)+"2000"+Chr(10)+"3000" )
   AddGadgetItem(0, -1, "№2"+Chr(10)+"Тест"+Chr(10)+"Тест"+Chr(10)+"Тест"+Chr(10)+"4000"+Chr(10)+"5000"+Chr(10)+"6000" )
   AddGadgetItem(0, -1, "№3"+Chr(10)+"Тест"+Chr(10)+"Тест"+Chr(10)+"Тест"+Chr(10)+"7000"+Chr(10)+"8000"+Chr(10)+"9000" )
    AddGadgetItem(0, -1, "№4"+Chr(10)+"Тест"+Chr(10)+"Тест"+Chr(10)+"Тест"+Chr(10)+"1000"+Chr(10)+"2000"+Chr(10)+"3000" )
   AddGadgetItem(0, -1, "№5"+Chr(10)+"Тест"+Chr(10)+"Тест"+Chr(10)+"Тест"+Chr(10)+"4000"+Chr(10)+"5000"+Chr(10)+"6000" )
   AddGadgetItem(0, -1, "№6"+Chr(10)+"Тест"+Chr(10)+"Тест"+Chr(10)+"Тест"+Chr(10)+"7000"+Chr(10)+"8000"+Chr(10)+"9000" )
    AddGadgetItem(0, -1, "№7"+Chr(10)+"Тест"+Chr(10)+"Тест"+Chr(10)+"Тест"+Chr(10)+"1000"+Chr(10)+"2000"+Chr(10)+"3000" )
   AddGadgetItem(0, -1, "№8"+Chr(10)+"Тест"+Chr(10)+"Тест"+Chr(10)+"Тест"+Chr(10)+"4000"+Chr(10)+"5000"+Chr(10)+"6000" )
   AddGadgetItem(0, -1, "№9"+Chr(10)+"Тест"+Chr(10)+"Тест"+Chr(10)+"Тест"+Chr(10)+"7000"+Chr(10)+"8000"+Chr(10)+"9000" )
   
   Repeat
     Event = WaitWindowEvent()
   Until Event = #PB_Event_CloseWindow
 EndIf
0
Эксперт по электронике
6991 / 3307 / 341
Регистрация: 28.10.2011
Сообщений: 12,985
Записей в блоге: 7
17.03.2024, 18:32
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
;{ Windows
Enumeration
  #Window_0
EndEnumeration
;}
;{ Gadgets
Enumeration
  #StatusBar
EndEnumeration
;}
;/////////////////////////
 
Procedure Calc(Gadget, Column)
  Protected r=0, i, Count
  
  Count = CountGadgetItems(Gadget)-1
  
  For i=0 To Count
    r + Val(GetGadgetItemText(Gadget, i, Column))
  Next
  
  ProcedureReturn r
EndProcedure
 
If OpenWindow(#Window_0, 100, 100, 610, 240, "Пример Гаджета", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  
  CreateStatusBar(#StatusBar, WindowID(#Window_0))
  AddStatusBarField(50)
  AddStatusBarField(90)
  AddStatusBarField(90)
  AddStatusBarField(90) ;4 колонка
  AddStatusBarField(90) ;5 колонка
  AddStatusBarField(100);6 колонка
  AddStatusBarField(90) ;7 колонка
  
  
  ListIconGadget(0, 5, 5, 600, 205, "№", 50, #PB_ListIcon_FullRowSelect | #PB_ListIcon_AlwaysShowSelection)
  AddGadgetColumn(0, 1, "Колонка 1", 90)
  AddGadgetColumn(0, 2, "Колонка 2", 90)
  AddGadgetColumn(0, 3, "Колонка 3", 90)
  AddGadgetColumn(0, 4, "Колонка 4", 90)
  AddGadgetColumn(0, 5, "Колонка 5", 90)
  AddGadgetColumn(0, 6, "Колонка 6", 90)
  
  AddGadgetItem(0, -1, "№1"+Chr(10)+"Тест"+Chr(10)+"Тест"+Chr(10)+"Тест"+Chr(10)+"1000"+Chr(10)+"2000"+ Chr(10)+"3000" )
  AddGadgetItem(0, -1, "№2"+Chr(10)+"Тест"+Chr(10)+"Тест"+Chr(10)+"Тест"+Chr(10)+"4000"+Chr(10)+"5000"+ Chr(10)+"6000" )
  AddGadgetItem(0, -1, "№3"+Chr(10)+"Тест"+Chr(10)+"Тест"+Chr(10)+"Тест"+Chr(10)+"7000"+Chr(10)+"8000"+ Chr(10)+"9000" )
  AddGadgetItem(0, -1, "№4"+Chr(10)+"Тест"+Chr(10)+"Тест"+Chr(10)+"Тест"+Chr(10)+"1000"+Chr(10)+"2000"+ Chr(10)+"3000" )
  AddGadgetItem(0, -1, "№5"+Chr(10)+"Тест"+Chr(10)+"Тест"+Chr(10)+"Тест"+Chr(10)+"4000"+Chr(10)+"5000"+ Chr(10)+"6000" )
  AddGadgetItem(0, -1, "№6"+Chr(10)+"Тест"+Chr(10)+"Тест"+Chr(10)+"Тест"+Chr(10)+"7000"+Chr(10)+"8000"+ Chr(10)+"9000" )
  AddGadgetItem(0, -1, "№7"+Chr(10)+"Тест"+Chr(10)+"Тест"+Chr(10)+"Тест"+Chr(10)+"1000"+Chr(10)+"2000"+ Chr(10)+"3000" )
  AddGadgetItem(0, -1, "№8"+Chr(10)+"Тест"+Chr(10)+"Тест"+Chr(10)+"Тест"+Chr(10)+"4000"+Chr(10)+"5000"+ Chr(10)+"6000" )
  AddGadgetItem(0, -1, "№9"+Chr(10)+"Тест"+Chr(10)+"Тест"+Chr(10)+"Тест"+Chr(10)+"7000"+Chr(10)+"8000"+ Chr(10)+"9000" )
  
  
  StatusBarText(#StatusBar, 3, "Итого :", #PB_StatusBar_Right)
  StatusBarText(#StatusBar, 4, Str(Calc(0, 4)), #PB_StatusBar_Center)
  StatusBarText(#StatusBar, 5, Str(Calc(0, 5)), #PB_StatusBar_Center)
  StatusBarText(#StatusBar, 6, Str(Calc(0, 6)), #PB_StatusBar_Center)
  
  Repeat
    Event = WaitWindowEvent()
  Until Event = #PB_Event_CloseWindow
EndIf
0
0 / 0 / 0
Регистрация: 11.12.2014
Сообщений: 30
17.03.2024, 19:41
Спасибо !!!
А если не в статус бар выводить....а например в EditorGadget...как переделать ?
0
Эксперт по электронике
6991 / 3307 / 341
Регистрация: 28.10.2011
Сообщений: 12,985
Записей в блоге: 7
17.03.2024, 21:01
PureBasic
1
2
3
AddGadgetItem(#Editor, -1, Str(Calc(0, 4)))
AddGadgetItem(#Editor, -1, Str(Calc(0, 5)))
AddGadgetItem(#Editor, -1, Str(Calc(0, 6)))
0
0 / 0 / 0
Регистрация: 11.12.2014
Сообщений: 30
18.03.2024, 05:25
Спасибо!!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.03.2024, 05:25
Помогаю со студенческими работами здесь

Изучение функция стандартной библиотеки для новичка
Здравствуйте! Поделитесь опытом: каким образом надо изучать функции стандартных библиотек С++. Может, надо читать какие-либо книги (книги,...

С точки зрения экономики
||||&quot;]Ты пришла на вечеринку с друзьями и видишь симпатичного парня. Подходишь к нему и говоришь, что с тобой классно в постели. ...

С точки зрения закона
Поделитесь опытом, как лучше сделать. Регистрировался кто нибудь, как ООО или как нибуть ещё? И вообще стоит ли? /' border='0'...

Точки зрения на фигуру
Здравствуйте, прошу помочь с решение задачи 1) Нужно построить фигуру с помощью матрицы которая во вложении с помощью numpy и matplotlib ...

C точки зрения професcионала.
Существует сайт palazzo.su который я взялся и создать и продвинуть. На мой субъективный взгляд, сайт вполне готов для выскакивания на...


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

Или воспользуйтесь поиском по форуму:
100
Ответ Создать тему
Новые блоги и статьи
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений. . . .
21 мат мед. Планы на развитие модели здравоСохранения
anaschu 01.06.2026
AnyLogic: план развития симуляционной модели рабочего коллектива — динамический абсентеизм, реальные данные, три сценария сравнения Продолжаю серию постов о дискретно-событийной модели рабочего. . .
20. Мат мед. Абсентеизм как отдельный тип простоя
anaschu 29.05.2026
Апдейт модели: исправленные баги, абсентеизм и новые механизмы Продолжаю развивать ранее описанную модель рабочего коллектива на AnyLogic. За последние несколько дней был проведён серьёзный. . .
19. здоровье, усталость и психотип работника влияют на производительность предприятия, и наоборот, производительность на здоровье, усталось и психотип
anaschu 28.05.2026
Дискретно-событийная модель рабочего коллектива на AnyLogic: здоровье, выгорание, психотипы и микростимуляция Привет, коллеги. Хочу поделиться итогами нескольких недель работы над симуляционной. . .
"Прокси" для последовательного порта
Eddy_Em 28.05.2026
Эту штуку написал я достаточно давно. Но сейчас вот понадобилось настроить датчик грозы, но при этом не отключать его от "метеодемона". Соответственно, надо запустить этот "прокси": метеодемон будет. . .
Рефакторинг программы уравнивания.
Massaraksh7 26.05.2026
Пример по предыдущей записи в блоге. Но, надо заметить, что, во-первых, там оптимизация не только математики, но и работы с базой данных, и с графами, а во-вторых, это ещё не всё.
Использование TThread в Lazarus для математических вычислений.
Massaraksh7 25.05.2026
Производя рефакторинг своих программ на предмет ускорения их работы, обратил внимание на такой аспект, как сокращение времени матвычислений. Дело в том, что приходится работать с большими матрицами. . .
Модель здравосохранения 18. Чем здоровее работник, тем быстрее выгорает
anaschu 24.05.2026
Имитационная модель корпоративного здравоохранения: что показывает математика Сегодня в модели рабочего коллектива на AnyLogic появились три новые механики — выгорание через накопленную усталость,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru