//Installationsprogramm
DialogHinweis
Variabeln
Dialog
CLEAR
EDIT
'
PROCEDURE CB_Static(wnd&,msg&,wparam&,lparam%)
  SELECT msg&                                   ' message()
  CASE WM_CTLCOLOR                              ' farbe wird angefordert
    s%=LOWORD(lparam%)                          ' handle der buttons
    SELECT HIWORD(lparam%)                      ' window-typ (z.Bsp. static,button etc)
    CASE CTLCOLOR_STATIC                        ' Typ=Static
      IF s%=DLGITEM(0,117)                      ' 1. Balkenanzeige
        ~SetBkColor(wparam&,RGB(177,177,177))   ' hg-Farbe = hlgr
        ~SetTextColor(wparam&,RGB(255,0,0))     ' Text-Farbe = rt
        RETVAL brush&                           ' handle des grauen pinsel zurückgeben
      ENDIF                                     ' s% ende
      IF s%=DLGITEM(0,125)                      ' 2. Balkenanzeige
        ~SetBkColor(wparam&,RGB(177,177,177))   ' hg-Farbe = hlgr
        ~SetTextColor(wparam&,RGB(20,255,0))    ' Text-Farbe = gn
        RETVAL brush&                           ' handle des grauen pinsel zurückgeben
      ENDIF                                     ' s% ende
    ENDSELECT
  ENDSELECT
