Presentation-Parameter abfragen

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

Moderator: Moderatoren

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

Presentation-Parameter abfragen

Beitrag von Jan »

Hallo,

weiß jemand, ob und wie ich Werte von Presentation-Parameter abfragen kann? Mit geht es dabei insbesondere um XBP_PP_ORIGIN. Der wird nicht mal im Debugger angezeigt.

Jan
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Presentation-Parameter abfragen

Beitrag von brandelh »

Jan hat geschrieben:Werte von Presentation-Parameter abfragen kann?
... insbesondere um XBP_PP_ORIGIN.
XBP_PP_ORIGIN ist ein #define Wert, der wenn er in deinem Quellcode vorkommt durch den Präprozessor nach z.Zeit 300 (definiert in xbp.ch) erstetzt wird. Wahrscheinlich verweißt er danach auf ein Arrayelement ...

Welchen ORIGIN brauchst du denn ?

XbpDialog() hat eine Instanzvariable dieses Namens: für Owner, Fenster und Maus ... ?

Eventuell brauchst du auch nur ::currentPos() ?
Gruß
Hubert
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14651
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Beitrag von Jan »

Hallo Hubert,

ich brauche das um zu unterscheiden, ob der TOPLEFT oder BOTTOMLEFT gesetzt ist. Abhängig davon muß ich unterschiedliche Aktionen ausführen.

Jan
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Jan hat geschrieben:Hallo Hubert,
ich brauche das um zu unterscheiden, ob der TOPLEFT oder BOTTOMLEFT gesetzt ist. Abhängig davon muß ich unterschiedliche Aktionen ausführen.
Jan
Sorry, ich verstehe nur Bahnhof ... bei welcher Klasse / Anwendungsproblem ?
Ich fürchte, ich bin hier keine Hilfe :?
Gruß
Hubert
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:

Beitrag von Tom »

Hallo, Jan.

Code: Alles auswählen

ich brauche das um zu unterscheiden, ob der TOPLEFT oder BOTTOMLEFT gesetzt ist.
Ich finde nicht eine einzige Referenz auf diese Defines. Standardmäßig müßte immer BOTTOMLEFT gesetzt sein (Dialoge beziehen sich mit ihrem Koordinatensystem auf die Ecke unten links des sichtbaren Desktops). Gegenfrage: Wer sollte das denn wo in Deiner Anwendung gesetzt haben? :?:
Herzlich,
Tom
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:

Beitrag von Tom »

Hallo, Jan.

Du kannst von jedem Objekt (also auch Dialog) mit :SetPresParam() die Presentation-Parameter abfragen:

a: = oXbp:SetPresParam()

In diesem Array (zweidimensional) findest Du einen Eintrag, der XBP_PP_ORIGIN entspricht (erstes Element ist 300), der zweite Wert entspricht der gewählten Einstellung, ist aber standardmäßig NIL.
Herzlich,
Tom
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14651
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Beitrag von Jan »

Hallo Tom und Hubert,

woher wisst Ihr, daß das der gesuchte Parameter ist?

Abgesehen davon stimmt da was nicht. Es ist egal ob ich TOPLEFT oder BOTTOMLEFT einsetze, der bleibt immer auf {300, NIL}. Hilft mir also nicht weiter. Leider.

Jan
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Jan hat geschrieben:woher wisst Ihr, daß das der gesuchte Parameter ist?
weil in der XBP.CH der Wert XBP_PP_ORIGIN mit 300 definiert ist.
Schreib doch mal ? XBP_PP_ORIGIN und compiliere mit /P, dann sieh
in der PPO Datei nach und dort wirst du in der Zeile ? 300 finden.
Dieser Austausch ist case sensitive, d.h. XBP_PP_ORIGIN <> Xbp_PP_ORIGIN
Jan hat geschrieben:Es ist egal ob ich TOPLEFT oder BOTTOMLEFT einsetze, der bleibt immer auf {300, NIL}.
Soweit ich weiß ist Xbase IMMER BOTTOMLEFT, also wird der Parameter wohl entweder für die Zunkunft oder der Vollständigkeit halber definiert sein.
Jan hat geschrieben:Hilft mir also nicht weiter. Leider.
Wo liegt das Problem, erklär und das nochmals ?

Alle Fenster und Koordinaten haben in Xbase (leider) ihren Ursprung links unten ... dies kann über :origin(x) abgefragt werden ...
Gruß
Hubert
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14651
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Beitrag von Jan »

