Static-Objekt in Function wird nicht gelöscht (destroy) [erledigt]

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

Moderator: Moderatoren

Antworten
Benutzeravatar
Wolfgang_B
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 484
Registriert: Do, 14. Jun 2007 18:22
Wohnort: 94065 Waldkirchen
Hat sich bedankt: 14 Mal
Danksagung erhalten: 5 Mal

Static-Objekt in Function wird nicht gelöscht (destroy) [erledigt]

Beitrag von Wolfgang_B »

Hallo,
war eigentlich ganz stolz, daß ich es geschafft habe eine Laufschrift in einem eigenen Thread zu erzeugen, die solange durchläuft bis der eigentliche Prozess beendet ist. In diesem Fall ist es eine Auflistung von Daten, die in eine Listbox geschrieben werden. Da dies relativ viel Datensätze sind (ca 5000) dauert das ca 10 Sek. Um dem Kunden zu signalisieren, daß der Prozess noch läuft, sollte die Laufschrift unten angezeigt werden.

Das tut Sie auch. Nur soll sich diese auch wieder beenden, wenn der Lade-Prozess fertig ist. Das tut sie aber nicht. Was mache ich da falsch??

Aufruf:

Code: Alles auswählen

oThread2:Start( "MELDUNG", drawingArea, oThread2:threadID, "" )


FUNCTION MELDUNG( drawingArea, id, stopp)
  LOCAL xpos := 900

    //MsgBox("Meldung -> "+ALLTRIM(STR(id))  )
    //MsgBox("stopp -> "+stopp )
    // id = ThreadId (nur zur Kontrolle)
    // "stopp" wird als CHR übergeben am Ende des Ladeprozesses

    oXbp := XbpStatic():new(drawingArea, , {xpos,10}, {350,25},{{XBP_PP_FGCLR, GRA_CLR_DARKGREEN}, { XBP_PP_COMPOUNDNAME, "14.ARIAL Fett" } } )
    oXbp:create()
    
    DO WHILE stopp <> "stopp"
      IF xpos <=10
        xpos := 900
      ENDIF  
      oXbp:configure(drawingArea, , {xpos,10}, {300,25} )
      oXbp:setCaption("Bitte einen Augenblick Geduld ...")
      xpos-=5
      inkey(.05)
   ENDDO  
   oXbp:destroy()

RETURN( NIL ) 
Gruß Wolfgang
Zuletzt geändert von Wolfgang_B am So, 18. Feb 2018 11:59, insgesamt 1-mal geändert.
Beste Grüße
Wolfgang

Mitglied des Deutschsprachigen Xbase-Entwickler e. V.
Mitglied der XUG Osnabrück
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Static-Objekt in Function wird nicht gelöscht (destroy)

Beitrag von Tom »

Falls Du "MELDUNG" abermals mit "stopp" aufrufst, berührst Du damit den ersten Aufruf nicht. Die Funktion könnte sich auch selbst mit "stopp" aufrufen, was dann aber nur diese Iterationsinstanz der Funktion stoppen würde.

Ich würde mit einer Get-Set-Funktion arbeiten, die in der Funktion MELDUNG ausgewertet wird.

Code: Alles auswählen

DO WHILE !MeldungStop()
..
ENDDO

Code: Alles auswählen

FUNCTION MeldungStop(lSet)
STATIC lStop := .F.
IF PCount()>0
  lStop := lSet
ENDIF
RETURN lStop
MeldungStop(.F.) resettet die Funktion, MeldungStop() gibt die Info (in MELDUNG), MeldungStop(.T.) setzt das Signal für MELDUNG. Wenn man in der Funktion ein statisches Array verwaltet, das ThreadIDs speichert, arbeitet sie auch für mehrere Threads gleichzeitig.
Herzlich,
Tom
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: Static-Objekt in Function wird nicht gelöscht (destroy)

Beitrag von AUGE_OHR »

