Seite 1 von 2

xbpstatic und :setcaption()

Verfasst: Mo, 22. Mai 2006 14:11
von Manfred
Hi,

ich habe gerade ein wenig ausprobiert und wollte ein Fenster im GUI Modus erstellen, in dem sich ändernde Daten angezeigt werden sollen. Das klappt auch ganz gut, solange die Daten sich nicht ändern.

Also habe ich mir Anfangs gedacht, ich baue jedesmal das Fenster mit den Inhalten neu auf. Ist aber blöde, weil dann immer alles :create() und :destroy() gemacht werden muß. Dann habe ich im Handbuch nachgeblättert und bin auf :setcaption() gestoßen. Das macht schon das was ich will, nur überschreibe ich mir dann in der Maske den Text, der links vor dem sich ändernden Wert steht. Wird denn nicht die eingestellte Größe des Static übernommen, die ich Anfangs eingestellt habe?

Code: Alles auswählen

local oDlg
local oStatic1, oStatic2

oDlg := XbpDialog():new(SetAppWindow(),,{4,30},(1000,170})
oDlg:create()

oStatic1 := XbPStatic():new(oDlg,,{1,10},{50,20})
oStatic2 := XbpStatic():new(oDlg,,{30,10},{100,20})

oStatic1:caption := "Wert1:"
oStatic1:option  := XBPSTATIC_TEXT_RIGHT+XBP_STATIC_TEXT_VCENTER
oStatic1:create()

oStatic2:caption := "11111"
oStatic2:option  := XBPSTATIC_TEXT_RIGHT+XBP_STATIC_TEXT_VCENTER
oStatic2:create()

oStatic2:setCaption("22222")
Die Zahlen für die Größe und der Position sind jetzt blind gewählt, um es darzustellen.

(ich habe die Lösung mal so probiert, weil ich nichts besseres kenne.)

Verfasst: Mo, 22. Mai 2006 14:30
von Jan
Manfred,

warum machst Du nicht ein

oStatic2:caption := "22222"
oStatic2:configure()

? Mit :configure() werden Änderungen, die erst nach dem :create() durchgeführt wurden, aktualisiert.

Jan

Verfasst: Mo, 22. Mai 2006 14:31
von Rolf
Hallo Manfred

So wie ich das sehe überzeichnet das oStatic1 bei Änderung das oStatic2.

Das oStatic1 ist an Position X=1 und Y=10 und hat eine Breite von 50 und eine Höhe von 20 Pixel.

Das oStatic2 beginnt aber schon wieder bei X=30 und müsste eigentlich erst bei X=1+50 beginnen

Achte auch auf die Reihenfolge der Create()'s.

Gruß Rolf

Verfasst: Mo, 22. Mai 2006 14:38
von Manfred
@ Rolf,

das habe ich mir gedacht, deshalb schrieb ich drunter, das die Werte nur pauschal sind um etwas stehen zu haben.

Die Abstände sind im Original schon richtig, denn beim :caption wird alles richtig angezeigt. Erst beim :setcaption() wird links überschrieben.
Und dafür habe ich im Moment keine Erklärung.

@Jan

da passiert das gleiche. Merkwürdig, zumal ich das :setcaption() woanders schon mit Erfolg einsetze.....

Verfasst: Mo, 22. Mai 2006 14:46
von Jan
Manfred,

noch mal zum Verständnis: Was meinst Du mit links überschreiben? Hast Du vielleicht mal einen Bildschirmausdruck oder so etwas ähnliches?

Jan

Verfasst: Mo, 22. Mai 2006 14:49
von Rolf
Hallo Manfred

steht irgendwo oStatic1:autoSize := .T., damit wird auch die Größe angepasst. Im Defaultfall ist das auf .F..

1. hast du noch andere Objekte die sich überdecken?
2. bitte führe mal nach dem setCaption() ein oDlg:invalidateRect() aus.
3. oder experimentiere mal mit oStatic1:clipSiblings
4. verschieb oder dreh die create-Reihenfolge mal um


Gruß
Rolf

Verfasst: Mo, 22. Mai 2006 14:51
von brandelh
Hallo,

:setCaption()

ist das gleiche wie

:caption()
:configure

nur wenn man mehrere Infos ändern will, soll man dies auf die zweite Art machen, da es dann schneller ist. Was die Breite angeht, eigentlich dürfte sich die Ausdehnung des statics nicht ändern. Wenn der Text zu breit wird müßte dieser abgeschnitten werden. ABER wenn er vorher schon überlagert hat, könnte das erneute setCaption die Zeichenreihenfolge ändern.

22222 müßte aber gleich groß wie 11111 sein.