Hubert,

ich kann das BOTTOMLEFT nicht leiden. Es ist mir zu kompliziert, ständig Dialoge und Ausdrucke aufwändig zu berechnen, nur damit ich am Seitenanfang, der aber nicht der Anfang des Koordinatensystemes ist, auch anfangen kann.

Daher arbeite ich grundsätzlich mit TOPLEFT. Was auch einwandfrei funktioniert (ging schon mit 1.82, mit 1.9 und einer überarbeiteten DLL ist es jetzt aber perfekt).

Jan
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo Jan,

du hast eine System-DLL angepasst ? Respekt. :thumbleft:

Ich habe bei meiner Druckerklasse nach außen auf auf TopDown umgestellt, indem ich das Koordinatensystem umrechne. Durch die Vererbung war das nicht so dragisch.

Wenn du selbst den Parameter bei deinen Programmen aber nicht bei allen setzt, kommt es natürlich drauf an wie Xbase-Controls darauf reagieren.
Dennoch bist doch du derjenige, der den Parameter setzt, also kannst du das auch ablegen. Wenn es nicht so geht wie vorgesehen, mach eine eigene Klasse:

CLASS TD_Dialog FROM XbpDialog()
var IsTopDown
...
Method TD_Dialog:init(......)
::XbpDialog:init(......) // TOP Down wie du es auch immer machst.
::IsTopDown := .t.
...

Sind jetzt alle XbpParts auf TopDown oder ButtomUp ???
Gruß
Hubert
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14651
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Beitrag von Jan »

Hallo Hubert,

um etwas richtig zu stellen: Ich habe keine System-DLL angepasst. Till hat auf meine "Reklamation" hin eine 1.9-DLL korrigiert.

Nun, ich setze bei meinem Hauptdialog in der Main-Prozedur den PP auf {XBP_PP_ORIGIN, XBP_ORIGIN_TOPLEFT}. Und damit ist alles auf TOPLEFT umgestellt. Da ja vererbt wird. So kann man dann endlich vernünftig im Koordinatensystem ohne Verrenkungen arbeiten :roll:

Leider muß ich gestehen daß ich von dem, was Du in Deinem letzten Beitrag geschrieben hast, keine 10 % verstanden habe :?

Jan
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo Jan,

ich meinte, dass du doch weißt ob TopLeft oder BottomLeft einstellt ist, das mußt du dir nur merken, egal ob in einer Public oder sonstwie.
Und wenn man eine eigene Klasse von der Basisklasse ableitet, die das MainFenster macht, und dort dann eine instanzvariable einbaut und den Zustand setzt, kann man diese später abfragen.

Was mich halt wundert ist, dass du später im Programm das ändern möchtest, das macht man doch nicht oder ?
Gruß
Hubert
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14651
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Beitrag von Jan »

Hubert,

so langsam beschleicht mich das Gefühl, daß Du mich mißverstanden hast. Ich möchte nichts nachträglich ändern. Und natürlich weiß ich, was ich selber nutze. Nämlich grundsätzlich TOPLEFT.

Ich schreiben gerade eine Klasse, die vermutlich nicht nur von mir genutzt werden wird. Und da gibt es einige Punkte drin, die nicht direkt auf TOPLEFT oder BOTTOMLEFT reagieren (können). Also muß ich vorher feststellen, was der jeweilige Entwickler da eingestellt hat. Um dann angemessen darauf reagieren zu können, ohne das da der jeweilige Entwickler "seine" Einstellungen nochmals angeben muß.

Jan
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo Jan,

ok, soweit so klar.

Du hast 3 Möglichkeiten.

1. Frage bei Alaska nach, warum der Wert nicht gesetzt wird !

2. Benutze in deinem MAIN Programm eine Public, die du später in deiner Klasse abfragst. Wenn sie nicht vorhanden oder NIL (ist glaube ich das selbe) ist, dann handelt es sich um Standard BottomLeft.

3. Du kannst auch in deiner Klasse eine Instanzvariable benutzen, die standardmäßig auf BottomLeft steht und die du in deinem Programm einmalig anders setzen musst.
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hi Jan,

nochmals kurz zur Klasse ... ich nutze nicht XbpDialog für meine Fenster in den normalen Programmen sondern meine eigenen abgeleiteten Klassen.
Hier das Beispiel eines RootFensters:

Code: Alles auswählen

