Seite 1 von 1

XbpCrt Multi Thread mit Tabpage ?

Verfasst: Di, 02. Jan 2007 8:25
von AUGE_OHR
hi,

bei alten Cl*pperanwendungen hat man ja oft ein "Menu" ( MenuTo )
aus dem man dann in die "SubMenu" der einzelnen Stammdaten kommt.

nun habe ich es bislang für Hybrid Anwendungen so gelöst, das für jeden
der Stammdaten ein Button als Menu vorhanden ist, von dem dann das
"SubMenu" als Thread im eigenen oCrt "Fenster" gestartet wird.

nun ist es mir beim "umschalten", minimieren/maximieren, zu "umständlich"
und ich denke da nun an 2 Möglichkeiten :

1.) "interner" Taskmanager für die verschiedenen oCrt "Fenster"
2.) die Thread oCrt "Fenster" auf einer Tabpage laufen lassen

Frage : hat jemand sowas schon mal mit oCrt "Fenstern" gemacht ?
Problem : eine "Ausgabe" darf nur im "aktiven" oCrt "Fenster" passieren,
d.h. die anderen Threads (minimiert) sind dann "deaktiviert" (kein timeout)

gruss by OHR
Jimmy

Fenstergestaltung

Verfasst: Di, 02. Jan 2007 18:19
von Rolf Ramacher
Hi Jimmy,

ich mache dies immer mit xbpdialog. Hierbei kannst du ja auch die Fenster sperren und wieder freigeben, und wieder aktivieren mit setappfocus.

Re: Fenstergestaltung

Verfasst: Di, 02. Jan 2007 19:27
von AUGE_OHR
hi,
Rolf Ramacher hat geschrieben: ich mache dies immer mit xbpdialog. Hierbei kannst du ja auch die Fenster sperren und wieder freigeben, und wieder aktivieren mit setappfocus.
die Tabpage selbst sind kein Problem.
Es fragt sich ob man Tabpage zu "steuern" von Threads nehmen könnte ?

gruss by OHR
Jimmy
p.s. es soll nur SDI werden.

Re: Fenstergestaltung

Verfasst: Di, 09. Jan 2007 0:45
von AUGE_OHR
hi,

also :
AUGE_OHR hat geschrieben: Es fragt sich ob man Tabpage zu "steuern" von Threads nehmen könnte ?
es sieht gut aus ! Der "Trick" an der Sache ist nun die verwendung einer
Crt Class mit Signal() (siehe Fordum Thread & Signal)

gruss by OHR
Jimmy

Verfasst: Di, 16. Jan 2007 9:18
von AUGE_OHR
hi,

so langsam bekomme ich die Dual-SDI Crt "Fenster" mit Tabpage hin.

Da ja jedes "Fenster" ein Thread ist, hat auch jedes "Fenster" seine
eigene WorkSpaceList(). Nun hab ich die Funktion aus dem Help File
genommen, aber das reicht bei weitem nicht aus sodas ich noch diverse
weiter Informationen absichere. Die Frage ist was man evtl. noch dazu
nehmen sollte was ich "vergessen" habe.

Code: Alles auswählen

FUNCTION  SaveWorkSpace(nSelect)
LOCAL aSaved  := {}
*LOCAL nSelect := Select()

// NEW just for debugging
LOCAL aWSL := WorkSpaceList()

   WorkSpaceEval( {|| AAdd( aSaved, SaveWorkArea() ) } )

// NEW my WorkSpaceListClose
   WSLclose()

RETURN { aSaved, nSelect }

*********************
FUNCTION  SaveWorkArea
LOCAL aWork   := {}

*   ALTD()
*   { ;
*   {  Select()   , {|x| DbSelectArea(x)} }, ;
*   {  OrdNumber(), {|x| OrdSetFocus(x) } }, ;
*   {  Recno()    , {|x| Dbgoto(x)      } }  }


   IF Select() > 0
      AADD(aWork,Select())
      AADD(aWork,ALIAS())
      AADD(aWork,Recno() )
      AADD(aWork,DBRelation(ALIAS()) )
      AADD(aWork,DBFilter() )
      AADD(aWork,DbInfo(DBO_SHARED))
   ELSE
      AADD(aWork,0)
      AADD(aWork,"")
      AADD(aWork,0)
      AADD(aWork,0)
      AADD(aWork,0)
      AADD(aWork,.F.)
   ENDIF

   IF OrdNumber() > 0
      AADD(aWork,OrdNumber())
   ELSE
      AADD(aWork,0)
   ENDIF

   AADD(aWork,DbScope(SCOPE_BOTH))

