Seite 1 von 2

Beim Editorgadget Zeile und Cursorstellung ermitteln.

Verfasst: 28.05.2014 18:51
von funkheld
Hallo, guten Tag.

Ich lade mit RS232 Text in einem Editogadget.
Dieser hat Zeilenumbrüche.
Wenn ich jetzt selber Text eingebe, ist der Eingabecursor immer in der Zeile 1.
Den Text den ich in der 1. Zeile eingebe erscheint dann am Ende des geladenen Textes.
Wie kann man die 1.Zeile unsichtbar machen?

danke.
Gruss

Re: Beim Editorgadget Zeile und Cursorstellung ermitteln.

Verfasst: 28.05.2014 18:54
von RSBasic
Ich verstehe deine Frage nicht genau. Möchtest du die aktuelle Cursorposition ermitteln oder die Cursorposition ans Ende setzen?
Was meinst du mit der ersten Zeile? Kannst du einen Screenshot posten, damit man sehen kann, was du genau meinst?

Re: Beim Editorgadget Zeile und Cursorstellung ermitteln.

Verfasst: 28.05.2014 20:00
von funkheld
Hallo, guten Tag.

Wenn ich Text mit RS232 einlese im Editfenster wird der Cursor im Editfenster nicht weiter bewegt wie bei einer manuellen Texteingabe über die Tastatur. Wenn ich jetzt Text eingebe über die Tastatur bleibt der Cursor in der 1. Zeile ganz links stehen dann wird der Text dort geschrieben , wird aber gleichzeitig am Textende vom eingelesenen Text über RS232 drangehängt. Danach wird der Text in der ersten Zeile komplett gelöscht und der Cusror steht wieder links ober und wartet auf die nächste Eingabe über die Tastatur.
Aber zwischendurch wird der neue RS232 richtig am Textende drangehängt.

Ich möchte die Textzeile ermitteln und die Position um meine Tastatureingabe dort hinzulegen.

Danke.
Gruss

Re: Beim Editorgadget Zeile und Cursorstellung ermitteln.

Verfasst: 28.05.2014 20:18
von RSBasic
Du meinst also, es wird ständig neue Texte hinzugefügt und du willst verhindern, dass sich die aktuelle von dir gesetzte Cursorposition aufgrund der Hinzufügung ändert.
Mal angenommen die Cursorposition ist derzeit auf 5 und es wird ein Text hinzugefügt. Aufgrund der Hinzufügung befindet sich dein Cursor aber nun am Ende. Du willst den Cursor wieder dorthin haben, wo er war. Meinst du das?

Code: Alles auswählen

EnableExplicit

Define Temp_EGCursorX
Define Temp_EGCursorY

