Seite 3 von 4

Verfasst: 26.07.2008 18:15
von Andreas_S
Wiso nicht?

Mach doch einfach eine Globale Variable. Aber besser wäre es wenn die ID als Parameter übergeben wird. Es ist voralles übersichtlicher.

Vil. hast du ja nicht das prinzip der ID bei LoadImage() verstanden... Du kannst mit der ID im ganzem Programm herumspielen, solange das Image nicht aus dem Speicher gelöscht wird...

Verfasst: 26.07.2008 18:20
von Joel
Andreas_S hat geschrieben: Vil. hast du ja nicht das prinzip der ID bei LoadImage() verstanden... Du kannst mit der ID im ganzem Programm herumspielen, solange das Image nicht aus dem Speicher gelöscht wird...
Und das Klappt bei mir leider nicht:

Code: Alles auswählen

LoadImage(6, "C:\1.JPEG", 0)
LoadImage(7, "C:\Datei.JPG", 0)


Procedure ListIcon() 
E = 0

Win.s = "C:\Windows"
If OpenWindow(10, 0, 0, 500, 550, "ListIconGadgets", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(10))
UseJPEGImageDecoder()
ListIconGadget(11,  1,  1, 599, 550, "Name", 300)
AddGadgetColumn(11, 1, "Größe in Byte", 200)

ReadFile(8, Win.s+"\Inhalt.txt")
ColumnPos = 0

For x = 1 To 500
a$ = ReadString(8, 0)
b$ = ReadString(8, 0)
c$ = ReadString(8, 0)

If a$ = "Datei"
AddGadgetItem(11, -1, b$ , ImageID(6))
SetGadgetItemText(11, ColumnPos, c$, 1)
EndIf 
If a$ = "Ordner"
AddGadgetItem(11, -1, b$ , ImageID(7))
SetGadgetItemText(11, ColumnPos, c$, 1)
EndIf 
ColumnPos+1
Next   

Repeat
If E = 5
ProcedureReturn
EndIf 
   
Until WaitWindowEvent(10) = #PB_Event_CloseWindow
EndIf
EndProcedure 

mm = CreateThread(@ListIcon(), 0)
Delay(5000)

Verfasst: 26.07.2008 18:27
von Andreas_S
Sorry, aber mir schmerzen richtig die augen wenn ich den code ansehe.
Stichwort: Einrückungen

So könnte ich beim besten willen nicht programmieren... man weis ja nie wann ein Block anfängt und wann er endet...

Verfasst: 26.07.2008 18:29
von Joel

Code: Alles auswählen

LoadImage(6, "C:\1.JPEG", 0)
LoadImage(7, "C:\Datei.JPG", 0)


Procedure ListIcon() 
E = 0
Win.s = "C:\Windows"
UseJPEGImageDecoder()
ReadFile(8, Win.s+"\Inhalt.txt")

If OpenWindow(10, 0, 0, 500, 550, "ListIconGadgets", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(10))
ListIconGadget(11,  1,  1, 599, 550, "Name", 300)
AddGadgetColumn(11, 1, "Größe in Byte", 200)
ColumnPos = 0

 For x = 1 To 500
 a$ = ReadString(8, 0)
 b$ = ReadString(8, 0)
 c$ = ReadString(8, 0)

  If a$ = "Datei"
  AddGadgetItem(11, -1, b$ , ImageID(6))
  SetGadgetItemText(11, ColumnPos, c$, 1)
  EndIf 

  If a$ = "Ordner"
  AddGadgetItem(11, -1, b$ , ImageID(7))
  SetGadgetItemText(11, ColumnPos, c$, 1)
  EndIf 
  
 ColumnPos+1

 Next   

Repeat

If E = 5
ProcedureReturn
EndIf 
   
Until WaitWindowEvent(10) = #PB_Event_CloseWindow
EndIf
EndProcedure 
So besser?

Verfasst: 26.07.2008 19:06
von Andreas_S
>> So besser?
naja, daran muss noch gearbeitet werden...


Ganz einfach... du musst .*ico laden, es ist ja auch ein ListIconGadget...

Und zu deinem Code... Da sind so viele Dinge drinnen die keinen Sinn haben, um nur ein paar bsp. zu nennen:

UseJPEGImageDecoder() innerhalb einer Prozedur, das sollte ganz am anfang des codes stehen...

