Parameter "im" Codeblock [erledigt]

Klassen, Objekte, Methoden, Instanzen

Moderator: Moderatoren

Antworten
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Parameter "im" Codeblock [erledigt]

Beitrag von AUGE_OHR »

hi,

Code: Alles auswählen

bblock := "{|"+a+","+b+"| tuwas(a,b) }
wie bekomme ich "a" und "b" als "Parameter" in den Codeblock ?
Zuletzt geändert von AUGE_OHR am Do, 28. Jul 2011 15:50, insgesamt 1-mal geändert.
gruss by OHR
Jimmy
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: Parameter "im" Codeblock

Beitrag von georg »

Hallo, Jimmy -


wahrscheinlich verstehe ich Deine Frage nicht, aber:

bBlock := {|a, b| TuWas(a, b)}
Eval(bBlock, cVar1, nVar2)

Oder willst Du den Inhalt von a bzw. als Parameter haben?

bBlock := "{|" + a + ", " + b + "| TuWas(" + a + ", " + b + ")}"
bBlock := &bBlock

In Deinem Code-Beispiel würden die beiden Werte in den | ignoriert, da sie nicht in der Parameterliste von TuWas() auftauchen.


Gruss,

Georg
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Parameter "im" Codeblock

Beitrag von brandelh »

AUGE_OHR hat geschrieben:

Code: Alles auswählen

bblock := "{|"+a+","+b+"| tuwas(a,b) }
wie bekomme ich "a" und "b" als "Parameter" in den Codeblock ?

Code: Alles auswählen

cblock := "{|a,b| tuwas(a,b) } // locale variabel a und b im Codeblock, Inhalt kommt zur Laufzeit
bblock := &(cblock) // codeblock wartet auf Arbeit ...
Eval( bBlock, Var1, Var2 )  // Var1 -> local a   |   Var2 -> local b
Gruß
Hubert
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Parameter "im" Codeblock

Beitrag von AUGE_OHR »

hi,

danke für euer Antworten, aber das ist nicht das was ich meine... ich habe mich da wohl nicht richtig ausgedrückt.

Ich bekommen einen WM_ Event, im GUI Thread, den ich an Xbase++ "weiterleiten" will um einen Codeblock auszuführen.
nun kann ich ja "im" Codeblock "zwischen" den "|" ( Pipe ) auch Parameter haben ( hier a,b )

Code: Alles auswählen

{ |a,b| Tuwas(a,b) } 
die Frage ist wie ich dem Codeblock die Parameter a,b , zwischen den "|" schicken kann den der wird ja im "Main" Thread evaluiert.
gruss by OHR
Jimmy
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16502
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Parameter "im" Codeblock

Beitrag von Martin Altmann »

Moin Jimmy,
genau das macht Huberts Antwort:

Code: Alles auswählen

cblock := "{|a,b| tuwas(a,b) } // locale variabel a und b im Codeblock, Inhalt kommt zur Laufzeit
bblock := &(cblock) // codeblock wartet auf Arbeit ...
Eval( bBlock, Var1, Var2 )

Das, was Du als Var1 angibst, wird im Codeblock als Vriable a übernommen. Analog mit Var2, das ist dann das b

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Parameter "im" Codeblock

Beitrag von AUGE_OHR »

Martin Altmann hat geschrieben:

Code: Alles auswählen

cblock := "{|a,b| tuwas(a,b) } // locale variabel a und b im Codeblock, Inhalt kommt zur Laufzeit
bblock := &(cblock) // codeblock wartet auf Arbeit ...
Eval( bBlock, Var1, Var2 )

Das, was Du als Var1 angibst, wird im Codeblock als Vriable a übernommen. Analog mit Var2, das ist dann das b
Yup, aber wie bekomme ich vom GUI Thread die Parameter a,b in den Main Thread ?
gruss by OHR
Jimmy
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16502
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Parameter "im" Codeblock

Beitrag von Martin Altmann »

Nun,
das ist eine völlig andere Geschichte 8)
Vielleicht mittels einer globalen Variable, in der Du die Referenz auf die entsprechende Klasse (oder den Codeblock selber) vorhältst?
Oder per Message?

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: Parameter "im" Codeblock