RETURN
//
PROCEDURE Datei(nam$)
  TRY                                   ' fehlerroutine
    IF fehler! THEN GOTO abbruch        ' bei zugriffs fehlern nichts mehr kopieren
    a$=LOWER$(quelle$+nam$)             ' pfad
    balk&=0,e!=FALSE,b%=0               ' label setzen
    IF over!=0 && EXIST(ziel$+"gdv_easy\"+nam$)    ' im ziel ist datei schon vorhanden
      DEFMOUSE 0                        ' mauszeiger pfeil
      SHOWM                             ' mauszeiger zeigen
      ALERT 3,"Datei "+LOWER$(nam$)+" ist bereits vorhanden!",2,"&Kopieren|&Alle|&Übergehen",a&
      HIDEM                             ' mauszeiger verstecken
      IF a&=2 THEN over!=TRUE           ' label ändern
      IF a&=2 THEN SETCHECK 0,114,1     ' kreuz setzen
      IF a&=3 THEN GOTO abbruch         ' nicht kopieren
      DEFMOUSE 2                        ' mauszeiger
    ENDIF                               ' over! ende
    IF EXIST(a$)                        ' datei auf diskette?
      _WIN$(DLGITEM(0,101))=LOWER$(a$)  ' ziel
      _WIN$(DLGITEM(0,120))="Kopiere "+LOWER$(nam$)+"..."
      OPEN "i",#1,a$                    ' öffnen
      bit%=LOF(#1)                      ' anzahl
      a=DIV(bit%,frei%)                 ' 1 prozent der datei vom gesamtvolumen
      IF a<1 THEN a=1                   ' zu kleine datei min 2 %
      teil+=a                           ' aufaddieren
      IF teil>100 THEN teil=100         ' nie über 100%
      a$=LOWER$(ziel$+"gdv_easy\"+nam$) ' pfad
      _WIN$(DLGITEM(0,102))=a$          ' ziel
      OPEN "o",#2,a$                    ' quelle öffnen
      i%=0,b%=0,c=0                     ' zähler =0
      graf%=DIV(bit%,100)               ' wieviel% für datei
      DO                                ' leseschleife
        byte&=INP(#1)                   ' einlesen
        OUT #2,byte&                    ' schreiben
        i%++                            ' zähler +1
        b%++                            ' b wg farbbalken
        IF b%=graf%                     ' wenn +1 %
          b%=0,c++                      ' b löschen
          balk&++                       ' +1 %
          IF balk&>100 THEN balk&=100   ' nie über 100%
          ~SendMessage(DLGITEM(0,118),WM_SETTEXT,0,STR$(balk&)+" %")
          ~SetWindowText(DLGITEM(0,117),STRING$(balk&,"|"))
        ENDIF                           ' b& ende
      LOOP UNTIL i%=bit% OR e!          ' alle bytes
      CLOSE #1                          ' quelle schließen
      CLOSE #2                          ' ziel schließen
      ~SetWindowText(DLGITEM(0,126),STR$(teil)+" %")    ' gesamt prozent
      ~SetWindowText(DLGITEM(0,125),STRING$(teil,"|"))
      ADD zusatz&,1                     ' zusatz +1.0
    ELSE                                ' Fehler
      _WIN$(DLGITEM(0,120))="Datei "+a$+" fehlt!!"
      DELAY 2                           ' 2 sekunden warten
    ENDIF                               ' exist ende
    abbruch:                            ' abfrage wenn datei schon existiert
  CATCH                                 ' Fehlerroutine ende
  FehlerAnzeige                         ' event. Fehler anzeigen
RETURN
//
PROCEDURE ddecb(h&,m&,w&,l%)
  SELECT m&
  CASE WM_DDE_ACK
    pw&=w&
  ENDSELECT
RETURN
//
PROCEDURE DDE_Start
  OPENW #1,0,0,0,0,0
  CB WIN(1),WM_DDE_FIRST TO WM_DDE_LAST,ddecb
  atom&=GlobalAddAtom("Progman")
  SENDMESSAGE -1,WM_DDE_INITIATE,WIN(1),MAKELONG(atom&,atom&)
  IF pw&=0 THEN ERROR 77
  a$="[CreateGroup(""GDV_Easy"",GDVEasy.grp)]"
  a$=a$+"[ShowGroup(""GDV_Easy"",1)]"
  a$=a$+"[AddItem("+ziel$+"gdv_easy\gdv_easy.exe,GDV_Easy)]"
  a$=a$+"[AddItem("+ziel$+"gdv_easy\gdv_empf.exe,GDV_Empfang)]"
  a$=a$+"[AddItem("+ziel$+"gdv_easy\setup.exe,Setup)]"
  a$=a$+"[AddItem("+ziel$+"gdv_easy\gdv_easy.hlp,Informationen)]"
  xeq(a$)
  ~SetFocus(WIN(1))
  POSTMESSAGE pw&,WM_DDE_TERMINATE,WIN(1),0
  ~GlobalDeleteAtom(atom&)
  CLOSEW #1
RETURN
//
PROCEDURE Dialog
  TRY                                           ' fehlerroutine
    DLG 3D ON                                   ' 3d einschalten
    SETMOUSE 470,125                            ' maus setzen
    DIALOG #0,100,75,400,255,"GDV_Easy (c)1994  Installation",DS_MODALFRAME,14,"Times New Roman"
      CONTROL "",95,"static",$10000007,10,10,250,88
      CONTROL "Quelle:",97,"static",SS_LEFT,20,24,65,22
      CONTROL "Ziel:",98,"static",SS_LEFT,20,64,65,22
      CONTROL LOWER$(CHR$(_DRIVE))+":"+LOWER$(pfad$),101,"edit",$50810000,80,20,170,25
      CONTROL "c:\",102,"edit",$50810000,80,60,170,25
      CONTROL "&Installieren",103,"button",$10010001,270,10,110,31
      CONTROL "&Hilfe",104,"button",$10010000,270,45,110,25
      CONTROL "&Abbrechen",105,"button",$10010000,270,73,110,25
      CONTROL "",115,"static",$10000006,10,111,221,71
      CONTROL "",116,"static",$10000007,18,120,206,20
      CONTROL "",117,"static",SS_LEFT,21,121,200,15
      CONTROL "0 %",118,"static",SS_LEFT,241,123,55,20
      CONTROL "",119,"static",$10000007,10,193,370,27
      CONTROL "Installation und Einrichtung von GDV_Easy auf Festplatte.",120,"static",SS_LEFT,20,198,355,18
      CONTROL "#1",121,"static",SS_ICON,343,148,35,35
      CONTROL "",124,"static",$10000007,18,153,206,20
      CONTROL "",125,"static",SS_LEFT,21,154,200,15
      CONTROL "0 %",126,"static",SS_LEFT,241,158,55,20
    ENDDIALOG                                   ' aufbau ende
    SHOWDIALOG #0                               ' Dialog zeigen
    ~SetFocus(DLGITEM(0,103))                   ' focus auf installieren
    e!=FALSE                                    ' Label ausgang
    CB DLG(0),0 TO -1,CB_Static()               ' wg Farbe CB aufrufen
    DO                                          ' message schleife
      GETEVENT                                  ' message 20 ms
      IF MENU(1)=30                             ' wenn item message
        SWITCH MENU(6)                          ' Nummer ID
        CASE 103                                ' Installieren
          fehler!=FALSE                         ' label löschen
          Installation                          ' aufrufen
          ~BringWindowToTop(DLG(0))             ' dlg nach vorne
          SETMOUSE 470,188                      ' maus setzen
        CASE 104                                ' Hilfe
          f!=WinHelp(DLG(0),pfad$+"\gdv_easy.hlp",HELP_KEY,"Setup")
        CASE 105                                ' Abbruch
          e!=TRUE                               ' label setzen
        ENDSWITCH                               ' menu(6) ende
      ENDIF                                     ' menu(1) ende
    LOOP UNTIL e!                               ' ausgang
    CLOSEDIALOG #0                              ' dialog schließen
    DLG 3D OFF                                  ' 3d abschalten
    ~SetErrorMode(0)                            ' Errors wieder anzeigen
    ~DeleteObject(brush&)                       ' pinsel löschen
  CATCH                                         ' Fehlerroutine ende
  FehlerAnzeige                                 ' event. Fehler anzeigen
RETURN
//
PROCEDURE DialogHinweis
  TRY                                           ' fehlerroutine
    DLG 3D ON                                   ' 3d einschalten
    DIALOG #0,100,75,323,325,"GDV_Easy-Setup",DS_MODALFRAME,14,"Times New Roman"
      CONTROL "",100,"static",$10000007,10,20,290,230
      CONTROL "",101,"static",$10000007,15,25,280,220
      CONTROL "Ein Hinweis zum Installieren:",105,"static",SS_CENTER,20,35,270,20
      CONTROL "Scholz-Software verändert keine INI-Dateien",106,"static",SS_CENTER,20,35,270,20
      CONTROL "und kopiert auch nichts in das Windows oder",107,"static",SS_CENTER,20,55,270,20
      CONTROL "Systemverzeichnis, wie andere Programme das",108,"static",SS_CENTER,20,75,270,20
      CONTROL "leider immer wieder machen. Das heißt für Sie",109,"static",SS_CENTER,20,95,270,20
      CONTROL "als Anwender: Wenn Sie GDV_Easy wieder löschen",110,"static",SS_CENTER,20,115,270,20
      CONTROL "wollen, so löschen Sie einfach mit dem Datei-",111,"static",SS_CENTER,20,135,270,20
      CONTROL "manager das Verzeichnis GDV_Easy oder über DOS",112,"static",SS_CENTER,20,155,270,20
      CONTROL "mit dem Befehl deltree. So einfach kann es",113,"static",SS_CENTER,20,175,270,20
      CONTROL "gehen. Ihr Windows wird nicht größer!",114,"static",SS_CENTER,20,195,270,20
      CONTROL "GARANTIERT! Ihre Scholz-Software.",115,"static",SS_CENTER,20,215,270,20
      CONTROL "&Sehr gut!",1,"button",$10010001,90,260,140,30
    ENDDIALOG                                   ' aufbau ende
    SHOWDIALOG #0                               ' diag zeigen
    SETMOUSE 310,290                            ' maus setzen
    ~SetFocus(DLGITEM(0,1))                     ' focus auf Super!
    DO                                          ' message schleife
      GETEVENT                                  ' message 20 ms
    LOOP UNTIL MENU(1)=30 && MENU(6)=1          ' ausgang
    CLOSEDIALOG #0                              ' dialog schließen
  CATCH                                         ' Fehlerroutine ende
  FehlerAnzeige                                 ' event. Fehler anzeigen
RETURN
//
PROCEDURE FehlerAnzeige
  ~SetErrorMode(0)                              ' Errors wieder anzeigen
  CLOSE #1                                      ' quelle schliessen
  CLOSE #2                                      ' ziel schliessen
  ~SetActiveWindow(DLG(1))                      ' dlg 1 aktivieren
  ~EnableWindow(DLG(1),TRUE)                    ' Enable aufheben
  ~ReleaseCapture()                             ' sperren freigeben
  CLIPCURSOR                                    ' cursor freigeben
  SHOWM                                         ' mauszeiger
  DEFMOUSE 0                                    ' pfeil
  IF ERR=-13 OR ERR-2                           ' datei zugriff fehler
    CHDIR window$                               ' neuer pfad auf window
    CHDRIVE SUB(ASC(LEFT$(LOWER$(window$),1)),96) ' laufwerk einstellen
    fehler!=TRUE                                ' label setzen
    _WIN$(DLGITEM(0,120))="Zugriffsfehler beim Installieren!"
  ENDIF                                         ' err ende
  SHOWM                                         ' mauszeiger zeigen
  MESSAGE "Fehlercode: "+STR$(ERR)+CHR$(13)+"Fehlertext  : "+ERR$(ERR),"Achtung! Fehler im Programm!",$0010,a&
  HIDEM                                         ' mauszeiger verstecken
  ~EnableWindow(DLGITEM(0,103),TRUE)            ' installieren normal
  ~EnableWindow(DLGITEM(0,104),TRUE)            ' Hilfe normal
  ~EnableWindow(DLGITEM(0,105),TRUE)            ' abbrechen normal
  ~SetErrorMode(1)                              ' Errors nicht anzeigen
RETURN
//
PROCEDURE Installation
  TRY                                                           ' fehlerroutine
    DEFMOUSE 2                                                  ' sanduhr
    ~EnableWindow(DLGITEM(0,103),FALSE)                         ' installieren sperren
    ~EnableWindow(DLGITEM(0,104),FALSE)                         ' hilfe sperren
    ~EnableWindow(DLGITEM(0,105),FALSE)                         ' abbrechen sperren
    SETMOUSE ADD(MOUSESX,60),ADD(MOUSESY,200)                   ' mauszeiger tiefer setzen
    HIDEM                                                       ' mauszeiger weg
    quelle$=LOWER$(TRIM$(_WIN$(DLG(0,101))))                    ' quelle
    ziel$=LOWER$(TRIM$(_WIN$(DLG(0,102))))                      ' ziel
    IF RIGHT$(quelle$,1)<>"\" THEN quelle$=quelle$+"\"          ' mit \
    IF RIGHT$(ziel$,1)<>"\" THEN ziel$=ziel$+"\"                ' mit \
    IF TRIM$(quelle$)=TRIM$(ziel$) THEN fehler!=TRUE            ' wenn quelle gleich Ziel = Fehler!
    frei%=DIV(gesamt%,100)                                      ' 1% der gesamten bytes auf diskette
    IF EXIST(quelle$+"*.*") && fehler!=FALSE                    ' Pfade ok?
      Verzeichnis("gdv_easy","")                                ' hauptverzeichnis
      Verzeichnis("daten","gdv_easy\")                          ' unterverzeichnis
      Verzeichnis("empfang","gdv_easy\")                        ' unterverzeichnis
      teil=2,over!=0                                            ' 2% für verzeichnisse
      _WIN$(DLGITEM(0,126))="2 %"                               ' gesamt prozent
      _WIN$(DLGITEM(0,125))="|"                                 ' anzeigen
      Datei("gdv_easy.ini")                                     ' Datei
      Datei("firmen.bmp")                                       ' Datei
      Datei("m_liste.dat")                                      ' Datei
      Datei("menue.dat")                                        ' Datei
      Datei("avon.txt")                                         ' Datei
      Datei("ctl3d.dll")                                        ' Datei
      Datei("gdv_easy.exe")                                     ' Datei
      Datei("gdv_empf.exe")                                     ' Datei
      Datei("setup.exe")                                        ' Datei
      Datei("gdv_easy.hlp")                                     ' Datei
      FOR i&=1 TO 31                                            ' dialog help-dateien
        IF EXIST(quelle$+"daten\dialog"+DEC$(i&,2)+".hlp") THEN Datei("daten\dialog"+DEC$(i&,2)+".hlp")  ' Datei
      NEXT i&                                                   ' i& ende
      Datei("info.cfg")                                         ' Datei
      Datei("daten\gebuehr.cfg")                                ' Datei
      Datei("daten\kostengr.cfg")                               ' Datei
      Datei("daten\firma.dat")                                  ' Datei
      Datei("daten\hotel.dat")                                  ' Datei
      nein!=FALSE                                               ' wg pfad ändern
      _WIN$(DLGITEM(0,120))="Eröffne eine neue Gruppe..."       ' hinweis
      DELAY 1                                                   ' warten
      IF fehler!=0 THEN DDE_Start                               ' Gruppe erzeugen
      _WIN$(DLGITEM(0,120))="Ändere gdv_easy.ini..."            ' hinweis
      version&=1,anzg!=TRUE,dat$="firma.dat"                    ' Firmenversion Voreinstellung
      a$=FN WriteProfile$("KONFIG","Version",STR$(version&),ziel$+"\gdv_easy\gdv_easy.ini")
      a$=FN WriteProfile$("KONFIG","AktuellCombobox",STR$(anzg!),ziel$+"\gdv_easy\gdv_easy.ini")
      a$=FN WriteProfile$("KONFIG","LadenStart",dat$,ziel$+"\gdv_easy\gdv_easy.ini")
      DELAY 1                                                   ' kurze pause
      _WIN$(DLGITEM(0,101))=quelle$                             ' quelle
      _WIN$(DLGITEM(0,102))=ziel$                               ' ziel
      _WIN$(DLGITEM(0,126))="100 %"                             ' 100% erreicht
      _WIN$(DLGITEM(0,125))=STRING$(100,"|")                    ' balken voll
      _WIN$(DLGITEM(0,120))="Installation von GDV_EASY ist fertig!"
      _WIN$(DLGITEM(0,105))="&Beenden"                          ' text ändern
    ELSE                                                        ' fehler quelle
      fehler!=TRUE                                              ' label setzen
      _WIN$(DLGITEM(0,120))="Wegen Zugriffsfehler Installation abgebrochen!"
    ENDIF                                                       ' ende exist quelle
    IF fehler! THEN ~EnableWindow(DLGITEM(0,103),TRUE)          ' Installieren normal
    ~EnableWindow(DLGITEM(0,104),TRUE)                          ' Hilfe normal
    ~EnableWindow(DLGITEM(0,105),TRUE)                          ' abbrechen normal
    SHOWM                                                       ' mauszeiger zeigen
    DEFMOUSE 0                                                  ' pfeil
  CATCH                                                         ' Fehlerroutine ende
  FehlerAnzeige                                                 ' event. Fehler anzeigen
RETURN
//
PROCEDURE Variabeln
  TRY                                   ' fehlerroutine
    gesamt%=1200000                     ' Gesamten Bytes des Programms auf Diskette ca. 1,2 MB
    proz$="0 %"                         ' wg redraw
    gesamt&=550                         ' 550 Kilobyte
    balk&=0,teil=0,a=0                  ' breite balken
    pfad$=DIR$(0)                       ' aktueller programm pfad
    window$=SPACE$(100)                 ' vorbelegen
    n&=GetWindowsDirectory(V:window$,100) ' wo ist windows
    window$=LEFT$(TRIM$(window$),PRED(LEN(TRIM$(window$))))   ' chr$(0) am ende löschen
    IF EXIST(pfad$+"\ctl3d.dll")        ' 3D-Datei
      a$=TRIM$(LEFT$(window$,n&))       ' leerzeichen weg
      IF NOT EXIST(window$+"\ctl3d.dll")' ctl3d.dll nicht in windows
        OPEN "i",#1,pfad$+"\ctl3d.dll"  ' quelle öffnen
        OPEN "o",#2,window$+"\ctl3d.dll"' ziel öffnen
        DO                              ' leseschleife
          byte&=INP(#1)                 ' einlesen
          OUT #2,byte&                  ' schreiben
        LOOP UNTIL EOF(#1)              ' alle bytes
        CLOSE #1                        ' quelle schliessen
        CLOSE #2                        ' ziel schliessen
      ENDIF                             ' not exist ende
    ENDIF                               ' exist ende
    block&=0,b%=0,bit%=0                ' Vars definieren
    ~SetErrorMode(1)                    ' Errors durch Windows nicht anzeigen
    brush&=CreateSolidBrush(RGB(192,192,192)) ' grauen pinsel erzeugen wg CB
  CATCH                                 ' Fehlerroutine ende
  FehlerAnzeige                         ' event. Fehler anzeigen
RETURN
//
PROCEDURE Verzeichnis(a$,c$)
  TRY                                   ' fehlerroutine
    IF fehler! THEN GOTO verzeichnis    ' wegen fehler kein verzeichnis mehr erzeugen
    FILES ziel$+c$ TO window$+"\files.dat" ' fileliste vom ziel
    OPEN "i",#1,window$+"\files.dat"    ' fileliste vom ziel erzeugen
    e!=FALSE                            ' label löschen
    WHILE NOT EOF(#1) OR e!             ' suchen, ob verzeichnis existiert
      INPUT #1,b$                       ' file einlesen
      IF INSTR(LOWER$(b$),a$)>0 THEN e!=TRUE ' ist das gesuchte verzeichnis vorhanden?
    WEND                                ' einleseschleife
    CLOSE #1                            ' datei schliessen
    KILL window$+"\files.dat"           ' fileliste löschen
    IF e!=FALSE                         ' nicht gefunden
      _WIN$(DLGITEM(0,120))="Erzeuge "+ziel$+c$+a$
      MKDIR ziel$+c$+a$                 ' erzeugen
    ELSE                                ' verzeichnis schon vorhanden
      _WIN$(DLGITEM(0,120))=ziel$+c$+a$+" existiert schon!"
    ENDIF                               ' e! ende
    DELAY 1                             ' 1 seec. warten
    CLR a$,b$,e!,c$                     ' Vars löschen
    verzeichnis:                        ' abbruchmarke bei fehler
  CATCH                                 ' Fehlerroutine ende
  FehlerAnzeige                         ' event. Fehler anzeigen
RETURN
//
PROCEDURE xeq(a$)
  cmdmem&=GlobalAlloc(GMEM_DDESHARE,LEN(a$)+1)
  CHAR{GlobalLock(cmdmem&)}=a$
  POSTMESSAGE pw&,WM_DDE_EXECUTE,WIN(1),MAKELONG(cmdmem&,0)
  DO
    PEEKEVENT
  LOOP UNTIL MENU(11)=0
  ~GlobalFree(cmdmem&)
RETURN
//
FUNCTION ProfileString$(a$,b$,c$)
  CLR t$                                        ' t$ löschen
  t$=SPACE$(60)                                 ' vorbelegen
  a%=GetPrivateProfileString(a$,b$,"",V:t$,60,c$)
  pos&=INSTR(t$,CHR$(0))                        ' shit nullbyte
  IF pos&>0 THEN MID$(t$,pos&,1)=" "            ' löschen
  CLR pos&,a$,b$,c$                             ' Var löschen
  RETURN TRIM$(t$)
ENDFUNC
//
FUNCTION WriteProfile$(a$,b$,c$,d$)
  CHDRIVE lauf$
  CHDIR pfad$
  ~WritePrivateProfileString(a$,b$,c$,d$)
  CLR a$,b$,c$,d$
  RETURN STR$(TRUE)
ENDFUNC
