XbpCrt Multi Thread mit Tabpage ?

Auf dem Weg von Clipper, FoxPro u.ä. nach Xbase++

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

XbpCrt Multi Thread mit Tabpage ?

Beitrag 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
Benutzeravatar
Rolf Ramacher
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1930
Registriert: Do, 09. Nov 2006 10:33
Wohnort: Bergheim
Danksagung erhalten: 3 Mal
Kontaktdaten:

Fenstergestaltung

Beitrag 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.
Gruß Rolf

Mitglied der Gruppe XUG-Cologne
www.xug-cologne.de
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: Fenstergestaltung

Beitrag 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.
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: Fenstergestaltung

Beitrag 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
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

Beitrag 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
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

DbRelation() abspeichern

Beitrag 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
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Beitrag 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ß....
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
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:

Beitrag 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 ...
Gruß
Hubert
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi Hubert,

das ist klar, (mittlerweile) ich wußte jetzt nur nicht, wie ich mich verständlich ausdrücken sollte.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
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

Beitrag 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
Antworten