Beitrag von UliTs »

Kannst Du den Code, der der Bearbeitung des WM_ Event dient, zeigen?

Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Parameter "im" Codeblock

Beitrag von brandelh »

Hi,

Pablo hat mal was gesagt, dass man manche Sachen im GUI Thread laufen lassen muss und dafür gäbe es in der ot4xb einen anderen dll Aufruf.
Ich habe das aber nie gebraucht, also am Besten Pablo fragen ;-)
Gruß
Hubert
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Parameter "im" Codeblock

Beitrag von AUGE_OHR »

Martin Altmann hat geschrieben:das ist eine völlig andere Geschichte 8)
aber das meine ich mit den Parameter "im" Codeblock ( weiss nicht wie ich das sonst bezeichnen soll )
Martin Altmann hat geschrieben:Vielleicht mittels einer globalen Variable, in der Du die Referenz auf die entsprechende Klasse (oder den Codeblock selber) vorhältst?
das wird nicht gehen den der GUI Thread "weiss" nichts vom "Main" Thread.

bei activeX habe ich o:subscribeEvent() um ein Event "abzufangen".
Wenn ich aber nun selbst das activeX schreibe muss ich die Parameter "im" Codeblock "bereitstellen"
Martin Altmann hat geschrieben:Oder per Message?
hm ... du bringst mich da auf eine Idee ... muss ich evaluieren...
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Parameter "im" Codeblock

Beitrag von AUGE_OHR »

brandelh hat geschrieben:Pablo hat mal was gesagt ...
das Problem ist, das ich öfter nicht "verstehe" was er damit meint ;)

Ja, das Control läuft im GUI Thread wo ich auch die WM_ Event ( MW_Notify ) "abfangen" kann.

ein DblClick oder ENTER kann ich "intern" abfangen oder einen Slot o:itemSelected einführen den ich mit einem Codeblock bestücke.
nun hätte aber, z.b. ListBox "nur"

Code: Alles auswählen

:itemSelected := {| uNIL1, uNIL2, self | ... }
d.h. "nur" das Object (Self ).

dummerweise "weiss" aber Windows nichts von Objecten sondern ich bekomme nur Pointer und Handles also muss ich beide "übergeben" um dann aus der Structure die Daten zu bekommen. ich diesem "Beispiel" wäre es also uNIL1 und uNIL2 die Xbase++ "abfängt" und "intern" verarbeiten müsste ...
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Parameter "im" Codeblock

Beitrag von AUGE_OHR »

hi,

ich "denke" ich habe es nun verstanden

Code: Alles auswählen

   elseif nMsg == WM_NOTIFY
      if lp == 0
         // must not happen
         return NIL
      end
      if( PeekDWord(lp) == ::hDPick )
        return ::_HandleListViewNotify_( PeekDWord(lp,8) , lp )
      end
      return NIL
ich erhalte bei WM_NOTIFY den Pointer ( lp )

Code: Alles auswählen

INLINE METHOD _HandleListViewNotify_( notify_code , p ) // do not call outside GUI thread
       local b := iif( ::m_ht==NIL,NIL, _hdict_getprop(::m_ht, cPrintf("LV%08.8X.notify",notify_code)) )
       if Valtype(b) =="B"
          return Eval(b, Self , notify_code , p )
       end
       return NIL
der Codeblock der in _HandleListViewNotify_ evaluiert wird ist aber nicht "mein" Codeblock sondern der "interne"

Code: Alles auswählen

INLINE METHOD SetLvNotifyCB( notify_code , b )
       local k,r
       local np  := PCount()
       if Valtype(notify_code) != "N" ; return NIL ; end
       k := cPrintf("LV%08.8X.notify",notify_code)
       r := delegated_eval( {|| iif( ::m_ht == NIL,, _hdict_GetProp(::m_ht,k)) } )
       if np > 1
          if Valtype(b) == "B"
             delegated_eval( {|| iif( ::m_ht == NIL,, _hdict_SetProp(::m_ht,k,b)) } )
          else
             delegated_eval( {|| iif( ::m_ht == NIL,, _hdict_RemoveProp(::m_ht,k)) } )
          end
       endif
       return r
