Inhalte einer DB auf Beamer scrollen

Grafische Primitive, XbaseParts und Darstellungsfragen allgemein.

Moderator: Moderatoren

Antworten
peternmb
1000 working lines a day
1000 working lines a day
Beiträge: 525
Registriert: Mi, 01. Feb 2006 16:22
Wohnort: 06618 Naumburg

Inhalte einer DB auf Beamer scrollen

Beitrag von peternmb »

Hallo,

ich möchte verschiedene Inhalte einer Datenbank auf einem Beamer scrollend darstellen.
Es sind einige-100 Datensätze, die regelmäßig aktualisiert werden.
Die Anzahl der Datesätz ändert sich nicht, sondern nur deren Inhalt.
Die Darstellung soll fortlaufend aktualisert, als Endlosschleife laufen.

Meine Idee dazu wäre es
1. die Datenbank in eine eine temporärte Datenbank kopieren -> edit: ist vermutlich nicht nowendig, wozu?
2. den Inhalt der Datenbank in eine Listbox einlesen
3. den Listboxinhalt "scrollend" anzeigen
4. wenn alles durch ist wieder mit 1. beginnen

Damit wäre das mit dem Aktualisieren eigenlich erledigt - nur wie kann ich die Listbox "scrollend " auf dem Monitor bzw. Beamer anzeigen?

Hat vielleicht jemand schon etwas in dieser Art gemacht und kann mir Tipps dazu geben?
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: Inhalte einer DB auf Beamer scrollen

Beitrag von AUGE_OHR »

hi,

bei Listbox oder Browse würde ich einen Thread verwenden.

bei einer Listbox gibt es o:NumItems() als EOF

Code: Alles auswählen

oListbox := oListBox := XbpListbox():new(Da ,, {300, 100}, {200, 150} ) 
...
oListBox:create()
oListBox:addItem( ...)
...
oThread:setInterval(100)  // jede Sekunde
oThread:start( "showList", oListbox ) 

* ------------------------------------ *

PROCEDURE ShowList(oListbox)
LOCAL iMax := oListbox:NumItems()
STATIC nLast := 0

  nLast ++
  IF nLast > iMax
     nLast := 1
  ENDIF
  oListbox:SetData({nLast})
RETURN
bei einer DBF / Browse muss man darauf achten das der Thread in einem anderen Workspace arbeitet d.h. er sieht die DBF nicht
gruss by OHR
Jimmy
peternmb
1000 working lines a day
1000 working lines a day
Beiträge: 525
Registriert: Mi, 01. Feb 2006 16:22
Wohnort: 06618 Naumburg

Re: Inhalte einer DB auf Beamer scrollen

Beitrag von peternmb »

Vielen Dank,

funtioniert prima =D>
Jetzt muss ich mich nur noch mit den Presentations-Parametern und den TabStops der ListBox befassen.

PS: in deinem Code fehlt

Code: Alles auswählen

oThread := Thread():New()
peternmb
1000 working lines a day
1000 working lines a day
Beiträge: 525
Registriert: Mi, 01. Feb 2006 16:22
Wohnort: 06618 Naumburg

Re: Inhalte einer DB auf Beamer scrollen

Beitrag von peternmb »

AUGE_OHR hat geschrieben: Fr, 21. Dez 2018 21:52 bei einer DBF / Browse muss man darauf achten das der Thread in einem anderen Workspace arbeitet d.h. er sieht die DBF nicht
Da ich bisher weder mit Threads noch mit verschiedenen Workspace gearbeitet habe tue ich mir damit sehr schwer.
Ich will eigentlich etwas ganz einfaches:
- in meinem Hauptprogramm (Thread-1) ist eine DBF shared geöffnet
- in dem Anzeigethread (Thread-2) soll ein Teil dieser DBF regelmäßig in eine tmp-Datenbank kopiert werden, woraus dann die Anzeige in der Listbox generiert wird.

Ich "merke" mir dazu den Alias der geöffneteten DB und öffne diese im 2. Thread ebenfalls shared.
Damit scheine ich aber etwas falsch zu machen, denn es knallt regelmäßig in einem der beiden Threads...
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: Inhalte einer DB auf Beamer scrollen

Beitrag von AUGE_OHR »

hi,
peternmb hat geschrieben: Do, 27. Dez 2018 16:34 Damit scheine ich aber etwas falsch zu machen, denn es knallt regelmäßig in einem der beiden Threads...
jeder Thread hat seine eigne Workspace d.h. wenn muss man die selbe DBF im SHARE Modus betreiben.
deshalb kann man NICHT aus einem Thread von einer DBF in einen anderen Thread "schreiben/lesen"

---