Wolfgang_B hat geschrieben: Di, 13. Feb 2018 19:14... die in eine Listbox geschrieben werden. Da dies relativ viel Datensätze sind (ca 5000) dauert das ca 10 Sek.
beim füllen einer Listbox() / Combobox() zuerst o:hide() verwenden ...
dann braucht man auch keine Laufschrift als "Ablenkung" mehr :!:

Das Problem mit dem Abbruch hat Tom ja schon erklärt.

was ich überarbeiten würde

Code: Alles auswählen

   oXbp:configure()
im Prinzip ist es ein o:Destroy() / o:Create()
wenn man das nun 1000 Mal hintereinander macht "könnte" es Problem mit dem CG geben.

ich mache eine Laufschrift so

Code: Alles auswählen

   iMax := LEN(cText)
   FOR i := 1 TO iMax
     cPart := SUBSTR(cText,nStart,i-nStart+1)

     // wenn es nicht mehr ins XbPart passt  
     aTextSize   := ::_GetTextExtentPoint(cPart)
     IF aTextSize[1] > nWide
        nStart += 1
     ENDIF

     oStatic:Setcaption(cPart)
 
     IF lExit = .T.
        EXIT
     ELSE   
        SLEEP(10)
     ENDIF 
   NEXT
gruss by OHR
Jimmy
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Static-Objekt in Function wird nicht gelöscht (destroy)

Beitrag von Tom »

Statt des Configure wäre ein SetPos() sinnvoller. Wolfang nutzt das Configure, um das Static am iterierenden xpos zu positionieren. Das geht mit SetPos() besser. Configure() müsste ein Flackern bewirken, kostet aber, wie Jimmy ausgeführt hat, sehr wahrscheinlich Ressourcen.
Herzlich,
Tom
Benutzeravatar
Wolfgang_B
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 484
Registriert: Do, 14. Jun 2007 18:22
Wohnort: 94065 Waldkirchen
Hat sich bedankt: 14 Mal
Danksagung erhalten: 5 Mal

Re: Static-Objekt in Function wird nicht gelöscht (destroy)

Beitrag von Wolfgang_B »

Hallo Tom,
habe Deine Version umgesetzt. Funktioniert gut. Allerdings wie Du auch schon angesprochen hast, flackert die Anzeige doch sichtbar.

Was meinst Du mit "SetPos()"? Wenn ich das verwende, bringt er mit den Fehler: "access to method not allowed in this context". Wenn ich die Doku richtig interpretiere ist diese Methode bei Graphik-Output nicht möglich, oder?

Jimmy auch Dir danke für die Tipps.
Gruß Wolfgang
Beste Grüße
Wolfgang

Mitglied des Deutschsprachigen Xbase-Entwickler e. V.
Mitglied der XUG Osnabrück
Benutzeravatar
Wolfgang_B
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 484
Registriert: Do, 14. Jun 2007 18:22
Wohnort: 94065 Waldkirchen
Hat sich bedankt: 14 Mal
Danksagung erhalten: 5 Mal

Re: Static-Objekt in Function wird nicht gelöscht (destroy)

Beitrag von Wolfgang_B »

Noch was für Jimmy,

ich habe sehr ungeduldige Kunden. Wenn sich da mal für 5 Sek. nichts am Bildschirm tut, drehen die fast durch. Dann wird wild auf der Tastatur rumgehackt usw.

btw. Gibt es eine schnellere Methode für das Auflisten auf dem Schirm als in eine Listbox zu schreiben?

Wolfgang
Beste Grüße
Wolfgang

Mitglied des Deutschsprachigen Xbase-Entwickler e. V.
Mitglied der XUG Osnabrück
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Static-Objekt in Function wird nicht gelöscht (destroy)

Beitrag von Jan »

Wolfgang,

oXbp:setPos({x, y}) funktioniert aber. Benutze ich ja auch, wenn auch nicht für Laufschriften.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Static-Objekt in Function wird nicht gelöscht (destroy)

Beitrag von Jan »

Wolfgang,

deswegen bau ich in den Warte-Situationen gerne eine Eieruhr ein (in Windows 10 nur noch der sich drehende Kringel).

