EditorGadet Find / FindNext

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Benutzeravatar
PAMKKKKK
Beiträge: 321
Registriert: 21.04.2005 22:08
Wohnort: Braunschweig
Kontaktdaten:

EditorGadet Find / FindNext

Beitrag 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.....
Zuletzt geändert von PAMKKKKK am 19.10.2005 07:59, insgesamt 1-mal geändert.
Wir Schreiben ein PureBasic Buch.
Auch du kannst mitmachen!
http://www.purearea.net/pb/english/pure ... :Main_Page
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: EditorGadet Find / FindNext

Beitrag 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.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
PAMKKKKK
Beiträge: 321
Registriert: 21.04.2005 22:08
Wohnort: Braunschweig
Kontaktdaten:

Re: EditorGadet Find / FindNext

Beitrag 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)
Wir Schreiben ein PureBasic Buch.
Auch du kannst mitmachen!
http://www.purearea.net/pb/english/pure ... :Main_Page
Antworten