Methode evaluieren ?

Zugriff, Engines, Konvertierung. Von ADS über DBF bis zu SQL.

Moderator: Moderatoren

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

Methode evaluieren ?

Beitrag von AUGE_OHR »

hi,

Ich bin dabei meine Xbase++ activeX Mediaplayer Engine "aufzubohren",
damit ich verschiedene OCX verwenden kann. Nun hab ich den M$ v6.4x,
v9/10 fertig und VLC v0.86a sowie M$ v11.x in Arbeit.

leider werden "unterschiedliche" Methode verwendet sodas ich bislang zu
einer DO CASE gegriffen habe ... das wird aber immer mehr ...

Nun überlege ich das ganze in ein Array oder DBF zu packen, was bei
"Function" ja ken Problem ist, aber wie evaluiere ich den eine Methode ?

Code: Alles auswählen

PRIVATE cDummy
...
   cDummy := oWMP:play()
...
   eval(cDummy)             // ???
gruss by OHR
Jimmy
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9367
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 102 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Beitrag von Tom »

Mmh. Vielleicht verstehe ich Deine Frage ja falsch.

Code: Alles auswählen

bDummy := {||oWMP:play()}
eval(bDummy)             
Herzlich,
Tom
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15697
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hi,

wie man es evaluiert hat ja Tom gezeigt, ich vermute mal du meinst aber, ob du ein oObject in der DBF speichern kannst, dass dann wieder eingelesen und evaluiert werden kann. Ehrlich gesagt keine Ahnung.
Ausprobieren.
Gruß
Hubert
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12909
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 46 Mal

Beitrag von AUGE_OHR »

hi,
Tom hat geschrieben: Mmh. Vielleicht verstehe ich Deine Frage ja falsch.

Code: Alles auswählen

bDummy := {||oWMP:play()}
eval(bDummy)             
codeblock ... hab mal wieder ein Brett vor Kopf gehabt ](*,)

danke, gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12909
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 46 Mal

Beitrag von AUGE_OHR »

hi,
brandelh hat geschrieben: ich vermute mal du meinst aber, ob du ein oObject in der DBF speichern
kannst, dass dann wieder eingelesen und evaluiert werden kann. Ehrlich gesagt keine Ahnung.
Ausprobieren.
ein Object selbst wohl nicht, aber ich muss die "Methode" als String für
den Codeblock ja erst "zusammenbauen" was kein Problem sein sollte...

gruss by OHR
Jimmy
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9367
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 102 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Beitrag von Tom »

Codeblock zusammenbauen:

Code: Alles auswählen

bBlock := &("{||dosomething("+Str(nNumber)+")}") usw.
Herzlich,
Tom
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12909
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 46 Mal

Beitrag von AUGE_OHR »

hi,

ich bin ein wenig verwirrt wegen EVAL( bBlock>, [<ExpressionList,...>] )

Code: Alles auswählen

...
AADD(::oMain:aAlarm,{cTime,{|| SHOWTERMIN(cTime,cMsg) }, cMsg,.F.})
...
EVAL(::aAlarm[I,2],  cTime,::aAlarm[I,3])
....
FUNCTION SHOWTERMIN( cTime, cMsg )
wieso muss ich "im" codeblock die Parameter angeben "UND" bei EVAL() ?
wie läst sich das "besser" lösen wenn es "mehr" Parameter werden ?
(evtl mit PValue() ? )

gruss by OHR
Jimmy
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15697
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hi Jimmy,

eigentlich definiert man im Codeblock (Compilerzeit) welche Parameter wohin gegeben werden und bei eval stellt man diese zur Ausführung dann zur Verfügung. Du hast in deinem Bespiel aber keine Parameter über den Codeblock übergeben, sondern zufällig vorhandene der Funktion verwendet. Das führt dazu, dass dein Codeblock abhängig ist, von der Funktion in der er ausgeführt wird.
Eigentlich geht das so (wenn man von Text ausgeht, sonst kann man die erste Zeile sparen):

Code: Alles auswählen

 cCode := "{|cZeit,dDate| Machwas(cZeit,dDate)}" 
// die Variablen cZeit,dDate sind nun local innerhalb dieses Codeblocks.
 bCode := &(cCode)
 eval(bCode, time(), date() ) // beliebige Funktionen oder Variablennamen ... 
 ? cZeit, cDate, "Variablen sind unabhängig von Codeblock"
Gruß
Hubert
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12909
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 46 Mal

Beitrag von AUGE_OHR »