Verfasst: Mo, 22. Mai 2006 15:19
von Manfred
Yepp,

Fehler gefunden.

Ich sage es mal ganz salopp, der rechte Wert hat den linken Wert nicht überlagert, sondern unterlagert und das wurde dann zu einer Überlagerung beim :setcaption(). merkwürdig, wo doch der linke TExt zuerst angezeigt wird. Da müßte doch dieser dann auch überschrieben werden, wenn der rechte Wert erst danach erzeugt und angezeigt wird?

So was blödes aber auch. Wie kann man denn so was überhaupt anzeigen lassen, ohne den XPPFD zu benutzen?

Aber wo wir gerade dabei sind, habe ich überhaupt eine Chance den rechten Wert, oder egal welchen, irgendwie vertieft, oder erhöht anzeigen zu lassen? Ich hatte das mal versucht, aber es gab nur eine Erhöhung, oder Vertiefung, die keinen Text anzeigte.

Das kostet alles Nerven.......

Verfasst: Mo, 22. Mai 2006 15:21
von Jan
sondern unterlagert und das wurde dann zu einer Überlagerung beim :setcaption().
Wovon redet der Mann??? Muß ich das verstehen?

Jan

Verfasst: Mo, 22. Mai 2006 15:28
von Manfred
Neeneenee,

wer soll das verstehen?

Was ich meinte war folgendes:

Ich habe einen Text erzeugt, der links am Rand anfängt. Am Ende dieses Textes sollte ein Wert erscheinen, der immer wieder aktualisiert wird.

Text: Wert

Dieser Wert wird anfangs mit :caption := "11.11.1111" belegt und erscheint dann so:

Text: 11.11.1111

Dann habe ich das mit :setcaption("22.22.2222") geändert

und das sah dann so aus

_____22.22.2222 (den Unterstrich muß man wegdenken, ich kriege mit Leerzeichen den Abstand nicht so hin)

Links war der Text weg.

Jetzt war ich aber bis vorhin der Meinung, dass, wenn der Text zuerst steht und der Wert "unsichtbar, weil zu breit" nach dem TExt angezeigt wird, dann sofort den TExt überschreiben müßte. Dem war aber nicht so. Es ist erst nach dem :setcaption() passiert.

PS: Ja, war etwas sehr unglücklich erklärt......

Verfasst: Mo, 22. Mai 2006 15:31
von Rolf
Ja Manfred

Nimm einfach 2 Statics eins erhöht (XBPSTATIC_TYPE_RAISEDRECT) und ein normales. Siehe xbpStatic:type

und in der Xbase-Hilfe zu xbpStatic:caption steht:

Wenn ein XbpStatic-Objekt zur Anzeige von Linien, Rahmen oder Boxen verwendet wird, wird die Caption nicht angezeigt. Die Ausnahme bildet der Typ XBPSTATIC_TYPE_GROUPBOX, bei dem ein Rahmen mit einem Titel (Caption) links oben angezeigt wird.

Gruß Rolf

Verfasst: Mo, 22. Mai 2006 15:31
von brandelh
Hallo Manfred,

Wenn autosize := .f. ist, gilt:

PosX + SizeX Werte (jeweils im Array verpackt) eines Controls müssen kleiner sein als der PosX Wert des folgenden. Die Reihenfolge im Create bestimmt die Anzeigereihenfolge (Z-Order heißt das glaube ich), ein neues Configure kann diese jedoch ändern, was bei setCaption passiert, daher am besten nicht überlagern lassen !

Wenn du mit Tiefstellen sowas meinst 22 etc. geht das nicht, da eine Caption immer nur eine Schriftart und Größe haben kann - denke ich jetzt mal.

Verfasst: Mo, 22. Mai 2006 15:33
von brandelh
Hallo Manfred,

NIE mit Leerzeichen positionieren !

Nimm mehrere unabhängige Statics wenn du sowas brauchst, oder versuche mit chr(9) einen Tabsprung.

Verfasst: Mo, 22. Mai 2006 15:35
von Manfred
brrrrrrrrrr,

wenn man einmal mit dem Gedöns angefangen hat, dann findet man kein Ende mehr. Eigentlich wollte ich ja nur im Textmodus alles programmieren, aber mit jedem neuen Abschnitt versucht man den nächsten usw. usw. Und dann raucht einem der Kopf.

Verfasst: Mo, 22. Mai 2006 15:37
von Manfred
brandelh hat geschrieben:Hallo Manfred,

NIE mit Leerzeichen positionieren !

Nimm mehrere unabhängige Statics wenn du sowas brauchst, oder versuche mit chr(9) einen Tabsprung.
?

Hubert, die Leerzeichen waren gerade nur für das Forum. Ich formatiere im Programm nicht mit Leezeichen. (glaube ich jedenfalls)

