#PN_Any absolut unzuverlässig?

Für allgemeine Fragen zur Programmierung mit PureBasic.
Kekskiller
Beiträge: 752
Registriert: 14.09.2004 21:39
Kontaktdaten:

#PN_Any absolut unzuverlässig?

Beitrag von Kekskiller »

Irgendwie macht mir dieses #PB_Any immer wieder Sorgen. Ich verwalte dynamisch mit Liste Bilder, indem ich mir mit #PB_Any die Indexnummern zurückgeben lasse. Wenn ich jetzt von vornherein aber Bilder aus dem Speicher catche, gibt es oft Probleme beim Anzeigen. Irgendwie kommen sich die Dinger ständig in die Haare... Ich könnte natürlich auch die Indexnummern aus dem Indexwert der Liste ziehen, aber ich will das auch anders hinbekommen. Wie kann ich das umgehen? Welchen Bereich wird #PB_Any nie erreichen?
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

Beitrag von ts-soft »

>> Welchen Bereich wird #PB_Any nie erreichen?
Ich denke mal oberhalb von 4 GB sollten alle Zahlen frei sein :mrgreen:

Aber im Ernst, so ganz verstehe ich Dein Problem nicht, könntest Du es vielleicht mal weiter erläutern bzw. ein paar Beispiel-Code-Zeilen.

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
Kekskiller
Beiträge: 752
Registriert: 14.09.2004 21:39
Kontaktdaten:

Beitrag von Kekskiller »

Ich verwalte in einem MDI-Gagdet Fenster mit Bildern drinne. Die ImageIDs werden mit #PB_Any abgespeichert.

Code: Alles auswählen

Structure IMG
  Image.l
  Display.l
  Area.l
  Path$
EndStructure

Code: Alles auswählen

Procedure AddImage(Path$)
  If FileSize(Path$) > -1
    Image = LoadImage(#PB_Any, Path$)
    If Image <> 0
      
      AddElement(Images())
      Images()\Image = Image
      Images()\Path$ = Path$
      
      Select LCase(GetExtensionPart(Path$))
        Case "bmp"
          img = img_bitmap
        Case "png"
          img = img_jpeg
        Case "jpg"
          img = img_jpeg
        Default
          img = img_default
      EndSelect
      
      AddGadgetItem(0, ListIndex(Images()), GetFilePart(Images()\Path$), UseImage(img))
        winw = ImageWidth()
        winh = ImageHeight()
        If winw > GadgetWidth(0)
          winw = GadgetWidth(0)
        EndIf
        If winh > GadgetHeight(0)
          winh = GadgetHeight(0)
        EndIf
        
        SetGadgetItemAttribute(0, ListIndex(Images()), #PB_MDI_ItemWidth, winw)
        SetGadgetItemAttribute(0, ListIndex(Images()), #PB_MDI_ItemHeight, winh)
        
        Images()\Area = ScrollAreaGadget(#PB_Any, 0,0, winw,winh, ImageWidth(),ImageHeight(), 10, #PB_ScrollArea_Single)
          Images()\Display = ImageGadget(#PB_Any, 0,0, ImageWidth(),ImageHeight(), UseImage(Images()\Image))
        CloseGadgetList()
        
      CloseGadgetList()
      
    EndIf
  EndIf
EndProcedure

Code: Alles auswählen

Global img_bitmap.l, img_jpeg.l, img_default.l
img_bitmap = CatchImage(#PB_Any, ?bitmap)
img_jpeg = CatchImage(#PB_Any, ?jpeg)
img_default = CatchImage(#PB_Any, ?defaultfile)
AddImage() fügt ein neues Fenster zu, je nach Dateiname entscheidet der Code, welches Icon genommen wird. Aber irgendwie werden schon die richtigen Icons genommen, die Bilder aber sind total verstümmelt und verkürzt. Ich vermute es liegt an der ID, Anderes sehe ich da nicht als Problem. Dazu bräuchte ich eine Lösung...
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

Beitrag von ts-soft »

Da Dein Code so nicht Testbar ist, deshalb rate ich mal. Durch UseImage wird die ImageID verändert, so das der Wert in Deiner Strukturvariable nicht mehr stimmt.

Mal sehen, ob ich gut im Raten bin :)

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
Kekskiller
Beiträge: 752
Registriert: 14.09.2004 21:39
Kontaktdaten:

Beitrag von Kekskiller »

Nein, UseImage wird nur einmal benutzt, daher kann auch falsche Anzeige durch falsch benutzte Images ausgeschlossen werden. Durch ein paar Debugausgaben sehe ich, dass die IDs von Images ziemlich nah aneinanderliegen. Wenn ich aber die richtige Adresse nehme, kann ich mir zwar die ID-Sache ersparen, aber danach kann ich nichts mehr so schön löschen. Hm...

Ich habs jetzt erstmal ohne Icons gelassen, geht auch so ganz ok...
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Beitrag von PMV »

Hm, ich habs mir auch grad mal angeschaut ... ich kann den Code zwar nicht testen, aber ich bin auch dafür, das es an UseImage(img) liegt, bzw dass am ende der Prozedur das falsche Image aktiv ist.

Code: Alles auswählen

Procedure AddImage(Path$) 
  If FileSize(Path$) > -1 
    Image = LoadImage(#PB_Any, Path$) 
    If Image <> 0 
      
      AddElement(Images()) 
      Images()\Image = Image 
      Images()\Path$ = Path$ 
      
      Select LCase(GetExtensionPart(Path$)) 
        Case "bmp" 
          img = img_bitmap 
        Case "png" 
          img = img_jpeg 
        Case "jpg" 
          img = img_jpeg 
        Default 
          img = img_default 
      EndSelect 
      
      AddGadgetItem(0, ListIndex(Images()), GetFilePart(Images()\Path$), UseImage(img)) 
        ;ab hier ist das aktive Image das img 

        winw = ImageWidth() 
        winh = ImageHeight() 
        If winw > GadgetWidth(0) 
          winw = GadgetWidth(0) 
        EndIf 
        If winh > GadgetHeight(0) 
          winh = GadgetHeight(0) 
        EndIf 
        
        SetGadgetItemAttribute(0, ListIndex(Images()), #PB_MDI_ItemWidth, winw) 
        SetGadgetItemAttribute(0, ListIndex(Images()), #PB_MDI_ItemHeight, winh) 
        
        ;ImageWidth() und ImageHeight() gehen hier von der Größe von img aus, nicht von der größe von Images()\Image
        UseImage(Images()\Image)  ;hier müsste das hin, damit ImageHeight() und ImageWidth() auch von dem gewünschen Image aus gehen
        Images()\Area = ScrollAreaGadget(#PB_Any, 0,0, winw,winh, ImageWidth(),ImageHeight(), 10, #PB_ScrollArea_Single) 
          Images()\Display = ImageGadget(#PB_Any, 0,0, ImageWidth(),ImageHeight(), UseImage(Images()\Image)) 
        CloseGadgetList() 
        
      CloseGadgetList() 
      
    EndIf 
  EndIf 
EndProcedure
MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Antworten