call methods

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

 

sinjin

Betreff: call methods

BeitragSo, Okt 05, 2014 4:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Das 2. Problem : wie kann man methoden (ist ja eigentlich nur ne funktion aber mit dem initialiationswert/pointer to self, wie macht man das, habe es auch in assembler probiert, leider versteht coff nicht "word ptr:" dang im lost, even if i know assembler....man muss es echt neu lernen.....
egal welche sprache....ich finde das ganze zeug echt nervig

Code: [AUSKLAPPEN]

superstrict
framework brl.retro
import brl.timer
import brl.graphics
import brl.glgraphics
import brl.max2d
import brl.glmax2d
import brl.d3d7max2d
import brl.maxgui
import brl.win32maxgui

'import brl.freetypefont
'import brl.bmploader
'import brl.tgaloader
'import brl.jpgloader 'noneed
'import brl.pngloader 'noneed
'import brl.wavloader
'import brl.oggloader
'import pub.freeprocess
'import pub.stdc
'import blitz3d.blitz3dsdk
'include "units2\sys.bmx"
'include "units2\gadget.bmx"

apptitle="New"

global win:tgadget=createwindow("New",100,100,500,500,,15-window_menu-window_status+window_hidden)
global can:tgadget=createcanvas(0,0,500,500,win)
setgraphics canvasgraphics(can)

sethotkeyevent key_x  ,modifier_alt,createevent(event_windowclose,win)
sethotkeyevent key_escape,0           ,createevent(event_windowclose,win)

'------------------------------------------

global secmil%=millisecs(),oldmil%
addhook fliphook,hookflip
function hookflip:object(id%,data:object,context:object)
  local a%=millisecs()
  oldmil=a-secmil
  secmil=a
endfunction

function drawbox(x%,y%,w%,h%)
  w:+x-1
  h:+y-1
  drawline x,y,w,y,false
  drawline w,y,w,h,false
  drawline w,h,x,h,false
  drawline x,h,x,y,false
endfunction

function drawcbox(x%,y%,w%,h%,rgbl%,rgbr%)
  w:+x-1
  h:+y-1
  setcolor rgbr shr 16,rgbr shr 8&$ff,rgbr&$ff
  drawline w,y,w,h,false
  drawline w,h,x,h,false
  setcolor rgbl shr 16,rgbl shr 8&$ff,rgbl&$ff
  drawline x,y,w,y,false
  drawline x,h,x,y,false
endfunction

'------------------------------------------

type tev
  field x%,y%
  field mx%,my%,mz%
  field down%,up%,first%,last%

  method area%(x1%,y1%,w1%,h1%)
    return (x>=x1) and (y>=y1) and (x<=x1+w1) and (y<=y1+h1)
  endmethod

  method upd()
    mx=0
    my=0
    mz=0
    up=0
    first=0
    last=0
    select currentevent.id
    case event_mousemove
      mx=x
      my=y
      x=currentevent.x
      y=currentevent.y
      mx=x-mx
      my=y-my
    case event_mousewheel
      mz=currentevent.data

    case event_mousedown
      local a%=1 shl (currentevent.data-1)
      if not down then first=a
      down:|a
    case event_mouseup
      local a%=1 shl (currentevent.data-1)
      down:&~a
      if not down then last=a
      up=a
    endselect
  endmethod
endtype

'-----------------------------------------

type tframe
  field x%,y%,w%,h%
  field prev:tframe
  field lvl%
  field opt% '$1=mouse over,$2=hold,$80=on/off state

  global gx%,gy%,gw%,gh%
  global vx%,vy%,vw%,vh%
  global active:tframe
  global ox%,oy%

  method draw() abstract
'  method upd%(ev:tev) abstract

  method reset(xx%,yy%,ww%,hh%,p:tframe=null)
    x=xx
    y=yy
    w=ww
    h=hh
    prev=p
    lvl=0
    while p
      lvl:+1
      p=p.prev
    wend
  endmethod
  method posglobal(xx%,yy%)
    x=xx
    y=yy
    local p:tframe=prev
    while p
      x:-p.x
      y:-p.y
      p=p.prev
    wend
  endmethod

  method get%()
    gx=x
    gy=y
    gw=w
    gh=h
    vx=x
    vy=y
    vw=w
    vh=h
    local p:tframe=prev
    while p
      gx:+p.x
      gy:+p.y
      if (vx<0) then
        vw:+vx
        vx=0
      endif
      if (vy<0) then
        vh:+vy
        vy=0
      endif
      if (vx+vw>p.w) then vw=p.w-vx
      if (vy+vh>p.h) then vh=p.h-vy
      vx:+p.x
      vy:+p.y
      p=p.prev
    wend
    return (vw>0) and (vh>0)
  endmethod

  method upd%(ev:tev)
    if active and (active<>self) then return false
    if not get() then
      if ev.last then
        opt:&~$3
        active=null
      endif
      return false
    endif

    if ev.area(vx,vy,vw,vh) then
      opt:|$1
      if ev.first then
        active=self
        opt:|$2
        ox=gx-ev.x
        oy=gy-ev.y
      endif
      if (ev.last&$1) and (active=self) then opt:~$80
    else
      opt:&~$1
    endif

    if ev.last then
      opt:&~$2
      active=null
    endif
    return true
  endmethod
endtype

type tframe_empty extends tframe
  method upd%(ev:tev)
'    return super.upd(ev)
super.upd(ev)
if opt&$2 then posglobal ev.x+ox,ev.y+oy
'get
'if (vw<0) then x=-w+1
'if (vh<0) then y=-h+1
  endmethod

  method draw()
    if not get() then return
    setviewport vx,vy,vw,vh
if opt&$2 then setcolor 255,255,255 else setcolor 0,255,0
'setalpha 0.5
'drawrect gx,gy,gw,gh
'setalpha 1
    drawbox gx,gy,gw,gh
setviewport 0,0,canw,canh
drawtext bin(opt),gx,gy
  endmethod
endtype

type tframe_but extends tframe
  field txt$,tx%,ty%

  method set(t$)
    txt=t
    tx=(w-textwidth(txt))/2
    ty=(h-textheight(txt))/2
  endmethod

  method upd%(ev:tev)
    return super.upd(ev)
  endmethod

  method draw()
    if not get() then return
    setviewport vx,vy,vw,vh
    if (opt&$1) then setcolor 0,96,96 else setcolor 0,0,128
    if (opt&$2) then setcolor 0,128,128' else setcolor 128,0,0
    drawrect gx+1,gy+1,gw-1,gh-1
'    if (opt&$1) then setcolor 255,255,255 else setcolor 128,128,128
if (opt&$80) then drawcbox gx,gy,gw,gh,$00008888,$0000ffff else drawcbox gx,gy,gw,gh,$0000ffff,$00008888
    setcolor 255,255,255
    drawtext txt,gx+tx,gy+ty
  endmethod
endtype

type tframe_win extends tframe
  field border%=12

  method upd%(ev:tev)
    super.upd(ev)
    if (opt&$2) then
      if (ev.down&$1) then posglobal ev.x+ox,ev.y+oy
'      if (ev.down&$2) then w=(ev.x-gx)'+(ev.x+ox-gx)
      if (ev.down&$2) then
        w:+ev.mx
        h:+ev.my
      endif
    endif
  endmethod

  method draw()
    if not get() then return
    setviewport vx,vy,vw,vh
    setcolor 0,0,0
    drawrect gx+1,gy+1,gw-2,gh-2
    setcolor 255,255,255
    drawbox gx,gy,gw,gh
    drawline gx+1,gy+border,gx+gw-1,gy+border,false
    drawline gx+gw-border,gy+1,gx+gw-border,gy+gh-1,false
    drawline gx+gw-1,gy+gh-border,gx,gy+gh-border,false
    drawline gx+border,gy+gh-1,gx+border,gy,false
  endmethod
endtype

function sorttframe(f:tframe[])
  if not f[0].active or (f[0].active=f[0]) then return
  local a%=f.length
  while a
    a:-1
    if (f[a]=f[0].active) then exit
  wend
local l%=a
  for local b%=a until f.length'-1
'if f[b].prev=f[0].active.prev then
if f[b].lvl<=f[l].lvl then
    local x:tframe=f[b]
    f[b]=f[l]
    f[l]=x
l=b
endif
  next
endfunction

'-----------------------------------------

'global ev:tev_old=new tev_old
global ev:tev=new tev
global canw%=clientwidth(can)
global canh%=clientheight(can)

global tf:tframe[6]
tf[0]=new tframe_empty
tf[0].reset 50,50,canw-100,canh-100
tf[0].upd ev
tf[1]=new tframe_empty
tf[1].reset 50,30,canw-170,canh-170,tf[0]
tf[2]=new tframe_but
tf[2].reset 20,0,90,20,tf[1]
tframe_but(tf[2]).set "Hello"
tf[3]=new tframe_but
tf[3].reset 20,30,90,20,tf[1]
tframe_but(tf[3]).set "aha"
tf[4]=new tframe_win
tf[4].reset 60,5,130,80,tf[1]
tf[5]=new tframe_but
tf[5].reset 10,4,50,40,tf[4]
tframe_but(tf[5]).set "win"

showgadget win

setclscolor 64,64,64
global timer:ttimer=createtimer(25)
repeat
  waitevent
'printevent

  select currentevent.id
  case event_windowclose  exit
  case event_gadgetpaint,event_timertick
    cls
for local a%=0 until tf.length
'for local a%=tf.length-1 to 0 step-1
tf[a].draw
next
setviewport 0,0,canw,canh
'    ev.draw
    flip

  default
    ev.upd
for local a%=tf.length-1 to 0 step-1
'for local a%=0 until tf.length
tf[a].upd ev
next
sorttframe tf
  endselect
forever



und was funktioniert aber was ich nochmal vereinfacht haben wollte.......oh mann ich bleibe bei assembler, weil da wesentlich mehr möglich ist....
Code: [AUSKLAPPEN]

 äithink its some sort of the same problem as before
'check tframe if window in window
superstrict
framework sj.all2
import brl.graphics
import brl.glgraphics
import brl.max2d
import brl.glmax2d
import brl.d3d7max2d
'import brl.freetypefont
'import brl.bmploader
'import brl.tgaloader
'import brl.jpgloader 'noneed
'import brl.pngloader 'noneed
'import brl.freeaudioaudio
'import brl.wavloader
'import brl.oggloader
'include "units2\sys.bmx"
'include "units2\gadget.bmx"

global win:twin=createwin("New",0,0,800,600,15+window_hidden)
win.center
win.reset

global can:tcan=createcan(0,0,win.cw,win.ch,win.g)

win.kid=can.g
win.show
win.activate

sethotkeyevent key_x  ,modifier_alt,createevent(event_windowclose,win.g)
sethotkeyevent key_esc,0           ,createevent(event_windowclose,win.g)

'------------------------------------------

global framepos%[4]
global framearea%[4]

type tframe
  field pos%[4]
  field prv:tframe

  method get()
    intmov framearea,pos,4
    intmov framepos,pos,4
    local s:tframe=prv
    while s
      framepos[0]:+s.pos[0]
      framepos[1]:+s.pos[1]
      framearea[0]:+s.pos[0]
      framearea[1]:+s.pos[1]
      if (framearea[0]<s.pos[0]) then
        framearea[2]:-s.pos[0]-framearea[0]
        framearea[0]=s.pos[0]
      endif
      if (framearea[1]<s.pos[1]) then
        framearea[3]:-s.pos[1]-framearea[1]
        framearea[1]=s.pos[1]
      endif
      if (framearea[0]+framearea[2]>s.pos[0]+s.pos[2]) then framearea[2]:-(framearea[0]+framearea[2])-(s.pos[0]+s.pos[2])
      if (framearea[1]+framearea[3]>s.pos[1]+s.pos[3]) then framearea[3]:-(framearea[1]+framearea[3])-(s.pos[1]+s.pos[3])
      s=s.prv
    wend
  endmethod
endtype

function freekern(krn:tkern var)
  krn.closeall
  krn=null
endfunction

type tdkern
  field tag%
  field data:object[]
  field on:object(krn:tkern)
  field off:object(krn:tkern)
  field done:object(krn:tkern)
  field call:object(krn:tkern)[]
endtype

const kern_break%=$1 'at checkall,updateall
type tkern
  field data:tdkern[]
  field now%
  field opt%

  method open(init2:object(krn:tkern)=null,done2:object(krn:tkern)=null,on2:object(krn:tkern)=null,off2:object(krn:tkern)=null)
    if data.length and data[now].off then data[now].off self
    now=data.length
    data=data[..now+1]
    data[now]=new tdkern
    data[now].on=on2
    data[now].off=off2
    data[now].done=done2
    if init2 then init2 self
    if on2 then on2 self
  endmethod

  method close(nr%)
    if not data.length then return
    local n%=now
    if (nr=n) and data[n].off then data[n].off self
    now=nr
    if data[nr].done then data[nr].done self
    for local a%=nr until data.length-1
      data[a]=data[a+1]
    next
    data=data[..data.length-1]
    if (nr=n) and data[nr].on then data[nr].on self
  endmethod

  method closeall()
    if not data.length then return
    if data[now].off then data[now].off self
    for now=0 until data.length
      data[now].done self
    next
    data=data[..0]
  endmethod

  method add(call2:object(krn:tkern))
    data[now].call=data[now].call[..data[now].call.length+1]
    data[now].call[data[now].call.length-1]=call2
  endmethod

  method find%(callnr%,prc:object(krn:tkern))
    for local a%=0 until data.length
      if (data[a].call[callnr]=prc) then return a
    next
    return -1
  endmethod

  method move(pos1%,pos2%)
    if not data.length then return
    local dir%=1
    if (pos1>pos2) then
      dir=pos1
      pos1=pos2
      pos2=dir
      dir=-1
    endif

    if (now>=pos1) and (now<pos2) then
      if data[now].off then data[now].off self
      now:+dir
      if data[now].on then data[now].on self
    endif

    pos2:-1
    while (pos1<=pos2)
      local e:tdkern=data[pos1]
      data[pos1]=data[pos1+1]
      data[pos1+1]=e
      pos1:+dir
    wend
  endmethod

  method upd(nw%,call%)
    now=nw
    if (call<data[nw].call.length) and data[nw].call[call] then data[nw].call[call] self
  endmethod

  method updall(dir%,call%)
    if not data.length then return
    opt:&~kern_break
    local nw%=now
    now=0
    if (dir<0) then now=data.length-1
    repeat
      if (call<data[now].call.length) and data[now].call[call] then data[now].call[call] self
      now:+dir
    until (now=data.length) or (now=-1) or (opt&kern_break)
    now=nw
  endmethod
endtype

const win_side%=$1+$2+$4+$8
const win_move%=$10
const win_size%=$20
type tkwin
  field frame:tframe=new tframe
  field opt%

  method upd(krn:tkern,e:tev)
    if (e.down=0) then
      opt:&~(win_side+win_move+win_size)
      return
    endif
    if (opt&(win_move+win_size)) then
      krn.opt:|kern_break
      return
    endif
    opt:&~(win_side+win_move+win_size)
    if not e.first then return
    if not e.area(framepos[0],framepos[1],framepos[2],framepos[3]) then return
    krn.opt:|kern_break
    krn.move krn.now,krn.data.length-1
  endmethod

  method move(krn:tkern,e:tev)
    if (opt&win_move=0) then
      if e.first=1 then
        if not e.area(framepos[0]+10,framepos[1]+10,framepos[2]-20,framepos[3]-20) then
          opt:|win_move
          frame.pos[0]:+e.mx
          frame.pos[1]:+e.my
        endif
      endif
    else
      frame.pos[0]:+e.mx
      frame.pos[1]:+e.my
    endif
  endmethod
endtype

function drawkwin()
if kern.now then
  setcolor 128,0,0
else
  setcolor 0,128,0
endif
  drawrect framepos[0],framepos[1],framepos[2],framepos[3]
  setcolor 255,255,255
  drawbox framepos[0],framepos[1],framepos[2],framepos[3]
  drawbox framepos[0]+10,framepos[1]+10,framepos[2]-20,framepos[3]-20
endfunction

'------------------------------------------

global ev:tev=new tev
global kern:tkern=new tkern

function clock_init:object(krn:tkern)
  krn.data[krn.now].data=krn.data[krn.now].data[..1]
  krn.data[krn.now].data[0]=new tkwin
endfunction
function clock_upd:object(krn:tkern)
  tkwin(krn.data[krn.now].data[0]).frame.get
  tkwin(krn.data[krn.now].data[0]).upd krn,ev
  if (kern.opt&kern_break=0) then return null
  tkwin(krn.data[krn.now].data[0]).move krn,ev
'  tkwin(krn.data[krn.now].data[0]).size krn,ev
endfunction
function clock_draw:object(krn:tkern)
  tkwin(krn.data[krn.now].data[0]).frame.get
  setviewport framearea[0],framearea[1],framearea[2],framearea[3]
'  setorigin framearea[0],framearea[1]
  drawkwin
drawtext "just a simple test here",framepos[0],framepos[1]
drawtext framepos[0]+":"+framearea[0],framepos[0],framepos[1]+10
endfunction

kern.open clock_init
tkwin(kern.data[kern.now].data[0]).frame.pos[2]=100
tkwin(kern.data[kern.now].data[0]).frame.pos[3]=100
kern.add clock_upd
kern.add clock_draw

kern.open clock_init
'tkwin(kern.data[kern.now].data[0]).frame.prv=tkwin(kern.data[0].data[0]).frame
tkwin(kern.data[kern.now].data[0]).frame.pos[0]=20
tkwin(kern.data[kern.now].data[0]).frame.pos[1]=20
tkwin(kern.data[kern.now].data[0]).frame.pos[2]=100
tkwin(kern.data[kern.now].data[0]).frame.pos[3]=100
kern.data[kern.now].tag=1
kern.add clock_upd
kern.add clock_draw

repeat
  waitgadgetsystem
'printevent

  select win.upd()
  case event_windowclose  exit
  endselect

  ev.upd
if ev.key=key_space then
  kern.move 0,1
endif
  kern.updall -1,0

  select can.upd()
  default
    setviewport 0,0,can.w,can.h
    cls
    kern.updall 1,1
    flip
  endselect
forever

BladeRunner

Moderator

BeitragSo, Okt 05, 2014 7:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Deine aktuelle Frage ist: Wie kann man Methoden?
Dieser Satz kein Verb.
Du solltest vielleicht erst mal schlafen, und dann deine Frage stellen.

Wenn Du Methoden aufrufen willst, bedenke dass sie Objektgebunden sind.
Eine Type.method() ergibt einen Fehler, ein Typeinstanz.method() läuft einwandfrei.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Xeres

Moderator

BeitragSo, Okt 05, 2014 10:58
Antworten mit Zitat
Benutzer-Profile anzeigen
~VERSCHOBEN~
Dieser Thread passte nicht in das Forum, in dem er ursprünglich gepostet wurde.

Bitte achte in Zukunft selbst auf das richtige Subforum, die Benutzung von Code Tags und eine deutliche Fragestellung.
Ich hätte von deinen ersten drei Beiträgen eher auf einen Bot geschlossen als auf irgendwas anderes...
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)

