Mini-Grafik-Demo als Aboutrequester

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

Beitrag von scholly »

HeX0R hat geschrieben:Prozedur in Prozedur geht nicht ? :freak:

Hier mal dein erstes Beispiel als Prozedur:
Und wo ist da eine Procedure in der Procedure ?

Das geht nicht:

Code: Alles auswählen

Procedure eins()
  debug "eins"
  Procedure zwei()
    debug "zwei"
  EndProcedure

EndProcedure

eins()
Aber das geht:

Code: Alles auswählen

Gosub eins
End

eins:
  Procedure zwei()
    Debug "zwei"
  EndProcedure

  Debug "eins"
  zwei()
Return
Und diesen Fall brauch ich bei mindest einem kommenden Requester.

Wenn mit Deinem Weg dann mit mehreren Proceduren arbeitet/arbeiten muß, muß man auf jeden Fall aufpassen, daß man alles altes löscht, wenn man seinen "About-Requester" austauscht, sonst bleiben Procedure-Leichen übrig.

Bei meinem Weg braucht man nur die (gefaltete) Subroutine durch eine andere zu ersetzen - nix bleibt übrig und alles neue ist da.
Simpel und einfach.
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag von Fluid Byte »

HeX0R hat absolut recht. Wir wissen zwar deine Mühen zu schätzen (ich zumindest) aber GOSUB ist Humbug. In einer Prozedur ist alles gekapselt und die einzustellenden Variablen bzw. Parameter müssen nicht umständlich über mehrere Zeilen deklariert und gesetzt werden. Man hat nur einen Funktionsaufruf wo man alle nötigen Parameter definiert. Ein weiteres Manko ist das Codeabschnitt in der Rountine den Code außerhalb beeinträchtigen kann da alle Variablen ungeschützt sind. Wenn ich deinen Code z. B. in einer Include-Datei speichere und irgendwo bei mir einsetzte und zufällig einen identischen Variablennamen benutze kann das unter Umständen zu Problemen führen (kein Protected, Static).
Windows 10 Pro, 64-Bit / Outtakes | Derek
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

Beitrag von scholly »

Fluid Byte hat geschrieben:Wenn ich deinen Code z. B. in einer Include-Datei speichere und irgendwo bei mir einsetzte und zufällig einen identischen Variablennamen benutze kann das unter Umständen zu Problemen führen (kein Protected, Static).
Die Variablennamen sollen ja extra so gewählt werden, daß sie nach menschlichem Ermessen nur in dieser einen Gosub-Routine vorkommen können.
Protected und Static guck ich mir gleich mal an, ob/wie das weiterhilft.

Aber ich bin ja lernwillg:
Wie soll das Problem gelöst werden, wenn eine (dann) 2., 3., ..n. Procedure benutzt werden soll/muß?

Mein Ziel ist ja eigentlich, daß jemand einen Codeschnipsel austauscht/verändert und nicht rumsuchen muß, was noch als "Codeschnipsel-Leiche" übrig bleiben könnte.

Das ist im eigenen, unveröffentlichen Code bestimmt egal, da ungenutzter Code AFAIK beim Compilieren ja "verschwindet" und die EXE nicht aufbläht.
Aber wenn sich jemand denn Source anguckt und dann über solche "Leichen" stolpert, weil es nicht sein Code ist oder es sein alter Code ist, dann ist das echt ....Stoffwexelendprodukt.
Zuletzt geändert von scholly am 14.03.2008 19:00, insgesamt 2-mal geändert.
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Benutzeravatar
gnasen
Beiträge: 578
Registriert: 01.08.2007 14:28
Computerausstattung: PB 4.60

Beitrag von gnasen »

Code: Alles auswählen

Procedure Wup_1()
  ;... ruft zB Wup_2() auf
EndProcedure

Procedure Wup_2()
  ;... ruft zB Wup_3() auf
EndProcedure

Procedure Wup_3()
  ;... ruft zB Wup_1() auf
EndProcedure


Wup_1()
das ist ja alles im Rahmen des möglichen. In den Prozeduren zB mit Protected kapseln.
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

Beitrag von scholly »

Und beim Austauschen wird dann nur

Code: Alles auswählen

Procedure Wup_1()
  ;... ruft zB Wup_2() auf
EndProcedure
gelöscht und der Rest bleibt drinne.
Ich möcht nicht wissen, wieviel "Leichen" nach 3 solcher Aktionen im Code noch 'rumfliegen :freak:
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

Re: arng_ugs_01

Beitrag von scholly »

Mal abgesehen von dem Glaubenskrieg Procedure vs. Gosub:

Kann mir denn niemand die Frage zu arng_ugs_01 beantworten?
Ich frag mich hierbei allerdings, warum da (nur bei mir ?) so weiße Spratzer auftauchen und ob/wie man die abstellen kann.
Oder tauchen die bei Euch nicht auf?
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: arng_ugs_01

Beitrag von Kiffi »

scholly hat geschrieben:Ich frag mich hierbei allerdings, warum da (nur bei mir ?) so weiße Spratzer auftauchen und ob/wie man die abstellen kann.
kann ich leider nicht beantworten. Allerdings ist mir beim durchsehen des
Codes folgendes aufgefallen:

Code: Alles auswählen

