Kein Multiline für Editorgadget - andere (kürzere) Lösung?

Anfängerfragen zum Programmieren mit PureBasic.
CNESM
Beiträge: 311
Registriert: 29.08.2004 15:16
Kontaktdaten:

Kein Multiline für Editorgadget - andere (kürzere) Lösung?

Beitrag von CNESM »

Hi Leute,

in der Vergangenheit habe ich öfters mal ein einzeiliges Editorgadget benötigt, was ich stets in etwa wie folgt umgesetzt habe:

Code: Alles auswählen

  If OpenWindow(0,0,0,322,150,"EditorGadget_NoMultiline",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
    CreateGadgetList(WindowID(0))
    EditorGadget(1,8,8,306,133)
    AddGadgetItem(1,-1, "Teststring")
    
    AddKeyboardShortcut(0,#PB_Shortcut_Control|#PB_Shortcut_C,1)
    AddKeyboardShortcut(0,#PB_Shortcut_Control|#PB_Shortcut_X,2)
    AddKeyboardShortcut(0,#PB_Shortcut_Control|#PB_Shortcut_V,3)
    AddKeyboardShortcut(0,#PB_Shortcut_Return,4)
 
    Repeat
      Select WaitWindowEvent() 
        Case #PB_Event_Menu
          If EventMenu()=1
            SendMessage_(GadgetID(1),#EM_GETSEL,@SelStart,@SelEnd)
            selText$=Space(SelEnd-SelStart) 
            SendMessage_(GadgetID(1),#EM_GETSELTEXT,0,@SelText$)
            SetClipboardText(SelText$)
          ElseIf EventMenu()=2
            SendMessage_(GadgetID(1),#WM_CUT,0,0)
            SelText$=GetClipboardText()
            SetClipboardText(SelText$)
          ElseIf EventMenu()=3
            If FindString(GetClipboardText(),Chr(13)+Chr(10),1)=0
              SetGadgetText(1,GetClipboardText())
            Else
              SetGadgetText(1,Mid(GetClipboardText(),1,FindString(GetClipboardText(), Chr(13)+Chr(10) ,1) -1))
            EndIf
          ElseIf EventMenu()=4
          EndIf
     EndSelect
    Until WaitWindowEvent()=#PB_Event_CloseWindow
  EndIf
Irgdendwie bin ich erst jetzt auf die Idee gekommen, mal nachzufragen, obs dafür nicht ne einfache und vielleicht sogar kürzere Variante (Stichwort: Sendmessage) gibt? Hab vergleichbares noch nicht entdecken können.

Danke euch und noch einen schönen Sonntag Abend bei "Hitch - Der Date Doktor" :D
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

SetWindowLong_(GadgetID(#Editor), #GWL_STYLE, GetWindowLong_(GadgetID(#Editor), #GWL_STYLE) - #ES_MULTILINE)

Probier das mal (Kann es momentan nicht testen, da Linux, sollte aber im idealfall klappen, denn sowohl beim EDIT Control als auch bei einem Rich Edit Control gibt es das Flag #ES_MULTILINE laut MSDN ).
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Beitrag von RSBasic »

Du willst ja kein MultiLine für dein Gadget haben.
Ne kürzere Variante gibt es.
Du kannst ja StringGadget nehmen
Und vergrößerst einfach die Höhe des Gadgets, dann sieht es aus wie ein EditorGadget.

Code: Alles auswählen

If OpenWindow(0,0,0,500,500,"Windows-Vorlage",#PB_Window_SystemMenu|#PB_Window_ScreenCentered) 
  If CreateGadgetList(WindowID(0)) 
    StringGadget(1,10,10,480,480,"",0) 
  EndIf 
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow 
EndIf 
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
CNESM
Beiträge: 311
Registriert: 29.08.2004 15:16
Kontaktdaten:

Beitrag von CNESM »

@DarkDragon

Hat bei mir keine Auswirkung auf den Style des Editors :cry:

@RSBasic

Nen Stringgadget kommt für meine Fälle nicht in Frage .....
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Es muesste "& ~#ES_MULTILINE" heissen.
CNESM
Beiträge: 311
Registriert: 29.08.2004 15:16
Kontaktdaten:

Beitrag von CNESM »

@edel

Hast du das mal getestet?

Code: Alles auswählen

SetWindowLong_(GadgetID(0), #GWL_STYLE, GetWindowLong_(GadgetID(0), #GWL_STYLE) & ~#ES_MULTILINE)
Hat bei mir ebenfalls keine Auswirkung :|
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag von Fluid Byte »

Die Multiline-Eigenschaft lässt sich nicht deaktivieren. Du musst ein über API erstelltes EditorGadget benutzen.

Code: Alles auswählen

OpenLibrary(0,"RICHED20")

OpenWindow(0,0,0,320,240,"void",#PB_Window_SystemMenu | #PB_Window_ScreenCentered)

dwStyle = #WS_CHILD | #WS_VISIBLE | #ES_AUTOHSCROLL | #WS_HSCROLL
hwndRichEdit = CreateWindowEx_(#WS_EX_CLIENTEDGE,"RICHEDIT20A",0,dwStyle,0,0,320,240,WindowID(0),0,0,0)
SendMessage_(hwndRichEdit,#WM_SETFONT,GetStockObject_(#DEFAULT_GUI_FONT),1)

While WaitWindowEvent() ! #PB_Event_CloseWindow : Wend
Windows 10 Pro, 64-Bit / Outtakes | Derek
CNESM
Beiträge: 311
Registriert: 29.08.2004 15:16
Kontaktdaten:

Beitrag von CNESM »

Danke für die Info, Fluid Byte!

Das sind ehrlich gesagt wieder so Dinge, die ich nicht nachvollziehen kann. Ein Stringgadget kann ich Einzeilig oder Multiline machen, aber nen Editorgadget geht nur Multiline :freak:
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag von Fluid Byte »

CNESM hat geschrieben:Das sind ehrlich gesagt wieder so Dinge, die ich nicht nachvollziehen kann. Ein Stringgadget kann ich Einzeilig oder Multiline machen, aber nen Editorgadget geht nur Multiline :freak:
Das ist so nicht ganz richtig. Das liegt einzig an PureBasic und wie es das Gadget erstellt. Ein per API erstelltes RichEdit Gadget verfügt über keine Multiline-Eigenschaft sofern nicht explizit per Window-Style angegeben.

Für RichEdit und Standard Edit Controls gilt:

Das Hinzufügen und Entfernen der Multiline-Eigenschaft nach der erstmaligen Erstellung erfordert das Löschen und die Neu-Erstellung des Gadgets mit bzw. ohne #ES_MULTILINE Stil.
Zuletzt geändert von Fluid Byte am 06.11.2007 14:48, insgesamt 2-mal geändert.
Windows 10 Pro, 64-Bit / Outtakes | Derek
CNESM
Beiträge: 311
Registriert: 29.08.2004 15:16
Kontaktdaten:

Beitrag von CNESM »

Dann soll Fred das gefälligst ändern :mrgreen: *EinOptinalesMultilineHabenWill*

Code: Alles auswählen

SetGadgetAttribute(0,#PB_Editor_Multiline,1) ;(0 bedeutet Einzeilig, 1 bedeutet Multiline)
Klar habe ich die Möglichkeit, mir ein eigenes zu bauen, aber ist das der Sinn der Sache? Dann brauchen wir überhaupt keine Libraries für Gadgets ..... :(
Antworten