gambas 有什么好的for循环范例?

新手涉及到的教学或入门贴,推荐新手必看,版主维护
回复
头像
TeliuTe
论坛版主
帖子: 7668
注册时间: 2007-11-25 13:29
系统: 16/18/20/w7
来自: 新疆博乐
联系:

gambas 有什么好的for循环范例?

#1

帖子 TeliuTe » 2014-11-18 12:52

gambas 的窗体(fmain)上好像不能显示文本

想找一个可视化的范例,控制台里数字1加到100,这些累加的太枯燥
附件
gamcode.png
头像
astolia
论坛版主
帖子: 6456
注册时间: 2008-09-18 13:11

Re: gambas 有什么好的for循环范例?

#2

帖子 astolia » 2014-11-18 21:32

窗体上放一个button,一个textarea和一个label

代码: 全选

Public Sub Button1_Click()

Dim s, i As Integer 
s = 0
For i = 1 To 100
  s += i
  TextArea1.Text &= i & " "
  Label1.Text = s
  Wait 0.1
Next

End
头像
TeliuTe
论坛版主
帖子: 7668
注册时间: 2007-11-25 13:29
系统: 16/18/20/w7
来自: 新疆博乐
联系:

Re: gambas 有什么好的for循环范例?

#3

帖子 TeliuTe » 2014-11-18 22:17

谢谢,明天去学校试试,貌似for循环里的wait不起作用,在gambas3里

看wiki里有个生成9×9×9个textbox的范例,可是要用到数组,想改编成不用数组的9×9,对象名称如何递增,使用new时需要不同的名称: http://www.gambasdoc.org/help/lang/new?zh&v3
[thinbasic]
' 本例创建9*9*9个小文本框,可以通过公共的Object[]对象数组来访问它们。

PUBLIC bIsInitialised AS Boolean
PUBLIC objIsImpossible AS Object[]

PUBLIC SUB Form_Open()

DIM iR AS Integer
DIM iR2 AS Integer
DIM iC AS Integer
DIM iC2 AS Integer
DIM iDigit AS Integer
DIM iX AS Integer
DIM objTextBox AS TextBox

IF NOT bIsInitialised THEN
objIsImpossible = NEW Object[] ' 创建需要的数组
iX = 0
FOR iR = 0 TO 8
FOR iC = 0 TO 8
FOR iDigit = 0 TO 8
iR2 = iDigit MOD 3
iC2 = iDigit / 3
objTextBox = NEW TextBox(ME) ' 创建9*9*9个TextBox的下一个
objTextBox.X = (iR * 3 + iR2) * 12 + 2
objTextBox.y = (iC * 3 + iC2) * 12 + 2
objTextBox.Width = 10
objTextBox.Height = 10

objIsImpossible.Add(objTextBox, iX)

iX = iX + 1
NEXT ' iDigit
NEXT ' iC
NEXT ' iR
ENDIF

END

[/thinbasic]
头像
astolia
论坛版主
帖子: 6456
注册时间: 2008-09-18 13:11

Re: gambas 有什么好的for循环范例?

#4

帖子 astolia » 2014-11-19 10:19

wait有效的。在14.04中的gambas 3.1.1和15.04的3.5.4中都没问题

代码: 全选

Public Sub Form_Open()
  Dim j, i As Integer
  Dim btn As Button
  
  For i = 1 To 9
    For j = 1 To 9
      btn = New Button(Me) As "btn"
      btn.y = (j - 1) * 20
      btn.x = (i - 1) * 30
      btn.Width = 30
      btn.height = 20
      btn.name = "btn" & i & j
      btn.Text = i & "-" & j
    Next
  Next
End

Public Sub btn_Click()
  Message.Info(Last.name & " is clicked")
End
头像
TeliuTe
论坛版主
帖子: 7668
注册时间: 2007-11-25 13:29
系统: 16/18/20/w7
来自: 新疆博乐
联系:

Re: gambas 有什么好的for循环范例?

#5

帖子 TeliuTe » 2014-11-19 13:17

试了下果然可以,多谢

我设想的是一个label1在窗体中不断的移动位置,代码放在form_open()里无效,放在label1_MouseDown()里,关闭时会在label1.x=i+1上提示“Invalid object in FMain:14.”,需要点停止按钮才行。

