Types Funktion o.ä. mitgeben?

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

RollingStone

Betreff: Types Funktion o.ä. mitgeben?

BeitragMo, Nov 02, 2009 20:37
Antworten mit Zitat
Benutzer-Profile anzeigen
hoi,

beispiel:

BlitzBasic: [AUSKLAPPEN]
Type textbox
Field x%
Field y%
Field image$
Field state% = 0
End Type

user.textbox = New textbox
user\x = 100
user\y = 100


wie kann ich diesem type textbox nun eine funktion o.ä. mitgeben, worauf eben alle instanzen dieses typs angesprochen werden? oder auch nur bestimmte instanzen, die ich z.b. durch eine weitere field-eigenschaft festlege o.ä.? gibt es sowas wie eine funktion im type?

grüße
RS

Xeres

Moderator

BeitragMo, Nov 02, 2009 20:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Im Type kannst du keine Funktion erstellen und Methoden gibt es auch nicht. Du kannst höchstens eine Funktion schreiben die alle Instanzen verarbeitet bzw. einer Funktion eine Instanz übergeben.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Nicdel

BeitragMo, Nov 02, 2009 20:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Funktionen in Types gibt es nur in BlitzMax. Du kannst es aber auch so machen:

Code: [AUSKLAPPEN]

Function DrawTextbox(tb.textbox)

   DrawImage tb\image, tb\x, tb\y

   ...

End Function



Edit: Das war keine Absicht Very Happy
Desktop: Intel Pentium 4 2650 Mhz, 2 GB RAM, ATI Radeon HD 3850 512 MB, Windows XP
Notebook: Intel Core i7 720 QM 1.6 Ghz, 4 GB DDR3 RAM, nVidia 230M GT, Windows 7
  • Zuletzt bearbeitet von Nicdel am Mo, Nov 02, 2009 20:57, insgesamt einmal bearbeitet

FireballFlame

BeitragMo, Nov 02, 2009 20:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Richtig, du kannst eine Funktion erstellen, der du ein Objekt übergibst.
BlitzBasic: [AUSKLAPPEN]
Function bla(blubb.textbox)
...
End Function

Funktionen direkt in Types gibt es aber nicht in BlitzBasic, dafür müsstest du dann BlitzMax nehmen.

EDIT: Bwargh, Beitragsinhaltklauer!
PC: Intel Core i7 @ 4x2.93GHz | 6 GB RAM | Nvidia GeForce GT 440 | Desktop 2x1280x1024px | Windows 7 Professional 64bit
Laptop: Intel Core i7 @ 4x2.00GHz | 8 GB RAM | Nvidia GeForce GT 540M | Desktop 1366x768px | Windows 7 Home Premium 64bit

RollingStone

BeitragMo, Nov 02, 2009 20:58
Antworten mit Zitat
Benutzer-Profile anzeigen
dankeschön! Very Happy

RollingStone

BeitragDi, Nov 03, 2009 8:33
Antworten mit Zitat
Benutzer-Profile anzeigen
ich bräuchte noch mal einen kleinen denkanstoss.

ich hab also den oben genannten type für die textboxen angelegt und möchte jetzt für jede textbox die ich platziere einfach so vorgehen:

BlitzBasic: [AUSKLAPPEN]

user.textbox = New textbox
user\x = 100
user\y = 100

test.textbox = New textbox
test\x = 200
test\y = 200


...
wie überprüfe ich jetzt am einfachsten in der programm-hauptschleife, ob sich die maus gerade über irgendeine der textboxen bewegt oder angeklickt wird?

am liebsten würde ich alle instanzen des types per schleife durchgehen und dann eben jeweils abfragen?
oder soll ich jede instanz in ein array laden und dieses dann durchgehen?

bitte helft mir. Smile

grüße
RS
 

Matthias

BeitragDi, Nov 03, 2009 10:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Hay.

Das ist eigentlich sehr einfach.
Du must nur schauen ob deine Maus inerhalb eines Bereiches ist.

Code: [AUSKLAPPEN]

Type TButton
Field Name$
Field PosX,PosY
Field Width,Height
End Type

CreateButton("Knopf1",100,100,30,20)
CreateButton("Knopf2",130,100,30,20)

Function CreateButton(Name$,X,Y,W,H)
    B.TButton=New TButton
    B\Name=Name
    B\PosX=X
    B\PosY=Y
    B\Width=W
    B\Height=H
