Seite 2 von 5

Verfasst: 14.03.2008 17:09
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.

Verfasst: 14.03.2008 17:36
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).

Verfasst: 14.03.2008 17:56
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.

Verfasst: 14.03.2008 18:12
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.

Verfasst: 14.03.2008 18:18
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:

Re: arng_ugs_01

Verfasst: 14.03.2008 21:45
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?

Re: arng_ugs_01

Verfasst: 14.03.2008 22:02
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

Verfasst: 14.03.2008 22:27
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))

Re: arng_ugs_01

Verfasst: 14.03.2008 22:52
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.

Verfasst: 14.03.2008 22:58
von HeX0R
Reicht das ? <)