Seite 1 von 1

DCSAY/GEt Tooltip

Verfasst: Sa, 08. Jan 2022 11:51
von Manfred
wo denke ich hier falsch?
warum klappt das hier?

Code: Alles auswählen

@ oDialogZusatz:nOben,oDialogZusatz:nLinks DCSAY "Bemerkung          :";
                                                   OBJECT oDialogZusatz:oText;
                                                   PARENT oDialogZusatz:oRahmenKopf;
                                                    SAYID "bemerkung";
                                                     SIZE 0
         @ DCGUI_ROW,DCGUI_COL DCGET oDialogZusatz:oZuw:m_bem;
                         EDITPROTECT {|| .T.};
                                 EVAL {|o| o:usevisualstyle := oSysPara:doParaWs:VisualStyle,;
                                           oDialogZusatz:oZuw:addEditControl(o,,,.T.);
                                      };
                               OBJECT oDialogZusatz:oZuw:oM_bem;
                               PARENT oDialogZusatz:oRahmenKopf;
                              TOOLTIP {|| zeigetooltip("bemerkungget")}<-----
                              
aber das hier nicht?

Code: Alles auswählen

@ oDialogZusatz:nOben,oDialogZusatz:nLinks DCSAY "Bemerkung          :";
                                                   OBJECT oDialogZusatz:oText;
                                                   PARENT oDialogZusatz:oRahmenKopf;
                                                    SAYID "bemerkung";
                                                     SIZE 0
         @ DCGUI_ROW,DCGUI_COL DCGET oDialogZusatz:oZuw:m_bem;
                         EDITPROTECT {|| .T.};
                                 EVAL {|o| o:usevisualstyle := oSysPara:doParaWs:VisualStyle,;
                                           oDialogZusatz:oZuw:addEditControl(o,,,.T.);
                                      };
                               OBJECT oDialogZusatz:oZuw:oM_bem;
                               PARENT oDialogZusatz:oRahmenKopf;
                              TOOLTIP {|| zeigetooltip(oDialogZusatz:oZuw:m_bem)}<-----
                              
oder das hier nicht?

Code: Alles auswählen

@ oDialogZusatz:nOben,oDialogZusatz:nLinks DCSAY "Bemerkung          :";
                                                   OBJECT oDialogZusatz:oText;
                                                   PARENT oDialogZusatz:oRahmenKopf;
                                                    SAYID "bemerkung";
                                                     SIZE 0
         @ DCGUI_ROW,DCGUI_COL DCGET oDialogZusatz:oZuw:m_bem;
                         EDITPROTECT {|| .T.};
                                 EVAL {|o| o:usevisualstyle := oSysPara:doParaWs:VisualStyle,;
                                           oDialogZusatz:oZuw:addEditControl(o,,,.T.);
                                      };
                               OBJECT oDialogZusatz:oZuw:oM_bem;
                               PARENT oDialogZusatz:oRahmenKopf;
                              TOOLTIP oDialogZusatz:oZuw:m_bem <-----
                              

Code: Alles auswählen

FUNCTION zeigetooltip(cWert)
	     RETURN cWert

Re: DCSAY/GEt Tooltip

Verfasst: So, 09. Jan 2022 12:27
von Manfred
hat keiner eine Idee, warum die Tooltips nicht angezeigt werden?

Re: DCSAY/GEt Tooltip

Verfasst: So, 09. Jan 2022 13:21
von Wolfgang Ciriack
Mal geprüft, was zeigetooltip(oDialogZusatz:oZuw:m_bem) zurückgibt ?

Re: DCSAY/GEt Tooltip

Verfasst: So, 09. Jan 2022 13:24
von Tom
Die Tooltip-Codeblöcke werden zur Laufzeit in ihrem Thread evaluiert. Was sie von dort aus in diesem Moment nicht sehen können (z.B. das Objekt "oDialogZusatz"), das können sie auch nicht anzeigen. M.E. hat Roger das Tooltipsystem aufgrund vieler schlechter Erfahrungen so fehlertolerant gebaut, dass man eher nichts statt eines Fehlers sieht.