Bei Listboxen ist in der Tat das Problem, das der Aufbau dauert. Der Einwand, die erst anzuzeigen wenn die komplett ist, ist zwar aus Perfomancegründen korrekt. Aber wenn die nach jedem neuen Eintrag anzeigen läßt dann sieht der Anwender ja auch, das da was passiert. Auch wenn das dann insgesamt gesehen länger dauert. Alternativ könnte man da eine Progressbar einbauen, wie Alaska die im XbPack 2 mitgeliefert hat, bzw. in der 2.0 als Asset (was aber der gleiche Code ist).

Alternativ ginge eventuell ein Browse. Den man ja auch auf ein Array setzen kann. Oder eine gefilterte/gescopete dbf. Da gibt es dann keine Verzögerung mehr. Außer dem Zusammenbauen des Arrays, wenn denn das notwendig ist.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Static-Objekt in Function wird nicht gelöscht (destroy)

Beitrag von Tom »

oXbp:SetPos({xpos,10}) muss funktionieren.
Herzlich,
Tom
Benutzeravatar
Wolfgang_B
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 484
Registriert: Do, 14. Jun 2007 18:22
Wohnort: 94065 Waldkirchen
Hat sich bedankt: 14 Mal
Danksagung erhalten: 5 Mal

Re: Static-Objekt in Function wird nicht gelöscht (destroy)

Beitrag von Wolfgang_B »

sorry ... habe "oXbp:" vergessen
Wolfgang
Beste Grüße
Wolfgang

Mitglied des Deutschsprachigen Xbase-Entwickler e. V.
Mitglied der XUG Osnabrück
Benutzeravatar
Wolfgang_B
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 484
Registriert: Do, 14. Jun 2007 18:22
Wohnort: 94065 Waldkirchen
Hat sich bedankt: 14 Mal
Danksagung erhalten: 5 Mal

Re: Static-Objekt in Function wird nicht gelöscht (destroy)

Beitrag von Wolfgang_B »

Jan, wie komme ich an die Eieruhr resp. Kringel und wie baut man die ein?
Wolfgang
Beste Grüße
Wolfgang

Mitglied des Deutschsprachigen Xbase-Entwickler e. V.
Mitglied der 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: Static-Objekt in Function wird nicht gelöscht (destroy)

Beitrag von AUGE_OHR »

Wolfgang_B hat geschrieben: Mi, 14. Feb 2018 10:20 flackert die Anzeige doch sichtbar.
das war zu erwarten ;-)
versuch mal eine Grafik über eine Grafik "laufen" zu lassen ohne das es flackert ...
hat mich eine ganze Zeit gekostet bis das klappte.
MOVEJPEG.ZIP
v1.9x
(696.9 KiB) 205-mal heruntergeladen
bei einer Listbox / Combobox dauert das o:AddItem() ewig wenn das Control "sichtbar" ist [-X
ein Progressbar, mit 1% Anzeige, schafft genügend "Ablenkung" für den User.

---

mögliche Alternativen :

1.) XbpQuickBrowse()
2.) DXE_Listbox()

beide können mit einem Array arbeiten ohne das man "einzeln" die Elemente per o:AddItem() hinzufügen muss.
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: Static-Objekt in Function wird nicht gelöscht (destroy)

Beitrag von AUGE_OHR »

Wolfgang_B hat geschrieben: Mi, 14. Feb 2018 11:21 resp. Kringel und wie baut man die ein?
siehe dir das mal an

Code: Alles auswählen

 ..\XPPW32\SOURCE\samples\basics\GRA\SPINNER.prg
gruss by OHR
Jimmy
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16502
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Static-Objekt in Function wird nicht gelöscht (destroy)

Beitrag von Martin Altmann »

Wolfgang,
mit der Methode :setPointer() kannst Du die Mauszeiger entsprechend wechseln.

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Wolfgang_B
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 484
Registriert: Do, 14. Jun 2007 18:22
Wohnort: 94065 Waldkirchen
Hat sich bedankt: 14 Mal
Danksagung erhalten: 5 Mal