der so aussehen könnte

Code: Alles auswählen

::SetLvNotifyCB( DTN_WMKEYDOWN      ,;
                 {|o,notify,lp| ::OnDummy(o,lp,"DTN_WMKEYDOWN"   ) } )
ich könnte also nun in der Method OnDummy() die "Aktion" einbauen ... aber damit wäre die ja "hard" codiert.

ich muss wohl nun per

Code: Alles auswählen

::SetLvNotifyCB( DTN_WMKEYDOWN      ,;
                 {|o,notify,lp| PostAppEvent(xbeMy_Event,lp ,o,Self)   ) } )
das ganze an

Code: Alles auswählen

INLINE METHOD HandleEvent(nEvent,mp1,mp2)
   DO CASE
      case nEvent == xbeMy_Event
         return ::MyCodeblock( mp1 , mp2 )
übergeben damit er den Codeblock, im zugewiesenen "Slot", evaluiert

Code: Alles auswählen

INLINE METHOD MyCodeblock(mp1, mp2)
       if Valtype( ::MyCodeblock ) == "B"
          eval(  ::MyCodeblock, mp1 , mp2 , Self)
       end
       return NIL
somit bekomme ich nun die Parameter mp1, mp2 "in" die "|" Pipe

Code: Alles auswählen

Proc Main

  oApp := MyClass():New():Create()
  oApp:MyCodeblock := {|mp1,mp2,oSelf| tuwas(mp1,mp2)} 
das "scheint" ja nun auch zu klappen ... ob es "richtig" ist ?
da muss ich wohl noch mal "Guru" Pablo fragen ...
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Parameter "im" Codeblock [erledigt]

Beitrag von AUGE_OHR »

fast getroffen ...

Code: Alles auswählen

::SetLvNotifyCB( DTN_WMKEYDOWN      ,;
    {|o,notify,lp| PostAppEvent(xbeMy_Event,lp ,o,Self)   ) } )
es "fehlt" noch was "dazwischen" ... die STRUCTURE.

ich dachte ich könnte die aus Self , was == o ist, beziehen, aber wenn es "ankommt" ist es (schon) "leer".
ich muss es also als Parameter von PostAppEvent() senden damit ich "den" Zustand zu dem Zeitpunkt bekomme

Code: Alles auswählen

::SetLvNotifyCB( DTN_WMKEYDOWN      ,;
    {|o,notify,lp, st|  st := MySTRUCTURE():New(),; // STRUCTURE anlegen
       st:_write_(lp,0,-1)                       ,; // Trick Pablo Pointer setzten
       PostAppEvent(xbeMy_Event,lp ,st,Self)   ) } )
gruss by OHR
Jimmy
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: Parameter "im" Codeblock [erledigt]

Beitrag von UliTs »

Eine Frage: Was ist ein "GUI-Thread"?
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Parameter "im" Codeblock [erledigt]

Beitrag von AUGE_OHR »

UliTs hat geschrieben:Eine Frage: Was ist ein "GUI-Thread"?
im GUI Thread läuft im Prinzip alles was "echtes" Windows ist wozu auch ActiveX und "native" Controls gehören.

nun "sollte" der Xbase++ "Wrapper" die Events aus der Windows Queue holen und sie in die Xbase++ Event Loop überführen.
Probleme gibt es auch mit DBF die man "in" einem solchen Thread öffnet da sie ja in einer anderen Workspacelist() sind. ( Beispiel Codejock Calender )

deshalb tüftele ich an den Codeblock rum, den ich dann in einen "anderen" Thread evaluieren will.
gruss by OHR
Jimmy
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Parameter "im" Codeblock [erledigt]

Beitrag von brandelh »

Wir generieren ein Xbase++ GUI Programm.
Dieses Programm läuft in einem Thread, im Hintergrund wird aber für die Anzeige der GUI Elemente automatisch
ein weiterer Thread gestartet, den nennt man (wir?) Gui-Thread.
Es muss noch einen weiteren geben, ob der sich aber um die Speicherverwaltung oder was anderes kümmert weiß ich nicht.
Gruß
Hubert
Antworten