hi,
brandelh hat geschrieben: Du hast in deinem Bespiel aber keine Parameter über den Codeblock übergeben, sondern zufällig vorhandene der Funktion verwendet. Das führt dazu, dass dein Codeblock abhängig ist, von der Funktion in der er ausgeführt wird.
ja ... jetzt "seh" ich das auch ... copy/paste ...
man sollte es also so schreiben :

Code: Alles auswählen

AADD(::oMain:aAlarm,{cTime,{|a,b| SHOWTERMIN(a,b) }, cMsg,.F.})
Nochmal zu den "Parametern" : wenn ich aber nun "viele" hätte würde
das ja wieder einen "Bandwurm" geben (auch bei EVAL) ...

wie kann man den "im codeblock" die Parameter "zählen" ?
hat da jemand mit PValue() experimentiert ?

gruss by OHR
Jimmy
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15697
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hi,

diese Funktion ist mir ja völlig unbekannt ... :shock: aber in der Anleitung steht:
Achtung
Die Funktion PValue() kann nicht innerhalb eines Codeblocks aufgerufen werden, sondern nur im Kontext von Funktionen, Prozeduren oder Methoden.
Ich frage mich jetzt ob das dann auch local Variablen sind, oder privates wie bei parameters. Aber im Codeblock geht es nicht.

Für einen Codeblock kannst du aber 1 Array als einen Parameter übergeben und innerhalb dann auswerten ... allerdings frag ich mich wie man das noch warten soll, wenn die Parameterleiste alleine schon mehr als eine Zeile ausmacht ...
Gruß
Hubert
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12909
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 46 Mal

Beitrag von AUGE_OHR »

hi,
brandelh hat geschrieben: Ich frage mich jetzt ob das dann auch local Variablen sind, oder privates wie bei parameters. Aber "im" Codeblock geht es nicht.
hm ... eine PRIVATE müsste man mit

Code: Alles auswählen

MSGBOX( IF(IsMemvar(PValue(1),MEMVAR_PRIVATE),"PRIVATE","LOCAL") )
raus bekommen (s.u.)
brandelh hat geschrieben: Für einen Codeblock kannst du aber 1 Array als einen Parameter übergeben und innerhalb dann auswerten
hm ja "im" Codeblock ein Array ... hm also vorhandens Array "umbaun"
brandelh hat geschrieben: ... allerdings frag ich mich wie man das noch warten soll, wenn die Parameterleiste alleine schon mehr als eine Zeile ausmacht ...
das war eher eine theoretische Frage "was-wäre-wenn"

zu den Parameter und PValue() vielleicht noch der Nachtrag mit
folgender Construktion :

Code: Alles auswählen

//
// NEW : 3st parameter "c"
//
AADD(::oMain:aAlarm,{cTime,{|a,b,c| SHOWTERMIN(a,b,c) }, cMsg,.F.})
...
//
// EVAL "nur" mit 2 Parameter
//
EVAL(::aAlarm[I,2],     cTime,::aAlarm[I,3])
//
//
//
FUNCTION SHOWTERMIN()
LOCAL oThread := Thread():new()
LOCAL i,iMax
LOCAL aVar := {}

   iMax := PCOUNT()                // = 2
   FOR i = 1 TO iMax
      AADD(aVar,PValue(i) )
      MSGBOX( IF(IsMemvar(PValue(i),MEMVAR_PRIVATE),;
                         "PRIVATE","LOCAL") )
   NEXT

   oThread:start( "SHOWMSG", aVar )

RETURN NIL
draus folgt Parameter "Anzahl" Codeblock >= "Anzahl" EVAL Parameter
d.h. die "Anzahl" muss nicht "gleich" sein ( was mir hilft )

trotzdem werde ich wohl deinem Rat folgen und meine "Alarm" Class
umschreiben damit die das Array, mit Array "im" Codeblock, verwendet
statt einzelne Parameter.

gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12909
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 46 Mal

Beitrag von AUGE_OHR »

hi,

so hier nun eine Array Version :

Code: Alles auswählen

#define AL_TIME            1
#define AL_MSG             2 
#define AL_BLOCK         3
//
// im codeblock nur noch 1 parameter "aItem"
//
AADD(::oMain:aAlarm,{cTime,cMsg,{|aItem| SHOWTERMIN(aItem) }, .F.})
//
// "item" Elemente im Array als parameter
//
EVAL(  ::aAlarm[i,AL_BLOCK],;
        { ::aAlarm[i,AL_TIME], ::aAlarm[i,AL_MSG] } )
//
// 
//
FUNCTION SHOWTERMIN( aVar )
...
   cTime := aVar[AL_TIME]
   cMsg  := aVar[AL_MSG]
...
damit gibt es dann auch keinen "Bandwurm" mehr bei den Parameter :)

gruss by OHR
Jimmy
Antworten