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

InputBox *

44 views
Skip to first unread message

kckrz...@poczta.onet.pl

unread,
Mar 19, 2003, 8:46:21 AM3/19/03
to

Czy istnieje prosty sposób na zamianę wprowadzanych znaków w InputBox na *

Krzysiek

--
Wysłano z serwisu OnetNiusy: http://niusy.onet.pl

Jacek Kubek

unread,
Mar 19, 2003, 8:52:57 AM3/19/03
to
kckrz...@poczta.onet.pl:

> Czy istnieje prosty sposób na zamianę wprowadzanych znaków w InputBox na *

IMO nie, lecz możesz utworzyć własny formularz...

--
Jacek (jacek...@onet.pl)

grzegorz...@bankmillennium.pl

unread,
Mar 19, 2003, 8:53:31 AM3/19/03
to
> -----Oryginalna wiadomość-----
> Od: grzegorz...@bankmillennium.pl
> [mailto:grzegorz...@bankmillennium.pl]
> Wysłano: 2003-03-19 14:51
> Do: pl-comp-bazy-d...@newsgate.pl
> Temat: Re: InputBox *
>
>
> > -----Oryginalna wiadomość-----
> > Od: kckrz...@poczta.onet.pl [mailto:kckrz...@poczta.onet.pl]
> > Wysłano: 2003-03-19 14:46
> > Do: pl-comp-bazy-d...@newsgate.pl
> > Temat: InputBox *

> >
> >
> >
> > Czy istnieje prosty sposób na zamianę wprowadzanych znaków w
> > InputBox na *
> >
>
> Istnieje: maska wprowadzania "Password".

Oczywiście we własnym formularzu a nie VB InputBoxie. Ale zrobienie małego
formularza nie powinno stanowić dla ciebie problemu.

Pozdrawiam
Grzegorz
--
Archiwum grupy: http://niusy.onet.pl/pl.comp.bazy-danych.msaccess

grzegorz...@bankmillennium.pl

unread,
Mar 19, 2003, 8:50:32 AM3/19/03
to
> -----Oryginalna wiadomość-----
> Od: kckrz...@poczta.onet.pl [mailto:kckrz...@poczta.onet.pl]
> Wysłano: 2003-03-19 14:46
> Do: pl-comp-bazy-d...@newsgate.pl
> Temat: InputBox *
>
>
>
> Czy istnieje prosty sposób na zamianę wprowadzanych znaków w
> InputBox na *
>

Istnieje: maska wprowadzania "Password".

Krzysztof Naworyta

unread,
Mar 19, 2003, 9:11:15 AM3/19/03
to
Użytkownik <grzegorz...@bankmillennium.pl> napisał w wiadomo¶ci

> > > Czy istnieje prosty sposób na zamianę wprowadzanych znaków w
> > > InputBox na *
> > >
> >
> > Istnieje: maska wprowadzania "Password".
>

> Oczywi¶cie we własnym formularzu a nie VB InputBoxie. Ale zrobienie małego


> formularza nie powinno stanowić dla ciebie problemu.

Stworzenie formularza nie stanowi problemu, ale aby działał tak jak funkcja InputBox(), to już
trochę więcej zachodu ;-)

Proponuję skorzystać z gotowca:

http://groups.google.com/groups?selm=OGbIykg79GA.257%40uppssnewspub04.moswest.msn.net

Przekleić kod i używać !

(za pierwszym razem zostanie wygenerowany formularz)

--
KN

P.S.
Czego to się człowiek nie naznajdywał, przy okazji MDE2MDB ;-)))


Pawel Durys

unread,
Mar 19, 2003, 12:11:25 PM3/19/03
to
> Proponuję skorzystać z gotowca:
>
>
http://groups.google.com/groups?selm=OGbIykg79GA.257%40uppssnewspub04.moswes
t.msn.net
>
> Przekleić kod i używać !
>
> (za pierwszym razem zostanie wygenerowany formularz)
>

Za pierwszym razem to czlowiek zostanie opluty przez AC, ze to nie
zadeklarowane, ze tamto niezgodne. ;-)

Po zajrzeniu do pelnego watku mozna znalezc samokrytyke autora, co do
wspominanego kodu.

Ale, nadal mam kiche, jakos nie moge sie doszukac, gdzie jest blad, ale u
mnie (A2k) nie moge wpisac nic do TextBoxa, nie mowiac juz o otrzymaniu
poprawnej wartosci zwrotnej.

Tylko bip, bip i bip.

> Czego to się człowiek nie naznajdywał, przy okazji MDE2MDB ;-)))

A swoja droga, to masz jakas liste co ciekawego jeszcze znalazles?

Wiem, wiem moge sam szukac tego co potrzebuje, ale wskazowki czlowieka co
juz raz przegryzl sie przez kod i wybral same rodzynki, sa bezcenne (nie
mowiac juz o oszczednosci czasu).


--
Pozdrowienia
Pawel Durys

--
Serwis Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/

Krzysztof Naworyta

unread,
Mar 19, 2003, 2:12:01 PM3/19/03
to
Użytkownik "Pawel Durys" <pdu...@gazeta.pl> napisał

| > Przekleić kod i używać !
| > (za pierwszym razem zostanie wygenerowany formularz)

| Za pierwszym razem to czlowiek zostanie opluty przez AC, ze to nie
| zadeklarowane, ze tamto niezgodne. ;-)
| Po zajrzeniu do pelnego watku mozna znalezc samokrytyke autora, co do
| wspominanego kodu.

