Noch ein paar Bugs! [PB 4.10+]

Hier werden, insbesondere in den Beta-Phasen, Bugmeldungen gepostet. Das offizielle BugForum ist allerdings hier.
LCD
Beiträge: 107
Registriert: 23.01.2008 13:13
Wohnort: Wien

Noch ein paar Bugs! [PB 4.10+]

Beitrag von LCD »

Hallo Leute!

Bin beim schreiben eines Betrachters für Retro-Computer Bilddateien auf folgendes Problem gestoßen: Wenn Explorerlistgadget sehr viele Filteroperationen aufweist (wie in dem Beispiel unten ca. 70), dann wirft der Debugger ein Invalid Memory Access aus. Das gilt für alle bisherigen PB Versionen inklusive 4.20 Beta 2. Mein Problem ist aber dass noch wesentlich mehr Erweiterungen zu der Liste hinzukommen werden.

Code: Alles auswählen

filterRX$ ="*.rxa;*.rxs"
filterZX$ = "*.scr;*.mlt;*.ifl;*.lce;*.sna;*.lcm;*.blk; *.blc;*.$c;*.afl;*.atr;*.chk;*.asc;*.rgb;*.cdi;*.mtl; *.gsc;*.img;*.mc;*.mcx;*.zed;*.4bpp;*.posc"
filterSAM$="*.ss1;*.ss2;*.ss3;*.ss4;*.sl4"
filterC64$="*.gcd;*.mon;*.dd;*.hed;*.hfc;*.him;*.art; *.hir;*.iph;*.eci;*.ibm;*.ish;*.fgs;*.gig;*.koa;*.rp; *.pi;*.cdu;*.rpm;*.sar;*.vid;*.cwg;*.ami;*.mil;*.fpt; *.ocp;*.ipt;*.dol;*.jj"
filterCPC$="*.cpc"
filterQL$ ="*.qs8;*.qs4"
filterXL$ ="*.pic;*.mic"
filterMSX$="*.pic;*.grp;*.sc2;*.sr2;*.sr5;*.sr7;*.sr8"

filterall$= filterRX$+"; "+filterZX$+"; "+filterSAM$+"; "+filterC64$+"; "+filterQL$+"; "+filterCPC$+"; "+filterXL$+"; "+filterMSX$

