IncludeBinary mit ToolBar

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
ProgOldie
Beiträge: 236
Registriert: 19.05.2012 17:09
Computerausstattung: Windows11, Arduinos, Pi3, PureBasic 6.02

IncludeBinary mit ToolBar

Beitrag von ProgOldie »

Hallo,
das folgende Testprogramm funktioniert.

Code: Alles auswählen

EnableExplicit

Enumeration
  #ToolBar
  #newRow
  #delRow
  #editRow
EndEnumeration

DataSection
  Icon_new:
  IncludeBinary("newRow.bmp")
  Icon_del:
  IncludeBinary("deleteRow.bmp")
  Icon_edit:
  IncludeBinary("Edit.bmp")
EndDataSection

Define Ev.i

Procedure.i TestWin()
  Protected WinNr.i
  
  DataSection
  Icon_new:
  IncludeBinary("newRow.bmp")
  Icon_del:
  IncludeBinary("deleteRow.bmp")
  Icon_edit:
  IncludeBinary("Edit.bmp")
EndDataSection
 
  WinNr=OpenWindow(#PB_Any,50,50,100,80,"Test-Window",#PB_Window_SystemMenu)
 
  If CreateToolBar(#ToolBar, WindowID(WinNr))
    ToolBarImageButton(#newRow, CatchImage(0,?Icon_new),#PB_ToolBar_Toggle)
    ToolBarImageButton(#delRow, CatchImage(1,?Icon_del),#PB_ToolBar_Toggle)
    ToolBarImageButton(#editRow, CatchImage(2,?Icon_edit),#PB_ToolBar_Toggle)   
  EndIf
EndProcedure
  
  TestWin()
  
  Repeat
    Ev=WaitWindowEvent()
  Until Ev=#PB_Event_CloseWindow
Trotzdem dazu zwei Fragen.
1.) Ich habe aus Gründen der Übersichtlichkeit die Datasection da definiert, wo sie gebraucht wird, innerhalb einer Prozedur. Gibt's damit grundsätzliche Probleme?
2.) Bei CatchImage() habe ich Nummern 0,1,2 angegeben. Es geht aber auch mit der gleichen Nummer wie z.B. 0. Muss ich denn unbedingt verschiedene Nummern nehmen, wenn ich - wie in der Toolbar - auf das Bild an sich gar nicht mehr zugreifen muss?
Windows10 / PB5.70 / Arduino (-Due) / Raspberry Pi3 /Linux Mint 18
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: IncludeBinary mit ToolBar

Beitrag von RSBasic »

ProgOldie hat geschrieben:1.) Ich habe aus Gründen der Übersichtlichkeit die Datasection da definiert, wo sie gebraucht wird, innerhalb einer Prozedur. Gibt's damit grundsätzliche Probleme?
Ich glaube, es ist egal, da der Compiler die DataSection-Bereiche separat ermittelt und binär in die richtigen Position einfügt.
Da in der PB-Hilfe nichts steht, dass es nicht erlaubt ist und da der Compiler nicht meckert, sollte das korrekt und erlaubt sein.
ProgOldie hat geschrieben:2.) Bei CatchImage() habe ich Nummern 0,1,2 angegeben. Es geht aber auch mit der gleichen Nummer wie z.B. 0. Muss ich denn unbedingt verschiedene Nummern nehmen, wenn ich - wie in der Toolbar - auf das Bild an sich gar nicht mehr zugreifen muss?
Verwende doch einfach #PB-Any, dann ist es dir egal, welche IDs.
Wenn du die gleiche Nummer verwendest, wird das vorherige geladene Bild überschrieben, aber da du die Bild-ID an die ToolBar übergibst, ist egal, ob du die gleiche Nummer verwendest, weil Windows das übergebene Bild separat im Speicher adressiert. Nur weiß ich nicht, ob Linux und MacOS genauso tun. Das kann vielleicht ganz anders sein.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
ProgOldie
Beiträge: 236
Registriert: 19.05.2012 17:09
Computerausstattung: Windows11, Arduinos, Pi3, PureBasic 6.02

Re: IncludeBinary mit ToolBar

Beitrag von ProgOldie »

Danke, bei 2) ist der Hinweis auf Linux und Co. bedenkenswert. Ich werde es mit #PB_Any machen.


Korrektur: Mit #PB_Any in z.B. CatchImage(#PB_Any,?Icon_del) funktioniert es nicht, die Buttons bleiben unsichtbar.
Windows10 / PB5.70 / Arduino (-Due) / Raspberry Pi3 /Linux Mint 18
Benutzeravatar
Bisonte
Beiträge: 2427
Registriert: 01.04.2007 20:18

Re: IncludeBinary mit ToolBar

Beitrag von Bisonte »

Mit #PB_Any meinte RS Basic auch was anders ;)

Wenn du mit #PB_Any etwas erstellst (Bild, Gadget etc.) dann bekommst du die PB ID zurück.

Dann musst du es so machen :

Code: Alles auswählen

Image = CatchImage(#PB_Any, ?Icon_new)
ToolBarImageButton(#newRow, ImageID(Image), #PB_ToolBar_Toggle)
Oder halt in Direkter weise :

Code: Alles auswählen

ToolBarImageButton(#newRow, ImageID(CatchImage(#PB_Any, ?Icon_new)), #PB_ToolBar_Toggle)
Wobei man die erste Möglichkeit immer vorziehen sollte, da dann FreeImage(Image) nachgeschoben werden kann...
PureBasic 6.04 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom​​
Benutzeravatar
DarkSoul
Beiträge: 689
Registriert: 19.10.2006 12:51

Re: IncludeBinary mit ToolBar

Beitrag von DarkSoul »

Ich habe aus Gründen der Übersichtlichkeit die Datasection da definiert, wo sie gebraucht wird, innerhalb einer Prozedur. Gibt's damit grundsätzliche Probleme?
Der Bereich zwischen DataSection und EndDatasection wird nicht ausgeführt.

Ich würde das nicht machen. Spätestens, wenn du eines der Icons ein weiteres Mal an einer anderen Stelle benötigst, ist es sch***. :)

Ich mache die DataSection immer an das Ende derselben Sourcecode-Datei und da ist dann komplett alles drin. Siehst ja trotzdem an den ?xyz-Pointern, wo die Daten herkommen und wenn du nur einen großen DataSection-Block hast, brauchste auch nicht lange suchen. :wink:
Bild
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: IncludeBinary mit ToolBar

Beitrag von mk-soft »

Ich glaube du kannst auch CatchImage(0, ...) nehmen. Beim anlegen des ToolBarImageButton wird wieder eine Kopie von Image erstellt

Code: Alles auswählen

If OpenWindow(0, 0, 0, 150, 25, "ToolBar", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    If CreateToolBar(0, WindowID(0))
      CreateImage(0,16,16)
      StartDrawing(ImageOutput(0))
        Box(0,0,16,16,RGB(255,255,255))
        Box(4,4,8,8,RGB(255,0,0))
      StopDrawing()
      ToolBarImageButton(0,ImageID(0))
      CreateImage(0,16,16)
      StartDrawing(ImageOutput(0))
        Box(0,0,16,16,RGB(255,0,0))
        Box(4,4,8,8,RGB(255,255,255))
      StopDrawing()
      ToolBarImageButton(1,ImageID(0))
      FreeImage(0)
    EndIf
    Repeat
    Until WaitWindowEvent() = #PB_Event_CloseWindow 
  EndIf
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Antworten