Einsteigerfragen zur PROFAN Programmierung

| Suchen
Seiten: 1 2 | Zurück zur Übersicht

Autor | Thema: externe prc-datei einbinden ???
Volker Lemke
| 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
Frank Abbing
| 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
Thorsten
| 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.
Volker
| 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 ?
Volker
| Datum:15.07.02 17:12 |
oder wie kann ich eine proc wieder verlassen, so das es sich wieder nach unten durcharbeitet.
Volker
| Datum:15.07.02 17:16 |
ich meine jetzt proc 3 if @getfocus(buttonX&) 1 'proc ElseIf @getfocus(buttonY&) 2 'proc endif endproc
Frank Abbing
| Datum:15.07.02 17:39 |
Hi, du kannst eine Procedure zu jedem Zeitpunkt mit >Return< wieder verlassen. Gruß, Frank
Volker
| 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
Rolf Koch
| 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
Volker
| 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
Frank Abbing
| 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
Rolf Koch
| 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
Volker
| 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 ;-)
Rolf Koch
| 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
Rolf Koch
| 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
Sebastian Sprenger
| 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
Rolf Koch
| 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
Sven Schmidts
| 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
Volker
| 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
Rolf Koch
| 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

Seiten: 1 2 | Zurück zur Übersicht

| Ein kostenloses WebMart Forum WebMart Homepage Tools kostenlos |