DCREAD verlassen, ohne Datenverlust

Moderator: Moderatoren

Antworten
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21186
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

DCREAD verlassen, ohne Datenverlust

Beitrag von Manfred »

Hi, ich stehe kurz vor einer Verzweiflungstat...

Ich übergebe ein Objekt an einen DCREAD GUI Dialog, in der eine DCListbox ist, die auf eine Arrayvariable des übergebenen Objektes zugreift. Der Inhalt der Listbox (entweder alle, oder nur die ausgewählten Elemente) möchte ich nach dem verlassen der DCREAD GUI Umgebung noch benutzen. Sobald ich aber diesen Dialog verlasse, ist auch die Membervar des Objektes, die von der Listbox die Auswahl beinhalten sollte leer. Wie kann ich das verhindern?
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!!
Leon
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 118
Registriert: Mi, 28. Nov 2007 12:48
Wohnort: Wien
Hat sich bedankt: 5 Mal
Kontaktdaten:

Re: DCREAD verlassen, ohne Datenverlust

Beitrag von Leon »

Schon einmal DCREAD GUI SAVE versucht?
Gruß aus Wien
Leon
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9358
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: DCREAD verlassen, ohne Datenverlust

Beitrag von Tom »

Du kannst doch im ITEMSELECTED-Block der Listbox irgendwas mit den Variablen tun, sie also in eigenen speichern. Und die Daten, die insgesamt in der Box sind, müssen ja von irgendwoher (also von Dir) stammen.

Ansonsten gibt es die NODESTROY-Option für DCREAD. Die sorgt m.E. dafür, dass der Dialog nach dem DCREAD erhalten bleibt - und damit auch alle Objekte darin. Du könntest also irgendwas mit den Parts tun und den Dialog dann manuell destroyen.
Herzlich,
Tom
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21186
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Re: DCREAD verlassen, ohne Datenverlust

Beitrag von Manfred »

Nur mal so gezeigt, für den Fall eines evtl. Missverständnisses.

Code: Alles auswählen

METHOD DialogMandanten:schulenauswahl()
       LOCAL getlist := {}
       LOCAL GetOptions
       LOCAL nPbHoehe := 30

       LOCAL oDialog  := NIL
       LOCAL oPbAlle  := NIL
       LOCAL oPbEnde  := NIL
       LOCAL oPbkeine := NIL
       LOCAL oRahmen  := NIL

       MEMVAR oSysPara

       @ 55, 5 DCGROUP oRahmen;
               CAPTION "Schulen";
                PARENT oDialog;
                  SIZE DCGUI_PARENTWIDTH-30,DCGUI_PARENTHEIGHT - 70

       @ 15,10 DCLISTBOX ::aSchulenArray;
                    LIST ::aSchulen;
                  OBJECT ::oListbox;
                  PARENT oRahmen;
                    SIZE DCGUI_PARENTWIDTH-30,DCGUI_PARENTHEIGHT-60;
                 TOOLTIP "Klick mit der linken Maustaste markiert oder demarkiert einen Satz"
       @ 0,0 DCPUSHBUTTON;
                   ACTION {|| AEval(::aSchulen, {|n,i| ::oListbox:setdata(i,.T.)})};
                  CAPTION "Alle";
                     EVAL {|| oPbAlle:setPos( {10,10} ),;
                              oPbAlle:setSize( {oRahmen:currentsize()[1]/3-10,nPbHoehe} );
                          };
                   OBJECT oPbAlle;
                   PARENT oRahmen;
                  TABSTOP;
                  TOOLTIP "Markiert alle Sätze"
       @ 0,0 DCPUSHBUTTON;
                   ACTION {|| ::oListbox:setData(::oListbox:getdata(),.F.) };
                  CAPTION "Keine";
                     EVAL {|| oPbKeine:setPos( {oPbAlle:currentpos()[1] + oPbAlle:currentsize()[1],10} ),;
                              oPbKeine:setSize( {oRahmen:currentsize()[1]/3-10,nPbHoehe} );
                          };
                   OBJECT oPbKeine;
                   PARENT oRahmen;
                  TABSTOP;
                  TOOLTIP "Demarkiert alle Sätze"
       @ 0,0 DCPUSHBUTTON;
                   ACTION {|| IF(oSysPara:oMessage:anzeigen("Fertig?",.T.,"N",,oDialog),;
                                 DC_ReadGuiEvent(DCGUI_EXIT_OK,GetList),;
                                .F.);
                          };
                  CAPTION 7755;
                     EVAL {|| oPbEnde:setPos( {oPbKeine:currentpos()[1] + oPbKeine:currentsize()[1],10} ),;
                              oPbEnde:setSize( {oRahmen:currentsize()[1]/3-10,nPbHoehe} );
                          };
                   OBJECT oPbEnde;
                   PARENT oRahmen;
                  TABSTOP

       DCGETOPTIONS;
             BORDER XBPDLG_SIZEBORDER;
         CLOSEQUERY MSG {|| IF(oSysPara:oMessage:anzeigen(" Abbruch?",.T.,"N"),.T.,.F.)};
         HILITEGETS GRA_CLR_CYAN;
        NOMAXBUTTON;
        NOMINBUTTON;
              PIXEL;
         SAYOPTIONS XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT;
       TOOLTIPCOLOR GRA_CLR_BLACK, GRA_CLR_YELLOW;
        WINDOWWIDTH 320;
       WINDOWHEIGHT 500

         DCREAD GUI;
               EVAL {|| AEval(::aSchulen, {|n,i| ::oListbox:setdata(i,.T.)}) };
            OPTIONS GetOptions;
             PARENT @oDialog;
              TITLE "Schulenauswahl"