DrawText(ar1_drawoffset_x,ar1_drawoffset_y,ar1_scrolltext,ar1_fontclr,Point(1,1)) 
Wenn Du ein anderes Fenster über Dein About-Fenster schiebst (eben über
besagten Point(1,1)), dann wird der Hintergrund des scrollenden Textes
natürlich schwarz.

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag von HeX0R »

Es ist meistens keine gute Idee direkt auf ein Window zu zeichnen, besser ein Image nehmen.
z.B. so:

Code: Alles auswählen

Procedure About(win_width.l, win_height.l, win_titel.s, Text.s, scrtext_1x.s, delaytime.l, FontID1.l = 0, FontID2.l = 0)
	Protected fontclr.l = #Black, quit.l, win_ID.l
	Protected scrolltext.s, sct_x.l, BGC.l, TimeOUT.l, st_y.l, a.l
	Protected drawoffset_x.l = 1, IID.l, IGID.l

	win_ID = OpenWindow(#PB_Any, 0, 0,win_width, win_height, win_titel, #PB_Window_ScreenCentered | #PB_Window_SystemMenu)
	If win_ID And CreateGadgetList(WindowID(win_ID))

		;nun brauchen wir die Pixellänge des einfachen scrolltextes
		If StartDrawing(WindowOutput(win_ID))
			If FontID2
				DrawingFont(FontID2)
			EndIf
			sct_x = TextWidth(scrtext_1x)
			BGC   = Point(win_width / 2, win_height - 10)
			If FontID1
				DrawingFont(FontID1)
			EndIf
			sty = TextHeight(Text) * (CountString(Text, #LF$) + 1)
			StopDrawing()
		EndIf
		
		a = TextGadget(#PB_Any, 0, 10, win_width, sty, Text, #PB_Text_Center)
		If FontID1
			SetGadgetFont(a, FontID1)
		EndIf

		IGID        = ImageGadget(#PB_Any, 0, sty + 10, win_width, win_height - sty - 10, 0)
		scrolltext  = Space(30) + scrtext_1x
		
		IID     = CreateImage(#PB_Any, win_width, win_height - 90)
		TimeOUT = ElapsedMilliseconds() + delaytime
		Repeat

			If TimeOUT < ElapsedMilliseconds()
				drawoffset_x - 1
				If drawoffset_x = -sct_x
					drawoffset_x = 0
				EndIf
				If StartDrawing(ImageOutput(IID))
					Box(0, 0, win_width, win_height - sty - 10, BGC)
					If FontID2
						DrawingFont(FontID2)
					EndIf
					DrawingMode(#PB_2DDrawing_Transparent)
					DrawText(drawoffset_x, ImageHeight(IID) / 2 - TextHeight(scrolltext) / 2, scrolltext, fontclr)
					StopDrawing()
				EndIf
				SetGadgetState(IGID, ImageID(IID))
				TimeOUT = ElapsedMilliseconds() + delaytime
			EndIf

			If WaitWindowEvent(delaytime) = #PB_Event_CloseWindow
				If EventWindow() = win_ID
					quit = #True
					CloseWindow(win_ID)
				EndIf
			EndIf
		Until quit = #True

		FreeImage(IID)
	EndIf
EndProcedure
; ANG_1 ###########################################################################

;-Example
Width       = 400
Height      = 200
LoadFont(0, "Verdana", 12)
LoadFont(1, "Arial", 32)
Title$      = "About-Requester - TNG "
Text$       = "PureBoard Requester Suite" + #LF$ + "ollys Requester 1 Version 0815" + #LF$ + "Copyleft März 2008"
ScrollText$ = " (: Credits gehen an alle, die in den PureBoards den Anfängern so gut helfen :) "

About(Width, Height, Title$, Text$, ScrollText$, 10, FontID(0), FontID(1))
Zuletzt geändert von HeX0R am 14.03.2008 22:57, insgesamt 1-mal geändert.
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

Re: arng_ugs_01

Beitrag von scholly »

Kiffi hat geschrieben:kann ich leider nicht beantworten.
Dann spratzt es bei Dir also auch :(
Kiffi hat geschrieben:Allerdings ist mir beim durchsehen des Codes folgendes aufgefallen:
Wenn Du ein anderes Fenster über Dein About-Fenster schiebst (eben über
besagten Point(1,1)), dann wird der Hintergrund des scrollenden Textes
natürlich schwarz.
Jetzt wird das vor der Schleife ermittelt. So schenll sollte der Punkt nicht beschattet werden können.
Hexor hat geschrieben:Es ist meistens keine gute Idee direkt auf ein Window zu zeichnen
Ist das die Erklärung für die Spratzer?
Dann taugt das ja als "abschreckendes Beispiel" ;)
Hexor hat geschrieben:besser ein Image nehmen.
Das hab ich Übersprungen.
Die Requester spiegeln wieder, in welchen Schritten ich was "dazugelernt" habe, manche Schritte sind klein, mache größer :lol:

Aber jetzt ist ja Deins da - Editier es bitte so, daß man sieht, daß es von Dir ist und nicht mit einem von mir verwechselt werden kann - für Rückfragen zu Deinem Code sollte sich keiner an mich wenden, nur weil mein Name drinsteht.
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag von HeX0R »

Reicht das ? <)
Antworten