DAK

BeitragSo, Okt 05, 2014 20:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn du Probleme mit Deutsch hast, und Englisch offensichtlich deine bessere Sprache ist, dann würde ich dir raten das englische BlitzBasic-Forum zu verwenden. Vielleicht fällt es dir dort einfacher deine Fragen so zu stellen, dass sie verstanden werden.

Zu den Fragen selbst: bitte poste nicht dein ganzes Programm, sondern nur den Teil, bei dem du Hilfe brauchst. Es hat hier keiner Lust mehrere hundert Zeilen kryptischen Code nach Fehlern zu durchforsten.

If you have problems with German and your English is better, maybe try posting your questions to the english BlitzBasic-Board. Maybe it will be easier for you to word your questions in an understandable way.

At your question: Please do not post your whole program, but only the part that you need help with. Noone here wants to wade through a few hundred lines of cryptic code to find your bugs.
Gewinner der 6. und der 68. BlitzCodeCompo
 

sinjin

BeitragDi, Okt 07, 2014 22:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Sorry nochmal, ich hätte wirklich nicht nach der Party noch was Posten sollen Wink

Und wenn ich nur die Sort-Funktion gepostet hätte, wüsste keiner was ich eigentlich vorhabe, gut, ich hätte den Code etwas kürzen können, alles andere läuft ja auch, es geht mir nur darum wie Windows sortiert werden.

DAK

BeitragMi, Okt 08, 2014 10:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Was man in dem Fall tut ist beschreiben, was du tun willst, und dann nur den Code posten, mit dem du Hilfe brauchst.

Alles, was wir von deinem Programm außerhalb der Sortierfunktion wissen brauchen ist Folgendes:
-Nach welchen Kriterien willst du die Elemente sortieren?
-Wie soll Input und Output der Funktion ausschauen?
Gewinner der 6. und der 68. BlitzCodeCompo

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group