1. DAO
2. Odhaczyć ADO, albo deklarować jawnie:
Dim loRst As DAO.Recordset
Dim loDb As DAO.Database
3. Poprawić "zawinięte" linie ;-)
4. Zapisać moduł (!!!) - koniecznie przed pierwszym użyciem zapisać i zamknąć
(procedura MakeForm() generuje także moduł formularza!
Ze względu na rozdzielenie VBE od Access'a prowadzi to
do różnych niestabilności na "brudnym" kodzie w A'2k)

| Ale, nadal mam kiche, jakos nie moge sie doszukac, gdzie jest blad, ale u
| mnie (A2k) nie moge wpisac nic do TextBoxa, nie mowiac juz o otrzymaniu
| poprawnej wartosci zwrotnej.
|
| Tylko bip, bip i bip.

Ja głównie wszystko pakuję do MDE ! Dlatego procedura jaką proponuje Terry interesuje
mnie jako "gotowiec" na etapie tworzenia aplikacji.

Rozdzielić ten kod można na:

1. procedura MakeForm() do jednorazowego wgenerowania formularza wraz z jego kodem

2. funkcja InputBox(), z której śmiało można wyciąć pierwsze linie, odwołujące się do
MakeForm():

(...)
If FormExists(frmInputBox) = False Then
Call MakeForm
End If
(...)

3. Ja w procedurze MakeForm() dołożyłem dwie dodatkowe linie.
choć oczywiście można to zrobić ręcznie, w projekcie już wygenerowanego formularza:

Set loCmd = CreateControl(strName, _
acCommandButton, _
acDetail, , , _
3855, 225, 1132, 352)
With loCmd
.Name = "cmdOK"
.Caption = "OK"
.OnClick = "[Event Procedure]"
.Default = True '<<<<<<<<<<<<<
End With
Set loCmd = CreateControl(strName, _
acCommandButton, _
acDetail, , , _
3855, 630, 1132, 352)
With loCmd
.Name = "cmdCancel"
.Caption = "Cancel"
.OnClick = "[Event Procedure]"
.Cancel = True '<<<<<<<<<<<<<
End With

4. W zasadzie nie da się debugować procedury CreateFormMod()
(śledzenie krokowe)
Trzeba zawierzyć autorowi ;)

5. Po wygenerowaniu formularza wraz z jego kodem, procedura InputBox() nie powinna
sprawiać problemów.

| > Czego to się człowiek nie naznajdywał, przy okazji MDE2MDB ;-)))
|
| A swoja droga, to masz jakas liste co ciekawego jeszcze znalazles?
|
| Wiem, wiem moge sam szukac tego co potrzebuje, ale wskazowki czlowieka co
| juz raz przegryzl sie przez kod i wybral same rodzynki, sa bezcenne (nie
| mowiac juz o oszczednosci czasu).

Jak wspomniałem, użyłem kilka słów kluczowych:
CreateForm, CreateControl, CreateReport, CreateReportControl,
Footer, Header

nie ma zbyt wiele wątków wokół tych słów kluczowych. W większości prowadzą do
procedur Ashisha lub Krefta, czasami Getza. W zasadzie wszystko można znaleźć też w
resources na www.mvps.org/access, tylko z racji zagęszczenia umykało mi to do tej
pory ;-)

Generalnie nie zapisywałem tamtych nowinek (nadmiar danych to brak danych ! mam już
ponad 3GB różnych ciekawostek, a czuję się jakbym nie miał niczego !!! ;-))) bo
szukanie w tym to straszna upiorność ;-))))
Dlatego bazuję na skojarzeniach ! Tak jak teraz: InputBox i Password ? aaa, było ...
wklepmy więc w googlu to i to ...

Jak następnym razem cos zmów mi się skojarzy to, wierz mi, szybko sie tym z Wami
podzielę ;-)

--
KN

Pawel Durys

unread,
Mar 20, 2003, 6:01:40 AM3/20/03
to
> 1. DAO
> 2. Odhaczyć ADO, albo deklarować jawnie:
> Dim loRst As DAO.Recordset
> Dim loDb As DAO.Database
> 3. Poprawić "zawinięte" linie ;-)
> 4. Zapisać moduł (!!!) - koniecznie przed pierwszym użyciem zapisać i
zamknąć
> (procedura MakeForm() generuje także moduł formularza!
> Ze względu na rozdzielenie VBE od Access'a prowadzi to
> do różnych niestabilności na "brudnym" kodzie w A'2k)

No nie, chyba sie obraze...

>
> | Ale, nadal mam kiche, jakos nie moge sie doszukac, gdzie jest blad, ale
u
> | mnie (A2k) nie moge wpisac nic do TextBoxa, nie mowiac juz o otrzymaniu
> | poprawnej wartosci zwrotnej.
> |
> | Tylko bip, bip i bip.
>

ale teraz mi przeszlo. Chyba jestem glupszy niz ustawa przewiduje, jako
wartosc parametru <Optional InputMask As String> trzeba podac nazwe maski,
czyli u mnie "PASSWORD", a nie jak ja glupi, podawalem "*"

Dziala, gra i przestalo buczec.

Krzysztof Naworyta

unread,
Mar 20, 2003, 4:05:14 PM3/20/03
to
Użytkownik "Pawel Durys" <pdu...@gazeta.pl> napisał

| > 1. DAO


| > 2. Odhaczyć ADO, albo deklarować jawnie:
| > Dim loRst As DAO.Recordset
| > Dim loDb As DAO.Database
| > 3. Poprawić "zawinięte" linie ;-)
| > 4. Zapisać moduł (!!!) - koniecznie przed pierwszym użyciem zapisać i
| zamknąć
| > (procedura MakeForm() generuje także moduł formularza!
| > Ze względu na rozdzielenie VBE od Access'a prowadzi to
| > do różnych niestabilności na "brudnym" kodzie w A'2k)
|
| No nie, chyba sie obraze...

Nie obrażaj się ...
Choć byłeś "formalnym" odbiorcą tego posta, to jednak wyszczególniając wszelkie
pułapki, miałem bardziej na myśli wszystkich innych, którym przyjdzie po raz pierwszy
zetknąć się z "gotowcem" w kodzie ...


| jako
| wartosc parametru <Optional InputMask As String> trzeba podac nazwe maski,
| czyli u mnie "PASSWORD", a nie jak ja glupi, podawalem "*"

| Dziala, gra i przestalo buczeć.

No właśnie. Ciężko do pewnych rzeczy dojść, bez uprzedniego zrozumienia jak działa
ten kod.
Jak się już zauważy, że jest tam po prostu ustawianie _standardowych_ właściwości, to
już "z górki".
Niestety początkujący developer musi najpierw dowiedzieć się, że maska "hasło" to
programistycznie "password" ... Żadne wielkie rzeczy, ale początkujący może mieć
problemy.
(zwłaszcza jeśli wielki P. Durys napisze, że mu nie chodzi ;-))))