Re: Static-Objekt in Function wird nicht gelöscht (destroy)

Beitrag von Wolfgang_B »

ok Jimmy, werde ich mir alles mal in Ruhe anschauen. Die Progressbar scheint wahrscheinlich das pragmatischste zu sein.
Martin, guter Tipp!!

Danke für die Inputs!
Wolfgang
Beste Grüße
Wolfgang

Mitglied des Deutschsprachigen Xbase-Entwickler e. V.
Mitglied der XUG Osnabrück
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16502
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Static-Objekt in Function wird nicht gelöscht (destroy)

Beitrag von Martin Altmann »

Falls Du einen animierten Mauszeiger selber programmieren möchtest, findest Du hier einen Ansatz: https://xbaseforum.de/viewtopic.php?f=3 ... 454#p41454

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Static-Objekt in Function wird nicht gelöscht (destroy)

Beitrag von Jan »

Wolfgang,

Code: Alles auswählen

oXb:setPointer(, XBPSTATIC_SYSICON_WAIT, XBPWINDOW_POINTERTYPE_SYSPOINTER)
Das machst Du am besten für den eigentlichen Dialog und alle children darauf. Also z. B.

Code: Alles auswählen

aChildList := oDialog:childList()
FOR i := 1 to Len(aChildList)
    aChildList[i]:setPointer( ...)
NEXT
Um die Sanduhr nach getaner Arbeit wieder weg zu bekommen nimmst Du dann als zweiten Parameter XBPSTATIC_SYSICON_ARROW.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Static-Objekt in Function wird nicht gelöscht (destroy)

Beitrag von Tom »

In eXpress++ geht das am einfachsten mit DC_SetPointerTree(), z.B. so:

Code: Alles auswählen

DC_SetPointerTree(oDialog,,XBPSTATIC_SYSICON_WAIT,2) // setzt den sich drehenden Kringel als Pointer

DC_SetPointerTree(oDialog,,XBPSTATIC_SYSICON_DEFAULT,2) // setzt den Standardpointer
Davon abgesehen steht Dir übrigens auch DC_WaitOn() zur Verfügung, das relativ umfangreiche Funktionen enthält (darunter einen Fortschrittsbalken im eigenen Thread, aber GRA-Zeug), allerdings nicht besonders hübsch aussieht.
Herzlich,
Tom
Benutzeravatar
Wolfgang_B
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 484
Registriert: Do, 14. Jun 2007 18:22
Wohnort: 94065 Waldkirchen
Hat sich bedankt: 14 Mal
Danksagung erhalten: 5 Mal

Re: Static-Objekt in Function wird nicht gelöscht (destroy) [erledigt]

Beitrag von Wolfgang_B »

Hallo,
mit Manchem bin ich noch überfordert. Aber trotzdem vielen Dank!!
Gruß Wolfgang
Beste Grüße
Wolfgang

Mitglied des Deutschsprachigen Xbase-Entwickler e. V.
Mitglied der XUG Osnabrück
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

Re: Static-Objekt in Function wird nicht gelöscht (destroy) [erledigt]

Beitrag von Manfred »

Hi Wolfgang,
wenn Du kannst, dann mache es doch zum Thema bei unseren nächsten XUG OS Treffen...
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
Wolfgang_B
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 484
Registriert: Do, 14. Jun 2007 18:22
Wohnort: 94065 Waldkirchen
Hat sich bedankt: 14 Mal
Danksagung erhalten: 5 Mal

Re: Static-Objekt in Function wird nicht gelöscht (destroy) [erledigt]

Beitrag von Wolfgang_B »

Hi Manfred,
gute Idee! Juli wird wahrscheinlich bei mir nicht klappen, aber dann vielleicht beim übernächsten Treffen ..
noch einen schönen Sonntag
Gruß Wolfgang
Beste Grüße
Wolfgang

Mitglied des Deutschsprachigen Xbase-Entwickler e. V.
Mitglied der XUG Osnabrück
Antworten