Du könntest mit DC_ToolTipThread() experimentieren. Das ist eine Get-Set-Funktion. Mit 1 als Parameter führt sie nur einen Tooltipthread für alle Module aus, mit 2 (Default) bekommt jeder Thread seinen eigenen Tooltipthread. Aber ich glaube nicht, dass das hier helfen wird. Der Codeblock sieht das Objekt nicht mehr, wenn er evaluiert wird. Man verwechselt allzu gerne das Zuweisen von Codeblöcken mit Funktionsaufrufen, aber es ist nicht das gleiche.

Re: DCSAY/GEt Tooltip

Verfasst: So, 09. Jan 2022 13:24
von Manfred
wenn ich einen Stopp in der Funktion (am Ende angeführt) mache, dann ist da genau der Wert drin, den ich erwarte.

Re: DCSAY/GEt Tooltip

Verfasst: So, 09. Jan 2022 13:25
von Manfred
@Tom,
das weiß ich. Deshalb habe ich ja eine Funktion gebaut, die mir dann den Wert als reinen Text zurück geben müßte. Das macht sie aber nicht. Der Codeblock solte das ja machen, oder?

Re: DCSAY/GEt Tooltip

Verfasst: So, 09. Jan 2022 13:38
von Tom
Mmmh. Es kann auch sein, dass sich Roger bei Tooltips, die Codeblöcke sind, den Wert im Moment des Dialogaufbaus holt, und nicht erst beim Anzeigen. Müsste ich mal schauen.

Re: DCSAY/GEt Tooltip

Verfasst: Do, 13. Jan 2022 9:25
von Manfred
ich frage mal andersherum, vielleicht gibt es ja dazu eine bessere Lösung?
Sicherlich scheint es etwas komisch auszusehen, warum ich das so mache. Also das getfeld nochmal in einen Tooltip anzuzeigen. Es geht mehr darum, das ein kleiner Ausschnitt aus einem MEmofeld angezeigt wird, ich aber die Möglichkleite geben möchte, den gesamten Inhalt dann über die Tooltips zu sehen. Gäbe es da evtl. einen anderen Weg? Für DCBROWSE gibt es ja auch die Möglichkeit über Tooltip den kompletten Inhalt anzuzeigen, wenn die Spalte zu schmal ist.

Re: DCSAY/GEt Tooltip

Verfasst: Do, 13. Jan 2022 10:47
von Tom
Die Tooltips interpretieren das Semikolon als Zeilenwechselzeichen. Du musst also die Soft-/Hard-CRs im Tooltip durch sie ersetzen, dann wird's mehrzeilig.

Re: DCSAY/GEt Tooltip

Verfasst: Do, 13. Jan 2022 11:24
von Manfred
OOPs,
in dem get Feld steht nur ein Teil. Das ist immer nur eine Zeile. Das meinte ich. Tooltip sollte dann alles anzeigen.

Re: DCSAY/GEt Tooltip

Verfasst: Do, 13. Jan 2022 13:20
von Wolfgang Ciriack
Hallo Manfred,
Gäbe es da evtl. einen anderen Weg?
Ich habe mal ein DCBrowse gebaut, wo darunter ein Multiline-Feld angezeigt wird. Wenn man mit der Maus auf eine Zelle im Browse kommt, wird der komplette Inhalt der Zelle in diesem ML-Feld angezeigt.
Wenn das eine Alternative für dich wäre, kann ich das mal raussuchen.

Re: DCSAY/GEt Tooltip

Verfasst: Do, 13. Jan 2022 13:27
von Koverhage
KKARTE ist Memofeld

Datenbank direkt
DCBROWSECOL FIELD kd->kkarte TOOLTIP 'Info' WIDTH 3 ;
HEADER "I" DATATOOLTIP {|| lDataToolTips} ;
EDITOR 'BROWSEEDIT_MEMO' EXITKEY xbeK_F6 PARENT oBrowse

