![]() |
Anzeige:
|
|
|||||||
| Helfer & Tools Programme für und in XProfan und Fragen dazu. |
|
![]() |
|
|
LinkBack | Themen-Optionen | Ansicht |
|
|
#1 (Direktlink) |
|
Weiß worum´s geht
![]() Registriert seit: 20.02.2009
Ort: Essen
Beiträge: 119
|
Hallo Leute,
habe vor Jahren von Franks Seite eine DLL (NEdit) heruntergeladen. mit dieser Dll war es ganz leicht möglich EDIT's nur die nummerische Eingabe zu erlauben. Alle Eingabe bis auf Komma, Punkt und Zahl wurden ignoriert. Diese DLL ist mir leider verloren gegangen und auf Franks Seite ist sie auch nicht mehr. Hat sie jemand von Euch noch? Kann sie mir Jemand besorgen?
__________________
Viele Grüsse Mike Window XP Prof SP3 Windows 7 ultimate Xprofan X2 |
|
|
|
|
|
|
#2 (Direktlink) |
|
Super-Moderator
![]() Registriert seit: 05.02.2009
Ort: Westliches NRW
Alter: 44
Beiträge: 5.093
|
Viele meiner älteren Tools findest du auf Jacs Seite: bloody random - Frank Abbings Software
Die Dll ist auch dabei, obwohl du das heute auch in reinem XProfan-Code per Subclassing realisieren kannst.
__________________
Gruß, Frank ![]() Webpage http://frabbing.bplaced.net mit Freeware - Tools, Spiele und Grafiken. |
|
|
|
|
|
#3 (Direktlink) |
|
Super-Moderator
![]() Registriert seit: 06.02.2009
Ort: Coswig
Alter: 27
Beiträge: 1.159
|
Jupp.
__________________
XProfan-Profi (XProfan X2+XPIA) http://jacdelad.bplaced.net http://jacdelad.square7.ch |
|
|
|
|
|
#4 (Direktlink) |
|
Weiß worum´s geht
![]() Registriert seit: 20.02.2009
Ort: Essen
Beiträge: 119
|
Vielen Dank an Euch,
das Mit dem Subclassen hatte ich schon gelesen, aber das übersteigt noch meine Programmierkünste.
__________________
Viele Grüsse Mike Window XP Prof SP3 Windows 7 ultimate Xprofan X2 |
|
|
|
|
|
#5 (Direktlink) |
|
Super-Moderator
![]() Registriert seit: 06.02.2009
Ort: Coswig
Alter: 27
Beiträge: 1.159
|
Das ist eigentlich nicht schwer. Sogar ziemlich einfach.
__________________
XProfan-Profi (XProfan X2+XPIA) http://jacdelad.bplaced.net http://jacdelad.square7.ch |
|
|
|
|
|
|
#6 (Direktlink) |
|
Forenmaskottchen
![]() Registriert seit: 23.01.2011
Ort: Bernburg
Alter: 58
Beiträge: 756
|
Hallo cyberangle
In Deinem speziellen Falle geht es auch ohne DLL und Subclassing. Code:
$H Messages.PH
Def %SIG 0 ' Wenn 1, dann + und - zulassen
Def %HEX 0 ' Wenn 1, dann HEX-Zahlen zulassen
Proc EditNum
Var String Zeile = GetText$(Editor)
Declare String Sel, Out
SendMessage(Editor, ~EM_SETSEL, 0, Len(Zeile))
WhileLoop Len(Zeile)
Sel = Mid$(Zeile, &loop, 1)
Select Sel
CaseOf "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", ".", ","
Out = Out + Sel
CaseOf "+", "-"
Case %Sig : Out = Out + Sel
CaseOf "a", "b", "c", "d", "e", "g", "A", "B", "C", "D", "E", "F"
Case %HEX : Out = Out + Sel
EndSelect
EndWhile
SendMessage(Editor, ~EM_REPLACESEL, 0, Addr(Out))
SendMessage(Editor, ~EM_SETSEL, Len(Out), Len(Out))
EndProc
CLS
Var Int Editor = Create("Edit", %hwnd, "", 4, 4, 128, 22)
While 1
WaitInput
If GetFocus(Editor)
EditNum
EndIf
EndWhile
End
Gruß Volkmar |
|
|
|
|
|
#7 (Direktlink) |
|
Dauergast
![]() Registriert seit: 06.02.2009
Ort: Wien, Österreich
Beiträge: 1.078
|
Für Profan 11.2a gibts noch ein Problem: Das Auslesen des Wertes aus dem Feld will nicht so recht klappen, der Cursor ist dort gefangen. Oder mach ich was falsch? Hier meine Versionsrückübersetzung des Programms von Volkmar:
Code:
$H Messages.PH
Def %SIG 0 ' Wenn 1, dann + und - zulassen
Def %HEX 0 ' Wenn 1, dann HEX-Zahlen zulassen
Proc EditNum
Var Zeile$ = GetText$(Editor&)
Declare Sel$, Out$
SendMessage(Editor&, ~EM_SETSEL, 0, Len(Zeile$))
WhileLoop Len(Zeile$)
Sel$ = Mid$(Zeile$, &loop, 1)
Select Sel$
CaseOf "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", ".", ","
Out$ = Out$ + Sel$
CaseOf "+", "-"
Case %Sig : Out$ = Out$ + Sel$
CaseOf "a", "b", "c", "d", "e", "g", "A", "B", "C", "D", "E", "F"
Case %HEX : Out& = Out& + Sel&
EndSelect
EndWhile
SendMessage(Editor&, ~EM_REPLACESEL, 0, Addr(Out$))
SendMessage(Editor&, ~EM_SETSEL, Len(Out$), Len(Out$))
EndProc
CLS
Var Editor& = Create("Edit", %hwnd, "", 4, 4, 128, 22)
While 1
WaitInput
If GetFocus(Editor&)
EditNum
EndIf
EndWhile
End
__________________
Win7-64HomPremSP1,XProfan11.2a,XPIA,JWasm,XPSE,IntelCoreQuad2.5GHz/4GB/je1TB HD intern:esataBay:USB2:USB3 |
|
|
|
|
|
#8 (Direktlink) |
|
Forenmaskottchen
![]() Registriert seit: 16.05.2010
Ort: Berlin
Beiträge: 724
|
Wäre schön, wenn jemand noch eine SubClass Version posten könnte,
weil irgendwie funzt das bei mir nie so richtig, hab da bestimmt was verkehrt verstanden Code:
$H Messages.PH
CLS
Var Editor& = Create("Edit", %hwnd, "", 100, 100, 128, 22)
SubClass Editor&, 1
While 1
WaitInput
EndWhile
End
SubClassProc
If SubClassMessage(Editor&, ~WM_KEYDOWN)
Select &sWParam
CaseOf 65
Set("WinProc", 0)
Otherwise
Set("WinProc", 1)
EndSelect
EndIf
EndProc
werden, somit das a nie geschrieben werden, dem ist aber nicht so. Deshalb wäre ein Beispiel schön.
__________________
Gruß Thomas Wenn mir früher jemand gesagt hätte, ich würde freiwillig eine Wanze mit mir herum tragen und sie auch noch selbst aufladen, hätte ich laut gelacht. Heute habe ich ein Smartphone. http://realsource.de |
|
|
|
|
|
#9 (Direktlink) |
|
Stammuser
![]() Registriert seit: 04.04.2009
Ort: Lübeck
Beiträge: 264
|
Ohne SubClass und NEdit.dll verwende ich :
Code:
Proc NUMWERT ' AUSWERTUNG auf Zeichen und Stellen
Parameters ED.N&,ED.N%
var a$="abcdefghijklmnopqrstuvwxyz"
a$=a$+Upper$("abcdefghijklmnopqrstuvwxyz")
a$=a$+"!§$%&/()=?´´*':;,-_²³{[]}\^°<>|++-"
var c$=""
WhileLoop len(a$)
c$ = MID$(a$,&Loop,1) ' c$= der nte Stringteil
Settext ED.N&,@Translate$(gettext$(ED.N&),c$,"") ' unzulässige löschen
Settext ED.N&,@Translate$(gettext$(ED.N&),"..",".") ' doppelte löschen
EndWhile
a$=trim$(gettext$(ED.N&))
WhileLoop ED.N%+1
@Match$("~.", a$)
If (%MatchPos>0) AND (%MatchPos<ED.N%+1)
a$="0"+a$
EndIf
EndWhile
If len(a$)=ED.N%
case @IsKey(8):a$=left$(a$,len(a$))
casenot @IsKey(8):a$=left$(a$,ED.N%)+"."
EndIf
SetText ED.N&,a$
sendmessage(ED.N&,$00B1,len(gettext$(ED.N&)),len(gettext$(ED.N&))+1) 'Cursor ans Ende
EndProc
Proc CheckChars
Parameters CC_I%,CC_Erlaubt$
Declare CC_GT$,CC_ZW$, CC_x%
CC_GT$= Gettext$(CC_I%)
CC_x%=1
WhileLoop Len(CC_GT$)
CC_ZW$ = Mid$(CC_GT$,CC_x%,1)
If Instr(CC_ZW$,CC_Erlaubt$)=0
CC_GT$=Translate$(CC_GT$,CC_ZW$,"")
BREAK
dec CC_x%
EndIf
inc CC_x%
EndWhile
Settext CC_I%, CC_GT$
sendmessage( CC_I%,$00B1,CC_x%-1,CC_x%-1)
EndProc
Declare Ed1%, Ed2%
Cls
Ed1%=CreateEdit(%hWnd,"",20,40,100,22)
Ed2%=CreateEdit(%hWnd,"",20,80,100,22)
@sendmessage(Ed2%,$00C5,6,0) ' zul. 6 Zeichen : nnn.nn
SetFocus( Ed1%)
While 0=0
WaitInput
case GetFocus(Ed1%) AND (%MouseKey=0): CheckChars Ed1%,"0123456789." 'Handle, zul. Zeichen
case GetFocus(Ed2%) AND (%MouseKey=0): NUMWERT Ed2%,3 'Handle, Zeichen vorm Komma
EndWhile
End
Gruß Thomas |
|
|
|
|
|
#10 (Direktlink) |
|
Forenmaskottchen
![]() Registriert seit: 23.01.2011
Ort: Bernburg
Alter: 58
Beiträge: 756
|
Hallo
@P.Specht: Eigentlich hast Du fast alles richtig gemacht, aber: Case %HEX : Out$ = Out$ + Sel$ Ist aber eigentlich egal, muß trotzdem gehen und geht bei mir auch unter XPofan 11 und wenn ich die ganze Select-Geschichte durch IFs ersetze auch unter XProfan 8. Die Botschaft ~Em_SetSel soll ja bei diesen Parametern den Cursor immer hinter die Einfügestelle setzen (Anfang und Ende der Markierung identisch markiert nichts und setzt den Cursor auf diese Position, also Länge der korrigierten Einfügung). Aber möglicherweise wäre SendMessage(Editor&, ~EM_SETSEL, -1, Len(Out$)) besser. So habe ich es gerade in der Beschreibung von SetSel gefunden. -1 in wParam markiert nichts und setzt Cursor auf Position in lParam. Meine schnelle Idee geht also möglicherweise nicht überall gleichermaßen. @ts-soft: 65 ist der Großbuchstabe A. Weiterhin solltest Du statt wm_keydown wm_Char verwenden, dann klappt das. Gruß Volkmar |
|
|
|
|
|
|
#11 (Direktlink) |
|
Dauergast
![]() Registriert seit: 06.02.2009
Ort: Wien, Österreich
Beiträge: 1.078
|
@Volkmar: Sowohl die Originalversion als auch SendMessage(Editor&, ~EM_SETSEL, -1, Len(Out$)) korrigieren zwar an der richtigen Stelle, hüpfen aber sofort danach ans jeweilige Ende. Ist das Absicht?
__________________
Win7-64HomPremSP1,XProfan11.2a,XPIA,JWasm,XPSE,IntelCoreQuad2.5GHz/4GB/je1TB HD intern:esataBay:USB2:USB3 |
|
|
|
|
|
#12 (Direktlink) |
|
Forenmaskottchen
![]() Registriert seit: 23.01.2011
Ort: Bernburg
Alter: 58
Beiträge: 756
|
Jetzt wird mir das Problem klar. Ich lese immer den kompletten Editorinhalt und schreibe den korrigiert zurück. Damit steht der Cursor wirklich immer am Ende. Mittenrein was korrigieren wird dann wirklich zur Qual. Ich habe eben mal auf die Schnelle versucht, was zu ändern, aber dann kommt bisher Unsinn raus.
Gruß Volkmar |
|
|
|
|
|
#13 (Direktlink) |
|
Forenmaskottchen
![]() Registriert seit: 23.01.2011
Ort: Bernburg
Alter: 58
Beiträge: 756
|
Ich habe es nun doch geschafft. Hier mal in der 11er Version. Für X2 wäre die neu eingeführte Variable SelPos entsprechend einzubauen. Es wird nun immer nur der Teil bis zur aktuellen Schreibposition bearbeitet.
Code:
$H Messages.PH
Def %SIG 0 ' Wenn 1, dann + und - zulassen
Def %HEX 0 ' Wenn 1, dann HEX-Zahlen zulassen
Proc EditNum
Declare Sel$, Out$, SelPos&
SendMessage(Editor&, ~EM_GETSEL, 0, Addr(SelPos&))
SendMessage(Editor&, ~EM_SETSEL, 0, SelPos&)
Var Zeile$ = Left$(GetText$(Editor&), SelPos&)
WhileLoop Len(Zeile$)
Sel$ = Mid$(Zeile$, &loop, 1)
Select Sel$
CaseOf "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", ".", ","
Out$ = Out$ + Sel$
CaseOf "+", "-"
Case %Sig : Out$ = Out$ + Sel$
CaseOf "a", "b", "c", "d", "e", "g", "A", "B", "C", "D", "E", "F"
Case %HEX : Out& = Out& + Sel$
EndSelect
EndWhile
SendMessage(Editor&, ~EM_REPLACESEL, 0, Addr(Out$))
SendMessage(Editor&, ~EM_SETSEL, -1, Len(Out$))
EndProc
CLS
Var Editor& = Create("Edit", %hwnd, "", 4, 4, 128, 22)
While 1
WaitInput
If GetFocus(Editor&)
EditNum
EndIf
EndWhile
End
Gruß Volkmar |
|
|
|
|
|
#14 (Direktlink) |
|
Forenmaskottchen
![]() Registriert seit: 23.01.2011
Ort: Bernburg
Alter: 58
Beiträge: 756
|
Für ts-soft nun mal die Version mit Subclass soweit aufgebaut. Hat nun die gleichen Möglichkeiten.
Code:
$H Messages.PH
CLS
Def %SIG 0 ' mit 1 + und - erlauben
Def %HEX 0 ' mit 1 HEX-Zahlen erlauben
Var Editor& = Create("Edit", %hwnd, "", 100, 100, 128, 22)
SubClass Editor&, 1
While 1
WaitInput
EndWhile
End
SubClassProc
If SubClassMessage(Editor&, ~WM_CHAR)
'Set("WinProc", 0)
Select &swparam
CaseOf 8, 44, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57
' 8 notwendig für Korrektur mittels Rücktaste
' 43 für +
' 45 für -
Set("WinProc", 1)
CaseOf 43, 45
If %SIG
Set("WinProc", 1)
Else
Set("WinProc", 0)
EndIf
CaseOf 65, 66, 67, 68, 69, 70, 97, 98, 99, 100, 101, 102
If %HEX
Set("WinProc", 1)
Else
Set("WinProc", 0)
EndIf
Otherwise
Set("WinProc", 0)
EndSelect
EndIf
EndProc
|
|
|
|
|
|
#15 (Direktlink) |
|
Forenmaskottchen
![]() Registriert seit: 16.05.2010
Ort: Berlin
Beiträge: 724
|
Danke, hab also nur das falsche Ereignis genutzt, ~WM_CHAR wäre richtig
__________________
Gruß Thomas Wenn mir früher jemand gesagt hätte, ich würde freiwillig eine Wanze mit mir herum tragen und sie auch noch selbst aufladen, hätte ich laut gelacht. Heute habe ich ein Smartphone. http://realsource.de |
|
|
|
|
![]() |
|
| Lesezeichen |
| Themen-Optionen | |
| Ansicht | |
|
|
Ähnliche Themen
|
||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| Listview.ddl und Nedit.dll gleichzeitig? | Martin_K | Dlls, Includes, Units & Prozeduren | 4 | 23.02.2010 21:53 |