--
KN

Pawel Durys

unread,
Mar 21, 2003, 5:34:37 AM3/21/03
to
> Nie obrażaj się ...

Dobra, zakopuje topor wojenny, howgh.

> No właśnie. Ciężko do pewnych rzeczy dojść, bez uprzedniego zrozumienia
jak działa
> ten kod.
> Jak się już zauważy, że jest tam po prostu ustawianie _standardowych_
właściwości, to
> już "z górki".
> Niestety początkujący developer musi najpierw dowiedzieć się, że maska
"hasło" to
> programistycznie "password" ... Żadne wielkie rzeczy, ale początkujący
może mieć
> problemy.

Tak ale, programista (to nie do ciebie, tylko do autora kodu) moglby
zamiescic jakis malenki komentarz, bo moim skromnym zdaniem naturalnym
odruchem, moze byc to co ja zrobilem. Chce miec np. jako maske znak #
zamiast *, i co musze redefiniowac PASSWORD.

> (zwłaszcza jeśli wielki P. Durys napisze, że mu nie chodzi ;-))))

A to musisz odszczekac ;-), ja nie jestem zaden wieki:

- jestem sobie maly mis, smieszny mis....

BraZby

unread,
Mar 21, 2003, 3:28:51 PM3/21/03
to

Użytkownik <kckrz...@poczta.onet.pl
> napisał w wiadomości news:7173.000004...@newsgate.onet.pl...

>
> Czy istnieje prosty sposób na zamianę wprowadzanych znaków w InputBox na *
>
[...]

Nie wiem czy to jest prosty sposób, ale można spróbować:

Private Declare Function GetActiveWindow Lib "user32" () As Long
Private Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal
wCmd As Long) As Long
Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA"
(ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long)
As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA"
(ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As
Any) As Long
'________________________________________________
Private Sub Polecenie0_Click()
Dim sOut As String

Me.TimerInterval = 200
sOut = InputBox("Wprowadź tekst:", "Wpisz hasło")
MsgBox "Wprowadziłeś: '" & sOut & "'"
End Sub
'_____________________________
Private Sub Form_Timer()
Dim lHwnd As Long
Dim lRet As Long

lHwnd = GetActiveWindow
Call ListWindows(lHwnd)
Me.TimerInterval = 0
End Sub
'____________________________
Private Sub ListWindows(lHwn)

Dim lRet As Long
Dim sBfCl As String
Dim hNext As Long
Const cSizeBf = 256
Const GW_CHILD = 5
Const GW_HWNDNEXT = 2
Const EM_SETPASSWORDCHAR = &HCC
Const PASSWORD_CHAR = 42

hNext = GetWindow(lHwn, GW_CHILD)

Do
sBfCl = Space(cSizeBf)
lRet = GetClassName(hNext, sBfCl, cSizeBf)
sBfCl = Left$(sBfCl, lRet)
If sBfCl = "Edit" Then
lRet = SendMessage(hNext, EM_SETPASSWORDCHAR, _
PASSWORD_CHAR, 0)
Exit Sub
End If
hNext = GetWindow(hNext, GW_HWNDNEXT)
Loop Until sBfCl = ""

End Sub
'___________________________________________

--
Pozdrowienia
BraZby


(c) Krzysztof Pozorek

unread,
Mar 23, 2003, 2:37:26 AM3/23/03
to
(...)

> > Czy istnieje prosty sposób na zamianę wprowadzanych znaków w InputBox na
*
> >
> [...]
>
> Nie wiem czy to jest prosty sposób, ale można spróbować:
>
(...)

Ten BraZby jak juz cos wymysli... Dla mnie swietne!

K.P.


BraZby

unread,
Mar 23, 2003, 9:49:57 AM3/23/03
to

Użytkownik "(c) Krzysztof Pozorek" <acc...@vis.pl> napisał w wiadomości
news:b5jo77$3fg$1...@nemesis.news.tpi.pl...

> (...)
> > > Czy istnieje prosty sposób na zamianę wprowadzanych znaków w InputBox
na
> *

[...]

>


> Ten BraZby jak juz cos wymysli... Dla mnie swietne!
>
> K.P.

Po takiej pochwale z poczułem się zobowiązany do ewentualnego skrócenia
kodu:

Private Declare Function GetActiveWindow Lib "user32" () As Long

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA"
(ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As
Any) As Long

Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA"
(ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal
lpsz2 As String) As Long
'__________________________________________