mymemo := kd->kkarte
DCBROWSECOL DATA mymemo TOOLTIP 'Info' WIDTH 3 ;
HEADER "I" DATATOOLTIP {|| lDataToolTips} ;
EDITOR 'BROWSEEDIT_MEMO' EXITKEY xbeK_F6 PARENT oBrowse

@ nil,nil DCMULTILINE xNIL SIZE 38,5 LINELENGTH 40 ;
FONT "10.Courier" MESSAGE 'F6=Speichern' ID 'BROWSEEDIT_MEMO'

Re: DCSAY/GEt Tooltip

Verfasst: Do, 13. Jan 2022 13:31
von Tom
Es geht hier aber nicht um ein Browse, sondern um einen Dialog aus diversen Get-Feldern. Einige davon zeigen nur einen Teil der Daten an, und Manfred möchte, dass die Tooltips dann jeweils die kompletten Daten anzeigen. Da die Inhalte der Get-Felder wechseln können, ist eine statische Zuweisung des kompletten Inhalts an den Tooltip nicht möglich.

Re: DCSAY/GEt Tooltip

Verfasst: Do, 13. Jan 2022 14:05
von Koverhage
Dann doch eigentlich so
@ 10.5, 77 DCMULTILINE m_gerinfo SIZE 38,4 LINELENGTH 30 FONT "9.Tahoma"

Re: DCSAY/GEt Tooltip

Verfasst: Do, 13. Jan 2022 16:15
von Wolfgang Ciriack
Es geht hier aber nicht um ein Browse, sondern um einen Dialog aus diversen Get-Feldern.
Sorry, habe ich übersehen.

Re: DCSAY/GEt Tooltip

Verfasst: Do, 13. Jan 2022 17:27
von Tom
Du hast ja im eXpress++-Forum nachgehakt, Manfred, und Roger hat Dir die gleiche Antwort wie ich weiter oben gegeben - es hat etwas damit zu tun, dass das Tooltipsystem in einem eigenen Thread läuft. Es sieht die Daten nicht. Aber vielleicht kannst Du wirklich einen Zehnzeiler bauen, der das in einem Beispiel zeigt, und wir finden dann mit Roger eine Lösung, denn ich hätte manchmal auch gerne so dynamische Tooltips.

Re: DCSAY/GEt Tooltip

Verfasst: Do, 13. Jan 2022 17:44
von Manfred
ich hatte kurz mal drüber nachgedacht. Ich weiß aber nicht ob sich der Aufwand dafür lohnt. Ich wüßte jetzt auch gar nicht, was ich da zusammenstricken sollte. Es muß ja meine Klasse und eine tabelle mit Memofeld usw. haben. Keine Ahnung, wie ich da ein Beispiel zusammenbekommen kann.

Re: DCSAY/GEt Tooltip

Verfasst: Do, 13. Jan 2022 22:40
von Werner_Bayern
In reinem Xbase++ ist es ja so, dass ein Tooltip nur einmalig zum Zeitpunkt des Create des entsprechenden Controls aufgerufen wird. Da hilft nur ein dynamisches Neuzuweisen, wenn sich die Info ändern soll.

Hab das in meinem Fall mittels :dragEnter gelöst, weil es ein Tooltip für jede Datenzeile in einem Browse ist.

Ähnlich sollte es doch hier auch möglich sein?

Re: DCSAY/GEt Tooltip

Verfasst: Fr, 14. Jan 2022 8:42
von Tom
Hallo, Werner.

Das Tooltip-System von eXpress++ ist zwar reines Xbase++, aber es ist ein wenig komplexer. Und tatsächlich kann ich in Rogers System einen Codeblock als Tooltip verwenden (z.B. {||"Es ist derzeit: "+Time()+" Uhr"}), und der wird im Anzeigemoment ausgewertet, zeigt also im Beispiel immer die richtige Zeit. Aber das funktioniert hier nur, weil "Time()" eine Funktion ist, während Manfred auf Instanzvariablen eines Objekts zugreifen will. Da das Tooltipsystem in einem eigenen Thread läuft (oder sogar in mehreren, wenn je Programmthread ein Tooltipthread genutzt wird, das ist optional), sind Objektdaten aus anderen Threads nicht sichtbar. Vermutlich müsste man mit Detached Codeblocks (_EarlyBoundCodeblock) hantieren, um das hinzukriegen. Ich überlege, ob ich mal ein Beispiel für Roger baue, dann will er sich ransetzen.

