Beim Editorgadget Zeile und Cursorstellung ermitteln.

Für allgemeine Fragen zur Programmierung mit PureBasic.
funkheld
Beiträge: 651
Registriert: 31.12.2009 11:58

Beim Editorgadget Zeile und Cursorstellung ermitteln.

Beitrag 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
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Beim Editorgadget Zeile und Cursorstellung ermitteln.

Beitrag 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?
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
funkheld
Beiträge: 651
Registriert: 31.12.2009 11:58

Re: Beim Editorgadget Zeile und Cursorstellung ermitteln.

Beitrag 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
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Beim Editorgadget Zeile und Cursorstellung ermitteln.

Beitrag 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
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
funkheld
Beiträge: 651
Registriert: 31.12.2009 11:58

Re: Beim Editorgadget Zeile und Cursorstellung ermitteln.

Beitrag 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
Benutzeravatar
CodeCommander
Beiträge: 213
Registriert: 02.03.2014 16:06

Beitrag 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.
Zuletzt geändert von CodeCommander am 18.01.2015 14:22, insgesamt 1-mal geändert.
~ DELETE ~
Derren
Beiträge: 558
Registriert: 23.07.2011 02:08

Re: Beim Editorgadget Zeile und Cursorstellung ermitteln.

Beitrag 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.
Signatur und so
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: Beim Editorgadget Zeile und Cursorstellung ermitteln.

Beitrag 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.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
CodeCommander
Beiträge: 213
Registriert: 02.03.2014 16:06

Beitrag 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:
Zuletzt geändert von CodeCommander am 18.01.2015 14:22, insgesamt 1-mal geändert.
~ DELETE ~
funkheld
Beiträge: 651
Registriert: 31.12.2009 11:58

Re: Beim Editorgadget Zeile und Cursorstellung ermitteln.

Beitrag 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()
-----------------------------
Antworten