Du verwendest die Variable E nicht für berrechnugen, aber fragst sie auf 5 ab...

Code: Alles auswählen

ReadFile(8, "C:\Windows\Inhalt.txt")

For x = 1 To 500
    a$ = ReadString(8, 0)
    b$ = ReadString(8, 0)
    c$ = ReadString(8, 0)
Next
Das ist wirklich sehr naiv. man kann mit EoF(File) überprüfen ob man am ende der Datei angekommen ist.
Außerdem gibt man einen allokierten Speicher vor Programmende wieder frei wenn man ihn vorher bezogen hat. Das gilt auch für Images, Files, ect. .

-> Back to the routes.

Verfasst: 26.07.2008 23:13
von Joel
So habe nach mehreren Stunden den Fehler gefunden bzw. die 3 Fehler. Ich räume meinen Code jetzt mal ein bisschen auf und hoffe, dass sich jetzt nichtmehr so leicht Fehler einschleichen.

Wenn ihr wollt Poste ich den Code später nochmal und hoffe vielleicht noch Verbesserungsvorschläge zu bekommen.

Verfasst: 25.11.2008 22:23
von Joel
Habe jetzt leider bei einem anderen Program wieder diesen Fehler.

Hier der Code:

Code: Alles auswählen

Procedure Auswahl(*Wert)

  If OpenWindow(1, 216, 0, 451, 194, "Auswahlfenster",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
       OptionGadget(50, 70, 70, 20, 20, "")
      OptionGadget(51, 70, 130, 20, 20, "")
      StringGadget(52, 100, 70, 210, 25, "")
      StringGadget(53, 100, 130, 210, 25, "")
      ButtonGadget(54, 330, 70, 100, 30, "Auswählen")
      ButtonGadget(55, 330, 130, 100, 30, "Auswählen")
      TextGadget(56, 10, 20, 400, 20, "Bitte wählen sie eine Datei oder ein Verzeichnis aus, das hochgeladen werden soll.")
      TextGadget(57, 20, 70, 40, 20, "Datei:")
      TextGadget(58, 16, 130, 40, 20, "Ordner:")
      ButtonGadget(59, 170, 160, 120, 33, "Senden")
      Repeat
    EventID = WaitWindowEvent()
    If EventID = #PB_Event_Gadget
      Select EventGadget()

        Case 54
        Datei$ = OpenFileRequester("Datei Auswählen", "Desktop", "*.*", 70, 0)
        SetGadgetText(52, Datei$)
         
        
        Case 55
        Ordner$ = PathRequester("Ordner Auswählen", "")
        SetGadgetText(52, Datei$)    
        
        
        Case 59
        Goto Auswahl_Ende:
     
        
    
         EndSelect
           EndIf 
  Until EventID = #PB_Event_CloseWindow
  EndIf
  *Wert = 66
  Auswahl_Ende:
EndProcedure

wahl = CreateThread(@Auswahl(), 67)
WaitThread(wahl)
Warum wird bei Endprocedure wieder "Invalid Memory access" angezeigt?

Habe phpbb 4.30 Beta 4

Verfasst: 25.11.2008 22:50
von Ligatur
Du lieferst hier ein gutes Beispiel ab, warum Goto bei vielen verpönt ist. Du springst bei

Code: Alles auswählen

     
        Case 59
        Goto Auswahl_Ende:
 
aus einer Repeat Until Schleife raus, das kann den Stack durcheinanderbringen und damit zu Abstürzen führen. Benutze lieber Break.

Verfasst: 25.11.2008 23:04
von Joel
Gute Idee!

Ihr seid echt Super, hat geklappt, , danke!!!!!

Verfasst: 26.11.2008 20:40
von Thalius
für die bilder nimm lieber ne enumeration für die IDs ( die sind dann auch automatisch Global ).

Code: Alles auswählen

Enumeration
#Bild1    ; -> 0
#Bild2    ; -> 1
; ... usw.
Endenumeration
dann so:

Code: Alles auswählen

LoadImage(#Bild1, "C:\1.JPEG", 0)
LoadImage(#Bild2, "C:\Datei.JPG", 0) 
...
Ausserdem solltest du deine Bildpfade auch relativ angeben anstatt absolut - wenn du das programm auf einem anderen pc auch zum laufen bringen willst ;)

Cheers,
Thalius