Objecte dynamisch im Codeblock ?

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

Objecte dynamisch im Codeblock ?

Beitrag von AUGE_OHR »

hi,

wie man eine "String" für einen Codeblock zusammen baut ist ja wohl bekannt.

Code: Alles auswählen

cString := "{|| "+cBedingung+"}"
bBlock := &(cString)
nun kann ich in einem Codeblock aber auch Objecte als Parameter übergeben

Code: Alles auswählen

bBlock := {|| Machwas(oObject) }
aber wie bekomme ich die dynamisch zusammen gebaut ?
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: Objecte dynamisch im Codeblock ?

Beitrag von georg »

Guten Morgen, Jimmy -


relativ simpel:

Code: Alles auswählen

bBlock := {|oObject| Machwas(oObject) }
Eval(bBloc, xIrgendwas)

Oder war die Frage anders gemeint?


Gruss,

Georg
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen 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: Objecte dynamisch im Codeblock ?

Beitrag von UliTs »

Georgs Ansatz kann man auch problemlos dynamisch mittels Macro-Operator umsetzen:

Code: Alles auswählen

cString := "{|"+cParameter+"|"+cBedingung+"}"
bBlock := &(cString)
...
Eval( bBlock,oObject )
Es ist sowieso viel besser, wenn man auf externe Variablen innerhalb Codeblöcken verzichtet (bzw. verzichten kann :-) ). Das gelingt mir leider auch viel zu oft nicht.

Uli
-------
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: Objecte dynamisch im Codeblock ?

Beitrag von AUGE_OHR »

hi,

danke für eure Antworten.

es geht ja um eine FOR / NEXT Schleife wo ich den Codeblock zusammen bauen möchte.
nun hab ich "jeweils" Object die ich dynamisch zusammen bauen will d.h. beim EVAL() habe ich "nur" den Codeblock der das "jeweilige" Object enthält.

mein Workaround ist nun ein Array was ich mit den Objecten fülle. Ein Array Element kann ich dann in der FOR / NEXT "in" einen Codeblock einbauen.

btw. bei den Codeblöcken spreche ich von der xbpToolbar:additem()

***

ich hatte bei der Toolbar das Problem das ich ein Array von der Structure TBBUTTON verwenden sollte. Pablo hat nun für solche Fälle vorgesorgt

Code: Alles auswählen

oBtn := TBBUTTON():New()
pBtnArray := _xgrab( oBtn:_sizeof_() * button_count )
oBtn:_link_(  pBtnArray , .F. ) // link to the first item
nNo := 1
for nNo := 1 to button_count
   // .....assign member values

   GwstArrayNext( oBtn) // go to the next item
next
***

wenn ich also Element eines Array als Structur MEMBER oder Class iVar behandeln könnte ...

deshalb die Frage wie man da den Codeblock "behandelt" der die "Action" ( KEY ) des Button dann auslösen soll ?
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: Objecte dynamisch im Codeblock ?

Beitrag von UliTs »

AUGE_OHR hat geschrieben:es geht ja um eine FOR / NEXT Schleife wo ich den Codeblock zusammen bauen möchte.
...
btw. bei den Codeblöcken spreche ich von der xbpToolbar:additem()
Wo hast Du denn vorher von einer FOR /NEXT Schleife gesprochen ? :wink:
Laut Beschreibung von xBase++ liefert xbpToolbar:additem() ein XbpToolBarButton-Object zurück.
Ich sehe nicht, wie da ein Codeblock zugewiesen/benutzt wird. Ich vermute, Dein Codeblock wird ausgeführt, wenn auf den Button geklickt wird, richtig?
Werden dabei Parameter übergeben? Z.B. der Button selbst?

Code: Alles auswählen

{|oBtn|...}
Dann könnte man im Cargo-Feld individuelle Daten speichern, die dann innerhalb des Codeblocks zur Verfügung stehen.

Uli
-------
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: Objecte dynamisch im Codeblock ?

Beitrag von AUGE_OHR »

