CvField - Modul für Text- und Bildfelder im CanvasGadget

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Andesdaf
Moderator
Beiträge: 2659
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Re: CvField - Modul für Text- und Bildfelder im CanvasGadget

Beitrag von Andesdaf »

Hallo,

@ts: Habe ich eingebaut, ich arbeite aber gerade an einem neuen Beispielcode, der mehr Einstellmöglichkeiten hat
(und englisch ist), damit ich das Modul auch drüben vorstellen kann. Kommt also irgendwann mit dem nächsten Update.

@jamirokwai: man könnte jedem Feld noch einen Wert hinterlegen, der dann mit FieldData() oder so abgerufen und ausgewertet werden könnte.
Oder man schickt ein Event in die Ereignisschleife und diesen Wert dann mit, allerdings hab ich mich mit PostEvent noch nie richtig beschäftigt.

Gruß,
Andesdaf
Win11 x64 | PB 6.00 (x64)
jamirokwai
Beiträge: 65
Registriert: 02.06.2008 16:10

Re: CvField - Modul für Text- und Bildfelder im CanvasGadget

Beitrag von jamirokwai »

Hi,

ich habe mal ein ScrollAreaGadget eingebaut, das mit ScrollBarGadgets steuerbar ist. Einfach das Beispiel austauschen. Ist so halb komfortabel.
Leider habe ich es auf die Schnelle nicht hinbekommen, die MouseWheel-Events des Canvasgadgets in 2D-Verschiebungen des ScrollAreaGadgets umzuwandeln. Mein MacBook gibt mir per Trackpad die Möglichkeit horizontal und vertikal zu scrollen. Vielleicht hat ja jemand die rettende Idee ohne API ;-)

Edit: Kommando zurück, BindEvent ist fantastisch... Habe es im Beispiel schon geändert.

Grüßle
J.

Code: Alles auswählen

