Threads und Browse

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

Moderator: Moderatoren

Antworten
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14658
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Threads und Browse

Beitrag von Jan »

Ich habe ein Problem mit dem refesh eines Browses. Die Vorgehensweise ist folgende: In einem Thread wird der Browse gezeigt. In einem anderen Thread können die Datensätze des Browses bearbeitet oder neue hinzugefügt werden. Das funktioniert soweit auch alles.

Ändere ich einen Datensatz, dann arbeite ich mit oBrowse:refreshCurrent() aus dem bearbeitenden Thread heraus. Funktioniert einwandfrei.

Bei einem neuen Datensatz geht das nicht, denn dann muß ich ja nicht einen neuen Datensatz refreshen, sondern einen neuen Satz an der korrekten Stelle einfügen und dann korrekt einfügen. Da geht :refreshCurrent() also nicht mehr. Hier muß :refreshAll() ran. Das funktioniert aber nicht. Der neue Datensatz wird im Browse doppelt angezeigt, und alle anderen nicht. Gehe ich mit den Cursortasten runter, dann erscheinen auch die anderen Sätze.

Das Browseobjekt wird an den Bearbeitungs-Thread übergeben, ist da also sichtbar. Und wie gesagt, :refreshCurrent() funktioniert auch tadellos.

Jan
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:

Beitrag von Rolf Ramacher »

Hallo Jan,

solche dinge habe ich folgendermaßen gelöst. Ich habe eine Function
DatenLaden in welcher der Browse mit den aktuellsten Daten aus einer temp-DBF befüllt wird. Sobald eine Änderung in der Browse-Maske (hier habe ich mehrere Buttons) durchgeführt wird, so wird die Function Datenladen wieder gestartet.
Gruß Rolf

Mitglied der Gruppe XUG-Cologne
www.xug-cologne.de
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15697
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo Jan,

Falls dein Browse sortiert bzw. gescopt oder gefiltert ist, musst du vor dem RefreshAll() die passenden Felder gefüllt haben. Dann in der DBF einen dbskip(0) dass da alles geschrieben ist. Nun würde ich mit RefreshAll() die Anzeige neu aufbauen lassen.

Für das Speichern eines neuen Satzes OHNE im alten Browser Satzbewegungen zu provizieren ist eine Funktion sinnvoll, der du die nötigen Infos mitgibst und die die DBF erneut öffnet und den Satz anlegt.

Unter VO hatte ich so ein ähnliches Problem gelöst.
Gruß
Hubert
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9367
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 102 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Beitrag von Tom »

Hallo, Jan.

Nur so am Rande: Warum laufen die Bearbeitungs- und Erfassungsfunktionen in einem getrennten Thread? Man kann doch eine DB innerhalb eines Threads auch einfach unter zwei Aliasen öffnen. Wie gesagt, nur am Rande gefragt. Mit Deinem Problem hat das, glaube ich, nämlich nichts zu tun.

Ich vermute, Du hast einen ColorBlock oder irgendwas anderes innerhalb des Browses belegt, und dieser Codeblock ist (vorübergehend) fehlerhaft, vielleicht verweist er auf irgendeine Information, die nicht verfügbar ist durch die neu angelegten Datensätze - oder Du belegst den Codeblock fälschlicherweise beim Neuerfassen mit irgendwas anderem. Dann verhalten sich Browses manchmal so, wie Du es schilderst. Es hat nichts mit Daten und Tabellen zu tun. Schmeiß mal alles raus, was Darstellungsgeschichten und ähnliches sind, und Du wirst sehen, daß sich das Browse ordnungsgemäß refresht. Oder häng mal ein oBrowse:ForceStable() an das RefreshAll. Und dann bau sukzessive wieder ein. Irgendwo ist ein Programmierfehler. Ziemlich sicher.
Herzlich,
Tom
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12909
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 46 Mal

Re: Threads und Browse

Beitrag von AUGE_OHR »

hi,
Jan hat geschrieben: Ändere ich einen Datensatz, dann arbeite ich mit oBrowse:refreshCurrent() aus dem bearbeitenden Thread heraus. Funktioniert einwandfrei.

Bei einem neuen Datensatz geht das nicht, denn dann muß ich ja nicht einen neuen Datensatz refreshen, sondern einen neuen Satz an der korrekten Stelle einfügen und dann korrekt einfügen. Da geht :refreshCurrent() also nicht mehr. Hier muß :refreshAll() ran.
den 2st Browse zu aktuallisieren mache ich anders :

Code: Alles auswählen

PRIVATE nEditRec := 0      // hier nur zu Demo PRIVATE !!!
...
tu_was_mit_den Daten()
...
oXbpSave:activate := {|| nEditRec := FIELD->RECNO() ,
                            PostAppEvent(xbeE_Refresh, nEditRec ,, oBrowse2 ) }

**********************************************************
 nEvent := AppEvent(@mp1,@mp2,@oXbp,nTimeOut) 
 DO CASE
      CASE nEvent = xbeE_Refresh
         GOTO (mp1)
         refreshall()
gruss by OHR
Jimmy
Antworten