Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Wizard command leiste und abfrage?

0 views
Skip to first unread message

Silenus paparias

unread,
Nov 4, 2009, 2:03:44 AM11/4/09
to
Hallo.

Habe eine kleine Anwendung geschieben.
Die Command leiste wurden automatisch mit den Wizard erstellt.

Nun moechte unterbinden das eine bestimmtes text-feld bei speichern
leer ist.

In der Valid event des "New" bottons was zu "Save" button wird, habe
folngedes geschrieben:

if this.downpicture="save.bmp"
if EMPTY(thisform.textfeld.value)
n=messagebox(...........)
thisform.textfeld.setfocus()
endif
endif

Das funktioniert nicht.

Was jemand was ist hier falsch bzw, wie kann sonst das text-feld bei
"saven" abfragen?

danke.

Silenus paparias

unread,
Nov 4, 2009, 4:41:40 AM11/4/09
to
Sorry , ich meinte der wizard command buttons.

Stefan Wuebbe

unread,
Nov 4, 2009, 9:26:59 AM11/4/09
to
Hallo Silenus,

Vom Vfp Form Wizard erstellte Formulare basieren auf Klassen,
die in den wiz*.vcx Bibliotheken im Home() Ordner gespeichert
sind (was einer der Nachteile des Form Wizard ist, weil dein
Projekt auf anderen Rechnern, wo der Home() Pfad eventuell
nicht derselbe ist, nicht mehr ohne Weiteres bearbeitet
werden kann).

Es gibt soweit ich wei� keine Dokumentation zum Form Wizard
und seinen Klassen, weswegen man im Code selbst schauen muss,
wenn das Form Wizard Ergebnis nicht genau den eigenen
Vorstellungen entspricht. (Viele Vfp EntwicklerInnen benutzen
den Form Wizard nicht.)

Wenn du z.B. deinen cmdAdd Button im Formular selbst
anschaust, siehst du, dass die Wizard Klasse keinen Code
im Valid(), sondern im Click() hat. Wenn du dort in deiner
abgeleiteten Instanz im Code Editor z.B.
Set Step On
DoDefault()
schreibst, kannst du im Debugger den Ablauf verfolgen.


> if this.downpicture="save.bmp"

Der Wizard "ButtonSet" hat eine Eigenschaft EditMode

> if EMPTY(thisform.textfeld.value)
> n=messagebox(...........)
> thisform.textfeld.setfocus()

SetFocus() w�re im Valid() seit Vfp5 nicht mehr "erlaubt",
im Click dagegen schon. Aber wichtiger ist, dass du per
DoDefault() Aufruf den eigentlichen (Wizard) Code aufrufst
(oder eben je nach Bedingung das nicht tust).
In deinem Fall also im cmdAdd.Click() in etwa so:

If This.Parent.EditMode
If EMPTY(NVL(thisform.textfeld.value,''))
n=messagebox(...........)
thisform.textfeld.setfocus()
Else
DoDefault()
Endif
Endif


hth
-Stefan

Silenus paparias

unread,
Nov 5, 2009, 1:31:30 AM11/5/09
to
Hallo Stefan.

Der Code funktioniert , nur ich habe eine Fehlermeldung bei setfocus
siehe code.

If This.Parent.EditMode
If EMPTY(NVL(thisform.textfeld.value,''))
n=messagebox(...........)

thisform.textfeld.setfocus() <----------------Fehler "Unknow
member"
Else
DoDefault()
Endif
Endif

Der Member existiert definitiv, wenn nicht, muesste ich frueher bei if
EMPTY(............) die fehlermeldung haben, aber hier laufter er
durch.
Das kann ich mir nicht erklaeren.

Hast du eine Anhnung?

gruss

Stefan Wuebbe

unread,
Nov 5, 2009, 4:16:45 AM11/5/09
to

Nein, keine. Wenn sich der Code im button.Click(), also nicht mehr im
Valid() befindet, und im Debugger "VarType(Thisform.textfeld)='O'" und
"PemStatus(Thisform.textfeld,'SetFocus',5)=.T." ist, entsteht der Fehler
vielleicht im eigenen Code textfeld.SetFocus() selbst?


hth
-Stefan

Jürgen Wondzinski

unread,
Nov 5, 2009, 5:57:25 AM11/5/09
to
Hallo Silenus

a) Mit welcher VFP-Version arbeitest du? Scheinbar noch nicht mit VFP9,
denn rein prinzipiell w�rde da dein frevelhaftes ;) Tun mit der
Fehlermeldung �hnlich "Cannot SETFOCUS from within VALID" kommen.
Merke: Ein VALID ist zum �berpr�fen der aktuell in _diesem_ Control
stattfindenden Eingabe zust�ndig, erst wenn das Valid verlassen wurde,
d�rfen andere Controls angesprungen werden. Du kannst nicht w�hrend einer
Abpr�fung zu einem anderen Control springen.

Bei einem Button kommt der Aktionscode immer in den CLICK, der Button.Valid
wird zwar nach dem Click noch gefeuert, dies ist aber eine Kr�cke um alten
portierten 2.x Code zum Laufen zu bringen (Damals gabs beim Button noch kein
Click-Event). Bei diesem Valid-Anstossen im Button taucht dann noch ganz
nebenbei eine weitere Unsch�nheit auf: Es wird nach dem Valid der When-Event
ein zweites Mal gefeuert; dies kommt daher, dass das Valid durch ein
kurzzeitiges Verlassen des Buttons mit sofortigem R�ckkehren getriggert
wird, und dabei feuert der When eben ein zweites Mal....


b) Ist die Buttonleiste in einer Toolbar oder auf der selben Form?

> Der Member existiert definitiv, wenn nicht, muesste ich frueher bei if
> EMPTY(............) die fehlermeldung haben, aber hier laufter er

c) schlicht ein Schreibfehler? Normalerweise m�sste Intellisense dir ja das
Objekt sauber reinschreiben, aber dein Code sieht so handgeschrieben aus...


d) So ne Abpr�fung geh�rt eigentlich in das Textbox-Valid, denn da ist der
Fehler, und da sollte er auch sofort behandelt werden:

IF LASTKEY() # 27
IF EMPTY(This.Value)
WAIT WINDOW "Darf nicht leer sein!"
RETURN 0
ENDIF
ENDIF


Das Lastkey() stellt sicher, dass die Pr�fung bei einem Abbruch (ESC
gedr�ckt, oder Click auf einen Button mit Cancel=.T.) nicht durchgef�hrt
wird.
Das RETURN 0 sorgt daf�r, dass der Anwender KEIN Feld weiter springt, also
in der Textbox drinbleibt. Bei einem RETURN .F. w�rde FoxPro selber ein
Waitwindow mit "Ung�ltige Eingabe" anzeigen, zus�tzlich zu deiner Ausgabe.
Das k�nnte man aber ebenfalls mit dem ErrorMessage Event �bersteuern:

Textbox.Valid:
IF LASTKEY() # 27
IF EMPTY(This.Value)
This.Tag = "Darf nicht leer sein!"
RETURN .F.
ENDIF
ENDIF

und im Textbox.ErrorMessage:
RETURN This.Tag

--

wOOdy
Visual FoxPro Technologieberater
Microsoft "Most Valuable Professional" 1996 bis 2009

"*��)
�.���.�*��) �.�*�)
(�.��. (�.�` *
..�`.Visual FoxPro: It's magic !
(�.�``��*

0 new messages