UliTs hat geschrieben:Wo hast Du denn vorher von einer FOR /NEXT Schleife gesprochen ? :wink:
ok, das hatte ich mit "dynamisch" gemeint
UliTs hat geschrieben:Laut Beschreibung von xBase++ liefert xbpToolbar:additem() ein XbpToolBarButton-Object zurück.
Ich sehe nicht, wie da ein Codeblock zugewiesen/benutzt wird. Ich vermute, Dein Codeblock wird ausgeführt, wenn auf den Button geklickt wird, richtig?
es geht nicht um xbpToolbar:additem() sondern um XbpToolBarButton:additem() was wiederum über den DropButton zu einem Menu kommt.

Code: Alles auswählen

XbpMenuBar():addItem(<aItem>)
<aItem> := { xCaption [, bAction, nStyle, nAttribute] }
wobei bAction wiederum ein Codeblock wäre.

nun kann ich ja mehrere DropButton haben und jedes hat ein Menu. ich brauche also "das" DropButton Object zu "dem" Menu.
ich habe noch alles im Array und suche nun nach der Caption "das" Element mit welches das DropButton Object "verwaltet":

Code: Alles auswählen

METHOD DXE_ToolBarButton:getItem( xItem )
LOCAL nNo
LOCAL oMenuItem  := NIL

   IF VALTYPE(xItem) = "N"
      nNo := ASCAN(::aButtonMenuItem,{|x| x[1] = xItem })
      IF nNo > 0
         oMenuItem := ::aButtonMenuItem[nNo]
      ENDIF

   ELSEIF VALTYPE(xItem) = "C"
      nNo := ASCAN(::aButtonMenuItem,{|x| x[2] = xItem })
      IF nNo > 0
         oMenuItem := ::aButtonMenuItem[nNo]
      ENDIF
   ENDIF

RETURN oMenuItem


p.s. Ich möchte bei meinen "native" Controls die vorgegebene Syntax nicht verändern ( wenn möglich)


***

noch mal eine Überlegung zu Objecten :
wenn man Objecte in ein Array aufnimmt ist das vermutlich wohl nur ein "Verweis" -> "Pointer" -> "Zahl"
die Frage wäre ob man über die "Zahl" -> "Pointer" -> wieder an den "Verweis" zum Object kommt ?
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: Objecte dynamisch im Codeblock ?

Beitrag von UliTs »

Hallo Jimmy,

leider verstehe ich vieles Deiner Antwort nicht. Ich vermute, weil ich selbst außer Button's bisher noch nicht in der Toolbar positioniert habe :? .

Ich vermute aber, dass Du auf "dynamische" Codeblöcke bzw. mit dem Macrooperator gebildete Codeblöcke verzichten kannst, weil laut Dokumentation bei Ausführung des Codeblock 3 Parameter, davon 2 mit Inhalt, übergeben werden:

Code: Alles auswählen

{|nMenuPos,uNil,oMenuBar|...}
Das heißt, mit Hilfe von oMenuBar und der angegebenen nMenuPos kannst Du auf den entsprechenden Eintrag zugreifen. Dort kannst Du bei Bedarf weitere Information z.B. in ::Cargo zur Verfügung stellen.

Zu Deinen Überlegungen zu Objekten:
Speichert man Objekte in einem Array werden nur die Verweise = Pointer auf die Objekte im Array gespeichert. Wird das Objekt später freigeben, bleibt jedoch der Verweis innerhalb des Objekt's bestehen, sofern man diesen nicht selbst z.B. auf NIL setzt. Deine Frage dazu verstehe ich nicht, da meiner Meinung Verweis = Pointer ist und man damit darauf zugreifen kann, wenn man auf das Array ebenfalls zugreifen kann :-) .

Uli
-------
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: Objecte dynamisch im Codeblock ?

Beitrag von AUGE_OHR »

UliTs hat geschrieben:

Code: Alles auswählen

