XbpDialog() ohne Min-, Max- und Close-Button

Grafische Primitive, XbaseParts und Darstellungsfragen allgemein.

Moderator: Moderatoren

Antworten
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

XbpDialog() ohne Min-, Max- und Close-Button

Beitrag von georg »

Guten Abend,


für ein Projekt muss ich innerhalb eines Xbase-Programms einen XbpDialog() anzeigen, der ohne die oben genannten Buttons daherkommt. Der Dialog ist recht klein, und die Buttons aufgrund seiner Funktion nicht erforderlich (eher: hinderlich).

Ich zitiere da mal aus der Dokumentation zu :maxButton:
The pushbutton is always displayed within an MDI client window, unless :titleBar is set to .F. (false).
OK, mein Problem ist, dass ich die Titlebar brauche. Nach mehreren Versuchen bin ich auf diese Lösung gekommen:

Code: Alles auswählen

   oDlg := XbpDialog():new(AppDeskTop(), oPart2Move:setOwner(), aPos, aSize)
Das funktioniert, wäre da nicht ein Schönheitsfehler:

Bild

Beide XbaseParts, also die XbpListBox() im Hintergrund, als auch der XbpDialog(), haben die gleiche Grösse, in diesem Fall 120 * 120 Pixel. Die angezeigte Grösse des XbpDialog() ist aber nur 105 * 112 Pixel (plus/minus 1 Pixel).

Ich hoffe, ich konnte mein Problem deutlich genug beschreiben:

ich brauche einen XbpDialog() mit der gleichen, angezeigten Grösse wie ein anderes XbasePart, dessen Titlebar sichtbar und nutzbar sein muss (zwecks mit der Maus packen und verschieben). Daher sind bei kleinen Ausgangs-XbaseParts die Buttons hinderlich und könnten alle entfallen.

Der Lösungsansatz, den Desktop als Parent zu verwenden, klappt - allerdings ist der XbpDialog() in der Anzeige etwas kleiner als die Vorgabe, die beim :new() mittels aSize vorgegeben wird. Rufe ich im Debugger die :currentSize() ab, wird sie (in diesem Fall) mit {120, 120} angegeben.

Jetzt suche ich nach einem Lösungsweg.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
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: XbpDialog() ohne Min-, Max- und Close-Button

Beitrag von AUGE_OHR »

georg hat geschrieben: Mo, 03. Sep 2018 18:52 ... allerdings ist der XbpDialog() in der Anzeige etwas kleiner als die Vorgabe, die beim :new() mittels aSize vorgegeben wird.
in solchen Fällen arbeite ich mit o:Clientsize d.h. von "innen nach aussen"
gruss by OHR
Jimmy
Dieter
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 237
Registriert: Do, 14. Aug 2008 14:59
Wohnort: Straelen
Hat sich bedankt: 2 Mal
Danksagung erhalten: 3 Mal

Re: XbpDialog() ohne Min-, Max- und Close-Button

Beitrag von Dieter »

Hallo Georg,

wenn in aSize={120,120} enthalten ist, dann muss das Fenster auch diese Größe haben. Bei deiner Fragestellung gehe ich davon aus, dass du die äußere Fenstergröße meinst. Überprüfe bei dir, ob die oDlg:create-Methode die Fenstergöße nochmals verändert.
Mit oDlg:clientsize kannst du die Göße des Fensterrahmen und der Titlebar ausrechnen. Mit oDlg:border=XBPDLG_NO_BORDER hat auf meinem Windowsrechner die Titlebar eine Höhe von 23 Pixel und der Fensterrahmen hat 3 Pixel. oDlg:clientSize beträgt dann {114,91}.
Viele Grüße

Dieter

Was man nicht versteht, besitzt man nicht.
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: XbpDialog() ohne Min-, Max- und Close-Button

Beitrag von georg »

Hallo, Dieter -


ich habe die ganzen Anweisungen (sind ja nicht so viele) mittels XppDbg verfolgt, und der XbpDialog() wird mit einer Grösse von {120, 120} erstellt. Seine linke, untere Ecke ist deckungsgleich mit der linken, unteren Ecke der XbpListBox().

Wenn ich die Grösse des XbpDialog() mittels :currentSize() abfrage, ist das Ergebnis {120, 120}. Das ist es ja, was mich verwirrt - gäbe es z.B. einen transparenten Rahmen, dann würde ich erwarten, dass er sich an allen Seiten des XbpDialog() befindet.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Dieter
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 237
Registriert: Do, 14. Aug 2008 14:59
Wohnort: Straelen
Hat sich bedankt: 2 Mal
Danksagung erhalten: 3 Mal

Re: XbpDialog() ohne Min-, Max- und Close-Button

Beitrag von Dieter »

Hallo Georg,

