Button mit mehreren klick Funktionen IF ELSE ?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
udg
Beiträge: 566
Registriert: 20.06.2013 23:27

Button mit mehreren klick Funktionen IF ELSE ?

Beitrag von udg »

ich habe einen "kopieren/ einfügen" button der mehrmals auf Events ansprechen soll.

Wenn ich mit der Maus in das entsprechende Panel Feld klicke, markiert es automatisch den kompletten Textinhalt.
Der Button prüft nun ob der Text von start bis end markiert ist und wenn ja, kopiert er den Text in die Zwischenablage.
Anschließend wird der Text sofort automatisch wieder deselekted.

Der button macht was er soll aber nur von hinten nach vorn, sprich von Panel 6 zu Panel 1. Anders rum, keine weitere Reaktion.
Der Code im Event wird nur von hinten nach vorn abgearbeitet. Ich möchte jedoch, dass es egal ist wo ich hinklicke.

Meine Schleife stimmt nicht Bild

Code: Alles auswählen

      ;- Kopiere markierten Panel-Text in Zwischenablage 
         Case #btn_Copy_Paste
            EventGadget = EventGadget()
            EventType = EventType()
           ; wenn Text kopiert, entferne die automatische Markierung aus dem Panel 
            If EventGadget = #btn_Copy_Paste
              If SendMessage_(GadgetID(#Panel_1), #EM_GETSEL, @startPos, @stopPos)
                 SetClipboardText(Mid(GetGadgetText(#Panel_1), startPos+0, stopPos+stopPos))
                 SendMessage_(GadgetID(#Panel_1), #EM_HIDESELECTION, Len(GetGadgetText(EventGadget())),0) 
                  Else       
                  If SendMessage_(GadgetID(#Panel_2), #EM_GETSEL, @startPos, @stopPos)
                     SetClipboardText(Mid(GetGadgetText(#Panel_2), startPos+0, stopPos+stopPos))
                     SendMessage_(GadgetID(#Panel_2), #EM_HIDESELECTION, Len(GetGadgetText(EventGadget())),0) 
                      Else
                      If SendMessage_(GadgetID(#Panel_3), #EM_GETSEL, @startPos, @stopPos)
                         SetClipboardText(Mid(GetGadgetText(#Panel_3), startPos+0, stopPos+stopPos))
                         SendMessage_(GadgetID(#Panel_3), #EM_HIDESELECTION, Len(GetGadgetText(EventGadget())),0)      
                          Else
                          If SendMessage_(GadgetID(#Panel_4), #EM_GETSEL, @startPos, @stopPos)
                             SetClipboardText(Mid(GetGadgetText(#Panel_4), startPos+0, stopPos+stopPos))
                             SendMessage_(GadgetID(#Panel_4), #EM_HIDESELECTION, Len(GetGadgetText(EventGadget())),0)      
                             Else
                             If SendMessage_(GadgetID(#Panel_5), #EM_GETSEL, @startPos, @stopPos)
                                SetClipboardText(Mid(GetGadgetText(#Panel_5), startPos+0, stopPos+stopPos))
                                SendMessage_(GadgetID(#Panel_5), #EM_HIDESELECTION, Len(GetGadgetText(EventGadget())),0)      
                                Else
                                If SendMessage_(GadgetID(#Panel_6), #EM_GETSEL, @startPos, @stopPos)
                                   SetClipboardText(Mid(GetGadgetText(#Panel_6), startPos+0, stopPos+stopPos))
                                   SendMessage_(GadgetID(#Panel_6), #EM_HIDESELECTION, Len(GetGadgetText(EventGadget())),0)      
                                EndIf
                             EndIf
                          EndIf
                      EndIf
                  EndIf  
              EndIf 
            EndIf

; [u]UND SO ARBEITET ES GENAU ANDERSRUM jedoch auch nur in eine Richtung[/u]

      ;- Kopiere markierten Panel-Text in Zwischenablage 
         Case #btn_Copy_Paste
            EventGadget = EventGadget()
            EventType = EventType()
           ; wenn kopiert, entferne die automatische Markierung aus dem Panel 
            If EventGadget = #btn_Copy_Paste
              If SendMessage_(GadgetID(#Panel_1), #EM_GETSEL, @startPos, @stopPos)
                 SetClipboardText(Mid(GetGadgetText(#Panel_1), startPos+0, stopPos+stopPos))
                 SendMessage_(GadgetID(#Panel_1), #EM_HIDESELECTION, Len(GetGadgetText(EventGadget())),0) 
              EndIf;    Else       
                  If SendMessage_(GadgetID(#Panel_2), #EM_GETSEL, @startPos, @stopPos)
                     SetClipboardText(Mid(GetGadgetText(#Panel_2), startPos+0, stopPos+stopPos))
                     SendMessage_(GadgetID(#Panel_2), #EM_HIDESELECTION, Len(GetGadgetText(EventGadget())),0) 
                  EndIf;    Else
                      If SendMessage_(GadgetID(#Panel_3), #EM_GETSEL, @startPos, @stopPos)
                         SetClipboardText(Mid(GetGadgetText(#Panel_3), startPos+0, stopPos+stopPos))
                         SendMessage_(GadgetID(#Panel_3), #EM_HIDESELECTION, Len(GetGadgetText(EventGadget())),0)      
                      EndIf;    Else
                          If SendMessage_(GadgetID(#Panel_4), #EM_GETSEL, @startPos, @stopPos)
                             SetClipboardText(Mid(GetGadgetText(#Panel_4), startPos+0, stopPos+stopPos))
                             SendMessage_(GadgetID(#Panel_4), #EM_HIDESELECTION, Len(GetGadgetText(EventGadget())),0)      
                          EndIf;   Else
                             If SendMessage_(GadgetID(#Panel_5), #EM_GETSEL, @startPos, @stopPos)
                                SetClipboardText(Mid(GetGadgetText(#Panel_5), startPos+0, stopPos+stopPos))
                                SendMessage_(GadgetID(#Panel_5), #EM_HIDESELECTION, Len(GetGadgetText(EventGadget())),0)      
                             EndIf;   Else
                                If SendMessage_(GadgetID(#Panel_6), #EM_GETSEL, @startPos, @stopPos)
                                   SetClipboardText(Mid(GetGadgetText(#Panel_6), startPos+0, stopPos+stopPos))
                                   SendMessage_(GadgetID(#Panel_6), #EM_HIDESELECTION, Len(GetGadgetText(EventGadget())),0)      
                                EndIf

            EndIf


VG
PB v5.43 LTS + v6.02 LTS | Windows 7 x86 + 11 x64 - Gforce RTX 4090 - AMD Ryzen 9 5900X 12-Core Processor 4.2 GHz - 64,0 GB RAM,
ASUSTEK TUF Gaming X570 Plus
ASUS ROG Thor-1200P Platinum (1200W, Aura Sync, OLED Display, 0dB-Cooling)
1x 1 TByte Samsung MZ-V7S500BW 970 EVO Plus 1 TB NVMe M.2 Internal SSD
1x 2 TByte Samsung MZ-V7S2T0BW 970 EVO Plus 2 TB NVMe M.2 Internal SSD
von BiSONTE!. Kauft Hardware gern bei ihm.
Monitor:
LG 38GL950G-B 95 (38 Zoll) Ultragear Curved 21: 9 UltraWide QHD IPS
Andesdaf
Moderator
Beiträge: 2673
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Re: Button mit mehreren klick Funktionen IF ELSE ?

Beitrag von Andesdaf »

nimm statt EM_HIDESELECTION mal EM_SETSEL mit zweimal 0 als Parameter.
Win11 x64 | PB 6.20
Benutzeravatar
udg
Beiträge: 566
Registriert: 20.06.2013 23:27

Re: Button mit mehreren klick Funktionen IF ELSE ?

Beitrag von udg »

pf. krass, Danke, und schon funktioniert es.

statt:
SendMessage_(GadgetID(#Panel_1), #EM_HIDESELECTION, Len(GetGadgetText(EventGadget())),0)
habe ich es nun geändert in:
SendMessage_(GadgetID(#Panel_1), #EM_SETSEL, 0,0)

und auf einmal funktioniert der Button kreuz und quer.

Ich hatte uA. probiert:
SendMessage_(GadgetID(#Panel_1), #EM_SETSEL, Len(GetGadgetText(EventGadget())),0)

hier war aber das Problem, dass es die Markierung des Textest zwar aufhob aber nicht komplett (das erste Wort blieb markiert), somit konnte ich anderen selektierten Text mit dem selben Button nicht ansprechen.

ok. nun geht es aber was habe ich damit verändert?
Es müsste logischerweise? mit: Len(GetGadgetText(EventGadget())),0) zu tun haben?
Das ist jetzt raus aus dem Code und der Button macht was er soll.

hier nochmal der Button-Code der jetzt arbeitet :allright: :

Code: Alles auswählen

         Case #btn_Copy_Paste
              If SendMessage_(GadgetID(#Panel_1), #EM_GETSEL, @startPos, @stopPos)
                 SetClipboardText(Mid(GetGadgetText(#Panel_1), startPos+0, stopPos+stopPos))
                 SendMessage_(GadgetID(#Panel_1), #EM_SETSEL, 0,0);Len(GetGadgetText(EventGadget())),0)
               EndIf               
                    If SendMessage_(GadgetID(#Panel_2), #EM_GETSEL, @startPos, @stopPos)
                       SetClipboardText(Mid(GetGadgetText(#Panel_2), startPos+0, stopPos+stopPos))
                       SendMessage_(GadgetID(#Panel_2), #EM_SETSEL, 0,0);Len(GetGadgetText(EventGadget())),0)
                    EndIf
                         If SendMessage_(GadgetID(#Panel_3), #EM_GETSEL, @startPos, @stopPos)
                            SetClipboardText(Mid(GetGadgetText(#Panel_3), startPos+0, stopPos+stopPos))
                            SendMessage_(GadgetID(#Panel_3), #EM_SETSEL, 0,0);Len(GetGadgetText(EventGadget())),0) 
                         EndIf
                              If SendMessage_(GadgetID(#Panel_4), #EM_GETSEL, @startPos, @stopPos)
                                 SetClipboardText(Mid(GetGadgetText(#Panel_4), startPos+0, stopPos+stopPos))
                                 SendMessage_(GadgetID(#Panel_4), #EM_SETSEL, 0,0);Len(GetGadgetText(EventGadget())),0)
                              EndIf
                                   If SendMessage_(GadgetID(#Panel_5), #EM_GETSEL, @startPos, @stopPos)
                                      SetClipboardText(Mid(GetGadgetText(#Panel_5), startPos+0, stopPos+stopPos))
                                      SendMessage_(GadgetID(#Panel_5), #EM_SETSEL, 0,0);Len(GetGadgetText(EventGadget())),0)
                                   EndIf
                                        If SendMessage_(GadgetID(#Panel_6), #EM_GETSEL, @startPos, @stopPos)
                                           SetClipboardText(Mid(GetGadgetText(#Panel_6), startPos+0, stopPos+stopPos))
                                           SendMessage_(GadgetID(#Panel_6), #EM_SETSEL, 0,0);Len(GetGadgetText(EventGadget())),0)
                                        EndIf
PB v5.43 LTS + v6.02 LTS | Windows 7 x86 + 11 x64 - Gforce RTX 4090 - AMD Ryzen 9 5900X 12-Core Processor 4.2 GHz - 64,0 GB RAM,
ASUSTEK TUF Gaming X570 Plus
ASUS ROG Thor-1200P Platinum (1200W, Aura Sync, OLED Display, 0dB-Cooling)
1x 1 TByte Samsung MZ-V7S500BW 970 EVO Plus 1 TB NVMe M.2 Internal SSD
1x 2 TByte Samsung MZ-V7S2T0BW 970 EVO Plus 2 TB NVMe M.2 Internal SSD
von BiSONTE!. Kauft Hardware gern bei ihm.
Monitor:
LG 38GL950G-B 95 (38 Zoll) Ultragear Curved 21: 9 UltraWide QHD IPS
Andesdaf
Moderator
Beiträge: 2673
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Re: Button mit mehreren klick Funktionen IF ELSE ?

Beitrag von Andesdaf »

EM_HIDESELECTION entfernt die Auswahl nicht, sondern versteckt sie nur. EM_GETSEL liefert deshalb weiterhin einen Wert ungleich null zurück. Das bringt im ersten Codeteil die verschachtelten Abfragen durcheinander. Im zweiten Teil ohne Verschachtelung werden dann aber alle Blöcke durchlaufen, für die eine Auswahl gefunden wird und und damit funktioniert wieder nur die eine Richtung.
Win11 x64 | PB 6.20
Benutzeravatar
udg
Beiträge: 566
Registriert: 20.06.2013 23:27

Re: Button mit mehreren klick Funktionen IF ELSE ?

Beitrag von udg »

Vielen Dank für die Erklärung.

Genau das war mein Problem, welches ich nicht lokalisieren konnte.
Wieder etwas gelernt.

Grüße
PB v5.43 LTS + v6.02 LTS | Windows 7 x86 + 11 x64 - Gforce RTX 4090 - AMD Ryzen 9 5900X 12-Core Processor 4.2 GHz - 64,0 GB RAM,
ASUSTEK TUF Gaming X570 Plus
ASUS ROG Thor-1200P Platinum (1200W, Aura Sync, OLED Display, 0dB-Cooling)
1x 1 TByte Samsung MZ-V7S500BW 970 EVO Plus 1 TB NVMe M.2 Internal SSD
1x 2 TByte Samsung MZ-V7S2T0BW 970 EVO Plus 2 TB NVMe M.2 Internal SSD
von BiSONTE!. Kauft Hardware gern bei ihm.
Monitor:
LG 38GL950G-B 95 (38 Zoll) Ultragear Curved 21: 9 UltraWide QHD IPS
Antworten