RETURN self
In dem Array ::aSchulenArray stehen die ausgewählten Elemente drin. Die benötige ich danach. Das Array ist aber leer, sobald ich den Dialog verlasse.
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
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21186
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Re: DCREAD verlassen, ohne Datenverlust

Beitrag von Manfred »

Mit SAVE oder NODESTROY alleine erreicht man nichts. Ich hatte auch schon das Listbox Array ausgetauscht um dann kurz vorm Verlassen es zu Clonen. Das klappt auch nicht.
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!!
Leon
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 118
Registriert: Mi, 28. Nov 2007 12:48
Wohnort: Wien
Hat sich bedankt: 5 Mal
Kontaktdaten:

Re: DCREAD verlassen, ohne Datenverlust

Beitrag von Leon »

Vielleicht hilft Dir das Beispiel von Roger Donna aus XDEMO weiter:

Code: Alles auswählen

/*
LISTBOX

This example shows how to implement 'Mark All' and '
Clear All' buttons in a DCLISTBOX command.
*/

LOCAL GetList := {}, aFields:={}, cField:={}
LOCAL oListBox

AADD(aFields, 'Alice')
AADD(aFields, 'Bob')
AADD(aFields, 'Carol')
AADD(aFields, 'Dick')
AADD(aFields, 'Harry')
AADD(aFields, 'Ted')
AADD(aFields, 'Tom')

@ 0,0 DCLISTBOX cField LIST aFields ;
	FONT "10.Courier" ;
	SIZE 15,10 ;
	OBJECT oListBox ;
	SELECT {2,4,5,6,7}

@ 0, 17 DCPUSHBUTTON ;
	CAPTION '~Mark All' ;
	SIZE 10, 1.1 ;
	FONT '8.MS Sans Serif' ;
   ACTION {|| AEVAL(aFields, {|x,i| oListBox:setData(i, .T.)}), ;
              DC_VarFromListBox(oListBox)} ;
	RELATIVE oListBox

@ 1.5, 17 DCPUSHBUTTON ;
	CAPTION 'C~lear All' ;
	SIZE 10, 1.1 ;
	FONT '8.MS Sans Serif' ;
   ACTION {|| AEVAL(aFields, {|x,i| oListBox:setData(i, .F.)}), ;
              DC_VarFromListBox(oListBox)} ;
	RELATIVE oListBox

DCREAD GUI ;
  TITLE 'List Box Demo' ;
  FIT ;
  ADDBUTTONS ;
  MODAL

