WinHdl --> #WinNr ?

Anfängerfragen zum Programmieren mit PureBasic.
sibru
Beiträge: 265
Registriert: 15.09.2004 18:11
Wohnort: hamburg

WinHdl --> #WinNr ?

Beitrag von sibru »

Hallo,

ich muß in ´nem Modul die #WinNr zu einem WinHdl ermittelt.
Früher klappte das mal mit

Code: Alles auswählen

Procedure WinHdl2Nr(WHdl.l)
   Protected WinNr
   While WindowID(WinNr)<>WHdl And WinNr<1000 : WinNr+1 : Wend
   ProcedureReturn WinNr
EndProcedure
Seit´m Update auf 3.94 klappt´s nicht mehr: WindowID(nicht geöffnetes #WinNr) liefert nicht mehr 0, sondern ´n Debugger-Error...
Hat jemand ´ne Ahnung, wie ich das umgehen kann ???
!!! nicht mit isWindow(), die Modul-Dateien sollen (erstmal) sowohl mit 3.80 als auch 3.94 funktionsfähig bleiben...

Gruss Siggi
Zuletzt geändert von sibru am 13.11.2007 20:29, insgesamt 1-mal geändert.
Benutzeravatar
Thomas
Beiträge: 893
Registriert: 06.07.2006 19:24
Wohnort: Regensburg
Kontaktdaten:

Beitrag von Thomas »

Kannst du es so erklären, dass auch ich verstehe, was du meinst?
(hab vielleicht ne Idee)
v6.00
sibru
Beiträge: 265
Registriert: 15.09.2004 18:11
Wohnort: hamburg

Beitrag von sibru »

konkrete Anwendung:

Funktion freeWinNr() soll eine noch nicht benutzt #Windows-Nr liefern:
also via WindowID(TestWinNr) nachsehen, ob´s schon ´n Fenster mit
openwindow(TestWinNr,....) gibt: wenn ja, TestWinNr incrememtieren
... und das Ganze, bis WindowID(TestWinNr) Null liefert(e)...
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Dann schalte den Debugger doch fuer die Procedure aus.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

1. Das Einsetzen ungültiger WindowID's in WindowID() führt zu einem Fehler (invalid ID), das programm stürzt gnadenlos ab
2. Das eim/ausschalten wie edel es vorschlägt, funktioniert daher nicht
3. Benutze isWindow(), um erst zu prüfen, ob es diese ID gibt

P.S.: Warum benutzt du immernoch 3.94? Warum nicht 4.10?
Zuletzt geändert von AND51 am 13.11.2007 21:28, insgesamt 1-mal geändert.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Der Übersicht wegen einen neuen Post, es sei mir vergeben!

Code: Alles auswählen

handle=OpenWindow(761, 0, 0, 0, 0, "AND51")

Debug handle



Procedure GetWindowIDFromHandle(Handle.l, max.l=1000)
	While Handle
		If IsWindow(max)
			If WindowID(max) = Handle
				Break
			EndIf
		EndIf
		max-1
	Wend
	ProcedureReturn max
EndProcedure


Debug GetWindowIDFromHandle(handle)
Zählt die Prozedur rückwärts, kann man bequem noch einen Parameter einbauen, der bestimmt, wie viele WindowID's von 0 bis max durchprobiert werden sollen. Optionale Parameter gibt es ab PB 4.00,
für 3.94 müsste man das so umstellen:

Code: Alles auswählen

handle=OpenWindow(761, 0, 0, 0, 0, "AND51")

Debug handle



Procedure GetWindowIDFromHandle(Handle.l, max.l)
	While Handle
		If IsWindow(max)
			If WindowID(max) = Handle
				Break
			EndIf
		EndIf
		max-1
	Wend
	ProcedureReturn max
EndProcedure


Debug GetWindowIDFromHandle(handle, 1000)
Zuletzt geändert von AND51 am 13.11.2007 21:32, insgesamt 1-mal geändert.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
sibru
Beiträge: 265
Registriert: 15.09.2004 18:11
Wohnort: hamburg

Beitrag von sibru »

gerade erst -nach ca 3 Jahren gelegentlichen Anrufen- unsern Update-Account bei MasterCreating klar gemacht... und nun beim Upadte von 3.80 auf 3.94 (war anscheinend nicht so viel... Pustekuchen! Wie soll das erst
mit 4.10 aussehen???).

Und der Chef ist genervt von nicht_aufwärz_kompatieblen Update´s
(und den damit verbundenen Kosten...), anscheinend wird´s wohl
bei 3.80 bleiben, hab´ nur ne´ Freigabe von 5:00 Arbeitsstunden für´s
Update von ca 1200 Modulen {=eigenständigen .PBI´s, die von mehreren Prg´s benutzt werden} und knapp 100 kommerziellen Prg´s....)

Gruss Siggi
sibru
Beiträge: 265
Registriert: 15.09.2004 18:11
Wohnort: hamburg

Beitrag von sibru »

@AND51

Ja, so ähnlich hatte ich mir auch vorgestellt...
Nur läuft´s halt nicht unter PB3.8... Und dieses Problem ist aufgetreten
beim 1. upzudatenen Prg: nu trau´ ich mich noch nicht, alle 1200 PBI´s
auf 3.94 umzubauen... (siehe oben...)

Oder gibt´s ne Möglichkeit, die beim Compilieren aktuelle PB-Version
zu erkennen ? (jaPBe-Version reicht nicht, ich benutzte 22.4..... sowohl
für PB3.8 als auch 3.94...)

- nebenbei -
ich bin immer wieder erstaunt, wie schnell hier die Antworten und Problemlösungen kommen... da müßen ja zig Leute mit richtig Fachwissen
nicht anderes zu tun haben...
Geiles Forum !!! :allright:

Gruss Siggi
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

@AND51
Woher nimmst du denn diese Weisheit ?

Code: Alles auswählen

Procedure WinHdl2Nr()
   Protected WinNr
   DisableDebugger
   While WindowID(WinNr) And WinNr<1000 
    WinNr+1 
   Wend
   EnableDebugger
   ProcedureReturn WinNr
EndProcedure 


OpenWindow(0,0,0,200,200,#PB_Window_SystemMenu,"Test")
OpenWindow(1,0,0,200,200,#PB_Window_SystemMenu,"Test")

Debug WinHdl2Nr()

Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

@ edel:
Tatsache! :o Bin ich wohl von irgendetwas falschem ausgegangen, ich war mir sicher, dass es sich so verhält, wie du es gesagt hast.
Danke für den Hinweis!

> Oder gibt´s ne Möglichkeit, die beim Compilieren aktuelle PB-Version zu erkennen
Also ab 3.94 gibt es #PB_Compiler_Version.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Antworten