End Function


Function CheckButtons$()
    MausX=MouseX() MausY=MouseY() MausT=MouseDown(1)
    For B.TButton=Each TButton
         IF MausX>B\PosX and MausX<B\PosX+B\Width Then
              IF MausY>B\PosY and MausY<B\PosY+B\Height Then
                   IF MausT=1 Then Return B\Name
               End IF   
          End IF
      Next
End Function


;------Mainloop---------
      Apptitle CheckButtons()
   


CheckButtons gibt dir dann den Name des Buttons zurück den du gedrückt hast.

Getestet hab ich es jetzt nicht aber es müste so functionieren.
Gruß Matz

RollingStone

BeitragDi, Nov 03, 2009 18:36
Antworten mit Zitat
Benutzer-Profile anzeigen
danke!

BlitzBasic: [AUSKLAPPEN]

Graphics 800, 600
SetBuffer BackBuffer()

Type TextBox
Field name$
Field x,y
Field width, height
Field state = 0 ;0 = inaktiv, 1 = aktiv, 2 = hover
Field maxlen
End Type

Function CreateTextBox(n$, x, y, w, h, m)
a.TextBox = New TextBox
a\name = n
a\x = x
a\y = y
a\width = w
a\height = h
a\maxlen = m
Rect a\x, a\y, a\width, a\height
End Function

Function CheckTextBox$()
md1 = MouseDown(1)
mx = MouseX()
my = MouseY()

For a.TextBox = Each TextBox
If mx >= a\x And mx <= a\x + a\width Then
If my >= a\y And my <= a\y + a\height Then
If md1 = True Then
a\state = 1
Else
a\state = 2
End If
Return a\name
End If
End If
Next
End Function



While Not KeyDown(1)
Cls

CreateTextBox("test1", 500, 500, 200, 100, 30)
CreateTextBox("test2", 100, 100, 200, 100, 30)


For a.TextBox = Each TextBox
If a\name = CheckTextBox() Then
Text 400, 420, a\state
End If
Next


Text 400, 400, CheckTextBox()

Flip
Wend

End


ich bekomme also die richtige textbox ausgegeben, wenn ich mit der maus drüber bin oder klicke.

je nachdem ob gehovered oder geklickt wird, soll jetzt die state-variable geändert werden, siehe code.
mein problem ist jetzt, wie ich an diese state-variable von der betroffenen textbox dran komme.

geht das nur wieder mit der for-each - schleife wie ich es in der hauptschleife probiert habe?
a\state, welches ausgegeben wird, wird leider immer wieder überschriebens, sodass ich die zahl nicht genau erkennen kann...warum weiß ich nicht?!

das prinzip mit a.TextBox = New TextBox habe ich auch noch nicht richtig verstanden. wie können denn von einer instanz mehrere instanzen erstellt werden? die variable a.TextBox kann es doch eigentlich gar nicht mehrere male geben?

RollingStone

BeitragDi, Nov 03, 2009 19:14
Antworten mit Zitat
Benutzer-Profile anzeigen
update:

BlitzBasic: [AUSKLAPPEN]

Graphics 800, 600
SetBuffer BackBuffer()

Type TextBox
Field name$
Field x,y
Field width, height
Field state ;0 = inaktiv, 1 = aktiv, 2 = hover
Field maxlen
End Type

Function CreateTextBox(n$, x, y, w, h, m)
a.TextBox = New TextBox
a\name = n
a\x = x
a\y = y
a\width = w
a\height = h
a\maxlen = m
Rect a\x, a\y, a\width, a\height
End Function

Function CheckTextBox$()
md1 = MouseDown(1)
mx = MouseX()
my = MouseY()

For a.TextBox = Each TextBox
If mx >= a\x And mx <= a\x + a\width And my >= a\y And my <= a\y + a\height Then
If md1 = True Then
a\state = 1
Else
a\state = 2
End If
Return a\name
Else
a\state = 0
End If
Next
End Function



While Not KeyDown(1)
Cls

CreateTextBox("druff", 500, 500, 200, 100, 30)
CreateTextBox("suff", 100, 100, 200, 100, 30)


For a.TextBox = Each TextBox
If a\name = CheckTextBox() Then
Text 420, 420, a\state
End If
Next


Text 400, 400, CheckTextBox()

Flip
Wend

End


