Seite 3 von 3

Re: Frage Gadgets

Verfasst: 31.03.2014 23:02
von ts-soft
schleicher hat geschrieben:Na toll. Aus Beispielen kann man am besten lernen und nun das. :bluescreen:
Naja, wenn Du die Beispiele abänderst, so das sie mit der aktuellen Version von PB kompatibel sind,
lernst Du extrem viel. Hierbei hilft es auch, in der Geschichte der Hilfe nachzuschlagen, was geändert wurde.

Also Beispiele, die nicht laufen, sind besonders hilfreich, man lernt die Fehlersuche und das ist die Haupt-
aufgabe eines Programmierers! Aber das wirst Du dann doch irgendwann selber feststellen :mrgreen:

Re: Frage Gadgets

Verfasst: 01.04.2014 02:39
von schleicher
so für heute ist schluss . Hab noch Probleme bei den Untermenüs in einem Containergadget darzustellen, aber heute Abend gehts weiter. Habe den Code neu begonnen. Der Containergadget ist vorhanden Wenn ich das heute Abend hinbekomme, kommt das andere wieder hinzu für die batches

Code: Alles auswählen

Global Window

Enumeration 
  #GUI
  #Editor_0
  #Container_1
  #Button_0
  #Button_1
  #Button_2
  #Button_3
EndEnumeration

Enumeration 
  #MenuItem_1
  #MenuItem_2
  #MenuItem_3
EndEnumeration