Private Sub Polecenie0_Click()
Dim sOut As String
Me.TimerInterval = 200
sOut = InputBox("Wprowadź tekst:", "Wpisz hasło")

MsgBox "Wprowadziłeś: '" & sOut & "'"
End Sub

'___________________________________________


Private Sub Form_Timer()
Dim lHwnd As Long
Dim lRet As Long

Const EM_SETPASSWORDCHAR = &HCC
Const PASSWORD_CHAR = 42

lHwnd = FindWindowEx(GetActiveWindow, ByVal 0&, "Edit", vbNullString)
lRet = SendMessage(lHwnd, EM_SETPASSWORDCHAR, _
PASSWORD_CHAR, 0)


Me.TimerInterval = 0
End Sub

Krótsze o Sub ListWindows()

--
Pozdrowienia
BraZby


Krzysztof Naworyta

unread,
Mar 23, 2003, 11:49:59 AM3/23/03
to
Użytkownik "BraZby" <bra...@poczta.onet.pl> napisał

| > Ten BraZby jak juz cos wymysli... Dla mnie swietne!

| Po takiej pochwale z poczułem się zobowiązany do ewentualnego skrócenia
| kodu:
(...)

Cóż mogę dodać ... Mnie się też bardzo podoba !

Pewna drobna "usterka" polega na tym, że parametr Default jest wyświetlany jawnie.
Ale spyta ktoś: a którz będzie w takiej sytuacji używał tego trzeciego parametru ?!
No - ja nie wiem ... Może czasami się przyda ?
Oczywiście jedna dodatkowa funkcja SetWindowText() i sprawa załatwiona.

Mnie zawsze intrygowała inna sprawa ... Ten Timer "nieszczęsny" ...
Ja wiem, jestem zbzikowany na tym punkcie ...
Ale jednak ... Timer jest jeden, a jeśli wykorzystam go do innych celów, to co ? będą
się gryzły algorytmy ?

Pod poniższym adresem zaproponowałem więc pewne drobne obejście, zwalniające
formularze z konieczności "tykania":
http://www.access.vis.pl/naworyta/BzInputBox.zip

Myślę, że wspólnie będzie można wypracować jakieś ostateczne rozwiązanie, które raz
na zawsze uprości kwestię pojedynczego tiku timera (często wykorzystywanego przez
K.P. i BrazBy)
Rozwiązanie korzysta z tego, że formularz jest klasą - a na punkcie klas ostatnio to
ja mam jeszcze większego bzika ;-)

Czekam na opinie

--
KN

Krzysztof Naworyta

unread,
Mar 23, 2003, 12:53:59 PM3/23/03
to
Użytkownik "Krzysztof Naworyta" <k.naw...@datacomp.com.pl>
strzelił byka:


| Ale spyta ktoś: a którz będzie w takiej sytuacji używał tego trzeciego parametru ?!

^^^^^

fuj, miało być "któż" ;-)
Choć skąd ja mogę wiedzieć jak ktoś zapyta ?? Może przez erzet ?

--
KN

Krzysztof Naworyta

unread,
Mar 23, 2003, 3:38:37 PM3/23/03
to
Użytkownik "Krzysztof Naworyta" <k.naw...@datacomp.com.pl> napisał

(...)


| Mnie zawsze intrygowała inna sprawa ... Ten Timer "nieszczęsny" ...
| Ja wiem, jestem zbzikowany na tym punkcie ...
| Ale jednak ... Timer jest jeden, a jeśli wykorzystam go do innych celów, to co ?
będą
| się gryzły algorytmy ?
|
| Pod poniższym adresem zaproponowałem więc pewne drobne obejście, zwalniające
| formularze z konieczności "tykania":
| http://www.access.vis.pl/naworyta/BzInputBox.zip
|
| Myślę, że wspólnie będzie można wypracować jakieś ostateczne rozwiązanie, które raz
| na zawsze uprości kwestię pojedynczego tiku timera (często wykorzystywanego przez
| K.P. i BrazBy)
| Rozwiązanie korzysta z tego, że formularz jest klasą - a na punkcie klas ostatnio
to
| ja mam jeszcze większego bzika ;-)

Jeśli ktos już pobrał, to informuję, że właśnie zaktualizowałem wersję, w której
dodałem trochę komentarzy i parę lekkich zmian w kodzie.

Osobna sprawa to "uniwersalny" Timer ciągle tykający, np. do użycia w takich
rozwiązaniach a'la K.P. jak kontrola "podświetlenia" kontrolki i inne.
Ciekawe kto co ładnego zaproponuje ?

--
KN

BraZby

unread,
Mar 23, 2003, 4:47:38 PM3/23/03
to

Użytkownik "Krzysztof Naworyta" <k.naw...@datacomp.com.pl
> napisał w wiadomości
[...]

> Cóż mogę dodać ... Mnie się też bardzo podoba !
>
> Pewna drobna "usterka" polega na tym, że parametr Default jest wyświetlany
jawnie.
> Ale spyta ktoś: a którz będzie w takiej sytuacji używał tego trzeciego
parametru ?!
> No - ja nie wiem ... Może czasami się przyda ?
> Oczywiście jedna dodatkowa funkcja SetWindowText() i sprawa załatwiona.
>

Po niewielkich zmianach tekst "Default" działa:

Private Sub Form_Timer()

Dim lHwnd As Long
Dim lRet As Long
Const EM_SETPASSWORDCHAR = &HCC
Const PASSWORD_CHAR = 42

Const WM_CLEAR = &H303
Const WM_UNDO = &H304

Me.TimerInterval = 0

