Hilfe zu XMLDialog

Anfängerfragen zum Programmieren mit PureBasic.
Lord
Beiträge: 313
Registriert: 21.01.2008 19:11

Hilfe zu XMLDialog

Beitrag von Lord »

Hallo!

Ich versuche gerade mit der Dialog-Library ein DPI-unabhängiges
Fenster zu erstellen. Es sind damit meine ersten Schritte.

Ich habe bisher folgenden Code erstellt:

Code: Alles auswählen

EnableExplicit

Runtime Enumeration
  #myDialogXML
EndEnumeration
Runtime Enumeration
  #myDialog
EndEnumeration
Runtime Enumeration
  #MainWindow
EndEnumeration
Runtime  Enumeration
  #Path
  #Name
  #Get
  #URL
  #List
EndEnumeration

Define DXML$

DXML$="<?xml version='1.0' encoding='UTF-16'?>" +
      "<dialogs>" +
      "  <window ID='#MainWIndow' flags='#PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_ScreenCentered' text='Test' minwidth='640' minheight='480' name='myWindow'>" +
      "    <vbox>" +
      "    <singlebox expand='horizontal' height='24'>" +
      "      <hbox height='24' >" +
      "        <string id='#Path' height='24' width='460' name='string_1' text=''/>" +
      "        <string id='#Name' height='24' width='120' name='string_2' text=''/>" +
      "      </hbox>" +
      "    </singlebox>" +
      "    <singlebox expand='horizontal' height='24'>" +
      "      <hbox height='24'>" +
      "          <gridbox columns='2' colexpand='yes' item='1' >" +
;       "        <singlebox expand='no' width='24' height='24'>" +
      "          <button id='#Get' width='24' height='24' name='button_1' text='!'/>" +
;       "        </singlebox>" +
;       "        <singlebox expand='horizontal' height='24'>" +
      "          <string id='#URL' height='24' width='640' name='string_3' text=' '/>" +
;       "        </singlebox>" +
      "          </gridbox>" +
      "      </hbox>" +
      "    </singlebox>" +
      "        <singlebox expand='yes' align='left'>" +
      "      <listicon id='#List' name='list_1' text='#' width='600'/>" +
      "    </singlebox>" +
      "    </vbox>" +
      "  </window>" +
      "</dialogs>"