Declare SetImage(EventType)




 OpenWindow(#GUI, 0, 0, 810, 520, "Hilfsprogramme Receiver",#PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_SizeGadget)
  SetWindowColor(#GUI,$615710)
  CreateMenu(0, WindowID(Window))
  MenuTitle("Einstellungen")
  MenuItem(#MenuItem_1, "neues Profil speichern")
  MenuItem(#MenuItem_2, "Profil laden")
  MenuItem(#MenuItem_3, "Netzwerkverbindung zum Receiver testen")
  EditorGadget(#Editor_0, 440, 12, 360, 400)
  ContainerGadget(#Container_1, 12, 12, 416, 400)
  SetGadgetColor(#Container_1, #PB_Gadget_BackColor,RGB(0,64,64))
  CloseGadgetList()
  ButtonGadget(#Button_0, 12, 424, 256, 36, "Untermenü 1")
  ButtonGadget(#Button_1, 276, 424, 104, 36, "Untermenü 2")
  ButtonGadget(#Button_2, 388, 424, 160, 36, "Untermenü 3")
  ButtonGadget(#Button_3, 552, 424, 184, 36, "Untermenü 4")
  
  
  
 Global Programm
 Global Ausgabe$ = ""
 Global Ausgabe_Fehlercode$  = ""
 
 Repeat
   Select WaitWindowEvent(10) ;damit das Editogadget aktualisiert wird
   Case #PB_Event_SizeWindow
     ; ResizeGadget(1,-2,WindowHeight(0)- 32,WindowWidth(0)+4,32)
      
      
  
   Case #PB_Event_Menu
      Select EventMenu()
      Case #MenuItem_1
          
      Case #MenuItem_3
      
      Case #MenuItem_2
        
    EndSelect
      
   Case #PB_Event_Gadget
      Select EventGadget()
         
      Case #Button_0
               
          
      Case #Button_1
         
        
      Case #Button_2
         
        
         
      Case #Button_3
         
         
     
  
    EndSelect
    
      Case #PB_Event_CloseWindow
      Quit = 1 
    
   EndSelect
  

   If IsProgram(Programm)
      If ProgramRunning(Programm)
         DisableGadget(#Button_1, #True)
         DisableGadget(#Button_2, #True)
         DisableGadget(#Button_3, #True)
        
         
         If AvailableProgramOutput(Programm)
            Ausgabe$ = ReadProgramString(Programm)
            Ausgabe_Fehlercode$ = ReadProgramError(Programm)
            AddGadgetItem(#Editor_0, -1, Ausgabe$)      ; Ergebnis in EditorGadget darstellen
         EndIf
         
      Else
         DisableGadget(#Button_1, #False)
         DisableGadget(#Button_2, #False)
         DisableGadget(#Button_3, #False)

         AddGadgetItem(#Editor_0, -1, "-----------------------------------------------------")
         
         ;ggf. eine Fehlermeldung ausgeben, sofern es eine gab
         If Ausgabe_Fehlercode$ <> ""
            AddGadgetItem(#Editor_0, -1, "Fehlermeldungen: " + Ausgabe_Fehlercode$)
         EndIf
         
         ;Exitcode ausgeben
         AddGadgetItem(#Editor_0, -1, "Exitcode: " + Str(ProgramExitCode(Programm)))
         Programm = 0
      EndIf
   EndIf   
   

Until Quit = 1








Re: Frage Gadgets

Verfasst: 01.04.2014 04:20
von ts-soft
Erstmal wieder ein paar Hinweise:

Du solltest mal nachlesen, über die Gültigkeit von Variablen. Globale Variablen haben überall Gültigkeit, sobald sie deklariert
sind. Da Du in dem Obigen Code jedoch nicht eine einzige Procedure hast, ist die globale deklaration überflüssig.
Hier solltest Du die Variablen mit Define deklarieren. Lokale Variablen innerhalb von Prozeduren meist mit Protected.
Mit globalen Variablen, die überall gültig sind, also auch innerhalb von Proceduren, sollte man Sparsam umgehen.

Also, möglichst Protected innerhalb von Proceduren, Define im Mainscope (alles ausserhalb von Prozeduren) und Global
nur, wenn die Variablen auch innerhalb verschiedener Proceduren benötigt werden.

Damit ist das Thema Variablen zwar noch nicht abgeschlossen, fehlen noch shared und static, die sind aber noch nicht
so wichtig am anfang.

Das nächste, was ich Dir ans Herz legen möchte, füge bitte als allererste Zeile ein EnableExplicit in Deinem Code ein,
und gewöhne es Dir gleich an, dieses ist die erste Tat, wenn ich einen neuen Code erstelle, z.B. Quit wurde nicht deklariert.

Zum Code selber:
Gut das Du Konstanten statt Nummern verwendest, aber die Namen der Konstanten sollte "Sprechen" und nicht nur
nummeriert ala #Button1, sondern #Button_Okay oder ähnlich.

Dann sollte innerhalb der Event-Schleife nur Code aufgrund eines Events ausgeführt werden! Alles hinter:
EndSelect, also der Teil, der mit IsProgram(Programm) beginnt gehört dort nicht hin!

Lass die 10 in WaitWindowEvent() weg und nutze gegebenenfalls einen Timer.

Erstmal genug, versuche erstmal einen Teil meiner Aussagen umzusetzen und dann gehts weiter :)

Re: Frage Gadgets

Verfasst: 05.04.2014 12:00
von schleicher
ts-soft hat geschrieben:Erstmal wieder ein paar Hinweise:

1. Du solltest mal nachlesen, über die Gültigkeit von Variablen.
Variablen mit Define deklarieren.

2. Füge bitte als allererste Zeile ein EnableExplicit in Deinem Code ein,
und gewöhne es Dir gleich an, dieses ist die erste Tat, wenn ich einen neuen Code erstelle, z.B. Quit wurde nicht deklariert.

3. Dann sollte innerhalb der Event-Schleife nur Code aufgrund eines Events ausgeführt werden! Alles hinter:
EndSelect, also der Teil, der mit IsProgram(Programm) beginnt gehört dort nicht hin!
Zu 1. Habe mich gründlich belesen und alle Variablen mit Define deklariert. Nur bei zwei Variablen habe ich Probleme Diese :

Code: Alles auswählen

CreateImage(0,210,30)
StartDrawing(ImageOutput(0))
For x = 0 To 20
   For y = 0 To 29
      Plot(x,y, RGB(x,y,x*y))
   Next
Next
DrawText(32,6,"Button 1")
StopDrawing()
Wie deklariere ich die Variablen x und y ?

Zu 2. Habe EnableExplicit eingefügt und Quit declariert
Zu 3. Habe den Code aufgeräumt

Bin auch schon ein Stück weiter und stehe vor der nächsten Frage: Habe dieses kleine Menü
Auszug aus Code:

Code: Alles auswählen

MenuTitle("Einstellungen")
MenuItem(#MenuItem_2, "Profil laden")
MenuItem(#MenuItem_3, "Profil erstellen")
MenuItem(#MenuItem_4, "Profil löschen")

Procedure GUI_Event(event)
  Select event
    Case #PB_Event_CloseWindow
      ProcedureReturn #False

    Case #PB_Event_Menu
      Select EventMenu()
        Case #MenuItem_2
        Case #MenuItem_3
        Case #MenuItem_4
      EndSelect
  EndSelect
  ProcedureReturn #True
EndProcedure
Ich möchte dem MenuItem_2 eine Auswahlliste anzeigen lassen . Für diese Liste gibt es einen speziellen Ordner. In der Liste sollen alle Dateien zur Auswahl stehen, die eine bestimmte Dateiendung haben. Sie sollen ausgewählt und geöffnet werden können.

Re: Frage Gadgets

Verfasst: 05.04.2014 12:22
von Andesdaf
x und y deklarierst du genauso wie alle anderen Variablen auch:

Code: Alles auswählen

Declare x.i, y.i
Probier erst einmal, den Ordnerinhalt auszulesen, am Besten in einer
eigenen Procedure. In der Hilfe gibt es zu ExamineDirectory() in der
FileSystem-Library ein Beispiel, wie man Ordnerinhalte ausliest. Der
Rest ist etwas komplizierter.

Re: Frage Gadgets

Verfasst: 05.04.2014 12:50
von schleicher
Ja das mache ich erst einmal. Danke

Re: Frage Gadgets

Verfasst: 06.04.2014 21:56
von schleicher
Ich habe das mit der Dateiauswahl hinbekommen aber brauche einen Tip
Wenn der FileRequester keine Datei erhält (Abruch oder Filerequester geschlossen) soll nach dem MessageRequester normal zum geöffneten Fenster zurückgekehrt werden . Die Ausführung von RunProgramm muss verhindert werden aber wie ?
Jemand ein Tip für mich ?
Codeauszug :

Code: Alles auswählen

Procedure OFile(file.s) 
    d=ReadFile(1, file) 
    If d 
      While Eof(1)=0 
        
      Wend 
      CloseFile(1) 
      
    Else 
      MessageRequester("Error","Keine Datei ausgewählt !",#MB_ICONERROR) 
      
    EndIf 
  EndProcedur
und der dazugehörige Codeauszug

Code: Alles auswählen

Case #MenuItem_2
          file$ = OpenFileRequester("Öffne Datei","c:\receiver\Profile\","Datei|*.*",1) 
          OFile(file$)
          Programm = RunProgram ( file$ ,"", "C:\", #PB_Program_Open | #PB_Program_Read | #PB_Program_Write| #PB_Program_Hide)

Re: Frage Gadgets

Verfasst: 06.04.2014 21:59
von RSBasic
@schleicher

Code: Alles auswählen

if file$
  runprogram(...)
endif
RunProgram() wird also nur dann ausgeführt, wenn man im OpenFileRequester() eine Datei ausgewählt hat. Hilft dir das?

Re: Frage Gadgets

Verfasst: 06.04.2014 22:19
von schleicher
Na da hätte ich auch selber drauf kommen können. Danke klappt super.