lHwnd = FindWindowEx(GetActiveWindow, ByVal 0&, "Edit", vbNullString)
lRet = SendMessage(lHwnd, EM_SETPASSWORDCHAR, _
PASSWORD_CHAR, 0)

'Prymitywne, ale działa - może ktoś zna coś bardziej eleganckiego ??
lRet = SendMessage(lHwnd, WM_CLEAR, 0, 0)
lRet = SendMessage(lHwnd, WM_UNDO, 0, 0)

End Sub

> Mnie zawsze intrygowała inna sprawa ... Ten Timer "nieszczęsny" ...
> Ja wiem, jestem zbzikowany na tym punkcie ...
> Ale jednak ... Timer jest jeden, a jeśli wykorzystam go do innych celów,
to co ? będą
> się gryzły algorytmy ?

Generalnie jest to problem, ale w tym przypadku po ustawieniu
jakiejś zmiennej bln - Timer sprawdzi ją i ew. wykona zmianę maski
zmieni bln na False i dalej będzie robił na dalsze swoje potrzeby (nie
zerowany).

> Pod poniższym adresem zaproponowałem więc pewne drobne obejście,
zwalniające
> formularze z konieczności "tykania":
> http://www.access.vis.pl/naworyta/BzInputBox.zip
>

> Myślę, że wspólnie będzie można wypracować jakieś ostateczne rozwiązanie,
> które raz na zawsze uprości kwestię pojedynczego tiku timera (często
> wykorzystywanego przez K.P. i BrazBy)
> Rozwiązanie korzysta z tego, że formularz jest klasą - a na punkcie klas
> ostatnio to ja mam jeszcze większego bzika ;-)
>
> Czekam na opinie

[...]

Mi się podoba, ale jak na razie nie mam pomysłu co do Timera.
Widziałem już drugą Twoją wersję i wreszcie doczekałem się tego
na co czekałem od początku:

Słynne:
If StrPtr(s) ;-)

--
Pozdrowienia
BraZby


Krzysztof Naworyta

unread,
Mar 23, 2003, 5:12:59 PM3/23/03
to
Użytkownik "BraZby" <bra...@poczta.onet.pl> napisał w wiadomości
news:b5l9vm$fb5$1...@news.onet.pl...

| > Pewna drobna "usterka" polega na tym, że parametr Default jest wyświetlany
| > jawnie.

| Po niewielkich zmianach tekst "Default" działa:
|


| lRet = SendMessage(lHwnd, EM_SETPASSWORDCHAR, _
| PASSWORD_CHAR, 0)
|
| 'Prymitywne, ale działa - może ktoś zna coś bardziej eleganckiego ??
| lRet = SendMessage(lHwnd, WM_CLEAR, 0, 0)
| lRet = SendMessage(lHwnd, WM_UNDO, 0, 0)

Fajnie, dzięki Tobie, zapoznawać się z tymi wszystkimi komendami.

Nie chce mi się sprawdzać, ale cos mi się wydaje, że to zadziała późno, czyli dopiero
po pierwszym "tiku".
Przez ułamek chwili będę i tak widział niegwiazdkowaną wartość.
(Sprawdzę jutro, jesli się mylę wybacz)

| > Mnie zawsze intrygowała inna sprawa ... Ten Timer "nieszczęsny" ...

| > Timer jest jeden, a jeśli wykorzystam go do innych celów,
| > to co ? będą się gryzły algorytmy ?

| Generalnie jest to problem, ale w tym przypadku po ustawieniu
| jakiejś zmiennej bln - Timer sprawdzi ją i ew. wykona zmianę maski
| zmieni bln na False i dalej będzie robił na dalsze swoje potrzeby (nie
| zerowany).

Dlatego zaproponowałem rozwiązanie z innym, niezależnym formularzem, wywoływanym jako
instancja klasy, aby "tyknęło" niezależnie od procedury Form_timer formularza
wołającego, czy innych wywołań tej samej funkcji !
(tym bardziej, że dla tego jednego celu ma tyknąć tylko raz !)
Dzięki temu funkcja jest praktycznie niezależna od wołającego ją formularza.
Oczywiście można zadanie kompilować budując własny Timer przy pomocy API, ale nie
wydaje się aby było to zasadne, w porównaniu z wbudowanym timerem accessowego
formularza (?)

| > Pod poniższym adresem zaproponowałem więc pewne drobne obejście,
| > zwalniające formularze z konieczności "tykania":
| > http://www.access.vis.pl/naworyta/BzInputBox.zip

| Mi się podoba, ale jak na razie nie mam pomysłu co do Timera.


| Widziałem już drugą Twoją wersję i wreszcie doczekałem się tego
| na co czekałem od początku:
|
| Słynne:
| If StrPtr(s) ;-)

;-)
nooo, przecież musiałem to dodać ;-)

--
KN


(c) Krzysztof Pozorek

unread,
Mar 23, 2003, 7:27:19 PM3/23/03
to
(...)

> | 'Prymitywne, ale działa - może ktoś zna coś bardziej eleganckiego ??
> | lRet = SendMessage(lHwnd, WM_CLEAR, 0, 0)
> | lRet = SendMessage(lHwnd, WM_UNDO, 0, 0)
>
> Fajnie, dzięki Tobie, zapoznawać się z tymi wszystkimi komendami.

W pelni sie zgadzam z przedmowca.

>
> Nie chce mi się sprawdzać, ale cos mi się wydaje, że to zadziała późno,
czyli dopiero
> po pierwszym "tiku".
> Przez ułamek chwili będę i tak widział niegwiazdkowaną wartość.
> (Sprawdzę jutro, jesli się mylę wybacz)

