Seite 1 von 1

Corser position im Editor Gadget und in Px für Win und Linux

Verfasst: 18.11.2005 22:20
von IcedCoffee
Moin

ich bin gerade beim coden einer kleinen Auto Complete funktion für Win und Linux

so und meine frage ist wie bekomme ich die Corser position?
SendMessage_(GadgetID(#MyStringGadget), #EM_GETSEL, @GetSelStart, @GetSelEnde) << nicht das [weil ist WinAPI]

und wie bekomme ich die Corser position in Pixel'n
MouseX() << nicht das [weil da brauche ich OpenWindowedScreen() für]

soweit bin ich schon: :-)

Code: Alles auswählen

#MyStringGadget = 1
#MyListGadget = 2
Procedure.s ICStringField(String.s, Separator.s, Index.l, StartPos.l, EndPos.l)
  Protected Wort.s, StartPosOfWort.l, EndPosOfWort.l, w.l, SatzPos.l
  Wort = StringField(String, Index, Separator)
  If CountString(String, Wort) = 1
    StartPosOfWort = FindString(String, Wort, 1)
    EndPosOfWort = StartPosOfWort+Len(Wort)
    PokeL(StartPos, StartPosOfWort-1)
    PokeL(EndPos, EndPosOfWort-1)
    ProcedureReturn Wort
  ElseIf CountString(String, Wort) > 1
    For w = 1 To CountString(String, Separator)
      Wort = StringField(String, w, Separator)
      SatzPos = SatzPos + Len(Wort) + 1
      If w = Index
        PokeL(StartPos, SatzPos-Len(Wort)-1)
        PokeL(EndPos, SatzPos-1)
        ProcedureReturn Wort
      EndIf
    Next
  Else
    ProcedureReturn ""
  EndIf
EndProcedure

OpenWindow(0,150,150,200,200, #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered, "Test")
If CreateGadgetList(WindowID())
  StringGadget(#MyStringGadget, 25,25,150,18,"")
  ListViewGadget(#MyListGadget, 25, 50, 150, 60)
EndIf

Text.s      ; Der Text wie er aus der Gadget kommt
WortStart.l ; Die Position des Wort anfangs
WortEnde.l  ; Die Position des Wort endes
i.l         ; wie oft ist " " im Text enthalten
GetSel.l    ; die position des Corsers
Wort.s      ; Wort in dem sich gerade der Corser befindet
SatzStart.s ; der Text vor dem Wort
SatzEnde.s  ; der Text nach dem Wort

NewList AutoCompleteList.s()
AddElement(AutoCompleteList()) : AutoCompleteList() = "Hallo"
AddElement(AutoCompleteList()) : AutoCompleteList() = "geht"
AddElement(AutoCompleteList()) : AutoCompleteList() = "euch"
AddElement(AutoCompleteList()) : AutoCompleteList() = "hoffe"
AddElement(AutoCompleteList()) : AutoCompleteList() = "scheisse"
AddElement(AutoCompleteList()) : AutoCompleteList() = "nene"
AddElement(AutoCompleteList()) : AutoCompleteList() = "joke"
AddElement(AutoCompleteList()) : AutoCompleteList() = "oder"
AddElement(AutoCompleteList()) : AutoCompleteList() = "egal"
AddElement(AutoCompleteList()) : AutoCompleteList() = "schön"
AddElement(AutoCompleteList()) : AutoCompleteList() = "Schöne"
AddElement(AutoCompleteList()) : AutoCompleteList() = "Cool"
AddElement(AutoCompleteList()) : AutoCompleteList() = "cooles"
Repeat
  Select WaitWindowEvent()
    Case #PB_Event_Gadget
      Select EventGadgetID()
        Case #MyStringGadget
          ;--------------------------
          Text = GetGadgetText(#MyStringGadget)+" "
          SendMessage_(GadgetID(#MyStringGadget), #EM_GETSEL, @GetSel, 0)
          ClearGadgetItemList(#MyListGadget)
          For i = 1 To CountString(Text, " ")
            Wort = ICStringField(Text, " ", i, @WortStart, @WortEnde)
            If WortStart <= GetSel And WortEnde >= GetSel And Wort <> "" And Len(Wort) > 2
              Debug Wort
              SatzStart = Left(Text, WortStart)
              SatzEnde = Right(Text, Len(Text)-WortEnde-1)
              WortLenge = Len(Wort)
              ResetList(AutoCompleteList())
              While NextElement(AutoCompleteList())
                If LCase(LSet(AutoCompleteList(), WortLenge)) = LCase(Wort)
                  AddGadgetItem(#MyListGadget, -1, AutoCompleteList())
                EndIf
              Wend
            EndIf
          Next
          Debug "-----"
          ;--------------------------
        Case #MyListGadget
          SetGadgetText(#MyStringGadget, SatzStart+GetGadgetItemText(#MyListGadget, GetGadgetState(#MyListGadget), 0)+SatzEnde)
      EndSelect
    Case #PB_Event_CloseWindow
      Break
  EndSelect
ForEver
CloseWindow(0)
End
die Corser position in Px brauche ich für so eine art popup fenster welches unter dem wort stehen soll
wen jemand verbesserungsvorschläge hat bitte sagen

ps: die AutoCompleteList() werde ich noch mit eine Datenbank austauschen

Verfasst: 18.11.2005 23:34
von edel
Meinst den Mauscursor oder das blinkende Ding im Editor (Caret) ?
Hast du auch einen Blick in die Hilfe unter Windows geworfen , dort
findest du WindowMouseX/Y() ?

Verfasst: 19.11.2005 12:23
von IcedCoffee
>> Meinst den Mauscursor oder das blinkende Ding im Editor (Caret) ?

ich meine "das blinkende Ding im Editor"

Verfasst: 19.11.2005 12:57
von ts-soft
Ohne API garnicht :mrgreen:
Entweder Du nutzt die jeweilige API des OS oder Du beschränkst Dich auf die Möglichkeiten, die in der PB-Hilfe aufgeführt sind.

Verfasst: 19.11.2005 14:57
von IcedCoffee
sch[a/ei]**e

weiss den dan jemand wie ich das mit der WinAPI machen kann
also ich weiss nur wie ich die position bekommen kann
SendMessage_(GadgetID(#MyStringGadget), #EM_GETSEL, @GetSelStart, @GetSelEnde)

aber ich weiss nicht wie ich die Px position des Caret bekommen kan

Verfasst: 19.11.2005 15:33
von edel
GetCaretPos_(@pt.POINT)

Dazu musst du allerdings noch die Fensterposition berechnen da die
Koordinate nur ab dem Editorgadget zaehlt.

Verfasst: 19.11.2005 16:27
von IcedCoffee
THX es geht :allright: :allright: