Seite 2 von 2

Verfasst: 01.05.2007 11:40
von Friedhelm
AND51 hat geschrieben:Frage: Wie unterbinde ich beim Poken, dass eine abschließende Null angehängt wird?
CopyMemory()

Syntax

CopyMemory(*SourceMemoryID, *DestinationMemoryID, Laenge)
Beschreibung

Kopiert einen Speicherbereich von '*SourceMemoryID' (der Ausgangs-Speicheradresse) mit der angegebenen Länge (in Bytes) zur '*DestinationMemoryID' (der Ziel-Speicheradresse).

Wenn sich Ausgangs- und Zielspeicherbereich überlappen, ist es sicherer, MoveMemory() zu verwenden, andernfalls kann das Ergebnis falsch sein.
Unterstützte OS

StringReplace Teil 2

Verfasst: 01.05.2007 12:05
von dater
Hallo,
ich habe mein "StringReplace" etwas erweitert.
Weiter funktionen kommen noch. Aber aus zeitgründen dauert es noch etwas.
Wer will, kann den Code ändern und hier Posten.

Code: Alles auswählen


; StringReplace 30.04.2007 Markus Maiwald
; (fast so gut wie das von AHK)

; StringReplace(text.s,such.s,ersetz.s,anzahl,grosklein.b)
; text.s		=Text der durchsucht wird  
; such.s		=Suchtext
; ersetz.s   	=Text der durch den Suchtext ersetzt werden soll
; anzahl.l		=Anzahl der ersetzungen  ( 0 = alles )
; grosklein.b	=  0 => Ohne Groß-Klein unterscheidung  
; großklein.b 	=  1 => 1 : 1 erkennungn  

Procedure.s StringReplace(text.s,such.s,ersetz.s,anzahl,grosklein.b)
If grosklein=0 : gk.b=32 : Else : gk.b=0 : EndIf
l=Len(text.s) : l2=Len(such.s) : te=0 : start=1
weiter:
For s=start To l							; loop text
	a.b=Asc(Mid(text.s,s,1))				; asc Zeichen Text
	For t=1 To l2						; loop suchtext
	b.b=Asc(Mid(such.s,t+te,1))			; asc Zeichen Suchtext
	If a.b=b.b Or (a.b+gk.b)=b.b Or (a.b-gk.b)=b.b; Groß Klein Schreibung aufheben.
		te=te+1						; Anzahl der Treffer 
		If te=l2						; Anzahl der Treffer mit Anzahl der SuchZeichen vergleichen 
			ok=ok+1					; Anzahl der gfunden Texte die ersetzt wurden.
			text1.s=Left(text.s,s-l2)		; Linke Textseite
			text2.s=Right(text.s,l-s)		; Rechte Textseite
			text.s=text1.s+ersetz.s+text2.s	; Text zusammen setzen
			l=Len(text.s)				; Neue Text Länge
			start=s-l2+(Len(ersetz.s))+1	; Neuer Start berechnen.		
			te=0						; Treffer auf null
			If anzahl=ok
				Goto ende
			Else
				Goto weiter				; 
			EndIf
		EndIf
		Break
	Else
		te=0
	EndIf
	Next t
Next s
ende:
	ProcedureReturn text.s
EndProcedure

;z.B.
A$="Heute wird am 1.Mai gefeiert."
b$="1.Mai"
c$="18.Mai"
Debug a$
a$=StringReplace(a$,b$,c$,0,1)
Debug a$
a$=StringReplace(a$,"Mai","Juni",0,1)
Debug a$
a$=StringReplace(a$,"gefeiert","gefressen",0,1)
Debug a$
a$=StringReplace(a$,"e","E",2,0)
Debug a$


StringReplace

Verfasst: 04.05.2007 04:22
von dater
Hi,
ich habe den Code etwas optimiert, das Goto ist weg und Define wurde hinzugefügt.

Code: Alles auswählen


; StringReplace 30.04.2007 Markus Maiwald
; (fast so gut wie das von AHK)