Rzeczywiscie jest pewne opoznienie, ale tylko dlatego, ze Zbyszek dal duzy
interwal Timera = 200 ms. Po zmianie na 20, opoznienie jest niezauwazalne.

>
> | > Mnie zawsze intrygowała inna sprawa ... Ten Timer "nieszczęsny" ...
> | > Timer jest jeden, a jeśli wykorzystam go do innych celów,
> | > to co ? będą się gryzły algorytmy ?

Wedlug tej zasady nigdy nie uzyjesz Timera, Taga, czy innych mozliwosci
formularza, no bo, jesli bedziesz chcial je wykorzystac do innych celow...
;)
Czyli Timer to nic zlego. Nie wiem jednak dlaczego, tez staram sie unikac
Timera na formularzu.

> Dlatego zaproponowałem rozwiązanie z innym, niezależnym formularzem,
wywoływanym jako
> instancja klasy, aby "tyknęło" niezależnie od procedury Form_timer
formularza

Pomysl rzeczywiscie uniezaleznia od formularza wywolujacego, ale dodaje
jeden dodatkowy formularz, cos za cos.

> Oczywiście można zadanie kompilować budując własny Timer przy pomocy API,
ale nie
> wydaje się aby było to zasadne, w porównaniu z wbudowanym timerem
accessowego
> formularza (?)

O sadze, ze czasem jest jednak zasadne. Np w tym przypadku Timer zrobiony za
pomoca API pozwoli nam zamknac hermetycznie calos w postaci jednego modulu
bez koniecznosci tworzenia formularzy pomocniczych. Taki mechanizm latwiej
przeniesc do innej bazy, bo wystarczy skopiowac jeden modul i juz i nie
trzeba pamietac, ze sa jakies jeszcze inne elementy do przeniesienia, bez
ktorych nasz InputBox z haslem nie zadziala.

Polaczylem Twoje rozwiazanie i Zbyszka i zamknalem wszystko w jedemn modul.
Funkcja InputPassw wywoluje nasz InputBox z haslem i nie potrzebuje do tego
ani formularza glownego, ani pomocniczego. Dzieje sie tak, jesli takze ten
jeden potrzebny tik timera wezmiemy z API:


'-- Dowolny modul standardowy ---
Private Declare Function SetTimer Lib "user32" _
(ByVal hwnd As Long, ByVal nIDEvent As Long, _
ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
Private Declare Function KillTimer Lib "user32" _
(ByVal hwnd As Long, ByVal nIDEvent As Long) As Long
Private Declare Function SendMessageA Lib "user32" _
(ByVal hwnd As Long, ByVal wMsg As Long, _


ByVal wParam As Long, lParam As Any) As Long

Private Declare Function GetFocus Lib "user32" () As Long
Private Const INTERVAL = 1
Private TimerID As Long

Public Sub TimerCallback()
Const EM_SETPASSWORDCHAR = &HCC
Call SendMessageA(GetFocus(), EM_SETPASSWORDCHAR, Asc("*"), 0)
KillTimer 0, TimerID
End Sub

Function InputPassw(Prompt, Optional Title, Optional Default = "", _
Optional XPos, Optional YPos, _
Optional HelpFile, Optional Context)
Dim s As String
TimerID = SetTimer(0, 0, INTERVAL, AddressOf TimerCallback)
s = InputBox(Prompt, Title, Default, XPos, YPos, HelpFile, Context)
If StrPtr(s) Then
InputPassw = s ' OK
Else
InputPassw = Null ' Cancel
End If
End Function
'-- Koniec modulu ---

Wystarczy do swojej aplikacji przekopiowac ten modul i uzywac funkcji
InputPassw(...) gdzie sie chce.
Krzysztof Pozorek


Krzysztof Naworyta

unread,
Mar 24, 2003, 1:23:45 AM3/24/03
to
Użytkownik "(c) Krzysztof Pozorek" <acc...@vis.pl> napisał

| > Dlatego zaproponowałem rozwiązanie z innym, niezależnym formularzem,


| wywoływanym jako
| > instancja klasy, aby "tyknęło" niezależnie od procedury Form_timer
| formularza
|
| Pomysl rzeczywiscie uniezaleznia od formularza wywolujacego, ale dodaje
| jeden dodatkowy formularz, cos za cos.

no, ja tam mam w swoich aplikacjach wiele takich obiektów pomocniczych i muszę o nich
pamiętać przy przenoszeniu części rozwiązań gdzie indziej.
Łatwiej przenieść jeden formularzyk pomocniczy (którego brak objawi się w momencie
kompilacji) niż przenosić i powielać część kodu z "normalnego" formularza.


| > Oczywiście można zadanie komplikować budując własny Timer przy pomocy API,


| > ale nie wydaje się aby było to zasadne, w porównaniu z wbudowanym timerem
| > accessowego formularza (?)

| O sadze, ze czasem jest jednak zasadne. Np w tym przypadku Timer zrobiony za
| pomoca API pozwoli nam zamknac hermetycznie calos w postaci jednego modulu
| bez koniecznosci tworzenia formularzy pomocniczych. Taki mechanizm latwiej
| przeniesc do innej bazy, bo wystarczy skopiowac jeden modul i juz i nie
| trzeba pamietac, ze sa jakies jeszcze inne elementy do przeniesienia, bez
| ktorych nasz InputBox z haslem nie zadziala.
|
| Polaczylem Twoje rozwiazanie i Zbyszka i zamknalem wszystko w jedemn modul.
| Funkcja InputPassw wywoluje nasz InputBox z haslem i nie potrzebuje do tego
| ani formularza glownego, ani pomocniczego. Dzieje sie tak, jesli takze ten
| jeden potrzebny tik timera wezmiemy z API:

(...)

eee, tak po prostu ?? ja się nie bawię ...
;-)