Ich arbeite gerne mit UserDef Event d.h. ich definiere selbst einen Event.
einen Event kann ich über verschiedene Thread schicken

Code: Alles auswählen

#define MyGotToRec            xbeP_User + 1
Thread2 :

Code: Alles auswählen

Postappvent(MyGotToRec, Thread2->(RECNO()),,oThread1)
Thread1 :

Code: Alles auswählen

   nEvent := 0
   DO WHILE !lExit
      nEvent := APPEVENT( @mp1, @mp2, @oXbp )
      DO CASE
         CASE nEvent == MyGotToRec
            SyncMyDBF(mp1) 
ich schicke die Auswahl ( RECNO() ) des 2nd Thread an den 1st Thread wo dann eine Aktion in "dem" Thread ausgeführt wird.
gruss by OHR
Jimmy
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: Inhalte einer DB auf Beamer scrollen

Beitrag von Werner_Bayern »

peternmb hat geschrieben: Do, 27. Dez 2018 16:34 - in dem Anzeigethread (Thread-2) soll ein Teil dieser DBF regelmäßig in eine tmp-Datenbank kopiert werden, woraus dann die Anzeige in der Listbox generiert wird.
Ich "merke" mir dazu den Alias der geöffneteten DB und öffne diese im 2. Thread ebenfalls shared.
Warum so umständlich?

Du hast hier sicherlich nicht mehrere GB an Daten, die der 2. Thread mit einem Aufruf anzeigen soll? Übergib dem Thread halt einfach - z. B. per Array - die anzuzeigenden Daten. Dann brauchst keine Daten in temporäre DBFs hin- und herschaufeln. Geht viel schneller, eleganter und sicherer.
es grüßt

Werner

<when the music is over, turn off the lights!>
peternmb
1000 working lines a day
1000 working lines a day
Beiträge: 525
Registriert: Mi, 01. Feb 2006 16:22
Wohnort: 06618 Naumburg

Re: Inhalte einer DB auf Beamer scrollen

Beitrag von peternmb »

Werner_Bayern hat geschrieben: Do, 27. Dez 2018 23:49 Warum so umständlich?

Du hast hier sicherlich nicht mehrere GB an Daten, die der 2. Thread mit einem Aufruf anzeigen soll? Übergib dem Thread halt einfach - z. B. per Array - die anzuzeigenden Daten. Dann brauchst keine Daten in temporäre DBFs hin- und herschaufeln. Geht viel schneller, eleganter und sicherer.
Ja, war auch meine erste Idee, aber
- auch um das Array regelmäßig zu aktualisieren müsste ich doch ebenfalls auf die Datenbank in Thread 1 zugreifen
- die temporäre Datenmbank wird mit verschiedenen - auch in anderen Bereichen genutzten - Funktionen bearbeitet, die ich dann alle auf Array umschreiben müsste
peternmb
1000 working lines a day
1000 working lines a day
Beiträge: 525
Registriert: Mi, 01. Feb 2006 16:22
Wohnort: 06618 Naumburg

Re: Inhalte einer DB auf Beamer scrollen

Beitrag von peternmb »

AUGE_OHR hat geschrieben: Do, 27. Dez 2018 21:23 jeder Thread hat seine eigne Workspace d.h. wenn muss man die selbe DBF im SHARE Modus betreiben.
deshalb kann man NICHT aus einem Thread von einer DBF in einen anderen Thread "schreiben/lesen"
es muss doch möglich sein, die im Thread 1 shared geöffnete DBF auch im Thread 2 shared zu öffnen.
Um die DBF zu kopieren muss ich diese ja nicht exclusiv öffen.
Bei meinem Programm ist diese DBF immer shared geöffnet, bei Schreiboperationen werden nur die entsprechenden Datensätze kurz gesperrt.
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: Inhalte einer DB auf Beamer scrollen

Beitrag von Jan »

Peter,

selbstverständlich kannst Du die gleiche dbf mehrfach shared öffnen. Auch in unterschiedlichen Threads.

Fragt sich nur - warum? Die beiden geöffneten wissen halt nichts voneinander. Wenn DU also z. B. im ersten Thread auf die dbf einen Scope oder Filter setzt, ist der nur im ersten Trhead wirksam. Der zweite weiß da nichts von. Außer Du trickst.

Trotzdem: Warum?

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
peternmb
1000 working lines a day
1000 working lines a day
Beiträge: 525
Registriert: Mi, 01. Feb 2006 16:22
Wohnort: 06618 Naumburg

Re: Inhalte einer DB auf Beamer scrollen

Beitrag von peternmb »

Jan hat geschrieben: Fr, 28. Dez 2018 11:13 Fragt sich nur - warum? Die beiden geöffneten wissen halt nichts voneinander. Wenn DU also z. B. im ersten Thread auf die dbf einen Scope oder Filter setzt, ist der nur im ersten Trhead wirksam. Der zweite weiß da nichts von. Außer Du trickst.

Trotzdem: Warum?

Jan
ich möchte, die in meiner Listbox angezeigten Daten vor jedem Füllen aktualisieren.
- dazu mache ich eine Kopie der DBF
- schließe die Orginal-DBF
- bearbeite die DBF-Kopie
- lese die Daten der DBF-Kopie in meine Listbox ein
- wenn alles durchgescrollt wurde beginnt wieder alles von vorne
Ich sehe eigentlich keinen einfacheren Weg, um in meiner Listbox immer die aktuellsten Daten zu zeigen.
Filter, Scopes usw. spielen dabei keinerlei Rolle.
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: Inhalte einer DB auf Beamer scrollen

Beitrag von Tom »

Es muss doch ein Kriterium dafür geben, welche Daten die aktuellsten sind. Beispielsweise diejenigen am Ende der Tabelle (Erfassungsreihenfolge) oder die mit einer bestimmten Timestamp. So oder so, diese Umkopiererei verstehe ich auch nicht. Wenn ich ein Browse habe, das immer auf dem Ende der Tabelle steht (oder, wenn sich was ändert, dorthin navigiert), dann löst ein :RefreshAll() die :Datalink-Codeblöcke aus und aktualisiert die Tabellenanzeige entsprechend.
Herzlich,
Tom
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: Inhalte einer DB auf Beamer scrollen

Beitrag von Jan »

Peter,

wenn Du partout irgend eine Zwischen-dbf brauchst zur Bearbeitung der Daten vor dem Anzeigen: Warum liest Du die nicht in ein Array ein (geht z. B. sehr einfach und schnell mit SELECT FROM cDbf INTO OBJECTS aObject WHERE filterausdruck), in dem Du die Daten bearbeiten kannst. Und das Du dann in die Listbox überträgst. Wenn Du dieses Array als PUBLIC einrichtest dann mußt Du in Thread 2 nicht die dbf noch mal öffnen inkl. dem ganze Synchronisationszeugs.

Ansonsten finde ich Toms Vorschlag sehr ansprechend. Weil simpel und unkompliziert und übersichtlich.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Bernd Reinhardt
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 159
Registriert: So, 16. Apr 2006 11:12
Wohnort: Öhringen

Re: Inhalte einer DB auf Beamer scrollen

Beitrag von Bernd Reinhardt »

Hallo.
Vielleicht verstehe ich das Problem nicht richtig, aber wir haben ein ähnliches Problem schon mal so gelöst.
Z. B. eine Kundendatei.

Hauptprogramm (main)

select 1 // Selectbereiche im Hauptprogramm habe ich kleiner 100
use kunden shared
arbeite an der Kundendatei, öffne schließe, wenn notwendig auch kurzzeitig exclusive

******************************************************

Thread1
do while .t.

select 101 // extra Workspace habe ich selectbereiche > 100 damit es keine Konflikte gibt.
use kunden shared
if filelock loop ( falls mal das Hauptprogramm die Datei kurzzeitig exclusive benötigt dann zeigen wir einfach die alten daten an
kopiere jeden record in das array
use // falls die Datenbank nicht offen sein soll

Zeige daten auf beamer
sleep(Wartezeit)
nGlobalTimerThread1++ // habe ich zum überwachen ob der Thread auch noch läuft. Wenn Wert immer gleich dann ist der Thread nicht mehr aktiv.

if lGlobalExitAlleThread // habe ich als Kenner damit ich den Thread vom Hauptprogramm kontrolliert beenden kann.
exit
endif
enddo

Damit müssen innerhalb der Thread keine Nachrichten ausgetauscht werden. Das Array könnte auch Global sein, so das lesend alle
Threads die aktuellen Daten haben.

Kann man so sehen, als ob es zwei völlig getrennte Programme (exe) sind.

Gruß
Bernd
Bernd Reinhardt
fa.reinhardt@gmx.de
peternmb
1000 working lines a day
1000 working lines a day
Beiträge: 525
Registriert: Mi, 01. Feb 2006 16:22
Wohnort: 06618 Naumburg

Re: Inhalte einer DB auf Beamer scrollen

Beitrag von peternmb »

Hallo,

ja, so ähnlich habe ich es jetzt auch gelöst - funktioniert wunderbar.

Die Darstellung der Daten in der Listbox lässt sich auch noch während der Laufzeit problemlos größenmäßig anpassen.
Ich kann das Scrollen anhalten, fortsetzen oder die Geschwindigkeit verändern.
Antworten