CompilerIf #PB_Compiler_IsMainFile

  UseModule CvField
  
  Define iMode.i, iSelected.i
  Define NewList Levels.s()
  
  Enumeration
    #Window_0
  EndEnumeration
  
  Enumeration
    #Canvas_0
    #Container_0
    #Frame_0
    #Text_0
    #Text_1
    #Button_0
    #Option_0
    #Option_2
    #Option_1
    #Container_1
    #Container_2
    #Frame_1
    #Frame_2
    #Text_2
    #Text_3
    #Text_4
    #Button_1
    #String_0
    #String_1
    #String_2
    #Checkbox_0
    #Checkbox_1
    #Button_2
    #Button_3
    #Button_4
    #Button_5
    #Button_6
    #Button_7
    #Button_8
    #Combobox_1
    #ScrollArea
    #Vert_Scroll
    #Hori_Scroll
  EndEnumeration
  
  Procedure MyScroll()
    Select EventGadget()
        Case #Vert_Scroll : SetGadgetAttribute(#ScrollArea,#PB_ScrollArea_Y,GetGadgetState(#Vert_Scroll))
        Case #Hori_Scroll : SetGadgetAttribute(#ScrollArea,#PB_ScrollArea_X,GetGadgetState(#Hori_Scroll))
    EndSelect
  EndProcedure

  OpenWindow(#Window_0, x, y, 940, 620, "CanvasField-Beispiel", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

  ScrollAreaGadget(#ScrollArea,10,10,600,580,1500,1500)
  CanvasGadget(#Canvas_0, 0, 0, 1500, 1500, #PB_Canvas_ClipMouse)
  CloseGadgetList()
  ScrollBarGadget(#Vert_Scroll,610, 10, 20,580,0,1500,580,#PB_ScrollBar_Vertical)
  ScrollBarGadget(#Hori_Scroll, 10,595,610, 20,0,1500,610)
  
  BindGadgetEvent(#Vert_Scroll, @MyScroll())
  BindGadgetEvent(#Hori_Scroll, @MyScroll())

  ContainerGadget(#Container_0, 640, 10, 290, 260, #PB_Container_BorderLess)
  HideGadget(#Container_0, 1)
  FrameGadget(#Frame_0, 10, 10, 270, 240, "Text")
  TextGadget(#Text_0, 20, 30, 140, 20, "Angezeigter Text:")
  StringGadget(#String_1, 160, 30, 110, 20, "")
  TextGadget(#Text_1, 20, 60, 140, 20, "Schriftstil:")
  ButtonGadget(#Button_0, 160, 60, 110, 20, "ändern...")
  OptionGadget(#Option_0, 20, 90, 90, 20, "linksbündig")
  OptionGadget(#Option_2, 210, 90, 60, 20, "zentriert")
  OptionGadget(#Option_1, 110, 90, 90, 20, "rechtsbündig")
  CheckBoxGadget(#Checkbox_1, 20, 120, 140, 20, "Zeilenumbruch")
  CloseGadgetList()
  ContainerGadget(#Container_1, 640, 10, 290, 260)
  HideGadget(#Container_1, 1)
  FrameGadget(#Frame_1, 10, 10, 270, 240, "Bild")
  TextGadget(#Text_2, 20, 30, 130, 20, "Pfad:")
  ButtonGadget(#Button_1, 160, 60, 110, 20, "ändern...")
  StringGadget(#String_0, 160, 30, 110, 20, "")
  CheckBoxGadget(#Checkbox_0, 20, 90, 250, 20, "Seitenverhältnis beibehalten")
  CloseGadgetList()
  ContainerGadget(#Container_2, 640, 280, 290, 200)
  FrameGadget(#Frame_2, 10, 10, 270, 180, "Ebene")
  TextGadget(#Text_3, 20, 30, 130, 20, "Hintergrundbild:")
  ButtonGadget(#Button_5, 160, 60, 110, 20, "ändern...")
  StringGadget(#String_2, 160, 30, 110, 20, "")
  TextGadget(#Text_4, 20, 90, 130, 20, "Hintergrundfarbe:")
  ButtonGadget(#Button_6, 160, 90, 110, 20, "ändern...")
  CloseGadgetList()
  ButtonGadget(#Button_7, 640, 490, 140, 30, "Speichern")
  ButtonGadget(#Button_8, 790, 490, 140, 30, "Laden")
  ComboBoxGadget(#Combobox_1, 640, 530, 140, 30)
    AddGadgetItem(#Combobox_1, -1, "Main")
    SetGadgetState(#Combobox_1, 0)
  ButtonGadget(#Button_4, 790, 530, 140, 30, "Neue Ebene")
  ButtonGadget(#Button_2, 640, 570, 140, 30, "Neuer Text")
  ButtonGadget(#Button_3, 790, 570, 140, 30, "Neues Bild")
  
  AddLevel("Main", #Canvas_0)
  LevelColor(#COLOR_BACK, $FFFFFF)
  
  AddField(#TYPE_TEXT, 40, 30, #PB_Ignore, #PB_Ignore)
  FieldText("InitText")
  Redraw()
  
  CreatePopupMenu(0)
    MenuItem(0, "Löschen")
    MenuBar()
    MenuItem(1, "eine Ebene nach oben")
    MenuItem(2, "eine Ebene nach unten")
    MenuItem(3, "ganz nach oben")
    MenuItem(4, "ganz nach unten")
    MenuBar()
    MenuItem(5, "horizontal ausrichten")
    MenuItem(6, "vertikal ausreichten")
    MenuItem(7, "linke Kante ausrichten")
    MenuItem(8, "rechte Kante ausrichten")
    MenuItem(9, "obere Kante ausrichten")
    MenuItem(10,"untere Kante ausrichten")
  
  
  Repeat
    Define Event = WaitWindowEvent()
    
    Select Event
      Case #PB_Event_Gadget
        Select EventGadget()
          Case #Canvas_0
            Select EventType()
              Case #PB_EventType_LeftButtonDown
                Select GetMousePosition()
                  Case #POS_BORDER
                    MoveField(#MODE_BEGIN)
                    iMode = #POS_BORDER
                  Case #POS_HBOTTOM
                    ResizeField(#POS_HBOTTOM, #MODE_BEGIN)
                    iMode = #POS_HBOTTOM
                  Case #POS_HMIDDLE
                    ResizeField(#POS_HMIDDLE, #MODE_BEGIN)
                    iMode = #POS_HMIDDLE
                  Case #POS_HRIGHT
                    ResizeField(#POS_HRIGHT, #MODE_BEGIN)
                    iMode = #POS_HRIGHT
                EndSelect
                
              Case #PB_EventType_LeftButtonUp
                If iMode = #POS_BORDER
                  MoveField(#MODE_END)
                  iMode = 0
                ElseIf iMode = #POS_HBOTTOM
                  ResizeField(#POS_HBOTTOM, #MODE_END)
                  iMode = 0
                ElseIf iMode = #POS_HMIDDLE
                  ResizeField(#POS_HMIDDLE, #MODE_END)
                  iMode = 0
                ElseIf iMode = #POS_HRIGHT
                  ResizeField(#POS_HRIGHT, #MODE_END)
                  iMode = 0
                EndIf
                
                HideGadget(#Container_0, 1)
                HideGadget(#Container_1, 1)
                SetGadgetText(#String_1, "")
                SetGadgetText(#String_0, "")
                
                If GetMousePosition() = #POS_CENTER
                  If SelectField(-1)
                    SelectField(0)
                  Else
                    SelectField(1)
                  EndIf
                  If SelectedFieldCount() = 1
                    SetSelectedField()
                    Select FieldType()
                      Case #TYPE_TEXT
                        HideGadget(#Container_0, 0)
                        SetGadgetText(#String_1, FieldText())
                        SetGadgetState(#Checkbox_1, FieldTextWordwrap())
                      Case #TYPE_IMAGE
                        HideGadget(#Container_1, 0)
                        SetGadgetText(#String_0, FieldImage())
                        SetGadgetState(#Checkbox_0, FieldImageConstant())
                    EndSelect
                  EndIf
                ElseIf GetMousePosition() = #POS_NONE
                  SelectField(2)
                EndIf
                
              Case #PB_EventType_MouseMove
                If iMode = #POS_BORDER
                  MoveField(#MODE_DRAW)
                ElseIf iMode = #POS_HBOTTOM
                  ResizeField(#POS_HBOTTOM, #MODE_DRAW)
                ElseIf iMode = #POS_HMIDDLE
                  ResizeField(#POS_HMIDDLE, #MODE_DRAW)
                ElseIf iMode = #POS_HRIGHT
                  ResizeField(#POS_HRIGHT, #MODE_DRAW)
                EndIf

              Case #PB_EventType_RightClick
                If GetMousePosition() = #POS_CENTER
                  If SelectField(-1)
                    DisplayPopupMenu(0, WindowID(#Window_0))
                  EndIf
                EndIf
                
            EndSelect
            
          Case #String_1
            FieldText(GetGadgetText(#String_1))
            Redraw()
          
          Case #Button_0
            FontRequester(FieldFontName(), FieldFontSize(), #PB_FontRequester_Effects, FieldFontColor(), FieldFontStyle())
            FieldFontColor(SelectedFontColor())
            FieldFontName(SelectedFontName())
            FieldFontSize(SelectedFontSize())
            FieldFontStyle(SelectedFontStyle())
            Redraw()
          
          Case #Button_1
            FieldImage(OpenFileRequester("Bild wählen", GetHomeDirectory(), "*.*", 0))
            Redraw()
            
          Case #Button_2
            AddField(#TYPE_TEXT, 0, 0, #PB_Ignore, #PB_Ignore)
            SelectField(2)
            SelectField()
            FieldText("Neuer Text")
            Redraw()
            
          Case #Button_3
            AddField(#TYPE_IMAGE, 0, 0, #PB_Ignore, #PB_Ignore)
            SelectField(2)
            SelectField()
            FieldImage(#PB_Compiler_Home + "Examples/Sources/Data/PureBasicLogo.bmp")
            Redraw()
            
          Case #Button_4
            AddLevel(InputRequester("Neue Ebene", "Namen eingeben:", ""), #Canvas_0)
            LevelColor(#COLOR_BACK, $FFFFFF)
            GetLevels(Levels())
            ClearGadgetItems(#Combobox_1)
            ForEach Levels()
              AddGadgetItem(#Combobox_1, -1, Levels())
            Next
            SetGadgetState(#Combobox_1, 0)
            
          Case #Button_5
            LevelBackImage(OpenFileRequester("Bild wählen", GetHomeDirectory(), "*.*", 0))
            Redraw()
           
          Case #Button_6
            LevelColor(#COLOR_BACK, ColorRequester(LevelColor(#COLOR_BACK)))
            Redraw()
            
          Case #Button_7
            SaveLevelset(SaveFileRequester("als XML speichern", GetHomeDirectory(), "xml|*.xml", 0))
         
          Case #Button_8
            LoadLevelset(OpenFileRequester("aus XML laden", GetHomeDirectory(), "xml|*.xml", 0))
            GetLevels(Levels())
            ClearGadgetItems(#Combobox_1)
            ForEach Levels()
              AddGadgetItem(#Combobox_1, -1, Levels())
            Next
            SetGadgetState(#Combobox_1, 0)
            Redraw()
         
          Case #Option_0
            FieldTextAlign(#TEXT_LEFT)
            Redraw()
            
          Case #Option_1
            FieldTextAlign(#TEXT_RIGHT)
            Redraw()
            
          Case #Option_2
            FieldTextAlign(#TEXT_CENTER)
            Redraw()
            
          Case #Checkbox_0
            FieldImageConstant(GetGadgetState(#Checkbox_0))
            Redraw()
            
          Case #Checkbox_1
            FieldTextWordwrap(GetGadgetState(#Checkbox_1))
            Redraw()
            
          Case #Combobox_1
            SetCurrentLevel(GetGadgetText(#Combobox_1))
            SetGadgetText(#String_2, LevelBackImage())
            Redraw()
            
        EndSelect
        
      Case #PB_Event_Menu
        Select EventMenu()
           
           Case 0
             DeleteField()
             HideGadget(#Container_0, 1)
             HideGadget(#Container_1, 1)
             Redraw()
           Case 1 : SetFieldStack(#STACK_UP)     : Redraw()
           Case 2 : SetFieldStack(#STACK_DOWN)   : Redraw()
           Case 3 : SetFieldStack(#STACK_TOP)    : Redraw()
           Case 4 : SetFieldStack(#STACK_BOTTOM) : Redraw()
           Case 5 : ArrangeField(#ARRANGE_HORIZONTAL)
           Case 6 : ArrangeField(#ARRANGE_VERTICAL)
           Case 7 : ArrangeField(#ARRANGE_LEFT) 
           Case 8 : ArrangeField(#ARRANGE_RIGHT)
           Case 9 : ArrangeField(#ARRANGE_UPPER)
           Case 10: ArrangeField(#ARRANGE_LOWER)
           
        EndSelect
        
    EndSelect
    
  Until Event = #PB_Event_CloseWindow
  
UnuseModule CvField
CompilerEndIf
Andesdaf
Moderator
Beiträge: 2659
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Re: CvField - Modul für Text- und Bildfelder im CanvasGadget

Beitrag von Andesdaf »

Hallo jamirokwai, danke für dein Beispiel. Ich arbeite jetzt wieder an der Sache,
sodass bald Updates folgen werden.
Win11 x64 | PB 6.00 (x64)
Andesdaf
Moderator
Beiträge: 2659
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Re: CvField - Modul für Text- und Bildfelder im CanvasGadget

Beitrag von Andesdaf »

So, eine neue Version ist im ersten Post verfügbar.

Code: Alles auswählen

v1.03
- Hinzugefügt: Neues Beispiel, das Zugriff auf alle Einstellungsmöglichkeiten bietet

- Geändert: DeleteField unterstützt auch das gleichzeitige Löschen mehrerer Felder
- Geändert: DeleteLevel, DeleteField und AddField prüfen vorher, ob ein Level vorhanden ist
Win11 x64 | PB 6.00 (x64)
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: CvField - Modul für Text- und Bildfelder im CanvasGadget

Beitrag von ts-soft »

Sehr schön, aber leider nicht mehr kompatible zu PB5.30!
Der Befehl "CreateXMLNode()" scheint geändert worden zu sein. Jedenfalls fehlt ein optionaler Parameter.

Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Andesdaf
Moderator
Beiträge: 2659
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Re: CvField - Modul für Text- und Bildfelder im CanvasGadget

Beitrag von Andesdaf »

Danke für den Hinweis. Ich habe den Code entsprechend korrigiert.
Win11 x64 | PB 6.00 (x64)
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: CvField - Modul für Text- und Bildfelder im CanvasGadget

Beitrag von ts-soft »

Naja, jetzt läufts nur noch unter 5.30 :D

Du solltest es schon so anpassen, das es unter beiden Versionen läuft, also mit CompilerIf:

Code: Alles auswählen

CompilerIf #PB_Compiler_Version < 530
; code für LTS Version
CompilerElse
; code für aktuelle Version
CompilerEndif
Also die LTS Version nicht mehr zu unterstützten halte ich für eine denkbar schlechte Idee.
(hoffentlich kommen da nicht noch mehr solche Änderungen)

Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Andesdaf
Moderator
Beiträge: 2659
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Re: CvField - Modul für Text- und Bildfelder im CanvasGadget

Beitrag von Andesdaf »

es gibt noch Probleme, wenn man versucht, zwei Canvas-Gadgets mit CvField zu benutzen
oder sich die Gadgetnummer des Canvas zwischendurch ändert und man auf gespeicherte
Levelsets zurückgreift. Mit dieser Funktion sollte das Problem erst einmal behoben werden,
ich überlege mir dann noch ein besseres Konzept.

Aktualisiert im ersten Post.

Code: Alles auswählen

v1.05

- Hinzugefügt: LevelGadet(), für Setzen oder Rückgabe des Canvas-Gadgets, auf dem sich das Level befindet

- Geändert: SetCurrentLevel() umbenannt zu CurrentLevel(), ist jetzt bezogen auf das jeweilige Canvas-Gadget, unterstützt die Rückgabe des gerade aktiven Levels
- Geändert: die Ausgabe von GetLevels() lässt sich nach Canvas-Gadget einschränken
- Geändert: LevelBackImage() mit Leerstring als Parameter entfernt das aktuelle Hintergrundbild
- Geändert: Redraw() wird verlassen, wenn kein gültiger Ausgabekanal vorhanden ist
Win11 x64 | PB 6.00 (x64)
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Re: CvField - Modul für Text- und Bildfelder im CanvasGadget

Beitrag von GPI »

Ein kleiner Bug ist in code: Wenn man ein Hintergrund hinzufügen will und bei der Dateiauswahl abbrechen klickt, dann schmiert das Programm hier ab:

Code: Alles auswählen

        If iFoundCount <= 1
          FreeImage(l()\iBackImageID)
        EndIf
kann man recht einfach durch

Code: Alles auswählen

        If iFoundCount <= 1 And l()\iBackImageID
          FreeImage(l()\iBackImageID)
        EndIf
korrigieren.

Wird in CodeArchiv unter Gadgets/CanvasGadget/CvField_Place_Text_and_pictures_inside_gadget.pbi auftauchen.
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Andesdaf
Moderator
Beiträge: 2659
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Re: CvField - Modul für Text- und Bildfelder im CanvasGadget

Beitrag von Andesdaf »

danke für den Bugreport, ich spiele aber schon eine zeitlang mit dem Gedanken
einer Version 2 (mit VectorDrawing-Library), sodass hier erst mal weiter keine großen
Änderungen zu erwarten sind.
Win11 x64 | PB 6.00 (x64)
Antworten