Re: DCSAY/GEt Tooltip

Verfasst: Fr, 14. Jan 2022 8:49
von Manfred
das verstehe ich jetzt doch nicht so ganz. Selbst wenn es ein anderer Thread ist, er bekommt doch den Wert der Membervar übergeben. Und wenn ich dann im Codeblock einen breakpoint einbaue, dann kann ich diesen Wert dann auch sehen an der Stelle. Wieso wird der dann nicht zurückgegeben? Ich befinde mich doch selbst in der Funktion des Codeblocks (zeigetooltip()) im anderen Thread, oder was verstehe ich hier falsch? Das man nicht so ohne weiteres auf eine DBF eines anderen Threads zugreifen kann, ist mir klar, aber ich arbeite doch eigentlich mit Variablen....

Re: DCSAY/GEt Tooltip

Verfasst: Fr, 14. Jan 2022 12:26
von Tom
Du bist im Codeblock (und im selben Thread). Aber der Tooltipthread, der ihn evaluiert, ist das nicht. Das ist das Vertrackte mit Codeblöcken.

Re: DCSAY/GEt Tooltip

Verfasst: Fr, 14. Jan 2022 14:24
von Werner_Bayern
Servus Tom,

ok, das ist ja dann schon eine sehr interessante Erweiterung des toolTipText, in reinem Xbase++ kann man nur eine Zeichenkette übergeben. Kann man dem Codeblock nicht Parameter mitgeben? Wenn der dann zur Anzeigezeit immer neu ausgeführt wird, müsste das dann doch möglich sein?

Code: Alles auswählen

{|oZuw|oZuw:m_bem}
Da müsste nur das eval() im eXpress-Code angepasst werden?
Notfalls oZuw als private deklarieren? Oder ist das genau das Problem von Manfred?

Oder über den :enter-Slot des Controls den toolTipText neu belegen, so gings in reinem Xbase++. Feuert dann aber ohne spezielle Anpassungen relativ oft.

Re: DCSAY/GEt Tooltip

Verfasst: Fr, 14. Jan 2022 14:30
von Tom
Hallo, Werner.

Ja, das ist eine coole Sache, was Roger da alles gebaut hat.

Aber es hülfe nicht, den Wert als Parameter zu übergeben, weil das ja im Moment der Zuweisung ausgewertet würde. Dann hättest Du zwar den kompletten Wert, aber nur für den ersten Eintrag. Wenn sich der Inhalt der Objektvariablen ändert, ändert sich der Parameter nicht mehr.

Edit: PRIVATE hätte auch keinen Sinn, das ist ja threadlokal. Aber man könnte eine Get-Set-Funktion verwenden und mit Identifiern arbeiten, also eine Funktion im Codeblock übergeben, die z.B. ein statisches Array enthält, und an Position XY steht jeweils der Tooltiptext. Und das Objekt bestückt "seine" Position bei jedem Refresh mit dem aktuellen Tooltip:

Code: Alles auswählen

DCGET ... TOOLTIP {||MyToolTip(102029)}

FUNCTION MyToolTip(nId,xValue)
STATIC aToolTips := {}
IF pCount()>1
  * mit aScan prüfen, ob für nId schon ein Wert vorhanden ist, ggf. anhängen usw.
ENDIF
RETURN aToolTips[nId]
Beim Bestücken der Gets ruft jedes Get myToolTip mit seiner ID und dem Wert auf. Oder so.

Re: DCSAY/GEt Tooltip

Verfasst: Fr, 14. Jan 2022 17:08
von Werner_Bayern
Edit: PRIVATE hätte auch keinen Sinn, das ist ja threadlokal.
Public? Ich verwechsle die immer, weil ich keine der beiden Typen benutze. Besser eine dateiweite Static und ja genau, eine Set-Methode drauf, die der Codeblock aufruft. Dann sparst dir das Array?