If ParseXML(#myDialog, DXML$) And XMLStatus(#myDialogXML) = #PB_XML_Success
 
  If CreateDialog(#myDialog) And OpenXMLDialog(#myDialog, #myDialogXML, "myWindow")
   
    AddGadgetColumn(#List, 1, "Col 1", 100)
    AddGadgetColumn(#List, 2, "Col 2", 100)
    SendMessage_(GadgetID(#List),#LVM_SETCOLUMNWIDTH,0,48)
    
    Repeat
    Until WaitWindowEvent() = #PB_Event_CloseWindow
   
  Else 
    Debug "Dialog error: " + DialogError(#myDialog)
  EndIf
 
Else
  Debug "XML error: " + XMLError(#myDialogXML) + " (Line: " + XMLErrorLine(#myDialogXML) + ")"
EndIf
Jetzt habe ich mehrere Probleme damit, die ich nicht beheben kann.

1.
Ich möchte erreichen, daß in der ersten Zeile zwei Stringgadgets nebeneinander
mit der festen Höhe von 24px, aber mit unterschiedlicher Breite erstellt werden.
Gibt es die Möglichkeit die Breite prozentual anzugeben, so daß das erste Gadget
eine Breite von 60% und das zweite Gadget eine Breite von 40% hat?

2.
In der zweiten Zeile sollen ein ButtonGadget und ein Stringgadget nebeneinander
ebenfalls mit der festen Höhe von 24px, das ButtonGadget soll dabei die feste
Breite von 24px haben, während das StringGadget die restliche Breite einnehmen
soll.
In meinem bisher erstellten Code ändert sich immer die Breite des Buttons.
Ich hatte statt mit der GridBox mit zwei SingleBoxes experimentiert, aber ohne
Erfolg.
Bei der GridBox hat die Angabe von item='0', item='1' oder item='2' keine Aus-
wirkung. Trotzdem die Frage: beginnt die Zählung mit 0 oder mit 1?

3.
Die beiden Zeilen mit den StringGadgets sollen ihre y-Position nicht ändern, nur
das ListIconGadget soll die Höhe variieren können.
In meinem Code drittelt sich das Fenster und verschieben bei Größenänderung
ListIconGadget und die Zeile mit Button/StringGadget entsprechend.

Mit HeX0Rs DialogDesign0R V1.69 hatte ich leider auch keinen Erfolg. Deshalb
hatte ich versucht, das Ganze per Hand zu erstellen.
Kann mir da jemand bitte bei meinen ersten Gehversuchen mit der Dialog-Library
helfen und Tips geben?
Bild
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: Hilfe zu XMLDialog

Beitrag von ccode_new »

Hallo Lord,
ich versuche mal die Fragen zu beantworten.

1.
Nein es gibt keine Prozentangaben, aber rein rechnerisch kannst du die Werte ja trotzdem auf 60/100 und 40/100 festlegen.
Bei einer Größenveränderung werden die Werte ja automatisch angepasst.
Du kannst aber auch ein Gadget eine feste Größe geben und das Andere dann mit width='auto' festlegen.

2.
Die 'item:x' Angabe richtet sich nach den "Expand"-Angaben.
Bei z.B. colexpand='item:2' würde hier:

Code: Alles auswählen

<gridbox columns='2' colexpand='item:2'>" +
;       "        <singlebox expand='no' width='24' height='24'>" +
      "          <button id='#Get' width='24' height='24' name='button_1' text='!'/>" +
;       "        </singlebox>" +
;       "        <singlebox expand='horizontal' height='24'>" +
      "          <string id='#URL' height='24' width='auto' name='string_3' text=' '/>" +
;       "        </singlebox>" +
      "          </gridbox>" +
das zweite Gadget erweitert werden.
Bei item:0 würde gar keine Erweiterung stattfinden.
Hier siehst du im übrigen auch schon deinen Syntaxfehler.
<gridbox columns='2' colexpand='yes' item='1' >"

Hier mal Alle möglichen Parameter.

3.
Die beiden Zeilen mit den StringGadgets sollen ihre y-Position nicht ändern, nur
das ListIconGadget soll die Höhe variieren können.
Die StringGadgets verändern doch jetzt schon nicht ihre y-Position, oder?
Ansonsten z.Bsp. so:
<listicon id='#List' name='list_1' text='#' height='auto' width='600'/>"
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Benutzeravatar
helpy
Beiträge: 635
Registriert: 29.08.2004 13:29

Re: Hilfe zu XMLDialog

Beitrag von helpy »

XML etwas vereinfacht:

Code: Alles auswählen

<?xml version='1.0' encoding='UTF-8'?>
<dialogs>
  <window ID='#MainWIndow' text='Test' name='myWindow' 
          minwidth='640' minheight='480'
          flags='#PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_ScreenCentered'>
    <vbox expand="item:3">
      <hbox height='24'>
        <string id='#Path' height='24' width="384" name='string_1' text=''/>
        <string id='#Name' height='24' width='256' name='string_2' text=''/>
      </hbox>
      <hbox height='24' expand="item:2">
        <button id='#Get' width='24' height='24' name='button_1' text='!'/>
        <string id='#URL' height='24' name='string_3' text=' '/>
      </hbox>
      <listicon id='#List' name='list_1' text='#' width='600'/>
    </vbox>
  </window>
</dialogs>
[/size]
Windows 10
PB Last Final / (Sometimes testing Beta versions)
Benutzeravatar
helpy
Beiträge: 635
Registriert: 29.08.2004 13:29

Re: Hilfe zu XMLDialog

Beitrag von helpy »

For me it is much easier to write XML in an separate file (GUI.xml) which I use like this:

Code: Alles auswählen

EnableExplicit

DataSection
	GUI:
		IncludeBinary "GUI.xml"
	GUI_END:
EndDataSection

Runtime Enumeration
  #myDialogXML
EndEnumeration

Runtime Enumeration
  #myDialog
EndEnumeration

Runtime Enumeration
  #MainWindow
EndEnumeration

Runtime  Enumeration
  #Path
  #Name
  #Get
  #URL
  #List
EndEnumeration

Define xmlGUI
Define dlgGUI

xmlGUI = CatchXML(#PB_Any, ?GUI, ?GUI_END -?GUI)
If xmlGUI
	If XMLStatus(xmlGUI) = #PB_XML_Success
		dlgGUI = CreateDialog(#PB_Any)
		If dlgGUI
			If OpenXMLDialog(dlgGUI, xmlGUI, "myWindow")
		    AddGadgetColumn(#List, 1, "Col 1", 100)
		    AddGadgetColumn(#List, 2, "Col 2", 100)
		    SendMessage_(GadgetID(#List),#LVM_SETCOLUMNWIDTH,0,48)
		   
		    Repeat
		    Until WaitWindowEvent() = #PB_Event_CloseWindow
			Else
				Debug "Error in dialog definition: " + DialogError(dlgGUI)
			EndIf
		Else
			Debug "Dialog could not be created!"
		EndIf
	Else
		Debug "XML error: " + XMLError(xmlGUI)
		Debug "           in line " + Str(XMLErrorLine(xmlGUI)) + " at position " + Str(XMLErrorPosition(xmlGUI))
	EndIf
	FreeXML(xmlGUI)
Else
	Debug "XML could not be loaded."
	End
EndIf
[/size]
Windows 10
PB Last Final / (Sometimes testing Beta versions)
Andesdaf
Moderator
Beiträge: 2658
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Re: Hilfe zu XMLDialog

Beitrag von Andesdaf »

Für eine 40/60-Prozent-Verteilung könntest du auch eine Gridbox mit 10 Spalten und
colexpand='equal' anlegen und dann die jeweiligen colspans von 4 und 6 an die
Child-Elemente vergeben.
Win11 x64 | PB 6.00 (x64)
Lord
Beiträge: 313
Registriert: 21.01.2008 19:11

Re: Hilfe zu XMLDialog

Beitrag von Lord »

Hallo @all!

Danke an alle, die geantwortet haben.
Ihr habt mir prima weitergeholfen.
Ich habe eure Anmerkungen und Beispiele einmal in meinen Versuch übernommen
und habe dabei (bisher) dieses Ergebnis:

Code: Alles auswählen

<?xml version='1.0' encoding='UTF-8'?>
<dialogs>
  <window ID='#MainWIndow' text='Test' name='myWindow'
          minwidth='640' minheight='480'
          flags='#PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_ScreenCentered'>
    <vbox expand='item:4'>
      <hbox height='24' expand='no'>
      	<button id='#New'  width='24' height='24' name='button_1' text='1'/>
      	<button id='#Open' width='24' height='24' name='button_2' text='2'/>
      	<button id='#Save' width='24' height='24' name='button_3' text='3'/>
      	<button id='#Stop' width='24' height='24' name='button_4' text='4'/>
      </hbox>
      <hbox height='24'>
        <string id='#Path' height='24' width='400' name='string_1' text=''/>
        <string id='#Name' height='24' width='200' name='string_2' text=''/>
      </hbox>
      <hbox height='24' expand='item:2'>
        <button id='#Get' width='24' height='24' name='button_5' text='5'/>
        <string id='#URL' height='24' name='string_3' text=' '/>
      </hbox>
      <listicon id='#List' name='list_1' text='#' width='600'/>
      <vbox height='24'>
        <progressbar id='#Progress1' height='4' min='0' max='100' name='p1'/>
        <progressbar id='#Progress2' height='4' min='0' max='100' name='p2'/>
      </vbox>
      <hbox height='24' expand='item:1'>
      	<string id='#Status1' height='24' text='1'/>
      	<string id='#Status2' height='24' width='64' text='2'/>
      	<string id='#Status3' height='24' width='64' text='3'/>
      	<string id='#Status4' height='24' width='64' text='4'/>
      	<string id='#Status5' height='24' width='64' text='5'/>
      </hbox>
    </vbox>
  </window>
</dialogs>
Mit euren Vorgaben komme ich gut voran.
Ich werde wohl auf diesem Weg bleiben.

Danke für die Hilfestellung...

...und bleibt gesund!
Bild
Benutzeravatar
Shardik
Beiträge: 738
Registriert: 25.01.2005 12:19

Re: Hilfe zu XMLDialog

Beitrag von Shardik »

Lord hat geschrieben:

Code: Alles auswählen

    SendMessage_(GadgetID(#List),#LVM_SETCOLUMNWIDTH,0,48)
Nur ein kleiner Hinweis:
Die Verwendung einer Windows API-Funktion zum Setzen der Spaltenbreite in einem ListIconGadget ist nicht mehr nötig, weil PureBasic dies bereits seit Version 4.00 nativ kann.

Code: Alles auswählen

    SetGadgetItemAttribute(#List, 0, #PB_ListIcon_ColumnWidth, 48, 0)
Die Verwendung der PureBasic-Funktion ermöglicht es, das Beispiel auch in Linux und MacOS auszuprobieren.
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Hilfe zu XMLDialog

Beitrag von Kiffi »

<OT>
Shardik hat geschrieben:
Lord hat geschrieben:

Code: Alles auswählen

    SendMessage_(GadgetID(#List),#LVM_SETCOLUMNWIDTH,0,48)
Dass Du das hast lesen können! :shock:

Bild

</OT>
Hygge
Lord
Beiträge: 313
Registriert: 21.01.2008 19:11

Re: Hilfe zu XMLDialog

Beitrag von Lord »

Hallo!
Shardik hat geschrieben:...
Nur ein kleiner Hinweis:
Die Verwendung einer Windows API-Funktion zum Setzen der Spaltenbreite in einem ListIconGadget ist nicht mehr nötig, weil PureBasic dies bereits seit Version 4.00 nativ kann.
...
Die Verwendung der PureBasic-Funktion ermöglicht es, das Beispiel auch in Linux und MacOS auszuprobieren.
Danke für den Hinweis, hatte ich vergessen. :oops:
Kiffi hat geschrieben:<OT>
...
Dass Du das hast lesen können! :shock:
...
</OT>
Das war bereits im Originalposting von mir drin, helpy hatte das so übernommen.
Die kleine Schrift ist aber tatsächlich eine Herausforderung.
Bild
Lord
Beiträge: 313
Registriert: 21.01.2008 19:11

Re: Hilfe zu XMLDialog

Beitrag von Lord »

Kiffi hat geschrieben:<OT>
...
Dass Du das hast lesen können! :shock:
...
</OT>
Das bringt mich zur nächsten Frage:

Warum kann ein Button nur minimal 24 Pixel klein sein und
warum kann ein Stringgadget nur minimal 20 Pixel klein sein?
Liegt das an der Fontgröße? Diese kann ich erst nach dem Erstellen des Dialogs
angeben, da vorher keine Gadgets vorhanden sind.
In der Hilfe habe ich dazu kein Beispiel gefunden.

Habt ihr irgendwelche Ideen, wie man Button-/StringGadget kleiner erstellen kann?
Mein "Versuchsaufbau":

Code: Alles auswählen

Runtime Enumeration
  #MainWindow
EndEnumeration
Runtime Enumeration
  #Button1
  #Text1
  #Editor1
EndEnumeration

LoadFont(1, "Arial", 6)

Procedure myResize()
  Protected Text.s
  Text+
       "Button x: "+#TAB$+GadgetX(#Button1)+#CRLF$+
       "Button y: "+#TAB$+GadgetY(#Button1)+#CRLF$+
       "Button w: "+#TAB$+GadgetWidth(#Button1)+#CRLF$+
       "Button h: "+#TAB$+GadgetHeight(#Button1)+#CRLF$+
       "String x:  "+#TAB$+GadgetX(#Text1)+#CRLF$+
       "String y:  "+#TAB$+GadgetY(#Text1)+#CRLF$+
       "String w:  "+#TAB$+GadgetWidth(#Text1)+#CRLF$+
       "String h:  "+#TAB$+GadgetHeight(#Text1)+#CRLF$+
       "Window w: "+#TAB$+WindowWidth(#MainWindow, #PB_Window_InnerCoordinate)+#CRLF$+
       "Window h: "+#TAB$+WindowHeight(#MainWindow, #PB_Window_InnerCoordinate)+#CRLF$
  SetGadgetText(#Editor1, Text)
  
EndProcedure

xmlGUI = CatchXML(#PB_Any, ?GUI, ?GUI_END - ?GUI,0, #PB_Ascii)
If xmlGUI
  If XMLStatus(xmlGUI) = #PB_XML_Success
    dlgGUI = CreateDialog(#PB_Any)
    If dlgGUI
      If OpenXMLDialog(dlgGUI, xmlGUI, "myWindow")
        
        SetGadgetFont(#Button1, FontID(1))
        SetGadgetFont(#Text1, FontID(1))
        myResize()
        BindEvent(#PB_Event_SizeWindow, @myResize())
        

        Repeat
        Until WaitWindowEvent()=#PB_Event_CloseWindow
                
        
      Else
        Debug "Fehler in der Dialog-Definition: " + DialogError(dlgGUI)
      EndIf
    Else
      Debug "Dialog konnte nicht erstellt werden!"
    EndIf
  Else
    Debug "XML Fehler: " + XMLError(xmlGUI)
    Debug "           in Zeile " + Str(XMLErrorLine(xmlGUI)) + " an Position " + Str(XMLErrorPosition(xmlGUI))
  EndIf
  FreeXML(xmlGUI)
Else
  Debug "XML konnte nicht aus Speicher geladen werden."
  End
EndIf

DataSection
  IncludePath --> Hier eigenen Pfad zur Dialog.xml eintragen
  GUI:
    IncludeBinary "TestGUI.xml"
  GUI_END:
EndDataSection
Dazu die verwendete XML:

Code: Alles auswählen

<?xml version='1.0' encoding='UTF-8'?>
<dialogs>
  <window ID='#MainWindow' text='Test' name='myWindow'
          minwidth='640' minheight='480'
          flags='#PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_ScreenCentered |
                 #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget'>
  <vbox expand='item:2'>
    <hbox expand='item:2'>
      <button ID='#Button1' width='12' height='12' text='?'>
      </button>
      <string ID='#Text1' height='12' text='Text 1'>
      </string>
    </hbox>
    <!-- 
      Dieser Bereich ist auskommentiert
    -->
    <editor ID='#Editor1' text='Editor 1'>
    </editor>
  </vbox>
  </window>
</dialogs>
Bild
Antworten