Tak to pierwotna, piękna i prosta idea Zbyszka nabrała również pięknej formy...

--
KN

Krzysztof Naworyta

unread,
Mar 24, 2003, 2:28:40 AM3/24/03
to
Użytkownik "(c) Krzysztof Pozorek" <acc...@vis.pl> napisał

(...)


| > | > Mnie zawsze intrygowała inna sprawa ... Ten Timer "nieszczęsny" ...
| > | > Timer jest jeden, a jeśli wykorzystam go do innych celów,
| > | > to co ? będą się gryzły algorytmy ?
|
| Wedlug tej zasady nigdy nie uzyjesz Timera, Taga, czy innych mozliwosci
| formularza, no bo, jesli bedziesz chcial je wykorzystac do innych celow...
| ;)

śmichy chichy ... ;-)
To JEST dość spory problem, te TAGi na przykład.
Jak się ma już parę różnych uniwersalnych rozwiązań, które z tag'ów korzystają, to
zaczynasz się zastanawiać, czy przypadkiem nie zamażesz innej wartości, wsadzonej tam
w projekcie ...

W przeciwieństwie do Timera (TimerInterval jest jeden i jest to liczba), właściwością
Tag da się tak zarządzać aby nie było konfliktów.

W tym celu panowie K.Getz i ska napisali klasy TaggedValue i TaggedValues, którą
można pobrać z http://www.developershandbook.com/

klasa TaggedValue, której tam nie znajdziecie, jest trywialna i po prostu realizuje
_publiczny_ typ użytkownika:

'----------------------------------
Option Compare Database
Option Explicit

Public Tag As String
Public Value As String
'----------------------------------

W ten sposób nie nadpiszemy jakiejś jednej wartości, lecz dodamy inną, trzymając się
konwencji:

"Tag1=Wartość1;Tag2=Wartość2;..."

Polecam uwadze, bo używanie jest bardzo proste a korzyści ogromne.
W sieci jest tez stosowny artykuł omawiający zawarte w nich idee:
http://www.mssmartsolutions.com/features/1998/11/vba199811kg_f/vba199811kg_f.asp

--
KN

Cosmophillia

unread,
Mar 24, 2003, 1:27:29 AM3/24/03
to
(c) Krzysztof Pozorek <acc...@vis.pl> wrote in message
news:b5ljd0$ptn$1...@atlantis.news.tpi.pl...

> TimerID = SetTimer(0, 0, INTERVAL, AddressOf TimerCallback)

Przepraszam, że wtrącę się z banalnymi uwagami. Ale i ja chciałabym wyrazić
swoje gorące poparcie dla SetTimer().
SetTimer() IMHO ma miażdżacą przewagę nad accessowym timerem. Mianowicie dla
jednego okna możemy ustawić kilka niezależnie działających timerów z różnymi
ID (drugi parametr). Mogą te timery mieć różne intervals, służyć do różnych
celów itd.
Uzycie SetTimer() upraszcza wiele spraw - nie trzeba się męczyć z
"zaprzęganiem" i "odprzęganiem" czy "rozdrabnianiem" jednego timera na
użytek wielu różnych zadań tak jak w przypadku timera "accessowego" (tego z
arkusza właściwości formy, OnTimer itd) .
Poza tym funkcją TimerCallback() można obsłużyć wiele timerów jednocześnie i
niezależnie.
To wszystko znacznie upraszcza kod.

Sorry za banały. Wiem, że wiecie. Ja tak gaworzę tylko dla podtrzymywania
kontaktów społecznych pod pretekstem pro publico bono :-)

Swego czasu bawiłam się kilkoma timerami jednocześnie na jednej formie
(animowane etykietki - każda "obsługiwana" przez inny timer z innym
interval) i wyszło to całkiem miło
Po co ja to wszystko piszę? Ano na okoliczność wątpliwości czy aby na pewno
użycie wielu timerów na raz na jednej formie Acc nie może powodować jakichś
przykrych objawów (tzn normalnie nic nie powinno się złego dziać, ale
wiadomo jak to czasem bywa z próbą użycia WinAPI w Acc; dla mnie (lame) Acc
pod tym względem jest jak wielki, tłusty śfinx: tajemniczy, kapryśny,
ciężki, w końcu zbędny ...). Ja z moimi animacjami nie miałam żadnych
niemiłych przygód.

Szczerze mówiąc nie jestem miłośniczką rozwiązań opartych na timerach. A w
ogóle bardzo rzadko używałam accesowego timera. Wiem, że kilka timerów
jednocześnie ustawianych przez SetTimer() nie gryzie się między sobą. Czy
mogą się gryźć z tak powszechnie lubianym timerem accessowym? - nie
pochylałam się nad tym za bardzo, przypuszczam, że nie miałyby powodu. Ale -
jak wspomniałam - mam małe doświadczenia z timerem Acc. Może tam jednak leżą
jakieś skórki od bananów o których nie wiem, bo rzadko tamtędy chadzam ...

Pozdrawiam

Dorota

P.S. Przepraszam, że wypowiedź w poetyce jak na 1-ego maja. Ja nie lubię
1-maja. Tak wyszło.


Cosmophillia

unread,
Mar 24, 2003, 2:32:30 AM3/24/03
to
Przepraszam za mój zegar spóźniający się o godzinę w poprzednim poście. Już
ustawiłam poprawny czas :-).

