home *** CD-ROM | disk | FTP | other *** search
/ Programming Tool Box / SIMS_2.iso / code / cdspy / my.bas < prev    next >
BASIC Source File  |  1995-02-26  |  49KB  |  1,552 lines

  1. ' Variablendeklaration erzwingen
  2. Option Explicit
  3. ' Textvergleiche erfolgen ohne Rⁿcksicht auf Gross/Kleinschreibung
  4. Option Compare Text
  5.  
  6. ' ----------------------------
  7. ' - Benutzerdefinierte Typen -
  8. ' ----------------------------
  9.  
  10. Type TM_OutlineRec
  11.   Bezeichnung As String * 25
  12.   hat_unter_obj As Integer
  13.   Vaterobj As Long
  14.   Kind As Long
  15.   Vor As Long
  16.   Nach As Long
  17.   Pfad As String * 128
  18.   Ebene As Integer
  19.   Visible As Integer
  20. End Type
  21.  
  22. Type TM_DBRec
  23.   Bezeichnung As String * 35
  24.   Vater As Long
  25.   Verzeichnis As String * 128
  26.   Code As Integer
  27. End Type
  28.  
  29. Type TM_WordsRec
  30.   Wort As String * 30
  31. End Type
  32.  
  33. Type TM_OccursRec
  34.   ID_Wort As Long
  35.   ID_Spy As Long
  36. End Type
  37.  
  38. Type TM_Worte
  39.   Wort As String * 50
  40.   ID As Long
  41. End Type
  42.  
  43. Type TM_AktElement
  44.   Info As String
  45.   Startfile As String
  46.   Demofile As String
  47.   Readmefile As String
  48.   Verzeichnis As String
  49.   Code As Integer
  50.   SetupCommand As String
  51.   Hilfefile As String
  52.   Copy As Integer
  53. End Type
  54.  
  55. ' ---------------------
  56. ' - globale Variablen -
  57. ' ---------------------
  58.  
  59. ' zuletzt mit FM_LiesDB gelesenen Datensatz
  60. Global GM_DB As TM_DBRec
  61. ' gesamte Datenbank
  62. Global GM_DBAll() As TM_DBRec
  63. ' Pfad der Datei CDINFO
  64. Global G_CDInfoFile As String
  65. ' diverses
  66. Global G_Control As Control
  67. ' Pfad des im Editor anzuzeigenden Files
  68. Global G_EditFile As String
  69. ' Liste der zu kopierenden Dateien
  70. Global G_CopyFiles As String
  71. ' Liste aller benutzer W÷rter (Wird in der prod. Version nicht ben÷tigt!)
  72. Global G_Worte() As TM_Worte
  73. ' CD-Laufwerk
  74. Global GM_Drive As String * 2
  75. ' Spy-Datenbank Dateiname
  76. Global GM_DBName As String * 12
  77. ' W÷rterdatenbank Dateiname
  78. Global GM_DBWorte As String * 40
  79. ' Vorkommendatenbank Dateiname
  80. Global GM_DBOccurs As String * 40
  81. ' Array das alle gefundenen Stichwortpositionen enthΣlt
  82. Global GM_Occurs() As TM_OccursRec
  83. ' Flags
  84. Global GM_Refresh As Integer
  85. ' Aktuell ausgewΣhltes Element
  86. Global GM_AktElement As TM_AktElement
  87. ' Suchtext nach dem die aktuelle Suche erfolgt
  88. Global GM_Searchtext As String
  89. ' Dateihandle fⁿr die Datenbank SPY.DAT
  90. Global GM_FH_DBName As Integer
  91. ' Fensterbezeichnung fⁿr F_Search
  92. Global GM_Searchtitle As String
  93. ' Suchstring um im Editor weitersuchen zu k÷nnen
  94. Global GM_SeekString As String
  95. ' Flag, ob der Editor ein ⁿbergrosses File enthΣlt
  96. Global GM_HugeFile As Integer
  97.  
  98. ' ----------------------
  99. ' - globale Konstanten -
  100. ' ----------------------
  101.  
  102. ' Dateinamen
  103. Global Const GCM_INFOFILENAME = "CDINFO.TXT"
  104. Global Const GCM_DBNAME = "\SPY.DAT"
  105.  
  106. ' CDInfo.TXT Topics
  107. Global Const GCM_VERZEICHNIS = "VERZEICHNIS="
  108. Global Const GCM_PROJEKT = "PROJEKT="
  109. Global Const GCM_INFO = "INFO="
  110. Global Const GCM_DEMO = "DEMO="
  111. Global Const GCM_INSTALL = "INSTALL="
  112. Global Const GCM_STARTABLE = "STARTABLE="
  113. Global Const GCM_README = "README="
  114.  
  115. ' Allgemeine Konstanten
  116. Global Const GCM_SEPERATOR = ","
  117. Global Const GCM_OWNER_ERROR = 32767
  118.  
  119. ' INI-Datei Topics
  120. Global Const GCM_EINSTELLUNGEN = "Einstellungen"
  121. Global Const GCM_SPLITT = "Splitt"
  122.  
  123. ' SchaltflΣchen im Cmd_Array
  124. Global Const GCM_CMD_INFO = 0
  125. Global Const GCM_CMD_START = 1
  126. Global Const GCM_CMD_DEMO = 2
  127. Global Const GCM_CMD_COPY = 3
  128. Global Const GCM_CMD_INSTALL = 4
  129. Global Const GCM_CMD_CODE = 5
  130. Global Const GCM_CMD_HILFE = 6
  131. Global Const GCM_CMD_README = 7
  132.  
  133. ' Konstanten fⁿr Textboxhandling
  134. Global Const ON_TAB = 1
  135. Global Const ON_ALT = 2
  136. Global Const ON_MOUSE = 3
  137. Global Const ON_ELSE = 4
  138.  
  139. ' allgemeine Konstanten
  140. Global Const GCM_ENABLE = -1
  141. Global Const GCM_DISABLE = 0
  142. Global Const GCM_STICHWORTSUCHE = "Stichwortsuche"
  143. Global Const GCM_TITELTEXTSUCHE = "Titeltextsuche"
  144.  
  145. ' ---------------------
  146. ' - API-Deklarationen -
  147. ' ---------------------
  148.  
  149. Declare Function SendMessage Lib "User" (ByVal hWnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As String) As Long
  150. Declare Function GetModuleUsage Lib "KERNEL" (ByVal InstanceID%) As Integer
  151. Declare Function EnableWindow% Lib "User" (ByVal hWnd%, ByVal aBOOL%)
  152. Declare Function GetProfileString Lib "Kernel" (ByVal lpAppName As String, ByVal lpKeyName As String, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Integer) As Integer
  153. Declare Function GetAsyncKeyState Lib "User" (ByVal vKey As Integer) As Integer
  154.  
  155. ' ------------------------------------------------------------------
  156. ' Erzeugt das ⁿbergebene Unterverzeichnis verz$.
  157. ' ------------------------------------------------------------------
  158. Function FM_CreateDirectory (verz$)
  159.   Dim L_TmpVerz$, L_Verz$, L_Res%, L_TmpDrive$
  160.   
  161.   On Error GoTo Err_FM_CreateDirectory
  162.   If FM_ExistDir(verz$) Then
  163.     FM_CreateDirectory = 2
  164.     Exit Function
  165.   End If
  166.   L_Res% = True
  167.   L_TmpDrive$ = CurDir$
  168.   ChDrive verz$
  169.   L_TmpVerz$ = CurDir$
  170.   ChDir "\"
  171.   L_Verz$ = FM_ParseZeile(verz$, "\")
  172.   Do While L_Verz$ <> ""
  173.     L_Verz$ = Left$(FM_ParseZeile("", ""), 8)
  174.     If L_Verz$ <> "" Then
  175.       MkDir (L_Verz$)
  176.       ChDir (L_Verz$)
  177.     End If
  178.   Loop
  179.   
  180.   ChDrive L_TmpDrive$
  181.   ChDir (L_TmpVerz$)
  182.   
  183. Ende_FM_CreateDirectory:
  184.     FM_CreateDirectory = L_Res%
  185.   Exit Function
  186. Err_FM_CreateDirectory:
  187.   Select Case Err
  188.     Case Is = 75
  189.       Resume Next
  190.     Case Else
  191.       MsgBox "Das gewⁿnschte Verzeichnis konnte gar nicht oder nur teilweise erstellt werden! Die Funktion wird abgebrochen!", 48, "Fehler"
  192.   End Select
  193.   L_Res% = False
  194.   Resume Ende_FM_CreateDirectory
  195. End Function
  196.  
  197. ' --------------------------------------------------------
  198. ' True, wenn das Verzeichnis Dirn$ existiert, sonst false
  199. ' --------------------------------------------------------
  200. Function FM_ExistDir% (Dirn$)
  201.   Dim L_Dir$
  202.   On Error Resume Next
  203.   L_Dir$ = Dir$(Dirn$, 16)
  204.   If (Err <> 0) Or (L_Dir$ = "") Then
  205.     FM_ExistDir% = False
  206.   Else
  207.     FM_ExistDir% = True
  208.   End If
  209. End Function
  210.  
  211. ' --------------------------------------------------------
  212. ' Liefert True, wenn die Datei Dn$ existiert sonst false
  213. ' --------------------------------------------------------
  214. Function FM_Exists% (dn$)
  215.   Dim L_Dir$
  216.   On Error Resume Next
  217.   L_Dir$ = Dir$(dn$, 32)
  218.   FM_Exists = Not ((Err <> 0) Or (L_Dir$ = "") Or (Right$(dn$, 1) = "\"))
  219. End Function
  220.  
  221. Function FM_GetAktInfo () As String
  222.   FM_GetAktInfo = GM_AktElement.Info$
  223. End Function
  224.  
  225. Function FM_GotFocusON ()
  226.   Const KEY_TAB = &H9
  227.   Const KEY_MENU = &H12
  228.   Const KEY_LBUTTON = &H1
  229.   If GetAsyncKeyState(KEY_MENU) = &H8001 Then
  230.     FM_GotFocusON = ON_TAB
  231.   ElseIf GetAsyncKeyState(KEY_MENU) = &H8001 Then
  232.     FM_GotFocusON = ON_ALT
  233.   ElseIf GetAsyncKeyState(KEY_LBUTTON) = &H8001 Then
  234.     FM_GotFocusON = ON_MOUSE
  235.   Else
  236.     FM_GotFocusON = ON_ELSE
  237.   End If
  238. End Function
  239.  
  240. ' --------------------------------------------------------
  241. ' Liest aus der Datei GCM_DBNAME den Datensatz an der
  242. ' Stelle ID& und liefert entweder die Position des ge-
  243. ' lesenen Datensatzes oder 0 zurⁿck (Positionen von 1 bis)
  244. ' --------------------------------------------------------
  245. Function FM_LiesDB (ID&)
  246.   On Error Resume Next
  247.   If ID& > 0 Then
  248.     If ID& <= UBound(GM_DBAll) Then
  249.       If GM_DBAll(ID&).Verzeichnis <> "" Then
  250.         Get #GM_FH_DBName%, ID&, GM_DB
  251.       Else
  252.         GM_DB = GM_DBAll(ID&)
  253.       End If
  254.       FM_LiesDB = ID&
  255.     Else
  256.       FM_LiesDB = 0
  257.     End If
  258.   End If
  259. End Function
  260.  
  261. ' --------------------------------------------------------
  262. ' Liefert die gr÷ssere der beiden Zahlen x und y
  263. ' --------------------------------------------------------
  264. Function FM_Max (x, Y)
  265.   If x > Y Then
  266.     FM_Max = x
  267.   Else
  268.     FM_Max = Y
  269.   End If
  270. End Function
  271.  
  272. ' --------------------------------------------------------
  273. ' Liefert die kleinere der beiden Zahlen x und y
  274. ' --------------------------------------------------------
  275. Function FM_Min (x, Y)
  276.   If x < Y Then
  277.     FM_Min = x
  278.   Else
  279.     FM_Min = Y
  280.   End If
  281. End Function
  282.  
  283. ' --------------------------------------------------------
  284. ' Die Funktion Parse_Zeile liefert aus einer gegebenen
  285. ' Zeile die Zeichenkette bis zum ersten Zeichen ch$ zurⁿck
  286. ' und reduziert die Zeile auf den nachfolgenden Teil der
  287. ' Zeile ▄ber den Parameter Zeile$ wird die Zeile zur Initia-
  288. ' lisierung ⁿbergeben. Zum Abrufen der Werte wird ein
  289. ' Leerstring als Zeile$ ⁿbergeben
  290. ' --------------------------------------------------------
  291. Function FM_ParseZeile$ (zeile$, ch$)
  292.   Static L_Txt$, L_Zch$
  293.   Dim L_Tmp$
  294.   ' Eine Zeile$ ungleich "" bedeutet Initialisierung
  295.   If zeile$ <> "" Then
  296.     ' Zeile initialisieren
  297.     L_Txt$ = zeile$ + ch$
  298.     L_Zch$ = ch$
  299.   End If
  300.   If Trim$(L_Txt$) <> "" Then
  301.     ' Zeichenkette bis zum ersten Separator bestimmen
  302.     L_Tmp$ = Left$(L_Txt$, InStr(L_Txt$, L_Zch$) - 1)
  303.     ' Zeile auf Teil nach erstem Separator reduzieren
  304.     L_Txt$ = LTrim$(Mid$(L_Txt$, InStr(L_Txt$, L_Zch$) + 1))
  305.   End If
  306.   FM_ParseZeile$ = L_Tmp$
  307. End Function
  308.  
  309. ' ------------------------------------------------------------------------
  310. ' Liefert True, wenn die Formen bei einem Refresh neue Daten holen sollen
  311. ' ------------------------------------------------------------------------
  312. Function FM_Refresh% ()
  313.   FM_Refresh% = GM_Refresh%
  314. End Function
  315.  
  316. ' --------------------------------------------------------
  317. ' HΣngt den Datensatz GM_DB an die Datenbank GCM_DBNAME an
  318. ' und liefert die Position des geschriebenen Datensatzes
  319. ' zurⁿck
  320. ' --------------------------------------------------------
  321. Function FM_SchreibDB ()
  322.   Dim L_FilePosition%
  323.   L_FilePosition% = (LOF(GM_FH_DBName%) / Len(GM_DB)) + 1
  324.   Put #GM_FH_DBName%, L_FilePosition%, GM_DB
  325.   FM_SchreibDB = L_FilePosition%
  326. End Function
  327.  
  328. ' --------------------------------------------------------
  329. ' Kⁿrzt den Dateinamen in Filename$ so, dass dieser in
  330. ' den ⁿbergebenen Label hineinpasst.
  331. ' --------------------------------------------------------
  332. Function FM_ShortFilename$ (Bezeichner As Form, MaxLΣnge%, filename$)
  333.   Dim L_Filename$
  334.   Dim L_Pos%, L_Pos2%
  335.   If Bezeichner.TextWidth(filename$) <= MaxLΣnge% Then
  336.     L_Filename$ = filename$
  337.   Else
  338.     L_Filename$ = filename$
  339.     L_Pos% = InStr(L_Filename$, "\")
  340.     L_Pos2% = InStr(L_Pos% + 1, L_Filename$, "\")
  341.     Do While L_Pos% > 0 And L_Pos2% > 0 And Bezeichner.TextWidth(L_Filename$) > MaxLΣnge%
  342.       L_Filename$ = Left$(L_Filename$, L_Pos%) & "..." & Mid$(L_Filename$, L_Pos2%)
  343.       L_Pos2% = InStr(L_Pos% + 5, L_Filename$, "\")
  344.     Loop
  345.   End If
  346.   FM_ShortFilename$ = L_Filename$
  347. End Function
  348.  
  349. Function FM_StichwortSuche (ByVal StichWort$, Outline As Outline)
  350.   Dim f1%, f2%, L_W As TM_WordsRec, L_O As TM_OccursRec
  351.   Dim I&, found&
  352.   Dim jj&
  353.   Dim Flg_After%
  354.   Dim Faktor As Integer
  355.   Dim Lesen As Integer
  356.   Dim ABuchstaben As String
  357.   Lesen = False
  358.   Faktor = 200
  359.   ' Dim ABuchstaben as string
  360.  
  361.   Screen.MousePointer = 11 ' Sanduhr
  362.   StichWort$ = LCase(StichWort$)
  363.   ABuchstaben = Left$(StichWort$, 1)
  364.   f1% = FreeFile
  365.   Open Trim$(GM_DBWorte$) For Random As f1% Len = Len(L_W)
  366.   For jj& = 1 To LOF(f1%) / Len(L_W)
  367. Lesen:
  368.  
  369.     Get #f1%, jj&, L_W
  370.     If Lesen = False Then
  371.       If ABuchstaben > Left$(L_W.Wort, 1) Then
  372.         jj& = jj& + Faktor
  373.         Lesen = False
  374.         If jj& > LOF(f1%) / Len(L_W) Then
  375.           jj& = jj& - Faktor
  376.           Lesen = True
  377.         End If
  378.         GoTo Lesen
  379.       End If
  380.       If ABuchstaben = Left$(L_W.Wort, 1) Then
  381.         jj& = jj& - Faktor
  382.         Lesen = True
  383.         If jj& < 0 Then
  384.           jj& = 1
  385.         End If
  386.         GoTo Lesen
  387.       End If
  388.       If ABuchstaben < Left$(L_W.Wort, 1) Then
  389.         jj& = jj& - Faktor
  390.         Lesen = True
  391.         If jj& < 0 Then
  392.           jj& = 1
  393.         End If
  394.         GoTo Lesen
  395.       End If
  396.     End If
  397.     
  398.     If Trim$(L_W.Wort) = StichWort$ Then
  399.       found& = jj&
  400.       FM_StichwortSuche = True
  401.       f2% = FreeFile
  402.       Open GM_DBOccurs For Random As f2% Len = Len(L_O)
  403.       PM_ClsFound
  404.       Flg_After% = False
  405.       ' For I& = 1 To LOF(f2%) / Len(L_O)
  406.       Faktor = 500
  407.       Lesen = False
  408.       For I& = found& To LOF(f2%) / Len(L_O)
  409. Lesen_Zahl:
  410.         Get #f2%, I&, L_O
  411.         ' Debug.Print L_O.ID_Wort
  412. '----------------------------------------------------
  413. ' Optimierung
  414.         If Lesen = False Then
  415.             If L_O.ID_Wort = 0 Then
  416.                 Lesen = True
  417.                 I& = I& - Faktor
  418.                 If I& < 0 Then
  419.                   I& = 1
  420.                   Lesen = True
  421.                 End If
  422.                 GoTo Lesen_Zahl
  423.             End If
  424.  
  425.           If found& > L_O.ID_Wort Then
  426.             I& = I& + Faktor
  427.             Lesen = False
  428.             If I& > LOF(f2%) / Len(L_W) Then
  429.               I& = I& - Faktor
  430.               Lesen = True
  431.             End If
  432.             GoTo Lesen_Zahl
  433.           End If
  434.           If found& <= L_O.ID_Wort Then
  435.             I& = I& - Faktor
  436.             Lesen = True
  437.             If I& < 0 Then
  438.               I& = 1
  439.               Lesen = True
  440.             End If
  441.             GoTo Lesen_Zahl
  442.           End If
  443.         End If
  444.         If L_O.ID_Wort = found& Then
  445.           Flg_After% = True
  446.           PM_AddFound L_O, Outline
  447.         Else
  448.           If Flg_After% Then Exit For
  449.         End If
  450.       Next I&
  451.       Close f2%
  452.     Else
  453.       If found& > 0 Then Exit For
  454.     End If
  455.     If Chr$(Asc(ABuchstaben) + 1) < Left$(L_W.Wort, 1) And ABuchstaben <> "z" Then
  456.       found& = 0
  457.       Exit For
  458.     End If
  459.  
  460.   Next jj&
  461.   Close f1%
  462.   Screen.MousePointer = 0 ' Standard
  463. End Function
  464.  
  465. ' --------------------------------------------------------
  466. ' Liefert die Zeichenkette Verz$ mit abschliessendem \
  467. ' falls dieser nicht bereits vorhanden ist
  468. ' --------------------------------------------------------
  469. Function FM_Verz$ (verz$)
  470.   Dim L_Verz$
  471.   L_Verz$ = Trim$(verz$)
  472.   If Right$(L_Verz$, 1) <> "\" Then
  473.     L_Verz$ = L_Verz$ + "\"
  474.   End If
  475.   FM_Verz$ = L_Verz$
  476. End Function
  477.  
  478. Sub Main ()
  479.     
  480.     GM_Drive$ = Left$(CurDir$, 2)
  481.     ChDrive GM_Drive$
  482.     ChDir "\"
  483.  
  484.  
  485.   F_Startup.MousePointer = 11 'Sanduhr
  486.   F_Startup.Show
  487.   P_SetWindowTop F_Startup
  488.   DoEvents
  489.   
  490.   GM_DBName$ = Trim$(GM_Drive$ & "\SPY.DAT")
  491.   GM_DBWorte$ = Trim$(GM_Drive$ & "\WORDS.DAT")
  492.   GM_DBOccurs$ = Trim$(GM_Drive$ & "\OCCURS.DAT")
  493.   MDICDSpy.Show
  494.   F_Startup.MousePointer = 0 'Standard
  495.   Unload F_Startup
  496. End Sub
  497.  
  498. Sub P_Show3dObjectPixel (Frm As Form, Ct As Control, Art As Integer)
  499.  
  500.   Const BLACK = &H0&
  501.   Const WHITE = &HFFFFFF
  502.   Const GRAY = &HC0C0C0
  503.   Const DGRAY = &H808080
  504.   Frm.AutoRedraw = True
  505.   Select Case Art
  506.     Case Is = 0
  507.       Frm.Line (Ct.Left + 1, Ct.Top + 1)-(Ct.Width + Ct.Left, Ct.Top + Ct.Height), WHITE, B
  508.       Frm.Line (Ct.Left - 1, Ct.Top - 1)-(Ct.Width + 1 + Ct.Left, Ct.Top + Ct.Height + 1), DGRAY, B
  509.       Frm.Line (Ct.Left - 2, Ct.Top - 2)-(Ct.Width + Ct.Left + 1, Ct.Top + Ct.Height + 1), GRAY, B
  510.     Case Is = 1
  511.       Frm.Line (Ct.Left + 1, Ct.Top + 1)-(Ct.Width + Ct.Left, Ct.Top + Ct.Height), DGRAY, B
  512.       Frm.Line (Ct.Left - 1, Ct.Top - 1)-(Ct.Width + 1 + Ct.Left, Ct.Top + Ct.Height + 1), WHITE, B
  513.       Frm.Line (Ct.Left - 2, Ct.Top - 2)-(Ct.Width + Ct.Left + 1, Ct.Top + Ct.Height + 1), GRAY, B
  514.   End Select
  515.   Frm.AutoRedraw = False
  516.  
  517. End Sub
  518.  
  519. Sub P_Show3dTwips (Frm As Form, Ct As Control, Art As Integer)
  520.  
  521.   Const BLACK = &H0&
  522.   Const WHITE = &HFFFFFF
  523.   Const GRAY = &HC0C0C0
  524.   Const DGRAY = &H808080
  525.  
  526.   Dim I As Integer
  527.   Dim Tx As Integer
  528.   Dim Ty As Integer
  529.  
  530.   
  531.   Tx = Screen.TwipsPerPixelX
  532.   Ty = Screen.TwipsPerPixelY
  533.  
  534.   Frm.AutoRedraw = True
  535.   Select Case Art
  536.     Case Is = 0
  537.         Frm.Line (Ct.Left + (1 * Tx), Ct.Top + (1 * Ty))-(Ct.Width + (0 * Tx) + Ct.Left, Ct.Top + Ct.Height + (0 * Ty)), WHITE, B
  538.         Frm.Line (Ct.Left - (1 * Tx), Ct.Top - (1 * Ty))-(Ct.Width + (1 * Tx) + Ct.Left, Ct.Top + Ct.Height + (1 * Ty)), DGRAY, B
  539.         Frm.Line (Ct.Left - (2 * Tx), Ct.Top - (2 * Ty))-(Ct.Width + Ct.Left + (1 * Tx), Ct.Top + Ct.Height + (1 * Ty)), GRAY, B
  540.     Case Is = 1
  541.         Frm.Line (Ct.Left + (1 * Tx), Ct.Top + (1 * Ty))-(Ct.Width + (0 * Tx) + Ct.Left, Ct.Top + Ct.Height + (0 * Ty)), DGRAY, B
  542.         Frm.Line (Ct.Left - (1 * Tx), Ct.Top - (1 * Ty))-(Ct.Width + (1 * Tx) + Ct.Left, Ct.Top + Ct.Height + (1 * Ty)), WHITE, B
  543.         Frm.Line (Ct.Left - (2 * Tx), Ct.Top - (2 * Ty))-(Ct.Width + Ct.Left + (1 * Tx), Ct.Top + Ct.Height + (1 * Ty)), GRAY, B
  544.   End Select
  545.   Frm.AutoRedraw = False
  546.  
  547.  
  548. End Sub
  549.  
  550. Sub PM_AddFound (L_O As TM_OccursRec, Outline As Outline)
  551.   Dim Res&, I%
  552.  Dim ListIndex%
  553.   On Error GoTo Err_PM_AddFound
  554.   If Outline.ListCount > 0 Then
  555.     For I% = 0 To Outline.ListCount - 1
  556.       If Outline.ItemData(I%) = L_O.ID_Spy Then Exit Sub
  557.     Next I%
  558.   End If
  559.   Res& = FM_LiesDB(L_O.ID_Spy)
  560.   If Asc(GM_DB.Bezeichnung$) <> 0 Then
  561.       Outline.AddItem GM_DB.Bezeichnung$, ListIndex%
  562.       Outline.ItemData(ListIndex%) = Res&
  563.       Outline.PictureType(ListIndex%) = 2
  564.       Outline.Indent(ListIndex%) = 1
  565.       ListIndex% = ListIndex% + 1
  566.   End If
  567.   Exit Sub
  568. Err_PM_AddFound:
  569.   MsgBox "Die Suchfunktion konnte nicht korrekt erfolgen. Stellen Sie sicher, dass der CD-Spy genⁿgend Speicher zur Verfⁿgung hat. Die Suchaktion wurde abgebrochen."
  570.   'Resume
  571.   Exit Sub
  572. End Sub
  573.  
  574. ' --------------------------------------------------------
  575. ' L÷scht die Datenbank GCM_DBNAME
  576. ' --------------------------------------------------------
  577. Sub PM_ClearDB ()
  578.   Close
  579.   Kill GCM_DBNAME
  580.   Open GCM_DBNAME For Random As GM_FH_DBName% Len = Len(GM_DB)
  581. End Sub
  582.  
  583. ' ----------------------------------------------------------------------
  584. ' L÷scht das globale Array der gefundenen Stichworte
  585. ' ----------------------------------------------------------------------
  586. Sub PM_ClsFound ()
  587.   ReDim GM_Occurs(0)
  588. End Sub
  589.  
  590. ' --------------------------------------------------------
  591. ' Kopiert alle Dateien der globalen Variablen G_CopyFiles
  592. ' vom Quellverzeichnis ins Zielverzeichnis. G_CopyFiles
  593. ' muss wie folgt aufgebaut sein: Quellverzeichnis,Zielver-
  594. ' zeichnis,Datei1,Datei2,...,
  595. ' --------------------------------------------------------
  596. Sub PM_CopyFiles ()
  597.   Dim L_Datei
  598.   Dim L_Quellverzeichnis$, L_Zielverzeichnis$
  599.   Screen.MousePointer = 11 ' Sanduhr
  600.   F_CProgress.Show
  601.   L_Quellverzeichnis$ = GM_Drive$ + FM_ParseZeile$(G_CopyFiles$, ",")
  602.   L_Zielverzeichnis$ = FM_ParseZeile$("", "")
  603.   L_Datei = FM_ParseZeile$("", "")
  604.   If L_Datei = GCM_INFOFILENAME Then L_Datei = FM_ParseZeile$("", "")
  605.   Do While L_Datei <> ""
  606.     On Error Resume Next
  607.     ' *** kor. Kurt
  608.     F_CProgress.Lbl_QuellB = FM_ShortFilename$(F_CProgress, (F_CProgress!Lbl_QuellB.Width), UCase$(L_Quellverzeichnis$) & LCase$(L_Datei))
  609.     ' kor. Kurt ***
  610.     F_CProgress.Lbl_ZielB = FM_ShortFilename$(F_CProgress, (F_CProgress!Lbl_ZielB.Width), UCase$(L_Zielverzeichnis) & LCase$(L_Datei))
  611.     F_CProgress.Refresh
  612.     Kill L_Zielverzeichnis$ & L_Datei
  613.     On Error GoTo Fehler_Copy
  614.     FileCopy L_Quellverzeichnis$ & L_Datei, L_Zielverzeichnis$ & L_Datei
  615.     L_Datei = FM_ParseZeile$("", "")
  616.     If L_Datei = GCM_INFOFILENAME Then L_Datei = FM_ParseZeile$("", "")
  617.   Loop
  618.   Unload F_CProgress
  619.   Screen.MousePointer = 0 ' Standard
  620. ende:
  621. Exit Sub
  622.  
  623.  
  624. Fehler_Copy:
  625. Unload F_CProgress
  626. Screen.MousePointer = 0
  627.   Select Case Err
  628.     Case Is = 75, 76' Path not found
  629.       MsgBox "Achtung: Ungⁿltiges Verzeichnis!", 16, "Fehler beim Kopieren"
  630.  
  631.     Case Is = 61
  632.       MsgBox "Achtung: Festplatte voll!", 16, "Fehler beim Kopieren"
  633.  
  634.     Case Else
  635.       MsgBox "Achtung: Fehler wΣhrend dem Kopieren!", 16, "Fehler beim Kopieren"
  636.  
  637.   End Select
  638. Resume ende
  639.  
  640. End Sub
  641.  
  642. ' --------------------------------------------------------
  643. '
  644. ' --------------------------------------------------------
  645. Sub PM_DateiKopieren ()
  646. Rem kopieren der Dateien von der CD aufs Ziellaufwerk
  647.  
  648. Dim Pfad$
  649. Dim zielpfad$
  650. Dim doscommand$
  651. Dim filename$
  652. Dim stat As Integer
  653. Dim Msg$
  654. Dim begpos As Integer
  655. Dim endpos As Integer
  656. Dim temppath$
  657. Dim file$
  658. Dim filelist$
  659. Dim I As Integer
  660. Dim Ct As Integer
  661. Dim Index As Integer
  662. Dim G_Laufwerk$
  663.  
  664.     On Error Resume Next
  665.  
  666. Rem kopieren
  667.     If Right$(zielpfad$, 1) <> "\" Then
  668.         If Right$(zielpfad$, 3) = "*.*" Then
  669.             zielpfad$ = Left$(zielpfad$, Len(zielpfad$) - 3)
  670.         Else
  671.             zielpfad$ = zielpfad$ + "\"
  672.         End If
  673.     End If
  674.  
  675.     begpos = 4
  676.     Do While begpos < Len(zielpfad$)       ' directories suchen und erstellen
  677.         endpos = InStr(begpos, zielpfad$, "\")
  678.         If endpos = 0 Then
  679.             Exit Do
  680.         End If
  681.         temppath$ = Mid$(zielpfad$, 1, endpos - 1)
  682.         MkDir temppath$                     ' Make new directory.
  683.         Msg$ = ""
  684.         If Err = 75 And endpos = Len(zielpfad$) Then Msg$ = temppath$ & " Verzeichnis existiert bereits." + Chr$(13) + "(bestehende Dateien werden ⁿberschrieben)"' Check if directory exists.
  685.         If Err = 57 Then Msg$ = "GerΣte Ein-/Ausgabefehler."
  686.         If Err = 61 Then Msg$ = "DatentrΣger voll."
  687.         If Err = 76 Then Msg$ = "Pfad nicht gefunden."
  688.         If Err = 70 Then Msg$ = "Zugriff nicht gestattet."
  689.         Err = 0
  690.         If Msg$ <> "" Then
  691.             stat = MsgBox(Msg$, 49, "CD Spy")
  692.             If stat = 2 Then
  693.                 Exit Sub
  694.             End If
  695.         End If
  696.             
  697.         begpos = endpos + 1
  698.     Loop
  699.  
  700.     stat = 0
  701.     If stat <> 0 Then
  702.         Exit Sub
  703.     End If
  704.  
  705. End Sub
  706.  
  707. ' --------------------------------------------------------
  708. ' LΣdt die Datei Dn$ in das Textfeld des Formulars
  709. ' EditFile. Ist die Datei Dn$ > 32000 Byte so werden nur
  710. ' die ersten 32000 Bytes in das Textfeld geladen und der
  711. ' Benutzer auf den Umstand aufmerksam gemacht.
  712. ' --------------------------------------------------------
  713. Sub PM_EditFile (dn$)
  714.   Dim L_FileHandle%
  715.   Dim L_LengthOfFile&
  716.   Dim L_EditFile$
  717.   Dim L_Res%
  718.   L_FileHandle% = FreeFile
  719.   L_LengthOfFile& = FileLen(dn$)
  720.   If L_LengthOfFile& > 0 Then
  721.     GM_HugeFile% = (L_LengthOfFile& > 32000)
  722.     ' Erforderlichen Platz bereitstellen
  723.     L_EditFile$ = Space$(FM_Min(L_LengthOfFile&, 32000))
  724.     Open dn$ For Binary As L_FileHandle% Len = FM_Min(L_LengthOfFile&, 32000)
  725.     Get L_FileHandle%, 1, L_EditFile$
  726.     Close L_FileHandle%
  727.     G_EditFile$ = L_EditFile$
  728.     EditFile.Caption = dn$
  729.     EditFile.Show 1
  730.   Else
  731.     Screen.MousePointer = 0
  732.   End If
  733. End Sub
  734.  
  735. ' --------------------------------------------------------
  736. ' Kopiert die gewⁿnschten Dateien
  737. ' --------------------------------------------------------
  738. Sub PM_FileCopy ()
  739.   
  740. End Sub
  741.  
  742. ' --------------------------------------------------------
  743. ' Erzeugt die Datenbank. Wird in der Endversion nicht be-
  744. ' n÷tigt.
  745. ' --------------------------------------------------------
  746. Sub PM_GenerateDB (Pfad$)
  747.   Dim I%, L_Res%, Temp$, ii%
  748.   Dim Start
  749.   Dim fh%
  750.   Dim zeile$
  751.   Dim pos%
  752.  
  753.  Rem  GoTo SetDAT
  754.  
  755.   Start = Timer
  756.   
  757.   If FM_ExistDir(Pfad$) Then
  758.     PM_ClearDB
  759.     PM_ListSubDirs Pfad$, GM_DBAll()
  760.     For I% = 1 To UBound(GM_DBAll)
  761.       GM_DB = GM_DBAll(I%)
  762.       L_Res% = FM_SchreibDB()
  763.     Next I%
  764.   Else
  765.     MsgBox "Der angegebene Pfad existiert nicht! Die Funktion wird abgebrochen!"
  766.     Exit Sub
  767.   End If
  768.  
  769. ' --------------------------------------------------
  770.  
  771. Exit Sub
  772. ' A
  773.  
  774. ' ---------------------------------------------------
  775. ' GoTo SetDAT
  776.  
  777.   Dim db As database
  778.   Dim DS_Worte As Dynaset
  779.   Dim DS_Occurs As Dynaset
  780.   Dim tb As table
  781.   Dim tb_Occurs As table
  782.   Dim Wort$
  783.  
  784.   Set db = OpenDatabase("\NMCDSPY.MDB")
  785.  
  786.   Set tb = db.OpenTable("T_Worte")
  787.   tb.Index = "PrimaryKey"  ' Define current index.
  788.   Set tb_Occurs = db.OpenTable("T_Occurs")
  789.   tb_Occurs.Index = "PrimaryKey"
  790.  
  791.   MDICDSpy.WindowState = 0
  792.   For I% = 1 To UBound(GM_DBAll)
  793.     ChDir (GM_DBAll(I%).Verzeichnis)
  794.     If FM_Exists("WORTE.YZX") Then
  795.       fh% = FreeFile
  796.       Open "WORTE.YZX" For Input As fh%
  797.       db.BeginTrans
  798.       Do While Not EOF(fh%)
  799.         Line Input #fh%, zeile$
  800.         pos% = InStr(zeile$, ",")
  801.         Wort$ = Left$(zeile$, pos% - 1)
  802.         tb.Seek "=", Wort$
  803.         If tb.NoMatch Then
  804.           tb.AddNew
  805.           tb!Wort = Wort$
  806.           tb.Update
  807.           tb.Seek "=", Wort$
  808.         End If
  809.         tb_Occurs.Seek "=", I%, tb!ID
  810.         If tb_Occurs.NoMatch Then
  811.           tb_Occurs.AddNew
  812.           tb_Occurs!ID = I%
  813.           tb_Occurs!ID_Wort = tb!ID
  814.           tb_Occurs.Update
  815.         End If
  816.       Loop
  817.       db.CommitTrans
  818.       Close fh%
  819.       Temp$ = Dir$
  820.     End If
  821.   Next I%
  822.    tb.Close
  823.    tb_Occurs.Close
  824.  
  825. SetDAT:
  826.  
  827.   Dim W As TM_WordsRec
  828.   Dim O As TM_OccursRec
  829.   Dim fhW%, fhO%
  830.   Dim cbt&, cnt_W&, cnt_O&
  831.  
  832.   fhW% = FreeFile
  833.   Kill "\WORDS.DAT"
  834.   Kill "\occurs.DAT"
  835.   
  836.   Open "\WORDS.DAT" For Random As #fhW% Len = Len(W)
  837.   fhO% = FreeFile
  838.   
  839.   Open "\OCCURS.DAT" For Random As #fhO% Len = Len(O)
  840.   Set DS_Worte = db.CreateDynaset("Select * from T_Worte order by Wort")
  841.   cnt_W& = 1
  842.   cnt_O& = 1
  843.   DS_Worte.MoveFirst
  844.   Do While Not DS_Worte.EOF
  845.     W.Wort = DS_Worte!Wort & Space$(Len(W))
  846.     Put #fhW%, cnt_W&, W
  847.     Set DS_Occurs = db.CreateDynaset("Select * from T_Occurs where ID_Wort = " & DS_Worte!ID)
  848.     DS_Occurs.MoveFirst
  849.     Do While Not DS_Occurs.EOF
  850.       O.ID_Wort = cnt_W&
  851.       O.ID_Spy = DS_Occurs!ID
  852.       Put #fhO%, cnt_O&, O
  853.       cnt_O& = cnt_O& + 1
  854.       DS_Occurs.MoveNext
  855.     Loop
  856.     DS_Occurs.Close
  857.     cnt_W& = cnt_W& + 1
  858.     DS_Worte.MoveNext
  859.   Loop
  860.   Close
  861.   DS_Worte.Close
  862.   db.Close
  863. End Sub
  864.  
  865. ' --------------------------------------------------------
  866. ' Analysiert den Inhalt der aktuellen Datei CDINFO.TXT in
  867. ' die Struktur d ein.
  868. ' #miki
  869. ' --------------------------------------------------------
  870. Sub PM_GetCDINFO (d As TM_DBRec)
  871.   Dim L_Tmp$, L_FileHandle%, L_Zeile$, L_Pos%, L_CDInfoDatei$
  872.   L_CDInfoDatei$ = FM_Verz$(d.Verzeichnis$) + GCM_INFOFILENAME
  873.   L_FileHandle% = FreeFile
  874.   On Error Resume Next
  875.   Open L_CDInfoDatei$ For Input As L_FileHandle%
  876.   ' Konnte Datei nicht ge÷ffnet werden Abbruch
  877.   If Err <> 0 Then Exit Sub
  878.   If Not EOF(L_FileHandle%) Then
  879.     Line Input #L_FileHandle%, L_Zeile$
  880.     L_Pos% = InStr(UCase$(L_Zeile$), GCM_VERZEICHNIS)
  881.     If L_Pos% Then
  882.       d.Bezeichnung$ = Mid$(L_Zeile$, L_Pos% + Len(GCM_VERZEICHNIS))
  883.     End If
  884.     If Not EOF(L_FileHandle%) Then
  885.       Line Input #L_FileHandle%, L_Zeile$
  886.       L_Pos% = InStr(UCase$(L_Zeile$), GCM_PROJEKT)
  887.       If L_Pos% Then
  888.         d.Code = 1
  889.       Else
  890.         d.Code = 0
  891.       End If
  892.     End If
  893.   End If
  894.   Close L_FileHandle%
  895. End Sub
  896.  
  897. ' --------------------------------------------------------
  898. ' Liefert im Array d() alle VΣter
  899. ' --------------------------------------------------------
  900. Sub PM_GetParents (ID&, d())
  901.   Dim I%
  902.   For I% = 1 To LOF(GM_FH_DBName%) / Len(GM_DB)
  903.     Get GM_FH_DBName%, I%, GM_DB
  904.     If GM_DB.Vater = ID& Then
  905.       d(UBound(d)) = I%
  906.       ReDim Preserve d(UBound(d) + 1)
  907.     End If
  908.   Next I%
  909. End Sub
  910.  
  911. ' --------------------------------------------------------
  912. ' Liest die Datei CDINFO im Verzeichnis$ in die globale
  913. ' Variable G_CDInfoFile$ ein
  914. ' --------------------------------------------------------
  915. Sub PM_LiesCDInfo (Verzeichnis$)
  916.   Dim L_FileHandle%
  917.   Dim L_LΣnge&
  918.   Dim L_CDInfoFilename$
  919.   On Error Resume Next
  920.   L_CDInfoFilename$ = FM_Verz$(Verzeichnis$) & GCM_INFOFILENAME
  921.   L_LΣnge& = FileLen(L_CDInfoFilename$)
  922.   G_CDInfoFile$ = Space$(L_LΣnge&)
  923.   L_FileHandle% = FreeFile
  924.   Open L_CDInfoFilename$ For Binary As L_FileHandle% Len = L_LΣnge&
  925.   Get #L_FileHandle%, , G_CDInfoFile$
  926.   Close L_FileHandle%
  927. End Sub
  928.  
  929. ' --------------------------------------------------------
  930. ' Liest die ben÷tigten Control-Informationen aus dem
  931. ' Initialisierungsfile
  932. ' --------------------------------------------------------
  933. ' Autor   : NM/ag
  934. ' Datum   : 10.2.94
  935. ' VB      : 3.0
  936. ' --------------------------------------------------------
  937. Sub PM_LiesControl (Ctrl As Control)
  938.   Dim L_Ini_Zeile$, Eigenschaft$
  939.   L_Ini_Zeile$ = F_GetPrivatIni("Einstellungen", Ctrl.Tag)
  940.   Eigenschaft$ = FM_ParseZeile$((L_Ini_Zeile$), GCM_SEPERATOR)
  941.   If TypeOf Ctrl Is Label Then
  942.     If Eigenschaft$ = "" Then Exit Sub
  943.     Ctrl.FontName = Eigenschaft$
  944.     Eigenschaft$ = FM_ParseZeile$("", "")
  945.     If Eigenschaft$ = "" Then Exit Sub
  946.     Ctrl.FontSize = Val(Eigenschaft$)
  947.     Eigenschaft$ = FM_ParseZeile$("", "")
  948.     If Eigenschaft$ = "" Then Exit Sub
  949.     Ctrl.FontBold = Val(Eigenschaft$)
  950.     Eigenschaft$ = FM_ParseZeile$("", "")
  951.     If Eigenschaft$ = "" Then Exit Sub
  952.     Ctrl.ForeColor = Val(Eigenschaft$)
  953.     Eigenschaft$ = FM_ParseZeile$("", "")
  954.     If Eigenschaft$ = "" Then Exit Sub
  955.     Ctrl.BackColor = Val(Eigenschaft$)
  956.   Else
  957.     If Eigenschaft$ = "" Then Exit Sub
  958.     Ctrl.FontName = Eigenschaft$
  959.     Eigenschaft$ = FM_ParseZeile$("", "")
  960.     If Eigenschaft$ = "" Then Exit Sub
  961.     Ctrl.FontSize = Val(Eigenschaft$)
  962.     Eigenschaft$ = FM_ParseZeile$("", "")
  963.     If Eigenschaft$ = "" Then Exit Sub
  964.     Ctrl.FontBold = Val(Eigenschaft$)
  965.     Eigenschaft$ = FM_ParseZeile$("", "")
  966.     If Eigenschaft$ = "" Then Exit Sub
  967.     Ctrl.ForeColor = Val(Eigenschaft$)
  968.     Eigenschaft$ = FM_ParseZeile$("", "")
  969.     If Eigenschaft$ = "" Then Exit Sub
  970.     Ctrl.BackColor = Val(Eigenschaft$)
  971.   End If
  972. End Sub
  973.  
  974. ' --------------------------------------------------------
  975. ' Liest die ben÷tigten Formular-Informationen aus dem
  976. ' Initialisierungsfile
  977. ' --------------------------------------------------------
  978. ' Autor   : NM/ag
  979. ' Datum   : 10.2.94
  980. ' VB      : 3.0
  981. ' --------------------------------------------------------
  982. Sub PM_LiesForm (Frm As Form)
  983.  
  984.   Dim L_Ini_Zeile$, Eigenschaft$
  985.   On Error Resume Next
  986.  
  987.   L_Ini_Zeile$ = F_GetPrivatIni("Einstellungen", Frm.Tag)
  988.   Eigenschaft$ = FM_ParseZeile$((L_Ini_Zeile$), GCM_SEPERATOR)
  989.   If Eigenschaft$ = "" Then Exit Sub
  990.   Frm.Top = Val(Eigenschaft$)
  991.   Eigenschaft$ = FM_ParseZeile$("", "")
  992.   If Eigenschaft$ = "" Then Exit Sub
  993.   Frm.Left = Val(Eigenschaft$)
  994.   Eigenschaft$ = FM_ParseZeile$("", "")
  995.   If Eigenschaft$ = "" Then Exit Sub
  996.   Frm.Width = Val(Eigenschaft$)
  997.   Eigenschaft$ = FM_ParseZeile$("", "")
  998.   If Eigenschaft$ = "" Then Exit Sub
  999.   Frm.Height = Val(Eigenschaft$)
  1000.   Eigenschaft$ = FM_ParseZeile$("", "")
  1001.   If Eigenschaft$ = "" Then Exit Sub
  1002.   Frm.WindowState = Val(Eigenschaft$)
  1003. End Sub
  1004.  
  1005. ' --------------------------------------------------------
  1006. ' Liest den Verzeichnisbaum vom Verzeichnis Path$ an in
  1007. ' das Array d ein. Wird fⁿr die Endversion nicht ben÷tigt
  1008. ' --------------------------------------------------------
  1009. Sub PM_ListSubDirs (path$, d() As TM_DBRec)
  1010.   Const ATTR_DIRECTORY = 16
  1011.   Dim position%, Count%, Vater%
  1012.  
  1013.   Dim I, dirname
  1014.  
  1015.   On Error Resume Next
  1016.   If Right$(path$, 1) <> "\" Then path$ = path$ + "\"
  1017.   If FM_ExistDir(path$) Then
  1018.     position% = 1
  1019.     Count% = 1
  1020.     dirname = Dir(path, ATTR_DIRECTORY) ' Erster Verzeichnisname
  1021.  
  1022.     'Alle Verzeichnisse innerhalb dieses Verzeichnisses in D() speichern
  1023.     ReDim d(Count%)
  1024.     d(Count%).Verzeichnis$ = path$
  1025.     d(Count%).Vater = 0
  1026.     PM_GetCDINFO d(Count%)
  1027.     Count% = Count% + 1
  1028.     Do
  1029.       Do While dirname <> ""
  1030.         DoEvents
  1031.         If dirname <> "." And dirname <> ".." Then
  1032.           If (GetAttr(path + dirname) And ATTR_DIRECTORY) = ATTR_DIRECTORY Then
  1033.             ReDim Preserve d(Count%)
  1034.             d(Count%).Verzeichnis = path + dirname
  1035.             d(Count%).Vater = position%
  1036.             PM_GetCDINFO d(Count%)
  1037.             Count% = Count% + 1
  1038.           End If
  1039.         End If
  1040.         dirname = Dir   ' Get another directory name.
  1041.       Loop
  1042.       position% = position% + 1
  1043.       If position% >= Count% Then Exit Do
  1044.       path$ = Trim$(d(position%).Verzeichnis$) + "\"
  1045.       dirname = Dir(path, ATTR_DIRECTORY)
  1046.     Loop
  1047.   End If
  1048. End Sub
  1049.  
  1050. Sub PM_LookforExt (ReSourceName$)
  1051.   Dim nItemFound As Integer
  1052.   Dim AppPathSize As Long
  1053.   Dim sExtType, ApptoLaunch  As String
  1054.   Dim sAssocApp$
  1055.   Dim LaunchApp, Y As Integer
  1056.   On Error GoTo Err_PM_LookforExt
  1057.   sExtType = Right$(ReSourceName, 3)  ' Extension lesen
  1058.   ' ⁿbereinstimmenden Eintrag in WIN.INI [Extensions] suchen
  1059.   sAssocApp = Space$(256)
  1060.   nItemFound = GetProfileString("Extensions", ByVal sExtType, "", sAssocApp, Len(sAssocApp))
  1061.   If nItemFound = 0 Then
  1062.     GoTo Err_PM_LookforExt
  1063.   Else
  1064.     ' Applikationsname und Pfad extrahieren
  1065.     sAssocApp = RTrim(sAssocApp)
  1066.     AppPathSize = Len(sAssocApp)
  1067.     AppPathSize = AppPathSize - 6
  1068.     ApptoLaunch = Left(sAssocApp, AppPathSize)
  1069.     LaunchApp = Shell((ApptoLaunch + ReSourceName), 1)
  1070.     Do While GetModuleUsage(LaunchApp) > 0
  1071.       Y% = DoEvents()
  1072.     Loop
  1073.   End If
  1074.   Exit Sub
  1075. Err_PM_LookforExt:
  1076.   Error GCM_OWNER_ERROR
  1077.   Exit Sub
  1078. End Sub
  1079.  
  1080. Sub PM_NewWord (Wort$, DS_Worte As Dynaset, DS_Occurs As Dynaset, VerzPos%)
  1081.   Dim I%, ub%
  1082.   On Error Resume Next
  1083.   DS_Worte.AddNew
  1084.   DS_Worte!Wort = Wort$
  1085.   DS_Worte.Update
  1086.   If Err <> 0 Then
  1087.     Err = 0
  1088.     DS_Worte.FindFirst ("Wort = '" & Wort$ & "'")
  1089.   Else
  1090.     DS_Worte.MoveLast
  1091.   End If
  1092.   DS_Occurs.AddNew
  1093.   DS_Occurs!ID = VerzPos%
  1094.   DS_Occurs!ID_Wort = DS_Worte!ID
  1095.   DS_Occurs.Update
  1096. End Sub
  1097.  
  1098. Sub PM_OpenLeaf (OutCtrl As Outline, ID&)
  1099.   Dim I%, ii&
  1100.   For I% = 0 To OutCtrl.ListCount - 1
  1101.     If OutCtrl.ItemData(I%) = ID& Then Exit For
  1102.   Next I%
  1103.   If I% < OutCtrl.ListCount Then
  1104.     If OutCtrl.IsItemVisible(I%) Then Exit Sub
  1105.   End If
  1106.   ii& = FM_LiesDB(ID&)
  1107.   PM_OpenLeaf OutCtrl, (GM_DB.Vater)
  1108.   For I% = 0 To OutCtrl.ListCount - 1
  1109.     If OutCtrl.ItemData(I%) = GM_DB.Vater Then Exit For
  1110.   Next I%
  1111.   OutCtrl.Expand(I%) = True
  1112.  
  1113. End Sub
  1114.  
  1115. ' --------------------------------------------------------
  1116. ' Zerlegt den ⁿbergebenen String in einzelne Worte und
  1117. ' fⁿgt diese an die globale W÷rterliste G_Worte an.
  1118. ' --------------------------------------------------------
  1119. Sub PM_Parse (x As String, DS_Worte As Dynaset, DS_Occurs As Dynaset, VerzPos%)
  1120.   Dim I%, zch%, l%
  1121.   Dim Wort$, zeichen$
  1122.   For I% = 1 To Len(x)
  1123.     zeichen$ = Mid$(x, I%, 1)
  1124.     zch% = Asc(UCase$(zeichen$))
  1125.     If zch% >= 65 And zch% <= 90 Or zch% = 196 Or zch% = 214 Or zch% = 220 Then
  1126.       Wort$ = Wort$ + zeichen$
  1127.       l% = l% + 1
  1128.     Else
  1129.       If Trim(Wort$) <> "" And l% > 2 And l% < 51 Then
  1130.         PM_NewWord LCase(Wort$), DS_Worte, DS_Occurs, VerzPos%
  1131.       End If
  1132.       Wort$ = ""
  1133.       l% = 0
  1134.     End If
  1135.   Next I%
  1136. End Sub
  1137.  
  1138. ' --------------------------------------------------------
  1139. ' Liest die Informationen aus der Datei CDINFO des aktuell
  1140. ' im Outline-Control markierten Eintrages aus und enabled
  1141. ' resp. disabled die entsprechenden SchaltflΣchen und be-
  1142. ' reitet diese auf ihre Aufgabe vor.
  1143. ' --------------------------------------------------------
  1144. Sub PM_ReadCDInfo (OutCtrl As Outline, AktElement As TM_AktElement)
  1145.   Dim L_Res&
  1146.   Dim L_Position%
  1147.   Dim L_CDInfoCommands$
  1148.   Dim L_Tmp$
  1149.   Dim L_MakDatei$, L_HilfeDatei$
  1150.   Dim L_Lbl_Info_Visible%, L_Fil_Projekt_Visible%
  1151.  
  1152.   On Error GoTo Err_PM_ReadCDInfo
  1153.   ' CDInfo-Datei einlesen
  1154.   L_Res& = FM_LiesDB(Val(OutCtrl.ItemData(OutCtrl.ListIndex)))
  1155.   PM_LiesCDInfo Trim$(GM_DB.Verzeichnis$)
  1156.   ' Infoteil extrahieren
  1157.   L_Position% = InStr(UCase$(G_CDInfoFile$), GCM_INFO)
  1158.   If L_Position% <> 0 Then
  1159.     ' Alle Restlichen Angaben vor Info= extrahieren
  1160.     L_CDInfoCommands$ = UCase$(Left$(G_CDInfoFile$, L_Position% - 1))
  1161.     AktElement.Info$ = Mid$(G_CDInfoFile$, L_Position% + Len(GCM_INFO))
  1162.   Else
  1163.     L_CDInfoCommands$ = UCase$(G_CDInfoFile$)
  1164.     AktElement.Info$ = ""
  1165.   End If
  1166.   ' Startknopf enablen falls startbare Datei vorhanden
  1167.   L_Position% = InStr(L_CDInfoCommands$, GCM_STARTABLE)
  1168.   If L_Position% <> 0 Then
  1169.     L_Tmp$ = Mid$(L_CDInfoCommands$ + Chr$(13), L_Position% + Len(GCM_STARTABLE))
  1170.     AktElement.Startfile$ = Left$(L_Tmp$, InStr(L_Tmp$, Chr$(13)) - 1)
  1171.   Else
  1172.     AktElement.Startfile$ = ""
  1173.   End If
  1174.   ' Demoknopf enablen falls Demo vorhanden
  1175.   L_Position% = InStr(L_CDInfoCommands$, GCM_DEMO)
  1176.   If L_Position% <> 0 Then
  1177.     L_Tmp$ = Mid$(L_CDInfoCommands$ + Chr$(13), L_Position% + Len(GCM_DEMO))
  1178.     AktElement.Demofile$ = Left$(L_Tmp$, InStr(L_Tmp$, Chr$(13)) - 1)
  1179.   Else
  1180.     AktElement.Demofile$ = ""
  1181.   End If
  1182.   ' Readmeknopf enablen falls Demo vorhanden
  1183.   L_Position% = InStr(L_CDInfoCommands$, GCM_README)
  1184.   If L_Position% <> 0 Then
  1185.     L_Tmp$ = Mid$(L_CDInfoCommands$ + Chr$(13), L_Position% + Len(GCM_README))
  1186.     AktElement.Readmefile$ = Left$(L_Tmp$, InStr(L_Tmp$, Chr$(13)) - 1)
  1187.   Else
  1188.     AktElement.Readmefile$ = ""
  1189.   End If
  1190.   ' Kopierknopf enablen falls Projekt= vorhanden (Blatt des Baumes)
  1191.   L_Position% = InStr(L_CDInfoCommands$, GCM_PROJEKT)
  1192.   If L_Position% <> 0 Then
  1193.     AktElement.Copy% = True
  1194.   Else
  1195.     AktElement.Copy% = False
  1196.   End If
  1197.   ' Codeknopf enablen falls .MAK-Datei vorhanden
  1198.   L_Tmp$ = FM_Verz$(GM_DB.Verzeichnis$) + "*.MAK"
  1199.   L_MakDatei$ = Dir$(L_Tmp$)
  1200.   If L_MakDatei$ <> "" Then
  1201.     AktElement.Code% = True
  1202.   Else
  1203.     AktElement.Code% = False
  1204.   End If
  1205.   AktElement.Verzeichnis$ = GM_DB.Verzeichnis$
  1206.   ' Installknopf enablen falls Setup-Programm vorhanden
  1207.   L_Position% = InStr(L_CDInfoCommands$, GCM_INSTALL)
  1208.   If L_Position% <> 0 Then
  1209.     L_Tmp$ = Mid$(L_CDInfoCommands$ + Chr$(13), L_Position% + Len(GCM_INSTALL))
  1210.     AktElement.SetupCommand$ = Left$(L_Tmp$, InStr(L_Tmp$, Chr$(13)) - 1)
  1211.   Else
  1212.     AktElement.SetupCommand$ = ""
  1213.   End If
  1214.   ' Hilfedateiknopf enablen falls Hilfedatei vorhanden
  1215.   L_Tmp$ = FM_Verz$(GM_DB.Verzeichnis$) + "*.HLP"
  1216.   L_HilfeDatei$ = Dir$(L_Tmp$)
  1217.   If L_HilfeDatei$ <> "" Then
  1218.     AktElement.Hilfefile$ = "WinHelp " & FM_Verz$(GM_DB.Verzeichnis$) & L_HilfeDatei$
  1219.   Else
  1220.     AktElement.Hilfefile$ = ""
  1221.   End If
  1222.   Exit Sub
  1223. Err_PM_ReadCDInfo:
  1224.   Resume Next
  1225. End Sub
  1226.  
  1227. Sub PM_ReadDBAll ()
  1228.   Dim I&, Res&
  1229.   For I& = 1 To UBound(GM_DBAll)
  1230.     Res& = FM_LiesDB(I&)
  1231.     GM_DBAll(I&) = GM_DB
  1232.     DoEvents
  1233.   Next I&
  1234. End Sub
  1235.  
  1236. ' --------------------------------------------------------
  1237. ' Einlesen der Outline-Elemente
  1238. ' --------------------------------------------------------
  1239. Sub PM_ReadItems (OutCtrl As Outline, ByVal Vater&, ByVal ListIndex%, ByVal Ebene%)
  1240.   ReDim d(1)
  1241.   Dim cnt%, I%, Res%
  1242.   PM_GetParents Vater&, d()
  1243.   For I% = 1 To UBound(d) - 1
  1244.     Res% = FM_LiesDB(CLng(d(I%)))
  1245.     If Res% <> 0 Then
  1246.       ListIndex% = ListIndex% + 1
  1247.       If ListIndex% < OutCtrl.ListCount Then
  1248.         If OutCtrl.List(ListIndex%) = "Hilfs" Then
  1249.           OutCtrl.List(ListIndex%) = GM_DB.Bezeichnung$
  1250.         Else
  1251.           OutCtrl.AddItem GM_DB.Bezeichnung, ListIndex%
  1252.         End If
  1253.       Else
  1254.         OutCtrl.AddItem GM_DB.Bezeichnung, ListIndex%
  1255.       End If
  1256.       OutCtrl.ItemData(ListIndex%) = Res%
  1257.       OutCtrl.Indent(ListIndex%) = Ebene%
  1258.       If GM_DB.Code = 0 Then
  1259.         OutCtrl.PictureType(ListIndex%) = 0
  1260.         ListIndex% = ListIndex% + 1
  1261.         OutCtrl.AddItem "Hilfs", ListIndex%
  1262.         OutCtrl.Indent(ListIndex%) = Ebene% + 1
  1263.       Else
  1264.         OutCtrl.PictureType(ListIndex%) = 2
  1265.       End If
  1266.     End If
  1267.   Next I%
  1268. End Sub
  1269.  
  1270. ' -----------------------------------------------------------------------
  1271. ' Bestimmt, ob eine Form tatsΣchlich in einem Refresh Ereignis neue Daten
  1272. ' anzeigen soll.
  1273. ' -----------------------------------------------------------------------
  1274. Sub PM_Refresh (mode As Integer)
  1275.   GM_Refresh% = mode%
  1276. End Sub
  1277.  
  1278. Sub PM_RefreshForms ()
  1279.   Dim I%
  1280.   On Error Resume Next
  1281.   PM_Refresh GCM_ENABLE
  1282.   For I% = 0 To Forms.Count
  1283.     Forms(I%).Refresh
  1284.   Next I%
  1285.   PM_Refresh GCM_DISABLE
  1286. End Sub
  1287.  
  1288. Sub PM_ScanFile (filename$, DS_Worte As Dynaset, DS_Occurs As Dynaset, VerzPos%)
  1289.   Dim FileHandle%
  1290.   Dim zeile$
  1291.   Dim I%
  1292.   Const LC_MAX = 32000
  1293.   'Debug.Print "Scanstart : "; Timer
  1294.   ReDim G_Worte(0)
  1295.   FileHandle% = FreeFile
  1296.   Open filename$ For Binary As FileHandle%
  1297.   For I% = 1 To LOF(FileHandle%) \ LC_MAX
  1298.     zeile$ = Space$(LC_MAX)
  1299.     Get #FileHandle%, (I% - 1) * LC_MAX + 1, zeile$
  1300.     PM_Parse zeile$, DS_Worte, DS_Occurs, VerzPos%
  1301.   Next I%
  1302.   zeile$ = Space$((LOF(FileHandle%) Mod LC_MAX))
  1303.   Get #FileHandle%, (I% - 1) * LC_MAX + 1, zeile$
  1304.   PM_Parse zeile$, DS_Worte, DS_Occurs, VerzPos%
  1305.   Close FileHandle%
  1306.   Debug.Print "Scanend : "; Timer
  1307. End Sub
  1308.  
  1309. ' --------------------------------------------------------
  1310. ' Speichert die ben÷tigten Control-Informationen im
  1311. ' Initialisierungsfile ab
  1312. ' --------------------------------------------------------
  1313. ' Autor   : NM/ag
  1314. ' Datum   : 10.2.94
  1315. ' Version : 1.0
  1316. ' --------------------------------------------------------
  1317. Sub PM_SchreibControl (Ctrl As Control)
  1318.   Dim L_Ini_Zeile$
  1319.   If TypeOf Ctrl Is Label Then
  1320.     L_Ini_Zeile$ = Ctrl.FontName & GCM_SEPERATOR
  1321.     L_Ini_Zeile$ = L_Ini_Zeile$ & Trim$(Str$(Ctrl.FontSize)) & GCM_SEPERATOR
  1322.     L_Ini_Zeile$ = L_Ini_Zeile$ & Ctrl.FontBold & GCM_SEPERATOR
  1323.     L_Ini_Zeile$ = L_Ini_Zeile$ & Ctrl.ForeColor & GCM_SEPERATOR
  1324.     L_Ini_Zeile$ = L_Ini_Zeile$ & Ctrl.BackColor
  1325.   Else
  1326.     L_Ini_Zeile$ = Ctrl.FontName & GCM_SEPERATOR
  1327.     L_Ini_Zeile$ = L_Ini_Zeile$ & Trim$(Str$(Ctrl.FontSize)) & GCM_SEPERATOR
  1328.     L_Ini_Zeile$ = L_Ini_Zeile$ & Ctrl.FontBold & GCM_SEPERATOR
  1329.     L_Ini_Zeile$ = L_Ini_Zeile$ & Ctrl.ForeColor & GCM_SEPERATOR
  1330.     L_Ini_Zeile$ = L_Ini_Zeile$ & Ctrl.BackColor
  1331.   End If
  1332.   P_WritePrivatInit GCM_EINSTELLUNGEN, (Ctrl.Tag), L_Ini_Zeile$
  1333. End Sub
  1334.  
  1335. ' --------------------------------------------------------
  1336. ' Speichert die ben÷tigten Formular-Informationen im
  1337. ' Initialisierungsfile ab
  1338. ' --------------------------------------------------------
  1339. ' Autor   : NM/ag
  1340. ' Datum   : 10.2.94
  1341. ' Version : 1.0
  1342. ' --------------------------------------------------------
  1343. Sub PM_SchreibForm (Frm As Form)
  1344.   Dim L_Ini_Zeile$, L_tmp_State%
  1345.   L_tmp_State% = Frm.WindowState
  1346.   Frm.WindowState = 0
  1347.   L_Ini_Zeile$ = Frm.Top & GCM_SEPERATOR
  1348.   L_Ini_Zeile$ = L_Ini_Zeile$ & Frm.Left & GCM_SEPERATOR
  1349.   L_Ini_Zeile$ = L_Ini_Zeile$ & Frm.Width & GCM_SEPERATOR
  1350.   L_Ini_Zeile$ = L_Ini_Zeile$ & Frm.Height & GCM_SEPERATOR
  1351.   L_Ini_Zeile$ = L_Ini_Zeile$ & L_tmp_State%
  1352.   P_WritePrivatInit GCM_EINSTELLUNGEN, (Frm.Tag), L_Ini_Zeile$
  1353. End Sub
  1354.  
  1355. ' --------------------------------------------------------
  1356. ' Positioniert das Steuerelement Cntrl auf den Eintrag$
  1357. ' --------------------------------------------------------
  1358. Sub PM_SeekList (Cntrl As Control, Eintrag$)
  1359.   Const LC_CB_FINDSTRINGEXACT = &H400 + 24
  1360.   ' SendMessage liefert die Position resp. -1 des Eintrages
  1361.   Cntrl.ListIndex = SendMessage(Cntrl.hWnd, LC_CB_FINDSTRINGEXACT, -1, Eintrag$)
  1362. End Sub
  1363.  
  1364. ' --------------------------------------------------------
  1365. ' Schⁿtzt die ⁿbergebene Textbox vor dem ⁿberschreiben
  1366. ' --------------------------------------------------------
  1367. Sub PM_SetReadOnly (Ctrl As TextBox)
  1368.   Dim Res&
  1369.   Const WM_USER = &H400
  1370.   Const EM_SETREADONLY = WM_USER + 31
  1371.   Res& = SendMessage(Ctrl.hWnd, EM_SETREADONLY, -1, "")
  1372. End Sub
  1373.  
  1374. ' --------------------------------------------------------
  1375. ' Wartet bis das Programm beendet worden ist
  1376. ' --------------------------------------------------------
  1377. Sub PM_ShellAndWait (CommandString$)
  1378.   Dim L_ID%
  1379.   L_ID% = Shell(CommandString$, 1)
  1380.   Do
  1381.     DoEvents
  1382.   Loop Until GetModuleUsage(L_ID%) = 0
  1383. End Sub
  1384.  
  1385. ' --------------------------------------------------------
  1386. ' 3D-Effekt auf Formen mit ScaleMode = Pixel
  1387. ' --------------------------------------------------------
  1388. Sub PM_show3d (Frm As Form)
  1389. ' Colors
  1390.  
  1391. Const BLACK = &H0&
  1392. Const WHITE = &HFFFFFF
  1393. Const GRAY = &HC0C0C0
  1394. Const DGRAY = &H808080
  1395.  
  1396. Dim Ct As Control
  1397. Dim I As Integer
  1398.  
  1399. Frm.AutoRedraw = True
  1400. Frm.Cls
  1401. ' Zeichne Formular
  1402. Frm.BackColor = &HC0C0C0
  1403. If Frm.BorderStyle = 0 Or Frm.BorderStyle = 1 Or Frm.BorderStyle = 3 Then
  1404.     Frm.DrawWidth = 2
  1405.     Frm.Line (0, 0)-(Frm.ScaleWidth, Frm.ScaleHeight), DGRAY, B
  1406.     Frm.DrawWidth = 1
  1407.     Frm.Line (0, 0)-(Frm.ScaleWidth, Frm.ScaleHeight), WHITE, B
  1408. End If
  1409.  
  1410. For I = 0 To Frm.Controls.Count - 1
  1411.     Set Ct = Frm.Controls(I)
  1412.     If Ct.Visible Then
  1413.       If TypeOf Ct Is Shape Then
  1414.           Ct.Visible = False
  1415.           Frm.DrawWidth = 2
  1416.           Frm.Line (Ct.Left, Ct.Top)-(Ct.Width + 1 + Ct.Left, Ct.Top + Ct.Height), DGRAY, B
  1417.           Frm.DrawWidth = 1
  1418.           Frm.Line (Ct.Left - 1, Ct.Top - 1)-(Ct.Width + Ct.Left, Ct.Top + Ct.Height - 1), WHITE, B
  1419.       End If
  1420.       If TypeOf Ct Is PictureBox Then
  1421.           Frm.Line (Ct.Left + (1), Ct.Top + (1))-(Ct.Width + Ct.Left, Ct.Top + Ct.Height), WHITE, B
  1422.           Frm.Line (Ct.Left - (1), Ct.Top - (1))-(Ct.Width + (1) + Ct.Left, Ct.Top + Ct.Height + (1)), DGRAY, B
  1423.           Frm.Line (Ct.Left - (2), Ct.Top - (2))-(Ct.Width + Ct.Left + (1), Ct.Top + Ct.Height + (1)), GRAY, B
  1424.       End If
  1425.       If TypeOf Ct Is Label Then
  1426.   
  1427.           Frm.FontSize = Ct.FontSize
  1428.           Frm.FontName = Ct.FontName
  1429.           Frm.FontBold = Ct.FontBold
  1430.           Ct.Visible = False
  1431.           Frm.CurrentX = Ct.Left + 1
  1432.           Frm.CurrentY = Ct.Top + 1
  1433.           Frm.ForeColor = WHITE
  1434.           Frm.Print Ct.Caption
  1435.           Frm.CurrentX = Ct.Left
  1436.           Frm.CurrentY = Ct.Top
  1437.           Frm.ForeColor = BLACK
  1438.           Frm.Print Ct.Caption
  1439.           Ct.Visible = True
  1440.       End If
  1441.       If TypeOf Ct Is TextBox Then
  1442.           Frm.Line (Ct.Left + 1, Ct.Top + 1)-(Ct.Width + Ct.Left, Ct.Top + Ct.Height), WHITE, B
  1443.           Frm.Line (Ct.Left - 1, Ct.Top - 1)-(Ct.Width + 1 + Ct.Left, Ct.Top + Ct.Height + 1), DGRAY, B
  1444.           Frm.Line (Ct.Left - 2, Ct.Top - 2)-(Ct.Width + Ct.Left + 1, Ct.Top + Ct.Height + 1), GRAY, B
  1445.       End If
  1446.       If TypeOf Ct Is ListBox Then
  1447.           Frm.Line (Ct.Left + 1, Ct.Top + 1)-(Ct.Width + Ct.Left, Ct.Top + Ct.Height), DGRAY, B
  1448.           Frm.Line (Ct.Left - 1, Ct.Top - 1)-(Ct.Width + 1 + Ct.Left, Ct.Top + Ct.Height + 1), WHITE, B
  1449.           Frm.Line (Ct.Left - 2, Ct.Top - 2)-(Ct.Width + Ct.Left + 1, Ct.Top + Ct.Height + 1), GRAY, B
  1450.       End If
  1451.       If TypeOf Ct Is ComboBox Then
  1452.           Frm.Line (Ct.Left + 1, Ct.Top + 1)-(Ct.Width + Ct.Left, Ct.Top + Ct.Height), DGRAY, B
  1453.           Frm.Line (Ct.Left - 1, Ct.Top - 1)-(Ct.Width + 1 + Ct.Left, Ct.Top + Ct.Height + 1), WHITE, B
  1454.           Frm.Line (Ct.Left - 2, Ct.Top - 2)-(Ct.Width + Ct.Left + 1, Ct.Top + Ct.Height + 1), GRAY, B
  1455.       End If
  1456.       If TypeOf Ct Is Line Then
  1457.           Ct.Visible = False
  1458.           Frm.Line (Ct.X1 + 1, Ct.Y1 + 1)-(Ct.X2 + 1, Ct.Y2 + 1), DGRAY
  1459.           Frm.Line (Ct.X1, Ct.Y1)-(Ct.X2, Ct.Y2), WHITE
  1460.       End If
  1461.     End If
  1462. Next I
  1463. Frm.AutoRedraw = False
  1464.  
  1465. End Sub
  1466.  
  1467. Sub PM_ShowToolbox (mode As Integer)
  1468.   Dim I%
  1469.   Static CMDEnables(7) As Integer
  1470.   If mode Then
  1471.     F_Toolbox.Show
  1472.     For I% = 0 To 7
  1473.       MDICDSpy!MnuSetupItem(I%).Visible = CMDEnables(I%)
  1474.     Next I%
  1475.     MDICDSpy!MnuSetupTrenn.Visible = True
  1476.   Else
  1477.     F_Toolbox.Hide
  1478.     For I% = 0 To 7
  1479.        CMDEnables(I%) = MDICDSpy!MnuSetupItem(I%).Visible
  1480.        MDICDSpy!MnuSetupItem(I%).Visible = False
  1481.     Next I%
  1482.     MDICDSpy!MnuSetupTrenn.Visible = False
  1483.   End If
  1484. End Sub
  1485.  
  1486. ' -----------------------------------------------------------------------
  1487. ' Schaltet den ⁿbergebenen Befehl in der Toolbox auf aktiv resp. inaktiv
  1488. ' -----------------------------------------------------------------------
  1489. Sub PM_Switch (Button As Integer, mode As Integer)
  1490.   F_Toolbox.Cmd_Array(Button%).Enabled = mode%
  1491. End Sub
  1492.  
  1493. Sub PM_UpdateOccurs (ID_Spy&, filename$)
  1494.   Dim I%, ii%
  1495.   Dim FileHandle%
  1496.   Dim L_Occurs As TM_OccursRec
  1497.   FileHandle% = FreeFile
  1498.   Open "C:\OCCURS.DAT" For Random As FileHandle% Len = Len(L_Occurs)
  1499.   ii% = LOF(FileHandle%) / Len(L_Occurs) + 1
  1500.   For I% = 1 To UBound(G_Worte)
  1501.     L_Occurs.ID_Wort = G_Worte(I%).ID
  1502.     L_Occurs.ID_Spy = ID_Spy&
  1503.     Put FileHandle%, ii%, L_Occurs
  1504.     ii% = ii% + 1
  1505.   Next I%
  1506.   Close FileHandle%
  1507. End Sub
  1508.  
  1509. Sub PM_UpdateWords ()
  1510.   Dim I%, ii%
  1511.   Dim FileHandle%
  1512.   Dim L_Words As TM_WordsRec
  1513.   Dim found%
  1514.   
  1515.   Dim db As database, ds As Dynaset
  1516.  
  1517.   Debug.Print "Start: "; Timer
  1518.   Set db = OpenDatabase("C:\TEMP.MDB")
  1519.   Set ds = db.CreateDynaset("t")
  1520.  
  1521.   FileHandle% = FreeFile
  1522.   Open "C:\WORDS.DAT" For Random As FileHandle% Len = Len(L_Words)
  1523.  
  1524.   On Error Resume Next
  1525.   ds.BeginTrans
  1526.  
  1527.   For I% = 1 To UBound(G_Worte)
  1528.     ds.AddNew
  1529.     ds!Wort = G_Worte(I%).Wort
  1530.     ds.Update
  1531.     If Err = 0 Then ' Bereits vorhandenes Wort
  1532.       ds.MoveLast
  1533.       G_Worte(I%).ID& = ds!ID
  1534.     End If
  1535.   Next I%
  1536.   
  1537.   For I% = 1 To UBound(G_Worte)
  1538.     If G_Worte(I%).ID& = 0 Then
  1539.       L_Words.Wort$ = G_Worte(I%).Wort$
  1540.       G_Worte(I%).ID& = ii% + I%
  1541.       Put #FileHandle%, ii% + I%, L_Words
  1542.     End If
  1543.   Next I%
  1544.   Close FileHandle%
  1545.   ds.CommitTrans
  1546.   ds.Close
  1547.   db.Close
  1548.   Debug.Print "End : "; Timer
  1549.  
  1550. End Sub
  1551.  
  1552.