Verfasst: Mo, 22. Mai 2006 15:41
von Manfred
Habe das Teil wieder entfernt, war zu groß...

@Hubert,

was ich meinte, war, Erhaben, bzw. Eingedrückt.

Verfasst: Mo, 22. Mai 2006 16:31
von Rolf
@Manfred

zu deinem Quelltext

Meine Anfänge mit GUI sahen auch so aus, alles sehr Funktionsorientiert.
Die ganzen Wiederholungen von einzelnen Zeilen kann man eigentlich nur über Schleifen (+Arrays) ,den &Makro-Operator oder durch geziehlte benutzerdefinierte Funktionen umgehen.

Ich würde dir mal eine E-Mail mit einem einfachen Objekorientierten Dialog schicken. Wenn du möchtest sag bescheid.

Aller Anfang ist schwer. :wink:

Rolf

Verfasst: Mo, 22. Mai 2006 16:35
von Manfred
Rolf hat geschrieben:@Manfred

zu deinem Quelltext

Meine Anfänge mit GUI sahen auch so aus, alles sehr Funktionsorientiert.
Die ganzen Wiederholungen von einzelnen Zeilen kann man eigentlich nur über Schleifen (+Arrays) ,den &Makro-Operator oder durch geziehlte benutzerdefinierte Funktionen umgehen.

Ich würde dir mal eine E-Mail mit einem einfachen Objekorientierten Dialog schicken. Wenn du möchtest sag bescheid.

Aller Anfang ist schwer. :wink:

Rolf
Hi Rolf,

das wäre nett. Ich muß jetzt irgendwie Beispiele sammeln und anhand derer ausprobieren.

Verfasst: Mo, 22. Mai 2006 16:49
von Rolf
So geschehen

gesendet :arrow:

Hoffe es hilft mehr als das es verwirrt. Ist auch noch nicht das optimale aber ich arbeite daran.

Gruß Rolf

Verfasst: Mo, 22. Mai 2006 16:51
von Manfred
Hi Rolf,

danke erhalten, aber könntest Du die Mailadresse hier wieder entfernen....

Danke.

Verfasst: Mo, 22. Mai 2006 17:04
von Manfred
Ich habe jetzt einmal die 1. Felder und Texte Erhaben anzeigen lassen um überhaupt einmal sehen zu können, wie groß ich die dimensioniert habe. Also das haut mich noch vom Hocker. Wie formatiert man denn überhaupt GUI Felder? Nach der neuen Anzeige mußte ich feststellen, das etliches überschrieben wird/wurde, was man so gar nicht erkennen kann.

Verfasst: Mo, 22. Mai 2006 17:25
von Rolf
Hi Manfred

hab die Frage nicht wirklich verstanden. Meinst du mit Formatieren die Größe festlegen.

Im Gegensatz zu DOS ist bei GUI die Größe von Steuerelemente abhängig von der aktuellen Auflösung also

Code: Alles auswählen

aSize := AppDesktop():currentSize()
. Kann allerdings auch von der Schriftart abhängen wenn :autosize:=.T.

Ich zeichne meine Dialoge meist kurz in Paint vor und setze sie dann um.

Bei Überschneidungen von Statics kann man auch :setColorBG() verwenden.

Die Reihenfolge der Create()'s entspricht auch der TabStop-Reihenfolge.

Gruß
Rolf

Verfasst: Mo, 22. Mai 2006 17:38
von Manfred
Hi Rolf

verflixt, ich muß mich langsam daran gewöhnen, dass die ganzen Parts auch noch von anderen erben und somit Methoden haben, die man nur in der Superklasse findet und nicht in der geerbten.

Danke nochmals für den Tipp.

PS: Ich habe groß die ganze Klassenhirarchie vor mir hängen und vergesse regelmäßig darauf zu schauen.....

Mit dem Formatieren meinte ich Größe festlegen...

Verfasst: Mo, 22. Mai 2006 17:41
von brandelh
Manfred hat geschrieben:Ich muß jetzt irgendwie Beispiele sammeln und anhand derer ausprobieren.
Hallo Manfred,

wenn du im XppFD einen Dialog erstellst und als Class-Code speicherst, erhälst du schöne Beispiele, so habe ich auch angefangen.
Auch das MDI Beispiel war sehr nützlich.
Dann gibt es noch eines mit den Fenstereigenschaften.

Verfasst: Mo, 22. Mai 2006 17:43
von Manfred
Hi Hubert,

da habe ich auch schon die ganze Zeit drüber nachgedacht, aber irgendwie habe ich eine leichte Abneigung gegenüber dem FD. Frage mich nicht warum....