Dorota


BraZby

unread,
Mar 24, 2003, 3:20:08 PM3/24/03
to

Użytkownik "(c) Krzysztof Pozorek" <acc...@vis.pl
> napisał w wiadomości

> (...)


> > | 'Prymitywne, ale działa - może ktoś zna coś bardziej eleganckiego ??
> > | lRet = SendMessage(lHwnd, WM_CLEAR, 0, 0)
> > | lRet = SendMessage(lHwnd, WM_UNDO, 0, 0)

Mam nadzieję, że rozwiązanie poniżej jest bardziej eleganckie.

[...]

> > Nie chce mi się sprawdzać, ale cos mi się wydaje, że to zadziała późno,
> czyli dopiero
> > po pierwszym "tiku".
> > Przez ułamek chwili będę i tak widział niegwiazdkowaną wartość.
> > (Sprawdzę jutro, jesli się mylę wybacz)

I tak chyba będzie zawsze (lub prawie zawsze). gdzieś tam Windows zwolni,
coś tam będzie musiał obliczyc, ktoś czegoś nie zwolni, a tu musi być
utworzene
nowe okno, opisane, ustawione itd. itd. itd.

> Rzeczywiscie jest pewne opoznienie, ale tylko dlatego, ze Zbyszek dal duzy
> interwal Timera = 200 ms. Po zmianie na 20, opoznienie jest niezauwazalne.

Testowałem na 100 ms, 10 ms i praktycznie często miałem widoczne
opóźnienie (P III 800MHz).

[...]


>
> Polaczylem Twoje rozwiazanie i Zbyszka i zamknalem wszystko w jedemn
modul.
> Funkcja InputPassw wywoluje nasz InputBox z haslem i nie potrzebuje do
tego
> ani formularza glownego, ani pomocniczego. Dzieje sie tak, jesli takze ten
> jeden potrzebny tik timera wezmiemy z API:
>
>
> '-- Dowolny modul standardowy ---

> Private Declare Function ............
[...]

>
> Public Sub TimerCallback()
> Const EM_SETPASSWORDCHAR = &HCC
> Call SendMessageA(GetFocus(), EM_SETPASSWORDCHAR, Asc("*"), 0)
> KillTimer 0, TimerID
> End Sub
>

Zaobserwowalem u siebie, tak raz na ok 5 razy, że tekst "Default"
wyswietla się niazahasłowany. Dopisałem parę linijek w powyższej
procedurze, tak aby ewentualnie zapobiec zaistniałej sutuacji.
Przede wszystkim chodziło mi o nieprzekazywanie zmiennej "Default"
poprzez inne zmienne w module.
Zdaję sobie sprawę, że jest to sztuka dla sztuki, nie mniej może się
stać coś strasznego jeżeli super tajne hasło ukaże sie niepowołanym oczom.

No to: "zahasłujmy zahasłowane hasło"

Public Sub TimerCallback()
Const EM_SETPASSWORDCHAR = &HCC

Const WM_SETTEXT = &HC
Const WM_GETTEXT = &HD
Const WM_GETTEXTLENGTH = &HE
Const EM_SETSEL = &HB1


Dim lHwnd As Long
Dim lRet As Long

Dim sBf As String
Dim lBf As Long

lHwnd = GetFocus()
Call SendMessageA(lHwnd, EM_SETPASSWORDCHAR, Asc("*"), 0)

lBf = SendMessageA(lHwnd, WM_GETTEXTLENGTH, 0, 0)
sBf = String(lBf + 1, vbNullChar)
lRet = SendMessageA(lHwnd, WM_GETTEXT, lBf + 1, ByVal sBf)
lRet = SendMessageA(lHwnd, WM_SETTEXT, 0, ByVal sBf)

lRet = SendMessageA(lHwnd, EM_SETSEL, 0, lBf)
'lRet = SendMessageA(lHwnd, EM_SETSEL, lBf, lBf)

KillTimer 0, TimerID

End Sub

[...]
Ale w dalszym ciągu czasami mam pewne opóźnienia i hasło przez
ułamek sekundy jest widoczne.

>
> Wystarczy do swojej aplikacji przekopiowac ten modul i uzywac funkcji
> InputPassw(...) gdzie sie chce.
> Krzysztof Pozorek

Wielkie dzięki.

--
Pozdrowienia
BraZby

(c) Krzysztof Pozorek

unread,
Mar 25, 2003, 9:09:34 AM3/25/03
to
(...)

> lBf = SendMessageA(lHwnd, WM_GETTEXTLENGTH, 0, 0)
> sBf = String(lBf + 1, vbNullChar)
> lRet = SendMessageA(lHwnd, WM_GETTEXT, lBf + 1, ByVal sBf)
> lRet = SendMessageA(lHwnd, WM_SETTEXT, 0, ByVal sBf)
>
> lRet = SendMessageA(lHwnd, EM_SETSEL, 0, lBf)

Nowe przyklady na uzycie API, z ktorymi warto sie zapoznac.

> Ale w dalszym ciągu czasami mam pewne opóźnienia i hasło przez
> ułamek sekundy jest widoczne.

Twoje rozwiazanie dziala u mnie bez zarzutu, lacznie z wlasciwym
podswietleniem tekstu. Temat jest dosyc oryginalny i znalazl sie juz na
mojej stronie http://www.access.vis.pl/, jednak proponowanych rozwiazan jest
kilka i wybralem subiektywnie takie, ktore mi najbardziej odpowiada. Jest
jednak link do archiwum, zeby kazdy mogl sobie przeczytac caly watek.

Krzysztof Pozorek


0 new messages