RETURN aWork
gruss by OHR
Jimmy

DbRelation() abspeichern

Verfasst: Di, 16. Jan 2007 21:16
von AUGE_OHR
hi,

in der Msg vorher hatte ich ja die WorkSpaceList() für jeden einzelnen
Thread "abgespeichert". Nun bin ich am Gegenstück und hab ein Problem
mit DbRelation() denn davon könnte ich ja mehrere haben ...

Also erstmal die Frage wie bekomme ich alle DbRelation() denn ich "weiss"
ja nicht wie viele dran hängen sodas ich nicht eine FOR/NEXT benutzen
kann ?

Angenommen ich hätte alle DbRelation(), welche Reihenfolge bei "Restore"
sollte man anwenden ?

Code: Alles auswählen

FOR i = 1 TO LEN(aSaveArray)
    SELECT (aSel[i})
    USE (aDBF[i])
    SET INDEX TO _alle_meine_indexe
    ORDSETFOCUS(aINDEX[i])
    GOTO(aRec[i])
...
    IF .NOT. EMPTY(aDbRelation[i] )
        was_jetzt_tun() 
    ENDIF
...
NEXT
Innerhalb der "ersten" FOR/NEXT kann ich es ja nicht "restoren" weil evtl.
die "Child-DBF" noch gar nicht geöffnet ist ... also noch eine "zweite" FOR/
NEXT Schleife ?

gruss by OHR
Jimmy

Verfasst: Mi, 17. Jan 2007 7:09
von Manfred
Hi Jimmy,

ich hoffe, dass ich Dich jetzt richtig verstehe. die Aliase kann man ja ermitteln und darüber kann man dann über (alias(nWert))->(Dbrlist()) in Erfahrung bringen, wohin die Reise geht, also welche DB zu welcher eine Relation bildet und dann auch über welche Verknüpfungen.

Aber das war es wohl nicht, oder? Erschien mir jetzt zu einfach. Aber wer weiß....

Verfasst: Mi, 17. Jan 2007 9:29
von brandelh
Manfred hat geschrieben: die Aliase kann man ja ermitteln und darüber kann man dann über (alias(nWert))->(Dbrlist()) in Erfahrung bringen
schneller ist es wenn du den nWert direkt verwendest:

Code: Alles auswählen

nWert := select()
...
(nWert)->Feld ...

Verfasst: Mi, 17. Jan 2007 9:45
von Manfred
Hi Hubert,

das ist klar, (mittlerweile) ich wußte jetzt nur nicht, wie ich mich verständlich ausdrücken sollte.

Verfasst: Mi, 17. Jan 2007 12:00
von AUGE_OHR
hi,
Manfred hat geschrieben: ich hoffe, dass ich Dich jetzt richtig verstehe. die Aliase kann man ja ermitteln und darüber kann man dann über (alias(nWert))->(Dbrlist()) in Erfahrung bringen, wohin die Reise geht, also welche DB zu welcher eine Relation bildet und dann auch über welche Verknüpfungen.

Aber das war es wohl nicht, oder? Erschien mir jetzt zu einfach. Aber wer weiß....
manchmal ist die "einfachste" Lösung "fast" die richtige, aber die Richtung
war schon richtig. Es musste was mit DBR...() sein und so kam
ich nun auf :

Code: Alles auswählen

   { DBRelation(i),ALIAS(DbRSelect(i)) }
damit hab ich dann 2 cString woraus ich dann

Code: Alles auswählen

   SET RELATION TO &(cRela) INTO &(cChild) ADDITIVE
machen kann.

damit scheine ich nun mein Ziel, alles aus der WorkSpaceList zu "save"n
und auch "restore"n zu können, ein grosses Stück näher gekommen und
die Thread-Crt Class scheint nun (fast) alles zu machen wie es sollte. :headbang:

gruss by OHR
Jimmy