window=OpenWindow(#PB_Any,0,0,700,600,"Retro Picture viewer",#PB_Window_SystemMenu| #PB_Window_MinimizeGadget|#PB_Window_TitleBar)
If Not CreateGadgetList(WindowID(window)) Or Not window:MessageRequester("Error","Window can't be opened",#MB_ICONERROR):End:EndIf

filelist=ExplorerListGadget(#PB_Any, 0,30,694,526,"C:\"+filterall$, #PB_Explorer_MultiSelect| #PB_Explorer_AlwaysShowSelection| #PB_Explorer_GridLines| #PB_Explorer_HeaderDragDrop| #PB_Explorer_FullRowSelect|#PB_Explorer_NoFolders| #PB_Explorer_NoParentFolder| #PB_Explorer_NoDriveRequester| #PB_Explorer_AutoSort)
close=0
Repeat
  wwe=WaitWindowEvent()
  If wwe=#PB_Event_CloseWindow And GetActiveWindow()=window:close=1:EndIf
Until close
Das nächste Problem: bei ImageMenu in PB4.20 Beta 2 funktioniert der Tabulator nicht so wie in normalen Menüs. Stattdessen wird ein Quadrat angezeigt, wird aber zu dem imagemenü noch ein Popup menü erstellt, funktioniert der Tabulator dort.

Es gibt weitere Probleme bei compilierten Programmen die sehr groß sind (Exe mit ca. 2.2 Mb) weil bei meinem Programm compilieren mit PB 4.10 und 4.20 Beta 2, und eingeschalteten Debuger den Compiler abstürzen lässt (Ohne Debuger wird normal compiliert) oder das verschieben eines Splitters ausserhalb des Fensters einen Programmabsturz verursacht, da aber der Source viel zu groß ist um ihn hier zu posten, werde ich es am besten gleich direkt an Fred mailen.

Und noch ein kleiner Fehler in der Help Datei: Bin zwar kein Experte, aber IMHO sollte man bei der Beschreibung von FakeReturn alle GoTo durch GoSub ersetzen...
Zuletzt geändert von LCD am 09.04.2008 19:58, insgesamt 3-mal geändert.
PB 4.61Beta1 32/64Bit. AMD FX6100, 8 GB RAM, ATI Radeon 5750, Win7 64 (64 bit ist mist weil 16-Bit Programme wie MakeTZX nicht mehr darauf funktionieren).
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

das ist kein BUG, sonder das liegt einfach an der Path-Begrenzung von 260 Zeichen:

Code: Alles auswählen

Debug #MAX_PATH
nimmst du also nur diese max Anzahl, läuft alles super.

Falls dir das nicht passt, kannst du auch selber die Orte durchsuchen (), Filtern, und in einem ListIconGadget ausgeben.

Hier noch eine Procedure für das finden der Icons, wenn du es selber baust:

Code: Alles auswählen

Structure MySHFILEINFO 
  hIcon.l 
  iIcon.l 
  dwAttributes.l 
  szDisplayName.b[#MAX_PATH] 
  szTypeName.b[80] 
EndStructure 
Procedure.l GetExtensionIcon(DateiPfad$, Size=0, Index=0) 
 Protected Info.MySHFILEINFO, StandardIcon.l, Flags.l, Typ$ 
 StandardIcon = 0 
 Flags = #SHGFI_ICON
 If Size = 0 
  Flags | #SHGFI_SMALLICON
 Else 
  Flags | #SHGFI_LARGEICON 
 EndIf 
 If Right(DateiPfad$,1) <> "\" : Left(DateiPfad$,Len(DateiPfad$)-1) : EndIf
 Typ$ = GetExtensionPart(DateiPfad$)
 If Typ$ 
  Flags | #SHGFI_USEFILEATTRIBUTES	
 EndIf
 If SHGetFileInfo_(DateiPfad$, 0, @Info.MySHFILEINFO, SizeOf(MySHFILEINFO), Flags) 
  StandardIcon = Info\hIcon 
 Else 
  If Size = 0 
   ExtractIconEx_("shell32.dll", Index, 0, @StandardIcon, 1) 
  Else 
   ExtractIconEx_("shell32.dll", Index, @StandardIcon, 0, 1) 
  EndIf 
 EndIf 
 ProcedureReturn StandardIcon 
EndProcedure

EDIT:
Ein Splitter kann man nicht außerhalb des Fenster schieben, außer man hat das Gadget außerhalb des Fensters platziert, und das wäre dann ein fehler des Programmierers
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
LCD
Beiträge: 107
Registriert: 23.01.2008 13:13
Wohnort: Wien

Beitrag von LCD »

#Max_Path ist schön und gut, aber es wäre noch schöner wenn man diese Konstante selber definieren könnte, sonst schätze ich dass bei längeren Verzeichnisnamen die Programme auch crashen werden (Vermutung).
Betreff der Idee ein ListIconGadget zu verwenden, habe ich selbstverständlich auch bereits daran gedacht, nur leider aktualisiert es sich mit neueren Dateien nicht selbst, sonst hätte es aber eine Menge Vorteile wie z.B. dass SetGadgetState dort funktioniert.
Wie ist es aber wenn ich eine ThumbNails Anicht einbauen will? Die Large Icons gehen nur bis zu 32x32 Pixel, kann man das nicht noch irgendwie auf 128x128 Pixel vergrößern um so eine Ansicht wie bei XnView zu bekommen?
PB 4.61Beta1 32/64Bit. AMD FX6100, 8 GB RAM, ATI Radeon 5750, Win7 64 (64 bit ist mist weil 16-Bit Programme wie MakeTZX nicht mehr darauf funktionieren).
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

@LCD: Hier mal mein Lösungsvorschlag: Du wirfst alles, was nicht zu
Deinen Extensionen passt, einfach wieder aus dem ExplorerListGadget()
raus.

Code: Alles auswählen

Procedure LVMUpdate(Gadget)
  
 [...] filterzeuch [...]
  
  Protected Counter.l
  Protected Filename.s

  For Counter = CountGadgetItems(Gadget) To 0 Step -1
    Filename = GetGadgetText(Gadget) + GetGadgetItemText(Gadget, Counter, 0)
    If FindString(filterall$, ";" + LCase(GetExtensionPart(Filename)) + ";", 1) = 0
      RemoveGadgetItem(Gadget, Counter)
    EndIf
  Next
  
EndProcedure

window=OpenWindow(#PB_Any,0,0,700,600,"Retro Picture viewer",#PB_Window_SystemMenu|#PB_Window_MinimizeGadget | #PB_Window_TitleBar)
If Not CreateGadgetList(WindowID(window)) Or Not window:MessageRequester("Error","Window can't be opened",#MB_ICONERROR):End:EndIf
filelist=ExplorerListGadget(#PB_Any,0,30,694,526,"C:\*.*", #PB_Explorer_MultiSelect | #PB_Explorer_AlwaysShowSelection | #PB_Explorer_GridLines | #PB_Explorer_HeaderDragDrop | #PB_Explorer_FullRowSelect | #PB_Explorer_NoFolders | #PB_Explorer_NoParentFolder | #PB_Explorer_NoDriveRequester | #PB_Explorer_AutoSort)
LVMUpdate(filelist)
Repeat
  WWE=WaitWindowEvent()
  If WWE=#PB_Event_CloseWindow And GetActiveWindow()=window:close=1:EndIf
Until close
Grüße ... Kiffi
Zuletzt geändert von Kiffi am 09.04.2008 19:11, insgesamt 2-mal geändert.
a²+b²=mc²
LCD
Beiträge: 107
Registriert: 23.01.2008 13:13
Wohnort: Wien

Beitrag von LCD »

Wow! Wusste gar nicht dass das geht. Im Handbuch steht das leider nicht beschrieben.
Bleibt noch die Sache mit dem Refresh, also wenn eine neue Datei ins Verzeichnis kommt, und diese eine andere Erweiterung hat als die akzeptierten Dateien.
Welches #WM_ bekomme ich wenn eine neue Datei hinzugefügt wurde?
PB 4.61Beta1 32/64Bit. AMD FX6100, 8 GB RAM, ATI Radeon 5750, Win7 64 (64 bit ist mist weil 16-Bit Programme wie MakeTZX nicht mehr darauf funktionieren).
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

LCD hat geschrieben:Wow! Wusste gar nicht dass das geht.
wusste ich vorher auch nicht. ;-) Andreas hat mich in einem anderen Thread
freundlicherweise darauf aufmerksam gemacht.
LCD hat geschrieben:Bleibt noch die Sache mit dem Refresh,
Einfach bei EventGadget() = filelist das EventType() auf PB_EventType_Change
prüfen und dann noch einmal LVMUpdate(filelist) aufrufen.

Grüße ... Kiffi
a²+b²=mc²
LCD
Beiträge: 107
Registriert: 23.01.2008 13:13
Wohnort: Wien

Beitrag von LCD »

Hervorragend! Danke Leute! Beim nächsten Programmupdate werde ich dies berücksichtigen. Wegen der Abstürze mit dem Debugger: Habe grad PB4.20 Beta 3 geladen, ist aber anscheinend noch nicht behoben. Das bedeutet dass ich die Sources direkt an Fred mailen muss.
Wer sich übrigens mein Programm anschauen will:
http://rapidshare.com/files/106078373/R ... 6.zip.html
Ist zwar noch weit von der Fertigstellung entfernt, aber der Painter mit Importer und Viewer funktionieren schon, ebenso wie im DiskMaster die Suche nach doppelten Bildern
PB 4.61Beta1 32/64Bit. AMD FX6100, 8 GB RAM, ATI Radeon 5750, Win7 64 (64 bit ist mist weil 16-Bit Programme wie MakeTZX nicht mehr darauf funktionieren).
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

STARGÅTE hat geschrieben:das ist kein BUG, sonder das liegt einfach an der Path-Begrenzung von 260 Zeichen:

Code: Alles auswählen

Debug #MAX_PATH
nimmst du also nur diese max Anzahl, läuft alles super.
Das ist falsch. #MAX_PATH ist eine Konstante von WinApi und hat nichts
mit der Funktion zu tun. Der Code schmiert beim einlesen des Strings ab.
Halte ich auch fuer einen Fehler.
Andreas_S
Beiträge: 787
Registriert: 14.04.2007 16:48
Wohnort: Wien Umgebung
Kontaktdaten:

Beitrag von Andreas_S »

@LCD

Bitte mach hin und wieder Absätze in deinen Posts. Die Seite geht bei mir doppelt so weit wie normalerweise...

und bitte verwende auch die code-Tags...
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag von Fluid Byte »

Ist definitv ein Bug. Woher soll der Anwender wissen das es eine Begrenzung gibt wenn sie nicht im Manual steht? Außerdem sollte Fred sowieso eine entsprechende Fehlerbehandlung einbauen.
Windows 10 Pro, 64-Bit / Outtakes | Derek
Antworten