{|nMenuPos,uNil,oMenuBar|...}
Das heißt, mit Hilfe von oMenuBar und der angegebenen nMenuPos kannst Du auf den entsprechenden Eintrag zugreifen.
ja, aber nur wenn "ich" die Parameter bereitstelle "im || " des Codeblock "bereitstelle" da wir ja über ein "native" Control reden.
UliTs hat geschrieben:Zu Deinen Überlegungen zu Objekten:
Speichert man Objekte in einem Array werden nur die Verweise = Pointer auf die Objekte im Array gespeichert. Wird das Objekt später freigeben, bleibt jedoch der Verweis innerhalb des Objekt's bestehen, sofern man diesen nicht selbst z.B. auf NIL setzt. Deine Frage dazu verstehe ich nicht, da meiner Meinung Verweis = Pointer ist und man damit darauf zugreifen kann, wenn man auf das Array ebenfalls zugreifen kann :-) .
ich habe ja nichts gegen Array aber es betrifft ja nicht nur eine Class sondern mehrere.

Ich habe eine Toolbar mit mehreren TTButtons -> 1st Array
ein TTButton kann eine Dropdown Menu haben -> 2nd Array
eine Menu hat nun meisten mehrere Element -> 3rd Array
innerhalb eines Menu Eintrag habe ich nun mein Codeblock der ausgeführt werden soll.

die 3 Array sind aber nicht in einer Class sondern in 3 entsprechenden Class an die "weiterleiten" muss ...

deshalb suche ich nach einer "anderen" Lösung wie diese

Code: Alles auswählen

oBtn := TBBUTTON():New()
pBtnArray := _xgrab( oBtn:_sizeof_() * button_count )
oBtn:_link_(  pBtnArray , .F. ) // link to the first item
for n := 1 to button_count
   // .....assign member values
   GwstArrayNext( oBtn) // go to the next item
next
das war nun das Codebeispiel wo ich überlegte ... und mir das ausgedacht habe :

Code: Alles auswählen

// statt Array
   ::aArray[nNo][_Caption]
   ::aArray[nNo][_Key]
   ::aArray[nNo][_Index]

// eine ot4xb Structure
BEGIN STRUCTURE MyArray
   MEMBER LPSTR     Caption DYNSZ cText
   MEMBER LPSTR     Key     DYNSZ cText
   MEMBER INT       Index
END STRUCTURE
hier erst mal "simple" nur für "Text" und "Integer". man kann aber alle von ot4xb unterstützten Typen verwenden.

nun ist eine ot4xb Structure ein Object und ich kann davon eine Xbase++ Class "ableiten" ( inherit )

Code: Alles auswählen

CLASS BigArray FROM MyArray
Method BigArray:Next()
Method BigArray:Prev()
Method BigArray:Goto()
...
und damit alles innerhalb einer Class machen.

mehr Informationen unter

http://www.xbwin.com
Array - Structure ( GwstArray )
ot4xb.public
6. September 2012

p.s. in der DXE_Toolbar v0.19 benutze ich noch die Arrays
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: Objecte dynamisch im Codeblock ?

Beitrag von UliTs »

AUGE_OHR hat geschrieben:
UliTs hat geschrieben:

Code: Alles auswählen

{|nMenuPos,uNil,oMenuBar|...}
Das heißt, mit Hilfe von oMenuBar und der angegebenen nMenuPos kannst Du auf den entsprechenden Eintrag zugreifen.
ja, aber nur wenn "ich" die Parameter bereitstelle "im || " des Codeblock "bereitstelle" da wir ja über ein "native" Control reden.
Die Parameter werden beim Aufruf des Codeblocks übergeben, da kannst Du nichts gegen unternehmen :D .
Wenn Du allerdings die Platzhalter für die Parameter im Codeblock nicht aufführst, kannst Du (natürlich) innerhalb des Codeblocks nicht darauf zugreifen :oops: :D .
Was Du mit native Control meinst, verstehe ich nicht.

Uli
-------
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: Objecte dynamisch im Codeblock ?

Beitrag von AUGE_OHR »

UliTs hat geschrieben:Die Parameter werden beim Aufruf des Codeblocks übergeben, da kannst Du nichts gegen unternehmen :D .