Procedure EditorGadgetCursorX(Gadget.i)
  Protected GadgetID.i = GadgetID(Gadget), Range.CHARRANGE
 
  SendMessage_(GadgetID, #EM_EXGETSEL, 0, @Range)
  ProcedureReturn (Range\cpMax - (SendMessage_(GadgetID, #EM_LINEINDEX, SendMessage_(GadgetID, #EM_EXLINEFROMCHAR, 0, Range\cpMin), 0)) + 1)
EndProcedure

Procedure EditorGadgetCursorY(Gadget.i)
  Protected GadgetID.i = GadgetID(Gadget), Range.CHARRANGE
 
  SendMessage_(GadgetID, #EM_EXGETSEL, 0, @Range)
  ProcedureReturn SendMessage_(GadgetID, #EM_EXLINEFROMCHAR, 0, Range\cpMin) + 1
EndProcedure

Procedure EditorGadgetLocate(Gadget,x,y)
  Protected CharIdx
  Protected LLength
  Protected Range.CHARRANGE
  
  CharIdx = SendMessage_(Gadget, #EM_LINEINDEX, y-1, 0)
  LLength = SendMessage_(Gadget, #EM_LINELENGTH, CharIdx, 0)
  If LLength >= x-1
    CharIdx + x-1
  EndIf
  Range.CHARRANGE
  Range\cpMin = CharIdx
  Range\cpMax = CharIdx
  SendMessage_(Gadget, #EM_EXSETSEL, 0, Range)
EndProcedure 

If OpenWindow(0, 0, 0, 500, 400, "Window", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  EditorGadget(1, 0, 0, WindowWidth(0), WindowHeight(0), 0)
  
  SetGadgetText(1, "abc def ghi jkl mno pqr stu vwx yz")
  
  AddWindowTimer(0, 123, 1000)
  
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_Timer
        Select EventTimer()
          Case 123
            Temp_EGCursorX = EditorGadgetCursorX(1)
            Temp_EGCursorY = EditorGadgetCursorY(1)
            AddGadgetItem(1, -1, "abc def ghi jkl mno pqr stu vwx yz")
            EditorGadgetLocate(GadgetID(1), Temp_EGCursorX, Temp_EGCursorY)
        EndSelect
      Case #PB_Event_CloseWindow
        End
    EndSelect
  ForEver
EndIf

Re: Beim Editorgadget Zeile und Cursorstellung ermitteln.

Verfasst: 28.05.2014 22:22
von funkheld
Jup danke.

Der Cursor bleibt dauernd in der 1. Zeile ganz links.
Er schreibt den Text dort hin den ich über die Tastatur eingebe und der wird dann dahin übertragen wo die letzten
Eingabe von der seriellen Schnittstelle war. Das find ich so komisch. Ich möchte den Cursor dort haben wo der letzte
Buchstabe von der seriellen Schnittstelle ist.

Danke.
Gruss

Code: Alles auswählen

Global text_e.s,text_s.s,files.s, files1.s,result.s
  Global port.l,s_byte.c,r_byte.c
  
  Declare Datei_senden()
  
  Enumeration
    #Window_0
    #b_seriell_an
    #b_seriell_aus
    #b_cls_edit
    #b_datei
    #b_senden
    #str_seriell
    #str_datei
    #Editor_0
  EndEnumeration
  
  InitKeyboard() 
      
  OpenWindow(#Window_0, 400, 150, 550,570, "KIM", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MinimizeGadget|#PB_Window_TitleBar)

  ButtonGadget( #b_seriell_an, 10,10, 80, 25, "Seriell ein")
  ButtonGadget(#b_seriell_aus, 10,40, 80, 25, "Seriell aus")
  ButtonGadget( #b_datei, 10,70, 80, 25, "Datei laden")
  ButtonGadget( #b_senden, 10,100, 80, 25, "Datei senden")
  ButtonGadget( #b_cls_edit, 10,170, 80, 25, "Cls Edit")
  
  StringGadget(#str_seriell, 120, 10, 150, 22, "")
  StringGadget(#str_datei, 120, 70, 150, 22, "")
  EditorGadget(#Editor_0, 120, 170, 400,350,#PB_Editor_WordWrap)

  port=-1
 
  Repeat
    Event = WaitWindowEvent(2)    
    
    ExamineKeyboard()
    result=KeyboardInkey()
    
    If result
      s_byte=Asc(result)
      If s_byte=13   
        s_vyte=10
      EndIf  
      WriteSerialPortData(port, @s_byte, 1)
    EndIf
  
  
  Select Event
    Case #PB_Event_Gadget
      EventGadget = EventGadget()
      EventType = EventType()
      
      If EventGadget = #b_seriell_an 
        If port=-1
          port=OpenSerialPort(#PB_Any, "COM4", 1200, #PB_SerialPort_NoParity, 8, 1, #PB_SerialPort_NoHandshake, 1024,1024)
          If port
            text_s=""
            text_s + "...geöffnet   "+Str(port)
            SetGadgetText(#str_seriell, text_s)
          Else
            text_s=""
            text_s + "...nichts"
            SetGadgetText(#str_seriell, text_s) 
            port=-1
          EndIf
        EndIf  
      EndIf
      
      If EventGadget = #b_seriell_aus 
        If port > 0
          CloseSerialPort(port)
          text_s=""
          text_s + "...geschlossen"
          SetGadgetText(#str_seriell, text_s)
          port=-1
        EndIf
      EndIf
      
      If EventGadget =  #b_cls_edit
        text_e=""
        SetGadgetText(#Editor_0, text_e)
      EndIf
      
       If EventGadget = #b_datei
        Pattern$ = "Alle Dateien (*.*)|*.*"
        Pattern = 0   
        files = SaveFileRequester("Dateiname zum Speichern eingeben", StandardFile$, Pattern$, Pattern)

        If files=""
          Goto weiter2
        EndIf  
        files1=GetFilePart(files)
        SetGadgetText(#str_datei, files1)
        weiter2:
      EndIf
      
      
      If EventGadget =  #b_senden
        Datei_senden()
      EndIf
      
    Case #PB_Event_CloseWindow
      EventWindow = EventWindow()
      If EventWindow = #Window_0
        CloseWindow(#Window_0)
        Break
      EndIf
  EndSelect
  
  If port > 0
    While AvailableSerialPortInput(port)  
      ReadSerialPortData(port, @r_byte, 1)
      text_e + Chr(r_byte)
      SetGadgetText(#Editor_0, text_e)
    Wend 
  EndIf  
  
ForEver

Procedure Datei_senden()
  If Len(files) < 4
    Goto weiter4
  EndIf
  
  If ReadFile(0, files)
    While Eof(0) = 0
      s_byte=ReadByte(0)
      WriteSerialPortData(port, @s_byte, 1)
      Delay(10)
   Wend
   CloseFile(0)  
 EndIf

 weiter4:
 files1=""
 files=""
 SetGadgetText(#str_datei,"...")
EndProcedure

Verfasst: 28.05.2014 22:44
von CodeCommander
Ich kann dein Code zwar weder testen noch verbessern aber von mir nur ein paar Tipps weil ich dein Code Design nicht gut finde...
1. Du benutzt kein EnableExplicit.
2. Du definierst nicht alle Variablen.
3. Du definierst globale Variablen obwol es unnötig ist. Lokale Variablen reichen da aus. Variablen in Prozeduren kannst du auch übergeben.
4. Keine Einheitlichkeit. Mal benutzt du Leerzeichen nach dem Komma, nach dem Gleichzeichen und mal nicht.
5. Benennung deiner Variablen sind auch unterschiedlich. Einheitlichkeit der Groß und Kleinschreibung ist nicht vorhanden. Mal klein und mal groß.
6. Du benutzt Goto und springst quer durch den Code. Wie kannst du da den Überblick behalten?
7. WaitWindowEvent(2) ist auch unnötig. Wie bist du auf die 2 gekommen?
8. Du benutzt ExamineKeyboard() ohne Screen-Window?
9. Deine GUI-Struktur hat auch kein einheitliches System, wenn ich die Größen und Positionen anschaue.
10. Man kann das Fenster vergrößern ohne Gadgetgrößenanpassung?
11. Korrektes Einrücken ist auch nicht vorhanden.
12. Warum ein Dalay beim lesen der Datei? Willst du das lesen absichtlich verlangsamen?

Wie soll hier einer deinen Code testen? Man müsste viel Zeit haben und dein komplettes Programm nachprogrammieren aber wer hat schon die Zeit? Schau mal den Code von rsbasic an. Dieser sollte dir mehr helfen als dein Code uns.

Re: Beim Editorgadget Zeile und Cursorstellung ermitteln.

Verfasst: 28.05.2014 23:09
von Derren
CodeCommander hat geschrieben:8. Du benutzt ExamineKeyboard() ohne Screen-Window?
Was die Frage nach seiner PB Version aufwirft. Denn das geht seit mindestens 4.x nicht mehr.

Code: Alles auswählen

InitKeyboard()
ExamineKeyboard()
[23:07:40] [ERROR] Line: 2
[23:07:40] [ERROR] OpenScreen() Or OpenWindowedScreen() must be called before using any Keyboard commands.
[23:08:08] The Program was killed.

Re: Beim Editorgadget Zeile und Cursorstellung ermitteln.

Verfasst: 29.05.2014 06:14
von Danilo
EM_SETSEL

Code: Alles auswählen

SendMessage_(GadgetID(editor),#EM_SETSEL,Start,Ende)
Selektiert einen Text von 'Start' bis 'Ende'. Sind beide Werte gleich, wird nur der
Cursor verschoben, ohne Selektion.

Der Wert -1 steht für das Ende, also wird mit

Code: Alles auswählen

SendMessage_(GadgetID(editor),#EM_SETSEL,-1,-1)
der Cursor ganz ans Ende verschoben.

Verfasst: 29.05.2014 11:32
von CodeCommander
Derren, ich glaube, er hat mal wieder aus Faulheit Teile aus seinem Spaghetti Code copy and pasted und ist der Meinung wir können seinen Code umzaubern und hellsehen.

Im ernst Danilo? :lol: Er kann doch damit eh nichts anfangen sonst hätte er schon längst die Lösung aus rsbasics Code gehabt. Wie ich sehe verwendet er auch #EM_SETSEL.
Glaub mir er wird gleich wieder fragen und Codeteile, mit denen man nichts anfangen kann, hier posten! :lol:

Re: Beim Editorgadget Zeile und Cursorstellung ermitteln.

Verfasst: 29.05.2014 15:59
von funkheld
Jup, danke.
Jetzt funktioniert es als Listbox.
Ich habe die Version 5.22.

Unten die Abfrage funktioniert klasse.
Gruss
----------------------------
InitKeyboard()
................
................
ExamineKeyboard()
result=KeyboardInkey()
-----------------------------