Autor | Thema: externe prc-datei einbinden ??? | | Datum:15.07.02 16:10 
| |
hallo profaner,
ich bin dabei mich mit profan 5,0 zu arbeiten.
nun ist mein programm schon so groß, das ich den überblick nicht mehr so recht habe.
ist es möglich eine externe datei die in prc compiliert wurde von einer proc zu startem ?
z.b.:
'---------------------------------------------
proc 1
xxx1.prc
endproc
proc 2
xxx2.prc
endproc
proc 3
xxx2.prc
endproc
'hauptprogramm
1 'proc 1 starten
'---------------------------------------------
und in proc 1 soll z.b. ein neues fenster aufgebaut werden.
und hier noch ein problem:
ich kann von proc 3 nach 2 oder 1
aber nicht von proc 1 nach 2 oder 3 springen, wieso ???
mfg
volker lemke
|
| | Datum:15.07.02 16:40 
| |
Hallo,
mit .prc Dateien geht das, denke ich nicht, du kannst aber .inc Dateien einbinden $I. Das ist noch viel praktischer.
Beim Compilieren geht Profan von vorne nach hinten vor, Proc 3 ist Proc 1 also noch unbekannt und kann somit auch nicht aufgerufen werden.
Gruß, Frank
|
| | Datum:15.07.02 16:43 
(mrk@mrk-soft.de) | |
Hallo,
>nun ist mein programm schon so groß, das ich den überblick
>nicht mehr so recht habe.
>ist es möglich eine externe datei die in prc compiliert wurde
>von einer proc zu startem ?
PRC Dateien nicht, aber den Quellcode, wo die Proceduren
stehen, läst sich einbinden, das nennt man Include Files.
Bei DLLs sind meist solche Include Files sehr beleibt,
dort stehen viele PROC Teile, wo die DLL aufgerufen wird.
kleines Beispiel:
Programm: funktionen.inc
proc teil1
rem ** irgendwas
endproc
proc teil2
rem ***
print "Halllo"
endproc
'und so weiter.
Im Hauptprogramm läst sich nun diese INCLUDE einbinden,
als ob diese bestandteil deines Programms wären:
Programm: demo.prf
$I functionen.inc 'Quellcode einbinden
test2
waitkey
>und hier noch ein problem:
>ich kann von proc 3 nach 2 oder 1
>aber nicht von proc 1 nach 2 oder 3 springen, wieso ???
Das hat mit der Struktur im Programm zu tun. Ein Programm
beginnt immer an Anfang, oder Adresse 0, und Arbeitet es
Zeile für Zeile ab. Trift es nun auf ein PROC, so führt
es nicht den Code darinn aus, sondern merkt sich nur die
Adresse, wo die PROC zu finden ist.
Symbolisch sind hier die Zeilennummern bzw. Adressen:
00: (Programm anfang)
01: proc test1
02: rem *** irgendwas ***
03: endproc
04: cls
05: test1
06: proc test2
07: rem ***
08: endproc
Beim Start beginnt das ganze bei Adresse 0, Profan liest nun
Zeile für Zeile aus. Bei 01 trift es auf ein PROC und merkt
sich nun Intern, das test1 bei Adresse 01 zu finden ist,
und sucht nun das passende ENDPROC, wo es mit der Ausfürung
weiter macht, also ab 04. Bei 04 wird mit Cls der Bildscirm
gelöscht, und bei 05 wird nun die eine Proc "test1" aufgerufen.
Diese ist auch bekannt, da Profan diese Zeilen schon gelesen
hat. alles hinter dem Code , also ab Adresse 06 volgend, ist
noch komplett unbekannt, daher weiss Profan hier nicht, das
es noch eine Proc "test2" gibt. Daher würd die Zeile
05: test2
NICHT funktionieren, die Proc wurde also noch nicht
erkannt.
Kurz um gesagt, Profan kann nur jede Proceduren abarbeiten,
die IMMER über den aufruf stehen:
Am Sinnvollsten ist es also, alls Procs am Anfang des Programs
zu legen, also immer oben, und darunter dann der weitere
Code.
|
| | Datum:15.07.02 17:10 
| |
hallo ihr beiden,
bei mein 2ten beispiel geht das programm doch erst
proc 1 dann 2 und dann 3 ab, und dann kommt der aufruf für proc 1
wen es nun von 1 nach 3 soll, kennt es doch schon 3 von ersten durchlauf oder ?
|
| | Datum:15.07.02 17:12 
| |
oder wie kann ich eine proc wieder verlassen, so das es sich wieder nach unten durcharbeitet.
|
| | Datum:15.07.02 17:16 
| |
ich meine jetzt
proc 3
if @getfocus(buttonX&)
1 'proc
ElseIf @getfocus(buttonY&)
2 'proc
endif
endproc
|
| | Datum:15.07.02 17:39 
| |
Hi,
du kannst eine Procedure zu jedem Zeitpunkt mit >Return< wieder verlassen.
Gruß, Frank
|
| | Datum:15.07.02 17:58 
| |
hallo frank,
wen die prozedur angesprochen wird, wird ein neues dialog-fenster erstellt.
und wen der button exit gedrückt wird kommt:
@destroyWindow(D%) 'dialog beenden
und wen ich nun im hauptfenster bin, geht kein button mehr.
also hängt der noch ergendwo fest, nur wo ?
ich habe das mit dem return auch schon probiert, allerdings ohen erfolg.
habe das return unter und über @destroyWindow(D%)gemacht, geht aber trotzdem nicht :-(
mfg
volker
|
| | Datum:15.07.02 19:10 
(webmaster@roksoft.de) | |
Hi Volker,
aufjedenfall hängt das Programm noch dort, wo die Proc ist.
Du musst, wenn Du in der Proc ein Dialog erstellst, diesen auch in eine Schleife setzen:
Proc DIALOG_1
...
let blabla%=createdialog(.....)
let bend%=createbutton(....)
....
let dialogende%=0
while equ(dialogende%,0)
if getfocus(bend%)
let dialogende%=1
elseif .....
elseif .....
endif
wend
destroywindow(blabla%)
Endproc
CLS
WHILENOT ENDE%
WAITINPUT
if ......
DIALOG_1
' UND HIER GEHTS ERST WEITER, WENN DIE
' SCHLEIFE IN DIALOG_1 BEENDET WIRD.
' UND SCHON REAGIEREN DIE BUTTONS IM
' HAUPTFENSTER WIEDER ;)
elseif .....
endif
WEND
ROLF
|
| | Datum:15.07.02 20:03 
| |
hallo rolf,
habe es nun so gemacht und es funzt immer noch nicht :-(
habe hinter der proc eine einfache
------------
cls
waitkey
------------
anweisung gesetzt die nicht ausgeführt wird. hier mal ein teil von mein prog.
Proc xxx
Declare D%,FensterEnde%
...
... 'Button Erstellen
... ' & & &
Let FensterEnde% = 0
while equ(FensterEnde%,0)
WaitInput
'----- Button klick Abfragen -----
If @getfocus(ButtonExit&)
Let FensterEnde%=1
ElseIf @getfocus(ButtonListe&)
Liste
ElseIf @getfocus(ButtonAendern&)
Aendere
ElseIf @getfocus(ButtonHinzufuegen&)
Hinzufügen
ElseIf @getfocus(ButtonSuchen&)
Suche
EndIf
Wend
@DestroyWindow(D%)
ENDPROC
CLS
WaitKey
drücke ich nu (ButtonExit&) kommt es bis @DestroyWindow(D%)und danach geht mein hauptfenster immer noch nicht :-(
mfg
volker
|
| | Datum:15.07.02 20:37 
| |
Hi,
du kannst nur ein Hauptfenster gleichzeitig geöffnet haben...
Andere Fenster mußt du mit Dialogfenstern erzeugen.
Wenn du das Hauptfenster neu positionieren willst oder in der Größe ändern willst, dann genügt ein weiterer Aufruf von Windows ?,?-?,?
Gruß, Frank
|
| | Datum:15.07.02 20:56 
(webmaster@rokosoft.de) | |
@Frank
Besser wäre aber SetWindowPos um ein Fenster zu positionieren.
@Volker
Leider kennen wir Deien Code ja nicht richtig.
Irgendwo bleibt das Teil wirklich hängen.
Tip: Schreib mal unter Dein @destroywindow ein TRACEON
und schon kannste den Weg verfolgen, welchen Dein Code
geht.
Bedeutet: Wenn er irgendwo in einer Schleife (ausserhalb der Hauptschleife) hängenbleibt,
dann siehste das immer wieder die selben Anweisungen kommen.
Rolf
|
| | Datum:15.07.02 21:12 
| |
das ja ne supi sache´mit dem TRACEON :-)
als, das programm geht danach zu EndProc und springt von da in hauptteil mitten in einer ElseIf abfrage ? und von da nach WEnd
dann zu WhileNot und wartet WaitInput, aber ohne funktion :-)
ps: frank, ich habe 1 hauptfenster und danach dialoge ;-)
|
| | Datum:15.07.02 21:16 
(webmaster@rokosoft.de) | |
Nochmal @Volker
Declare D%,FensterEnde%,buttonexit&
Declare Button1&,ende%
Proc xxx
let D%=Createdialog(%hwnd,"JA ICH BINS ;)",10,10,300,200)
let buttonexit&=CreateButton(D%,"... und zurück ins Hauptfenster",10,32,220,25)
Let FensterEnde% = 0
while equ(FensterEnde%,0)
WaitInput
If @getfocus(ButtonExit&)
Let FensterEnde%=1
ElseIf @getfocus(ButtonListe&)
Liste
EndIf
Wend
@DestroyWindow(D%)
ENDPROC
WINDOW 0,0-500,500
WINDOWTITLE "... und so geht es!"
Let Button1&=CreateButton(%hwnd,"ab in die Proc",30,32,172,25)
Print "Du siehst, egal wo man klickt,"
Print "es geht wieder überall zurück ;)"
Whilenot ende%
Waitinput
if @getfocus(Button1&)
XXX
endif
Wend
... und so gehts aufjedenfall - studier dieses kleine Beispiel im Vergleich mit Deinem Code.
Rolf
|
| | Datum:15.07.02 21:20 
(webmaster@rokosoft.de) | |
und noch'n Tip
Compiliere den Code mal.
Vielleicht haste auch irgendwo in Deiner Hauptstruktur ein IF o.ä. vergessen.
Dann sagt Dir der Compiler bescheid ;)
Rolf
|
| | Datum:15.07.02 22:10 
(prof.chaos@netcologne.de) | |
Hallo Rolf,
> Vielleicht haste auch irgendwo in Deiner Hauptstruktur ein IF o.ä. vergessen.
> Dann sagt Dir der Compiler bescheid ;)
Das gibt's erst ab Profan 6.5. Volker hat aber Version 5.
Sebastian
|
| | Datum:15.07.02 22:27 
(webmaster@rokosoft.de) | |
Oja, richtig Sebastian.
Tja Volker, dann lad Dir PRFPAD herunter (wenn Du es noch nicht hast) http://www.prfpad.de/ Freeware und nun der Standarteditor für Profan.
Dort unter "BEARBEITEN/QUELLTEXT ÜBERPRÜFEN" den Code abchecken lassen.
Damit gehts auch super ;)
Rolf
|
| | Datum:16.07.02 08:23 
(schmidts@flat2serv.de) | |
Und der funktioniert mit allen Profan² Versionen ... Zu den Prodzeduraufrufen: Profan² unterstützt keine Vorwärts-Deklarationen. Dazu müssten Prototypen eingeführt oder der Compiler in einen 2-Path-Compiler geändert werden:
Der Compiler beginnt bei Zeile 1 und endet an der letzten Zeile. Jede Prozedur wird dabei durch einen Zeiger ersetzt (Zeile 2). Erfolgt nun später im Programm (Zeile 17) ein Aufruf dieser Prozedur, wird stattdessen der Zeiger auf diese (also auf Zeile 2) eingefügt. Damit der Zeiger eingefügt werden kann muss die Prozedur bekannt sein, daher muss sie vor dem Aufruf vorhanden sein.
Mfg.
Sven Schmidts
|
| | Datum:16.07.02 10:24 
| |
gunten morgen an alle,
das mit dem PROFAN-PAD ist ja ne super sachen, kann ich sogar mit dem mausrad arbeiten :-)
es wurde aber keine fehler gefunden :-(
es springt von der (proc) in die if rein, wo es aufgehört hat.
gruß
volker
|
| | Datum:16.07.02 12:41 
(webmaster@rokosoft.de) | |
Hi Volker,
dann schick mir mal den Code zu (wenn Du willst) und ich kuck mal durch. Mailadresse steht ja oben rechts.
Rolf
|
|
|