Was Du mit native Control meinst, verstehe ich nicht.
uuuuuupps ... ich hab es in diesem Thread wohl noch nicht erwähnt das sich das ganze auf mein "native" Toolbar Control bezieht.

deshalb muss "ich" in diesem Fall dafür sorgen das der User später "die" Objecte "im" Teil des Codeblock überhaupt erst bekommt.

Code: Alles auswählen

   ::oToolbar:buttonClick := {|oButton| MsgBox("Knopf [" + ;
                         LTRIM(STR(oButton:index ))+" "+ ;
                           Var2Char(oButton:caption)+ ;
                          "] angeklickt!")}


   ::SetLvNotifyCB( NM_CLICK,;
                   {|xbp,code,lp,st| st := NMMOUSE():New(), st:_write_(lp,0,-1),;
                   PostAppEvent(xbeMyTB_DBLCLK ,lp ,st,Self) , NIL } )


INLINE METHOD HandleEvent(nEvent,mp1,mp2)
   DO CASE
      CASE nEvent == xbeMyTB_DBLCLK
         RETURN ::OnbuttonClick(mp1, mp2)
...

    ENDCASE
RETURN NIL

INLINE METHOD OnbuttonClick(mp1, mp2)
LOCAL oClickBtn
LOCAL nIndex     := 0

   IF VALTYPE( ::buttonClick ) == "B"
      //
      // works fine ;)
      //
      EVAL( {|| nIndex    := ::GetTbInfo(mp1,mp2,Self),;
                oClickBtn := ::getItem(nIndex)         } )

      IF VALTYPE(oClickBtn) = "O"
      ELSE
         oClickBtn := DXE_ToolBarButton():New():create()
      ENDIF

      //
      // return DXE_ToolBarButton()
      //
      EVAL(    ::buttonClick, oClickBtn , NIL , Self)
   ENDIF
RETURN NIL
der "oClickBtn" ist nun der "oButton" wie du ihn im Helpfile findest.
DXE_ToolBarButton() sollte sich genau so wie XbpToolBarButton() verhalten.

ich hab praktisch alle Property und Method nach-gebaut nur

Code: Alles auswählen

:saveToolbar()
:restoreToolbar()
:customize()
hab ich nicht übernommen ... also 97% "fertig"
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: Objecte dynamisch im Codeblock ?

Beitrag von AUGE_OHR »

ich wollte ja den Testcode von Pablo hier veröffentlichen.
Voraussetzung : Antwort von Pablo auf "Array - Structure ( GwstArray )" ( s.o.)

Code: Alles auswählen

#include "ot4xb.ch"
//----------------------------------------------------------------------------------
proc main
local st := MyStruct():New()

? 'st:val := "Patata Frita"            -> ' , st:val := "Patata Frita"
? 'st:con                              -> ' , st:con
? "---"
? 'st:val := 123456                    -> ' , st:val := 123456
? 'st:con                              -> ' , st:con
? "---"
? 'st:val := SetAppWindow()            -> ' , st:val := SetAppWindow()
? 'st:con                              -> ' , st:con
? "---"
? 'st:val := NIL                       -> ' , st:val := NIL
? 'st:con                              -> ' , st:con
? "---"
? 'st:val := NIL                       -> ' , st:val := NIL
? 'st:con := _var2con("Patata Frita" ) -> ' , st:con := _var2con("Patata Frita" )
? '_con2var( st:con )                  -> ' , _con2var( st:con )
? 'st:val                              -> ' , st:val
? "---"


inkey(0)
return
//----------------------------------------------------------------------------------
BEGIN STRUCTURE MyStruct
   MEMBER LPXBASE val ; GWSTBACK ; MEMBER POINTER32 con
END STRUCTURE
//----------------------------------------------------------------------------------
WOW kann ich dazu nur sagen ;)

mehr dazu im Thread
http://www.xbwin.com
8. September 2012
ot4xb.public
"more Gwst / handle / Object"
gruss by OHR
Jimmy
Antworten