; StringReplace(text.s,such.s,ersetz.s,anzahl,grosklein.b)
; text.s		=Text der durchsucht wird  
; such.s		=Suchtext
; ersetz.s   	=Text der durch den Suchtext ersetzt werden soll
; anzahl.l		=Anzahl der ersetzungen  ( 0 = alles )
; grosklein.b	=  0 => Ohne Groß-Klein unterscheidung  
; großklein.b 	=  1 => 1 : 1 erkennungn  


Procedure.s StringReplace(text.s,such.s,ersetz.s,anzahl,grosklein.b)
Define.l	l,l2,te,start,s,anzahl,ok,t 
Define.b	grosklein,gk,a,b
Define.s 	text,text1,text2
If grosklein=0 : gk.b=32 : Else : gk.b=0 : EndIf
l=Len(text.s) : l2=Len(such.s) : te=0 : start=1 : s=0
Repeat
	a.b=Asc(Mid(text.s,s,1))				; asc Zeichen Text
	For t=1 To l2						; loop suchtext
	b.b=Asc(Mid(such.s,t+te,1))			; asc Zeichen Suchtext
	If a.b=b.b Or (a.b+gk.b)=b.b Or (a.b-gk.b)=b.b; Groß Klein Schreibung aufheben.
		te=te+1						; Anzahl der Treffer 
		If te=l2						; Anzahl der Treffer mit Anzahl der SuchZeichen vergleichen 
			ok=ok+1					; Anzahl der gfunden Texte die ersetzt wurden.
			text1.s=Left(text.s,s-l2)		; Linke Textseite
			text2.s=Right(text.s,l-s)		; Rechte Textseite
			text.s=text1.s+ersetz.s+text2.s	; Text zusammen setzen
			l=Len(text.s)				; Neue Text Länge
			start=s-l2+(Len(ersetz.s))+1	; Neuer Start berechnen.		
			te=0						; Treffer auf null
			If anzahl=ok
				Break
			Else
				Continue	
			EndIf
		EndIf
		Break
	Else
		te=0
	EndIf
	Next t
	s=s+1
Until s>l
	ProcedureReturn text.s
EndProcedure

Define.s a$,b$,c$
;z.B.
A$="Heute wird am 1.Mai gefeiert."
b$="1.Mai"
c$="18.Mai"
Debug a$
a$=StringReplace(a$,b$,c$,0,1)
Debug a$
a$=StringReplace(a$,"Mai","Juni",0,1)
Debug a$
a$=StringReplace(a$,"gefeiert","gefressen",0,1)
Debug a$
a$=StringReplace(a$,"e","E",2,0)
Debug a$


Verfasst: 04.05.2007 15:14
von AND51
Innerhalb von Proceduren sollte PROTECTED statt DEFINE verwendet werden.

Auch finde ich es schade, dass du auf meinen Hinweis keine Antwort gibst:
Ich sagte, dass ReplaceString() auch die Option bietet, Groß-/Kleinschreibung zu ignorieren.
Du meinst außerdem, es würde nur den ersten Strig ersetzen. Das stimmt nicht, es ersetzt alle Strings.

Du hast also das Rad unnötigerweise neu erfunden.

Verfasst: 04.05.2007 16:06
von edel
bla bla bla ...

Schonmal daran gedacht dass das Verhalten von ReplaceString
nicht immer ideal ist ? Wer etwas anderes braucht kann z.B. hier
im ctt Forum nachgucken.

Verfasst: 04.05.2007 16:37
von AND51
> bla bla bla ...
Soll das heißen, du stellst meine Hilfe in Frage? Das find ich aber nicht nett! /:->

> Schonmal daran gedacht dass das Verhalten von ReplaceString nicht immer ideal ist ?
In welchen Fällen denn zum Beispiel?

Änderung

Verfasst: 05.05.2007 09:16
von dater
Hi,
ich habe eure Bitten gelesen und werde die änderung durchführen.
Nur meine Zeit am Computer ist stark eingeschrenk.
Groß.Klein Schreibung ist drinne. last mir nich etwas Zeit.

Danke Dater...