1. warum wird folgendes nicht korrekt ausgegeben und der status immer wieder überschrieben? (zahl auf zahl sodass man nichts mehr erkennen kann...)

BlitzBasic: [AUSKLAPPEN]
For a.TextBox = Each TextBox
If a\name = CheckTextBox() Then
Text 420, 420, a\state
End If
Next


2. gibt es noch eine andere möglichkeit, leichter an den state-wert von EINER BESTIMMTEN textbox zu kommen? ich möchte ja nicht jedes mal alle textboxen per for-each - schleife durchgehen sondern auf die eigenschaften zb. direkt per textbox-name zugreifen können.

Nicdel

BeitragDi, Nov 03, 2009 19:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Verwende bitte den Edit-Button um so etwas noch an deinen vorigen Beitrag dranzuhängen. Doppelposts sind verboten.

1. Wenn du 2 Textboxen hast, deren Status du dir ausgeben lässt ist es doch klar, dass übereinander geschrieben wird Rolling Eyes

2.
Code: [AUSKLAPPEN]

a.Textbox = new Textbox
b.Textbox = new Textbox

Print a.status
print b.status
Desktop: Intel Pentium 4 2650 Mhz, 2 GB RAM, ATI Radeon HD 3850 512 MB, Windows XP
Notebook: Intel Core i7 720 QM 1.6 Ghz, 4 GB DDR3 RAM, nVidia 230M GT, Windows 7

RollingStone

BeitragDi, Nov 03, 2009 19:22
Antworten mit Zitat
Benutzer-Profile anzeigen
ich bekomme aber doch per ...

BlitzBasic: [AUSKLAPPEN]

For a.TextBox = Each TextBox
If a\name = CheckTextBox() Then
Text 420, 420, a\state
End If
Next


... nur den namen von einer textbox zurück...und nur von der wird doch der status ausgeben aufgrund der if-bedingung?!

und wenn ich es so mache wie du unter "2.", funktioniert ja meine komplette CreateTextBox - funktion nicht mehr. das war ja mein erster gedanke, die instanzen immer a, b, c usw. zu benennen. (siehe postings weiter oben...)
dann stellt sich mir aber die frage, wie ich die ganzen instanzen per schleife auf hover bzw. klick überprüfe...

mpmxyz

BeitragDi, Nov 03, 2009 19:42
Antworten mit Zitat
Benutzer-Profile anzeigen
@2.:
Hänge an den Namen der Erstellfunktion ".TextBox".
Das ändert - ähnlich wie "#" - den Datentyp des Rückgabewertes der Funktion.
Am Ende dieser Funktion schreibst du noch ein "Return a", damit die Objektreferenz zurückgegeben wird.
Diese kannst du z.B. nutzen, um auf den Zustand eines speziellen Objektes zuzugreifen.

Ich habe die Vermutung, dass du das Konzept mit den Containervariablen falsch verstehst:
(Die könnte vielleicht auch einen anderen Namen haben... Der wäre mir dann aber entfallen.)

BlitzBasic: [AUSKLAPPEN]
Local Container1.TextBox=CreateTextBox("abc", 0, 0, 100, 25, 1);2 TextBox-Objekte werden erstellt.
Local Container2.TextBox=CreateTextBox("bla", 30, 0, 100, 25, 1)

Local Container3=Container2;Das Objekt selbst wird nicht kopiert! Man greift mit den beiden Containern auf das selbe Objekt zu.

Container1=Null;Das Objekt ist auch immer noch in der Liste. Man kann aber nicht mehr über diesen Container auf dieses Objekt zugreifen.
Container1=Last TextBox;Ab jetzt zeigt jede dieser Variablen auf das selbe Objekt: die zweite TextBox


Wenn du diese Funktion nur dazu brauchst, einen betätigten Button zu finden, solltest deine "CheckTextBox" mit einem anderen Rückgabewert ausstatten.
Die gibt dann die Objektreferenz des betätigten Buttons zurück. (bzw. "Null", wenn keiner gedrückt wurde)
Diese kannst du dann sofort und ohne Suchen verwenden, wenn du vorher schaust, dass sie nicht "Null" also ungültig ist.

mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

Xeres

Moderator