* MDI_CLAS.PRG
*
* Abgeleitete Klassen f
Gruß
Hubert
Sören
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 205
Registriert: Mo, 07. Aug 2006 10:18
Wohnort: Leipzig
Danksagung erhalten: 11 Mal

Beitrag von Sören »

Hallo Jan,

meine Antwort kommt vielleicht ein wenig spät, aber vielleich kannst Du ja trotzdem noch etwas damit anfangen.

Die Funktion, die ich zum Abfragen von TopLeft benutze ist folgende:

Code: Alles auswählen

FUNCTION IsOriginTopLeft( oXbp ) 

  LOCAL lRet := .F.
  LOCAL oDesktop := AppDesktop() 
  LOCAL aPP
  LOCAL nPos

  while oXbp != oDesktop

    aPP := oXbp:setPresParam()
    nPos := AScan( aPP, { |a| a[1] == XBP_PP_ORIGIN } )

    if aPP[nPos][2] != NIL
      if aPP[nPos][2] == XBP_ORIGIN_TOPLEFT
        lRet := .T.
      endif
      EXIT
    endif

    oXbp := oXbp:setParent()

  enddo
 	 
RETURN lRet
Die Presentation Parameter des Xbp zu prüfen, für den man wissen möchte, ob BottomLeft oder TopLeft der Ursprung ist, funktioniert nur dann, wenn explizit für ihn Origin gesetzt wurde, andernfalls wird immer NIL zurückgegeben. Da der Xbp aber seine Eigenschaften (also auch Origin) vom Parent erbt, muss man eben dort prüfen, und ist Origin auch dort NIL, geht man eben zum Parent des Parent usw.

Übrigens habe ich selbst bisher mit TopLeft nur herumprobiert. Daher fallen mir spontan ein paar Fragen ein, die Du mir vielleicht beantworten könntest:

1. Was meintest Du weiter oben in diesem Thread damit, dass Du von Alaska eine korrigierte DLL erhalten hast? Sind DLL's der 1.9er Auslieferung in Hinsicht auf TopLeft-Verhalten fehlerbehaftet?

2. Ich habe, wenn ich TopLeft als Ursprung eingestellt habe, Probleme mit der Darstellung der Xbp, sobald der Dialog von Hand resized wird. Kennst Du das auch?

3. Verwendest Du den FormDesigner? Der kennt ja wohl nur BottomLeft! Falls Du damit arbeitest, wie rechnest Du von BottomLeft nach TopLeft um? Damit meine ich keine Funktion zur Koordinaten-Umrechnung, sondern ob Du eine Art von Automatismus, z.B. eine eigene Dialog-Klasse, einsetzt, die das für Dich erledigt!?

4. Da Du hier scheinbar der Einzige bist, der beim Dialogentwurf TopLeft als Ursprung verwendet (die Einstellung ist ja auch nirgendwo in der Xbase-Hilfe dokumentiert) noch eine abschließende Frage: Bist Du der Meinung, dass diese Möglichkeit ausgereift und praktikabel ist?


Tschüs,
Sören
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14651
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Beitrag von Jan »

Hallo Sören,

erstmal Danke für Deinen Code. Probiere ich nacher oder morgen mal aus.

Zu Deinen Fragen:

1) Naja, es funktioniert schon sehr gut mit den Standard-DLL von 1.9. Es gab nur einen ganz speziellen Punkt, wo es ein Problem gab. Till hat mir da ausgeholfen. Du kannst sie sicher bei Alaska anfragen, wirst es aber wohl bald auch herunterladen können. Aber wie gesagt: Normalerweise geht es auch ohne. Schau Dir mal die PDR 5599 an für weitere Infos.

2) Ich resize eigentlich nie. Kann ich also nicht beantworten. Teste ich aber mal.

3) Nein, Formdesigner nutze ich nie.

4) Ja. Ganz eindeutig. Ich arbeite grundsätzlich nur noch TopLeft. Es mag vielleicht noch ein paar Punkte geben, wo das nicht wirklich umgesetzt ist, wie etwa beim Formdesigner. Deswegen ist die ganze Geschichte wohl auch noch undokumentiert.

Jan
Sören
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 205
Registriert: Mo, 07. Aug 2006 10:18
Wohnort: Leipzig
Danksagung erhalten: 11 Mal

Beitrag von Sören »

Hallo Jan,

danke für Deine Antworten!