代码: 全选

Dim i As Integer
For i = 1 To 300
  Label1.x = i + 1
  Label1.y = i + 1
  Wait 0.2
Next
头像
astolia
论坛版主
帖子: 6456
注册时间: 2008-09-18 13:11

Re: gambas 有什么好的for循环范例?

#6

帖子 astolia » 2014-11-19 17:07

TeliuTe 写了: 我设想的是一个label1在窗体中不断的移动位置,代码放在form_open()里无效,放在label1_MouseDown()里,关闭时会在label1.x=i+1上提示“Invalid object in FMain:14.”,需要点停止按钮才行。
1、在form_open()里并非无效,而是open事件是初始化完毕还没有显示出来,show事件才是窗口显示完毕。该放到form_show里
2、Invalid object的问题,你可以在form_close里做个标记,在循环里一旦发现窗口已关闭就跳出

代码: 全选

Public closeFlag As Boolean

Public Sub Form_Open()
  closeFlag = False
  Print "Open()"
End

Public Sub Form_Show()
  Dim i As Integer
  For i = 1 To 300
    If (closeFlag) Then
      Break
    Endif
    Label1.x = i + 1
    Label1.y = i + 1
    Wait 0.2
  Next
  Print "Show()"
End

Public Sub Form_Close()
  closeFlag = True
  ' 此时还存在
  Label1.Text = "valid"
End
头像
TeliuTe
论坛版主
帖子: 7668
注册时间: 2007-11-25 13:29
系统: 16/18/20/w7
来自: 新疆博乐
联系:

Re: gambas 有什么好的for循环范例?

#7

帖子 TeliuTe » 2014-11-19 19:06

在gambas2里试了下,点关闭按钮(X)时还是会提示错误,
g2err.png
g2err.png (4.65 KiB) 查看 6659 次
3还没试,12.04里安装gambas3的ppa无法访问

代码: 全选

Cannot access PPA (https://launchpad.net/api/1.0/~nemh/+archive/gambas3) to get PPA information, please check your internet connection.
-----------------------------
3.5里试了下,也报错,提示段错误:

代码: 全选

(ex2:2569): GLib-GObject-WARNING **: invalid unclassed pointer in cast to `GtkWindow'
(ex2:2569): Gtk-CRITICAL **: IA__gtk_window_get_type_hint: assertion `GTK_IS_WINDOW (window)' failed
g3err.png
g3err.png (4.44 KiB) 查看 6391 次
头像
astolia
论坛版主
帖子: 6456
注册时间: 2008-09-18 13:11

Re: gambas 有什么好的for循环范例?

#8

帖子 astolia » 2014-11-19 22:42

看了一下12.04源里的gambas2,确实会报那个错。应该是它在窗口销毁事件与显示事件前后关系的处理上出了问题。gambas2.x的最新版本是2.24.0,比源里的2.23.1略高,不知道还有没有这个问题。3.x是不会报错的
2.x里让显示事件尽早结束就不会出错了,可以把循环的部分放到按钮的点击事件中,或者像下面那样在timer事件中执行循环

代码: 全选

PUBLIC t AS Timer

PUBLIC SUB Form_Show()
  t = NEW Timer AS "MyTimer"
  t.Delay = 1
  t.Enabled = TRUE
END

PUBLIC SUB MyTimer_Timer() 
  DIM i AS Integer
  FOR i = 1 TO 300
    IF (closeFlag) THEN
      BREAK
    ENDIF
    Label1.x = i + 1
    Label1.y = i + 1
    WAIT 0.2
  NEXT
  t.Stop
END
gambas3稳定版的ppa源地址目前是 https://launchpad.net/~gambas-team/+arc ... tu/gambas3
头像
TeliuTe
论坛版主
帖子: 7668
注册时间: 2007-11-25 13:29
系统: 16/18/20/w7
来自: 新疆博乐
联系:

Re: gambas 有什么好的for循环范例?

#9

帖子 TeliuTe » 2014-11-19 23:58

非常感谢,明天去3.5上试一试,定时器事件有些地方可以代替循环语句,
原来还有个稳定版的ppa,下回试一试,先存下
--------------------
楼上这个定时器的程序可以通过,关闭时正常退出
放在按钮或标签的点击事件里也都可以正常关闭退出
回复