Quelltexte/ Codesnippets | | | | - Seite 1 - |
| RudiB. | Hallo zusammen,
ich hoffe es kann mir jemand helfen.... Ich möchte ein Zeichen aus einem Rich-Editfenster auslesen und in eine Stringvariable übertragen. Markieren/auswählen haut ja hin aber dann ?? Das ist mein Lösungsansatz, funktioniert nur nicht.
Sendmessage(Rtf&,~EM_SETSEL,6,7)'--markiert das 7.te Zeichen im Richedit-Text
test$=Sendmessage(Rtf&,~EM_GETSEL,0,0)'--hier soll das Zeichen z.B das Zeichen "s" bzw. Chr$(115) ausgelesen werden, dieses steht auch an Position 7 im Text
print test$'--Ausgabe ist "458758"
|
| | | | |
| | « Dieser Beitrag wurde als Lösung gekennzeichnet. » | | RudiB. | Hallo Georg,
Super vielen Dank...das ist die Lösung...
Declare x&,y&,y_neu&,testtext$,Richedit&,n$,Bereich#,rtf#
Dim rtf#,84
Cls
Richedit&=Create("Richedit",%hwnd,"",20,20,600,300)
Testtext$="Declare test&,satz&,anzahl&,farb_anzahl&,superanzahl&,x&,y&,z&\n\
satz&=22\n\
anzahl&=44\n\
farb_anzahl&=100\n\
anzahl&=farb_anzahl&*30\n\
superanzahl&=anzahl&\n\
...\n\
...\n\
...\n\
usw. im Listing"
SetText Richedit&,TestText$
n$="anzahl&"'--Dieser Text soll gesucht werden(Nur zum Beispiel)
DIM Bereich#,16
clear Bereich#
x&=-1
y_neu&=-1
While 1
Long bereich#,0=x&+1
Long bereich#,4=-1
Long bereich#,8=Addr(n$)
x&=Sendmessage(Richedit&,$0438,2,bereich#)'--EM_FINDTEXT (2=Flagparameter für nur ganze Wörter suchen)
Case x&=-1:BREAK
y&=moeglichkeit_1_instr("_",GetText$(Richedit&),y_neu&)
Sendmessage(Richedit&,$00B1,x&,x&+Len(n$))'--Cursor setzen
y_neu&=x&+Len(n$)
IfNot y&=x&
rtf_SetColor RGB(255,0,0)
Endif
SetFocus(Richedit&)
'Sleep 100
EndWhile
waitinput
Dispose Bereich#
end
Proc rtf_SetColor
Parameters a&
Clear rtf#
LONG rtf#,0=84
LONG rtf#,4=$40000000
LONG rtf#,20=a&
sendmessage(Richedit&,1092,1,rtf#)'-EM_SETCHARFORMAT
EndProc
Proc moeglichkeit_1_instr
Parameters such$,text$,pos&
InStr(such$,text$,pos&)
EndProc
Deine erste Lösung mit "Instr" ist es...habs in die Schleife mit eingebaut. PERFEKT.......manchmal sieht man den Wald vor lauter Bäumen nicht.
Großes Danke aus München |
| | | | | |
| | Georg Teles | Guten Abend,
das EM_GETSEL markiert den Text sichtbar in der Edit, dazu muss man das Edit zunchst fokusieren
CLS
var rtf& = Create("RichEdit", %hWnd, "Das ist ein kleiner Test", 5, 5, 300, 300)
SetFocus(Rtf&)'erst Fokus setzen, bevor markiert wird
Sendmessage(Rtf&,$00B1,6,7)'--markiert das 7.te Zeichen im Richedit-Text
waitinput
ich habe keine Ahnung was du genau vor hast, so würde ich das lösen:
oder umständlich:
CLS
declare test#
dim test#,100
var rtf& = Create("RichEdit", %hWnd, "Das ist ein kleiner Test", 5, 5, 300, 300)
Sendmessage(Rtf&,$000D,100,Addr(test#))
print Mid$(String$(test#,0),23,1)'markiert das letzte S im Text
DisPose test#
waitinput
END
Grüße |
| | | | |
| | RudiB. | Hallo Georg, erst mal Danke für Deine Antwort.... Nun zu meiner Problematik, habe dazu ein lauffähiges Beispiel angehängt. Ich möchte in einem Programmlisting nach Variablen suchen... Nun kommt in diesem Listing die Variable "anzahl&" und "farb_anzahl&" vor, ich suche nun nur nach "anzahl&" mit der Suchoption 2 für nur ganze Wörter in FINDTEXT. Hier wird aber jetzt auch das "anzahl&" in der Variable "farb_anzahl&" mit gefunden/markiert, soll aber nicht so sein. Daher möchte ich eine Prüfung des Zeichens vor der Suchvariable durchführen. Also: wenn Zeichen vor Suchvariable = _ (Unterstrich) dann markiere nicht. Da hatte ich eben an ~EM_GETTEXT gedacht, kriegs aber nicht hin...
Declare x&,testtext$,Richedit&,n$,Bereich#,rtf#
Dim rtf#,84
Cls
Richedit&=Create("Richedit",%hwnd,"",20,20,600,300)
Testtext$="Declare test&,satz&,anzahl&,farb_anzahl&,superanzahl&,x&,y&,z&\n\
satz&=22\n\
anzahl&=44\n\
farb_anzahl&=100\n\
anzahl&=farb_anzahl&*30\n\
superanzahl&=anzahl&\n\
...\n\
...\n\
...\n\
usw. im Listing"
SetText Richedit&,TestText$
n$="anzahl&"'--Dieser Text soll gesucht werden(Nur zum Beispiel)
DIM Bereich#,16
clear Bereich#
x&=-1
While 1
Long bereich#,0=x&+1
Long bereich#,4=-1
Long bereich#,8=Addr(n$)
x&=Sendmessage(Richedit&,$0438,2,bereich#)'--EM_FINDTEXT (2=Flagparameter für nur ganze Wörter suchen)
Case x&=-1:BREAK
Sendmessage(Richedit&,$00B1,x&,x&+Len(n$))'--Cursor setzen
rtf_SetColor RGB(255,0,0)
SetFocus(Richedit&)
'Sleep 100
EndWhile
SetFocus(Richedit&)
waitinput
Dispose Bereich#
end
Proc rtf_SetColor
Parameters a&
Clear rtf#
LONG rtf#,0=84
LONG rtf#,4=$40000000
LONG rtf#,20=a&
sendmessage(Richedit&,1092,1,rtf#)'-EM_SETCHARFORMAT
EndProc
|
| | | Xprofan X4 Rudolf Beske / München
Hardware: NB Intel I9 - 16GByte RAM | 24.11.2021 ▲ |
| |
| | Thomas Freier | Habe mal in die Dokumentation der RTFHandling.pcu von Dieter Zornow gesehen, die auch mit EM_FINDTEXT arbeitet, aber da gäbe eine Einschränkung, dass nur die ersten 64kb durchsucht werden. Für mehr nimmt er die EM_FINDTEXTEX . Wenn (2=Flagparameter für nur ganze Wörter suchen) stimmt, und Wortgebilde nicht ausschließt, würde ich nicht nur bei x&=-1 aussteigen, sondern auch auf Leerzeichen, Punkt und Komma vor und nach dem Suchtext prüfen. |
| | | | |
| | RudiB. | Hallo Thomas,
zum einem besagt das "X&=-1" ja , das das Dokument bis zum Ende durchsucht wird, bzw. das Ende des Dokuments erreicht ist. Praktisch ist das der Rückgabewert von Sendmessage bei
...und bei allen anderen Zeichencodes z.B Komma,Leerzeichen etc. wird es ja auch richtig erkannt, eben nur beim Unterstrich nicht. Das funktioniert auch bei Texten größer als 64 KB.....
Daher suche ich ja nach der Möglichkeit das Zeichen vor dem gefundenen Suchbegriff auszulesen. Aber ~EM_GETSEL spuckt mir nur Zahlen aus .....möglicherweise Speicheradressen, doch wie lese ich die aus ?????? |
| | | | |
| | Georg Teles | Guten Abend,
ich hätte da einen Ansatz - für InStr und MemPos dürften keine Zeichen ein Problem sein oder kein Problem mit allen Zeichen geben ... wenn du MemPos noch in der Schleife umsetzen kannst, kannst du auch nicht druckbare Zeichen suchen, da war ich zu faul eine Proc für dich zu schreiben :/
Declare x&,testtext$,Richedit&,n$,Bereich#,rtf#
Dim rtf#,84
Cls
Richedit&=Create("Richedit",%hwnd,"",20,20,600,300)
Testtext$="Declare test&,satz&,anzahl&,farb_anzahl&,superanzahl&,x&,y&,z&\n\
satz&=22\n\
anzahl&=44\n\
farb_anzahl&=100\n\
anzahl&=farb_anzahl&*30\n\
superanzahl&=anzahl&\n\
...\n\
...\n\
...\n\
usw. im Listing"
SetText Richedit&,TestText$
n$="anzahl&"'--Dieser Text soll gesucht werden(Nur zum Beispiel)
DIM Bereich#,16
clear Bereich#
x&=-1
While 1
Long bereich#,0=x&+1
Long bereich#,4=-1
Long bereich#,8=Addr(n$)
x&=Sendmessage(Richedit&,$0438,2,bereich#)'--EM_FINDTEXT (2=Flagparameter für nur ganze Wörter suchen)
Case x&=-1:BREAK
Sendmessage(Richedit&,$00B1,x&,x&+Len(n$))'--Cursor setzen
rtf_SetColor RGB(255,0,0)
SetFocus(Richedit&)
'Sleep 100
EndWhile
' InStr Vorteil: lässt sich eine Schleife bilden, d.h. Position,
' ab der huier gesucht wird, beginnt bei -1 ... bei gefundenem Ergebnis kann
' zur gefudenen Position +1 dazugezählt werden und eine neue Suche gestartet werden, solange
' das Ergebnis nicht die vorherige Suchposition war
print "1. Ergebnis 1. Funktion: "+Str$(moeglichkeit_1_instr("farb_",GetText$(Richedit&),-1))
' auch gut, problematisch wirds mit der Position, diese muss immer -1 sein,
' da das MemPos nur den ersten Fund ausgibt
' das kann man vermeinden, wenn die Textvariable um ab der Gefundenen Position + Länge gekürzt wird
' und ab der Position -1 weitergesucht + die Länge und die vorherige Position des abgeschnittenen Strings hinzugezählt werden muss !
print "1. Ergebnis 2. Funktion: "+Str$(moeglichkeit_2_mempos("farb_",GetText$(Richedit&),-1))
print "-------------------------------------------------------------"
' InStr in Schleife
moeglichkeit_1_instr_schleife("farb_",GetText$(Richedit&),-1)
print "-------------------------------------------------------------"
' hier gibt es nichts zu sehen :/
moeglichkeit_2_mempos_schleife("farb_",GetText$(Richedit&),-1)
'SetFocus(Richedit&)
waitinput
Dispose Bereich#
end
Proc rtf_SetColor
Parameters a&
Clear rtf#
LONG rtf#,0=84
LONG rtf#,4=$40000000
LONG rtf#,20=a&
sendmessage(Richedit&,1092,1,rtf#)'-EM_SETCHARFORMAT
EndProc
Proc moeglichkeit_1_instr
Parameters such$,text$,pos&
InStr(such$,text$,pos&)
EndProc
Proc moeglichkeit_2_mempos
Parameters such$,text$,pos&
declare text#, p&
dim text#, len(text$)
char text#,0 = text$
p& = MemPos(text#,pos&,such$)
DisPose text#
Return p&
EndProc
Proc moeglichkeit_1_instr_schleife
Parameters such$,text$,pos&
declare ende%, laufvar&, var&, i%
ende% = 0
var& = -2
laufvar& = -2
i% = 0
WhileNot ende%
var& = Str$(moeglichkeit_1_instr("farb_",GetText$(Richedit&),laufvar&))
IfNot ((laufvar&+1) < var&)
print "#--- keine weiteren Treffer gefunden ---#"
break
EndIf
laufvar& = var&+1
inc i%
print Str$(i%)+". gefundene Position Schleife: "+Str$(var&)
EndWhile
EndProc
Proc moeglichkeit_2_mempos_schleife
Parameters such$,text$,pos&
print "war zu faul, eine Proc zu schreiben, der Aufwand ist zu groß\nder Text muss zugeschnitten werden bis zum vorherigen treffer + Länge\ndes textes und beim nächsten Ergebniss muss diese vorherige Position + Länge\nzur neuen gefundenen Position dazugerechnet werden :/"
Return
EndProc
Grüße |
| | | | |
| | RudiB. | Hallo Georg,
Super vielen Dank...das ist die Lösung...
Declare x&,y&,y_neu&,testtext$,Richedit&,n$,Bereich#,rtf#
Dim rtf#,84
Cls
Richedit&=Create("Richedit",%hwnd,"",20,20,600,300)
Testtext$="Declare test&,satz&,anzahl&,farb_anzahl&,superanzahl&,x&,y&,z&\n\
satz&=22\n\
anzahl&=44\n\
farb_anzahl&=100\n\
anzahl&=farb_anzahl&*30\n\
superanzahl&=anzahl&\n\
...\n\
...\n\
...\n\
usw. im Listing"
SetText Richedit&,TestText$
n$="anzahl&"'--Dieser Text soll gesucht werden(Nur zum Beispiel)
DIM Bereich#,16
clear Bereich#
x&=-1
y_neu&=-1
While 1
Long bereich#,0=x&+1
Long bereich#,4=-1
Long bereich#,8=Addr(n$)
x&=Sendmessage(Richedit&,$0438,2,bereich#)'--EM_FINDTEXT (2=Flagparameter für nur ganze Wörter suchen)
Case x&=-1:BREAK
y&=moeglichkeit_1_instr("_",GetText$(Richedit&),y_neu&)
Sendmessage(Richedit&,$00B1,x&,x&+Len(n$))'--Cursor setzen
y_neu&=x&+Len(n$)
IfNot y&=x&
rtf_SetColor RGB(255,0,0)
Endif
SetFocus(Richedit&)
'Sleep 100
EndWhile
waitinput
Dispose Bereich#
end
Proc rtf_SetColor
Parameters a&
Clear rtf#
LONG rtf#,0=84
LONG rtf#,4=$40000000
LONG rtf#,20=a&
sendmessage(Richedit&,1092,1,rtf#)'-EM_SETCHARFORMAT
EndProc
Proc moeglichkeit_1_instr
Parameters such$,text$,pos&
InStr(such$,text$,pos&)
EndProc
Deine erste Lösung mit "Instr" ist es...habs in die Schleife mit eingebaut. PERFEKT.......manchmal sieht man den Wald vor lauter Bäumen nicht.
Großes Danke aus München |
| | | | |
| | Georg Teles | Ja perfekt,
oh, ich habe aber Mist gepostet, habe überlesen, was du konkret wolltest seh heute auch den Wald vor lauter Bäumen nicht - zum Ziel hat es aber geführt hehehehehe
Grüße von der Baden-Württembergischer / Bayrischer Grenze (Ulm) |
| | | | |
|
Zum QuelltextThemenoptionen | 5.489 Betrachtungen |
ThemeninformationenDieses Thema hat 3 Teilnehmer: |