Tschüs,
Sören
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Jan hat geschrieben:2) Ich resize eigentlich nie. Kann ich also nicht beantworten. Teste ich aber mal.
1. Ideal wäre es, wenn standardmäßig bei dem Verkleinern eines Fensters (egal ob von oben oder unten) die Controls immer an der gleichen Stelle - in Bezug auf die linke obere Ecke - bleiben. Was nicht passt wird unten und rechts abgeschnitten.
Ohne Anpassung, der Resize Methode.

2. Möchte man die Controls in der Größe anpassen, kann man das ja in RESIZE erledigen.

3. Beim LeftBottom-Standard ist es aber tatsächlich so, dass die oberen Elemente verschwinden oder riesigen Platz dazwischen bekommen.
Dies setze ich in der Resize Methode zwar zurück, was ein Flackern erzeugt.

Wenn 1. und 2. für LeftTop zutrifft, wäre es ideal - auch wenn ich deshalb meine Druckerklasse anpassen müßte. Dort rechne ich intern immer auf LeftTop um. Wenn aber der Druckertreiber einen nicht ganz richtigen Wert für den unteren Rand ausgibt (0,0) immer zu Verschiebungen führt.
Mit LeftTop wäre das alles kein Problem.
Gruß
Hubert
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14651
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Beitrag von Jan »

Hubert,

wie gesagt, resize habe ich meines Wissens noch nicht eingesetzt. Bei mir hat das immer von Anfang an die Größe, die ich errechnet habe (z. B. bei Anpassung an die Bildschirmauflösung). Aber es müsste schon so sein: Die obere linke Ecke bleibt, denn das ist ja die Berechnungsgrundlage. Sowohl für die Position des Fensters selber als auch für die Controls in dem Fenster.

Die Umstellung auf TopLeft habe ich aus genau dem Grund gemacht: Immer dieses Rumgerechne, und dann passt es vielleicht doch nicht exakt. Was gerade bei Formulardrucken dann dumm aussieht. Außerdem kann ich so einfach oben anfangen ohne zu wissen, wass denn da vielleicht noch alles kommt, Längenmäßig gesehen.

Jan
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Jan hat geschrieben:resize habe ich meines Wissens noch nicht eingesetzt.
Was passiert denn mit den Controls wenn du dein Fenster nachträglich mit der Maus von der Größe her änderst ?
Oder hast du das mit festen MIN/MAX Werten verhindert ?
Gruß
Hubert
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14651
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Beitrag von Jan »

Hubert,

Du wirst Dich freuen: Wenn ich die Fenster mit der Maus ändere bleibt alles oben links sichtbar. Wie gewünscht (und gehofft).

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

Beitrag von Jan »

Hubert,

nein, Du nervst nicht. Im Gegenteil: Endlich weiß ich mal mehr als der Moderator :-) :idea:

Es ist, wie man das ordentlich erwarten kann: Die Eigenschaft wird vererbt. Das war früher noch nicht immer der Fall, aber in der 1.9 läuft das jetzt.

Wie oben schon gesagt: Es gab noch eine Macke, die Till aber sofort bereinigt hat. Sollte da also noch etwas auftauchen, dann sollte das auch kein längerfristiges Problem darstellen. Im "Normalbetrieb" habe ich aber sonst noch keine weiteren Fehler gefunden. Aber Spezialitäten gibt es halt doch noch immer ...

Jan


Hubert: Hast Du Deine Nachricht wieder gelöscht? Oder habe Halluzinationen?
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hi Jan,

ich hatte eben meine Frage gerade wieder gelöscht, weil du das mit der Vererbung ja schon erwähnt hattest, als ich sah, dass du schon darauf geantwortet hattest.
Die Klarstellung mit der Vererbung ist dennoch sehr wertvoll ich muss das mal ausprobieren.

Auch ich konnte nie verstehen wie man auf LeftBottom bei einem normalen Entwicklungswerkzeug für Verwaltungssoftware kommen kann, wo doch nur bei Mathe 0,0 links unten oder in der Mitte liegt, wir aber von links oben nach rechts unten lesen ... ;)

Diese Entscheidung hat auf den Programmierern auf jeden Fall viel Ärger eingebracht.
Gruß
Hubert
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16509
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Jan,
Jan hat geschrieben:nein, Du nervst nicht. Im Gegenteil: Endlich weiß ich mal mehr als der Moderator :-) :idea:
und das sogar als der schlechteste Programmierer aller XUGs :D

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.
Antworten