DC_MsgBox(cField)

RETURN nil
Gruß aus Wien
Leon
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21186
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Re: DCREAD verlassen, ohne Datenverlust

Beitrag von Manfred »

Nein, kann man nicht behaupten. Was soll ich damit machen?
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
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9358
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: DCREAD verlassen, ohne Datenverlust

Beitrag von Tom »

"aSchulenArray" - das Array, in dem die Auswahl gespeichert wird - ist nach meinem Verständnis eine iVar von "DialogMandanten". Es hat also nichts mit dem Verlassen/Zerstören des Dialogs zu tun, denn der steckt in "oDialog". Geschieht das eigentlich auch, wenn Du nur einen Datensatz per Klick auswählst? Ist auch "aSchulen" leer?

Ich würde auf den ersten Blick sagen, dass Du viel mit SetData arbeitest, also die Daten des Listbox-Objekts manipulierst. Du müsstest dann außerdem das Auswahlarray mit GetData bestücken, weil darin sonst schlicht nichts passiert. Das könnte die Ursache sein.
Herzlich,
Tom
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21186
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Re: DCREAD verlassen, ohne Datenverlust

Beitrag von Manfred »

@Tom,

Du scheinst irgendwie nicht ganz falsch zu liegen. Zumindest passiert etwas, wenn ich daran "schraube".

Es ist eine member Var und aSchulen wird nicht geleert.

Aber wie macht man das denn dann richtig? Ich möchte, dass alle Elemente zu Anfang ausgewählt sind. Das erreiche ich mit dem Eval in DCREAD. Wenn ich das weglasse und nur von hand auswähle, dann bleiben die Werte wohl drin. Sobald ich aber die anfänglich leere Listbox mit Alle komplett ausfülle, verschwinden die Werte nach dem verlassen. Alles kanz komisch. Ich werde das nochmal genauer untersuchen
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
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9358
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: DCREAD verlassen, ohne Datenverlust

Beitrag von Tom »

Du hast ein Array "aSchulenArray", in dem die Auswahl der Listbox gespeichert werden soll. Das ist aber nicht deckungsgleich mit dem Array, in dem die Listbox intern die Auswahl speichert! Wenn Du also mit SetData das interne Array der Listbox bestückst, musst Du zugleich dafür sorgen, dass das Auswahlarray damit synchronisiert wird. Die Arrayelemente, die mit SetData für das interne Array generiert werden, müssen außerdem für das externe generiert werden (leeren und neu bestücken). Bei "normaler Auswahl" macht das Rogers Klasse für Dich, wenn Du aber das Objekt direkt manipulierst, musst Du auch in dieser Hinsicht aktiv werden.

Am einfachsten wäre es, an allen Stellen, an denen ein SetData erfolgt, anschießend z.B. eine Funktion aufzurufen, die "aSchulenArray" leert und via GetData mit den gewählten Einträgen bestückt.
Herzlich,
Tom
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21186
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Re: DCREAD verlassen, ohne Datenverlust

Beitrag von Manfred »

Hm

ich habe das 1zu 1 aus einem anderen Programm von mir kopiert, ich glaube ich schaue mir das wirklich nochmal an, ob ich da nicht was vergessen habe.....
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
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21186
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Re: DCREAD verlassen, ohne Datenverlust

Beitrag von Manfred »

Ich habe es jetzt erstmal anders gelöst. Ich verlassen den Dialog nicht, sondern rufe direkt die nachfolgende Funktion auf und dann klappt es. Alles recht merkwürdig.
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
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21186
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Re: DCREAD verlassen, ohne Datenverlust

Beitrag von Manfred »

Also 1 Problem war es, dass ich einfach vergessen habe die Daten zu übertragen.

Code: Alles auswählen

(::aSchulenArray := AEval(::oListbox:getdata(),{|n| n := ::oListbox:getItem(n)   },,,.T.)
Aber selbst das kann nicht hinter DECREAD erfolgen, weil sonst die Werte weg sind. Aber erstmal klappt es jetzt so, wie ich es brauche.
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!!
Antworten