die äußere Größe der richtigen Fenster (oDlg) stimmt genau. Die Göße der Listbox wird in xBase ohne Scrollbalken und ohne Rahmen angegeben.
Du mußt also das oDlg-Fenster etwas gößer kalkulieren. Wie vieles andere ist das in xBase etwas mühsam. :(
Viele Grüße

Dieter

Was man nicht versteht, besitzt man nicht.
Dieter
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 237
Registriert: Do, 14. Aug 2008 14:59
Wohnort: Straelen
Hat sich bedankt: 2 Mal
Danksagung erhalten: 3 Mal

Re: XbpDialog() ohne Min-, Max- und Close-Button

Beitrag von Dieter »

Hallo Georg,

gerade habe ich festgestellt, dass auch grafische oDlg-Fenster mit gleicher Größe, aber unterschiedlichen Rahmentypen nicht kongruent sind.
Das wurde von mir mit oDlg:border:= XBPDLG_NO_BORDER und XBPDLG_SIZEBORDER getestet. Also muss es soetwas wie ein unsichtbaren Rahmenanteil geben! Ich hatte bisher immer geglaubt, dass Dialogfenster mit gleicher aSize außen immer gleich groß sind. Man kann sich also nur auf die oDlg:clientSize verlassen.
Viele Grüße

Dieter

Was man nicht versteht, besitzt man nicht.
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: XbpDialog() ohne Min-, Max- und Close-Button

Beitrag von georg »

Hallo, Dieter -


ich habe den Code mal ein wenig erweitert.

Code: Alles auswählen

   aPos := oPart2Move:currentPos()
   aSize := oPart2Move:currentSize()
   aPosDesk := RootWindow():currentPos()
   FOR nI := 1 TO 2
      aPos[nI] += aPosDesk[nI]
   NEXT

   oDlg := XbpDialog():new(AppDeskTop(), oPart2Move:setOwner(), aPos, aSize)
   oDlg:title := "bewege mich"
   oDlg:minButton := .F.
   oDlg:maxButton := .F.
   oDlg:create()

   aPos := oPart2Move:currentPos()
   aPos[1] += 20 + aSize[1]

   oDlg := XbpDialog():new(, , aPos, aSize)
   oDlg:title := "bewege mich 2"
   oDlg:create()
Das zweite (rechte) Fenster hat die gleiche Dimension, aber Parent ist nicht der Desktop, sondern die :drawingArea des Programms. Und es ist, denke ich, gut erkennbar, dass beide Fenster unterschiedlich gross sind:

Bild
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Dieter
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 237
Registriert: Do, 14. Aug 2008 14:59
Wohnort: Straelen
Hat sich bedankt: 2 Mal
Danksagung erhalten: 3 Mal

Re: XbpDialog() ohne Min-, Max- und Close-Button

Beitrag von Dieter »

Hallo Georg,
Und es ist, denke ich, gut erkennbar, dass beide Fenster unterschiedlich gross sind:
Ja das kann man deutlich erkennen, trotzdem sind die Fenstergrößen durch unsichtbare (transparente) Rahmenteile gleich groß gehalten.

Ändere deinen Code

Code: Alles auswählen

aPos[1] += 20 + aSize[1]
nach

Code: Alles auswählen

aPos[1] += aSize[1]
dann wird zwischen den Fenstern eine Lücke sichtbar, obwohl diese aneinander liegen müssten.
Viele Grüße

Dieter

Was man nicht versteht, besitzt man nicht.
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: XbpDialog() ohne Min-, Max- und Close-Button

Beitrag von AUGE_OHR »

georg hat geschrieben: Di, 04. Sep 2018 19:27 Das zweite (rechte) Fenster hat die gleiche Dimension, aber Parent ist nicht der Desktop, sondern die :drawingArea des Programms. Und es ist, denke ich, gut erkennbar, dass beide Fenster unterschiedlich gross sind:
schon mal versucht wenn es grösser ist als die 3 Buttons + Icon ?

die Xbase++ MDI Fenster sind "irgendwie verkehrt" ... schon die Titlebar stimmt nicht unter Windows 10.
mit o:Clientsize funktioniert es im Prinzip --- auch wenn mal paar Pixel fehlen und ein Horizontaler Schrollbar erscheint.

ich mache es dann die o:DrawingArea "sichtbar" mit

Code: Alles auswählen

oDlg:DrawingArea:SetColorBG(GRA_CLR_PINK)
p.s. zum "wegmachen" des Min+Max Button gibt es noch diese Möglichkeit von Phil Ide : SetWindowPropertyOff()
winprop.zip
Source
(1.2 KiB) 247-mal heruntergeladen
gruss by OHR
Jimmy
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2470
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 102 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: XbpDialog() ohne Min-, Max- und Close-Button

Beitrag von Koverhage »

Georg,
eventuell kann dich ein Express++ Spezialist auf die richtige Fährte führen.
Dort gibt es NOMIN und NOMAX Anweisungen die zumindest diese 2 ausblenden.
Gruß
Klaus
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: XbpDialog() ohne Min-, Max- und Close-Button

Beitrag von georg »

Guten Morgen,


die Windows-Property-Funktion von Phil hat das Problem gelöst.

Vielen Dank an alle!
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Antworten