BeitragDi, Nov 03, 2009 19:47
Antworten mit Zitat
Benutzer-Profile anzeigen
1. In der Create-Funktion hat das zeichnen mit Rect nichts zu suchen.
2. Du erstellst in jedem Schleifendurchlauf mit der Create-Funktion neue Textboxen
Explizit Locale und Globale Variablen helfen den Überblick zu bewahren.

BlitzBasic: [AUSKLAPPEN]
Graphics 800, 600, 0, 2
SetBuffer BackBuffer()
Local timer = CreateTimer(60)

Global mx, my, md1

Type TextBox
Field name$
Field x,y
Field width, height
Field state ;0 = inaktiv, 1 = aktiv, 2 = hover
Field maxlen
End Type

Function CreateTextBox(n$, x, y, w, h, m)
Local a.TextBox = New TextBox
a\name = n
a\x = x
a\y = y
a\width = w
a\height = h
a\maxlen = m
;Rect a\x, a\y, a\width, a\height
End Function

Function DrawTextBoxes()
Local a.TextBox
For a.TextBox = Each TextBox
Rect a\x, a\y, a\width, a\height
Next
End Function

Function CheckTextBox$()
Local a.TextBox

For a.TextBox = Each TextBox
If mx >= a\x And mx <= a\x + a\width And my >= a\y And my <= a\y + a\height Then
If md1 = True Then
a\state = 1
Else
a\state = 2
End If
Return a\name
Else
a\state = 0
End If
Next
End Function

CreateTextBox("druff", 500, 500, 200, 100, 30)
CreateTextBox("suff", 100, 100, 200, 100, 30)

Local a.TextBox
While Not KeyDown(1)
Cls

md1 = MouseDown(1)
mx = MouseX()
my = MouseY()

DrawTextBoxes()
For a.TextBox = Each TextBox
If a\name = CheckTextBox() Then
Text 420, 420, a\state
End If
Next


Text 400, 400, CheckTextBox()

Flip(0)
WaitTimer(timer)
Wend

End
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

RollingStone

BeitragMi, Nov 04, 2009 19:27
Antworten mit Zitat
Benutzer-Profile anzeigen
sehr gut. vielen dank euch beiden! das hat mir sehr geholfen.

so sieht das ganze jetzt aus. ich habe eure beiden lösungsmöglichkeiten ausprobiert. und beide funktionieren perfekt. Smile

BlitzBasic: [AUSKLAPPEN]

Graphics 800, 600
SetBuffer BackBuffer()

Global md1, mx, my

Type TextBox
Field name$
Field x,y
Field width, height
Field state ;0 = inaktiv, 1 = aktiv, 2 = hover
Field maxlen
End Type

Function CreateTextBox(n$, x, y, w, h, m)
a.TextBox = New TextBox
a\name = n
a\x = x
a\y = y
a\width = w
a\height = h
a\maxlen = m
End Function

Function DrawTextBox()
For a.TextBox = Each TextBox
Rect a\x, a\y, a\width, a\height
Next
End Function

Function ShowState()
Local i = 0
For a.TextBox = Each TextBox
Text 100, 400 + i, a\name
Text 100, 420 + i, a\state
i = i + 100
Next
End Function

Function CheckTextBox.TextBox()
md1 = MouseDown(1)
mx = MouseX()
my = MouseY()

For a.TextBox = Each TextBox
If mx >= a\x And mx <= a\x + a\width And my >= a\y And my <= a\y + a\height Then
If md1 = True Then
a\state = 1
Else
a\state = 2
End If
Return a
Else
a\state = 0
End If
Next
Return Null
End Function


CreateTextBox("box1", 500, 500, 200, 100, 30)
CreateTextBox("box2", 100, 100, 200, 100, 30)


While Not KeyDown(1)
Cls

DrawTextBox()

ShowState()

aktiv.TextBox = CheckTextBox()
If aktiv.TextBox <> Null Then
Text 400, 400, aktiv\name
Text 400, 420, aktiv\state
End If

Flip
Wend

End

RollingStone

BeitragDo, Nov 05, 2009 21:42
Antworten mit Zitat
Benutzer-Profile anzeigen
bin noch nen bisschen am rumprobieren....bekomme es einfach nicht hin, dass nur eine textbox auf t\active = true geschaltet werden kann.

wenn eine box auf true ist und man möchte per klick auf die andere diese ebenfalls auf true schalten, soll die, die ursprünglich true war, auf false springen. es soll also jeweils immer nur eine box auf true sein können!

hier der noch funktionierende code:

BlitzBasic: [AUSKLAPPEN]

Graphics 800, 600
SetBuffer BackBuffer()

Global gm, mx, my


Type textbox
Field name$
Field x,y
Field width, height
Field state = 0 ; 0 = inaktiv , 1 = aktiv , 2 = hover
Field active = False
Field max_len
End Type

Function create_textbox(name$, x, y, width, height, max_len)
t.textbox = New textbox
t\name = name
t\x = x
t\y = y
t\width = width
t\height = height
t\max_len = max_len
End Function

Function draw_textbox()
For t.textbox = Each textbox
If t\state = 1 Then
Color 0,0,100
Else If t\state = 2 Then
Color 100,0,0
Else
Color 255, 255, 255
End If
Rect t\x, t\y, t\width, t\height
If t\active = True Then
Color 0,255,0
Line t\x + 2, t\y + t\height - 2, t\x + t\width - 2, t\y + t\height - 2
End If
Next
Color 255,255,255
End Function

Function check_textbox.textbox()
gm = GetMouse()
mx = MouseX()
my = MouseY()

For t.textbox = Each textbox
If(mx >= t\x And mx <= t\x + t\width And my >= t\y And my <= t\y + t\height) Then
If(gm = 1) Then
t\state = 1
If t\active = False Then
t\active = True
Else
t\active = False
End If
Else
t\state = 2
End If
Return t
Else
t\state = 0
End If
Next
Return Null
End Function

create_textbox("test", 100, 150, 150, 35, 30)
create_textbox("test2", 300, 150, 150, 35, 12)

While Not KeyDown(1)
Cls


aktiv.textbox = check_textbox()
If aktiv <> Null Then
Text 100, 500, aktiv\name
End If

draw_textbox()


Flip
Wend
End



ps: ich hatte meinen letzten post erst editiert, musste aber dann feststellen, dass das thema bzw. der post nicht wieder hochgeholt wurde und ihr es so ja gar nicht sehen könnt, dass etwas editiert wurde.

Xeres

Moderator

BeitragDo, Nov 05, 2009 21:49
Antworten mit Zitat
Benutzer-Profile anzeigen
1. Bitte Timer + Flip(0) benutzen (Hurra, 100 % Auslastung)
2. Bitte, bitte zum testen im Fenstermodus laufen lassen.
3. Wenn du schon die Textbox in der Funktion zurückgeben kannst, warum machst du es nicht auch?

BlitzBasic: [AUSKLAPPEN]

Graphics 800, 600, 0, 2
SetBuffer BackBuffer()
Local timer=CreateTimer(60)
Global gm, mx, my


Type textbox
Field name$
Field x,y
Field width, height
Field state = 0 ; 0 = inaktiv , 1 = aktiv , 2 = hover
Field active = False
Field max_len
End Type

Function create_textbox(name$, x, y, width, height, max_len)
t.textbox = New textbox
t\name = name
t\x = x
t\y = y
t\width = width
t\height = height
t\max_len = max_len
End Function

Function draw_textbox()
For t.textbox = Each textbox
If t\state = 1 Then
Color 0,0,100
Else If t\state = 2 Then
Color 100,0,0
Else
Color 255, 255, 255
End If
Rect t\x, t\y, t\width, t\height
If t\active = True Then
Color 0,255,0
Line t\x + 2, t\y + t\height - 2, t\x + t\width - 2, t\y + t\height - 2
End If
Next
Color 255,255,255
End Function

Function check_textbox.textbox()
gm = GetMouse()
mx = MouseX()
my = MouseY()

Local t.textbox
For t.textbox = Each textbox
If(mx >= t\x And mx <= t\x + t\width And my >= t\y And my <= t\y + t\height) Then
If(gm = 1) Then
t\state = 1
If t\active = False Then
;t\active = True
Return t
Else
;t\active = False
End If
Else
t\state = 2
End If
Return t
Else
t\state = 0
End If
Next
Return Null
End Function

create_textbox("test", 100, 150, 150, 35, 30)
create_textbox("test2", 300, 150, 150, 35, 12)
Local aktiv.textbox

While Not KeyDown(1)
Cls


aktiv = check_textbox()
If aktiv <> Null Then
Text 100, 500, aktiv\name
End If

draw_textbox()


Flip(0)
WaitTimer(timer)
Wend
End


Nicht perfekt
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group