Seite 1 von 1

EditorGadet Find / FindNext

Verfasst: 08.10.2005 18:30
von PAMKKKKK
:( :( :( Ich kriegs einfach nicht hin......

Ich versuche Hier einen Text Editor mit dem EditorGadget zu Proggen.

Wenn ich Text in dem Gadget suchen lasse, findet er immer nur den Letztmöglichen eintrag des Suchtextes.

Wie mach man das, das er den erstmöglichen suchtext findet und bei jedem weiteren druck auf den Knopf den nächsten ....usw

Code: Alles auswählen

Procedure EditorGadgetSearch(Gadget_ID,SearchText.s,Flags)
  ; Possible Flags
  ; #FT_SEARCH = 1 ; Searching ASC, not the whole Word and not Case sensitive
  ; #FT_SEARCH_DESC = 0
  ; #FT_WHOLEWORD = 2
  ; #FT_MATCHCASE = 4 
  lpfindtext.FINDTEXTEX
  lpfindtext\chrg\cpMin=Len(GetGadgetText(Gadget_ID))
  lpfindtext\chrg\cpMax=-1
  lpfindtext\lpstrtext=@SearchText
  If SendMessage_(GadgetID(Gadget_ID),#EM_FINDTEXTEX,Flags,@lpfindtext) <> -1
    Delay(2000)
    SendMessage_(GadgetID(Gadget_ID),#EM_EXSETSEL,0,@lpfindtext\chrgtext)
    Delay(2000)
    ;newtext.s="new text, can be even longer"
    ;SendMessage_(GadgetID(Gadget_ID),#EM_REPLACESEL ,1,@newtext)
  EndIf  
EndProcedure
vielleicht auch die suchrichtung vorgeben kann.....

Re: EditorGadet Find / FindNext

Verfasst: 08.10.2005 22:59
von Danilo
PAMKKKKK hat geschrieben:

Code: Alles auswählen

  lpfindtext\chrg\cpMin=Len(GetGadgetText(Gadget_ID))
Der Anfang 'cpMin' sollte beim ersten Durchlauf 0 sein, danach
bei jedem Durchlauf der CharacterIndex nach dem zuletzt
gefunden Wort.

Wenn Du die PB-Befehle für das Editor-Gadget verwendest,
die Strings verarbeiten oder zurückgeben (GetGadgetText),
kannst Du nur mit Texten arbeiten die so gross sind wie
der PB-String-Buffer. AFAIK sind das 64000 Bytes, falls das
noch nicht erhöht wurde oder Du das nicht selber machst.
Bei größeren Texten droht damit Datenverlust und evtl. ein
Crash des Programmes.
Nur mal so nebenbei als Hinweis, falls einer Deiner User auf
die Idee kommt mal einen großen Text mit Deinem Editor zu
laden.

Re: EditorGadet Find / FindNext

Verfasst: 09.10.2005 14:15
von PAMKKKKK
Danilo hat geschrieben: Wenn Du die PB-Befehle für das Editor-Gadget verwendest,
die Strings verarbeiten oder zurückgeben (GetGadgetText),
kannst Du nur mit Texten arbeiten die so gross sind wie
der PB-String-Buffer. AFAIK sind das 64000 Bytes, falls das
noch nicht erhöht wurde oder Du das nicht selber machst.
Bei größeren Texten droht damit Datenverlust und evtl. ein
Crash des Programmes.
Nur mal so nebenbei als Hinweis, falls einer Deiner User auf
die Idee kommt mal einen großen Text mit Deinem Editor zu
laden.
Jo! War mir klar, leider ist das so /:->
Danke für den Hinweis!
[EDIT]
Laut WinAPI haben die Befehle ohne EX im Namen das selbe Problem.
z.B. EM_GETSEL und EM_EXGETSEL
die WinAPI befehle mit EX sollten mehr unterstützen....
[/EDIT]

Habe noch nicht rausbekommen wie ich den GetGadgetText() befehl ersetzen kann (max. Buffer vom Editorgadget erfragen?)..... :|

Mitlerweile bin ich auch selbst auf die Lösung gestossen.

Spassig ist, das man bei den Suchrichtungen nicht nur die Such-Range "umdrehen" muss, sondern auch der Selection-Range umgedreht ist....

Hier meine Lösung:
[EDIT]
< Falsch und Alt !!Bei dem ersten aufruf (erste suche = Find) muss FindNextPos = 0 sein.>
< Falsch und Alt !! Wenn FindNextPos > 0 ist, dann ist es eine weitersuche (Findnext)>


Habe gemerkt das die Proc bei der Rückwärtssuche nicht korrekt war! Ist nun gefixt.
Nun braucht die Proc auch keine Globale Variable mehr, und auch keine sonnstigen Stützfunktionen :mrgreen:

[/EDIT]

Code: Alles auswählen

Procedure EditorGadgetSearch(Gadget_ID,SearchText.s,Flags)
  ; Possible Flags
  ; #FT_SEARCH = 1 ; Searching Top to Bottom, not the whole Word and not Case sensitive
  ; #FT_SEARCH_Bottom_to_Top = 0
  ; #FT_WHOLEWORD = 2
  ; #FT_MATCHCASE = 4 
  SendMessage_(GadgetID(Gadget_ID),#EM_EXGETSEL,0,Range.CHARRANGE) ; Get CurrentCursor Position
  Updown = Flags & 2147483647 ; Flag for search direction
  findtext.FINDTEXTEX  ;Structurvariable, Type FINDTEXTEX
  If Updown ; If searchdirection Flag = 1, searching Top to Bottom
    ; Define the Top to Bottom SearchRange from Min to Max (where Min is Buffer Min and Max is Buffer Max !!!)
    findtext\chrg\cpMin = Range\cpMax ; Starting by the Current CurserRangeposition (Range cpMax)
    findtext\chrg\cpMax=-1 ; -1 stands vor maximum Bufferlength {equal to Len(GetGadgetText(Gadget_ID))}
  Else
    ; Define the Bottom to Top SearchRange from Min to Max (where Min is Buffer Max and Max is Buffer Min !!!)
    findtext\chrg\cpMin = Range\cpMin ; Starting by the Current CurserRangeposition (Range cpMin)
    findtext\chrg\cpMax= 0; beginn of Buffer is the end to search
  EndIf
  findtext\lpstrText=@SearchText ; Simple the Adress og the String to search
  If SendMessage_(GadgetID(Gadget_ID),#EM_FINDTEXTEX,Flags,@findtext) <> -1 ; If the Text is found
    SendMessage_(GadgetID(Gadget_ID),#EM_EXSETSEL,0,@findtext\chrgText) ; Select the Text
  EndIf 
EndProcedure

;-Beispielaufrufe:

; Sucht von unten nach oben das Wort "Hello" (zum weitersuchen Findnext einfach nochmal aufrufen)
EditorGadgetSearch(#EditorGadget0,"Hello",0) 

 ; Sucht von oben nach unten das Wort "Hello" (zum weitersuchen Findnext einfach nochmal aufrufen)
EditorGadgetSearch(#EditorGadget0,"Hello",1)

; Sucht von unten nach oben das Wort "Hello" und achtet auf Gross-/Kleischreibung (zum weitersuchen Findnext einfach nochmal aufrufen)
EditorGadgetSearch(#EditorGadget0,"Hello",4) 

 ; Sucht von unten nach oben das Wort "Hello" aber nur ganze Wörter (zum weitersuchen Findnext einfach nochmal aufrufen)
EditorGadgetSearch(#EditorGadget0,"Hello",2)

; Sucht von oben nach unten das Wort "Hello",nur ganze Wörter und achtet auf Gross-/Kleischreibung
; (zum weitersuchen Findnext einfach nochmal aufrufen)
EditorGadgetSearch(#EditorGadget0,"Hello",7)