home *** CD-ROM | disk | FTP | other *** search
/ Programming Tool Box / SIMS_2.iso / code / cdspy / pars_my.bas < prev    next >
BASIC Source File  |  1995-02-27  |  27KB  |  878 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 * 50
  31. End Type
  32.  
  33. Type TM_OccursRec
  34.   ID_Wort As Long
  35.   ID_Spy As Long
  36.   filename As String * 12
  37. End Type
  38.  
  39. Type TM_Worte
  40.   wort As String * 50
  41.   ID As Long
  42. End Type
  43.  
  44. Type TM_AktElement
  45.   Info As String
  46.   Startfile As String
  47.   Demofile As String
  48.   Readmefile As String
  49.   Verzeichnis As String
  50.   Code As Integer
  51.   SetupCommand As String
  52.   Hilfefile As String
  53.   Copy As Integer
  54. End Type
  55.  
  56. ' ---------------------
  57. ' - globale Variablen -
  58. ' ---------------------
  59.  
  60. ' zuletzt mit FM_LiesDB gelesenen Datensatz
  61. Global GM_DB As TM_DBRec
  62. ' gesamte Datenbank
  63. Global GM_DBAll() As TM_DBRec
  64. ' Pfad der Datei CDINFO
  65. Global G_CDInfoFile As String
  66. ' diverses
  67. Global G_Control As Control
  68. ' Pfad des im Editor anzuzeigenden Files
  69. Global G_EditFile As String
  70. ' Liste der zu kopierenden Dateien
  71. Global G_CopyFiles As String
  72. ' Liste aller benutzer W÷rter (Wird in der prod. Version nicht ben÷tigt!)
  73. Global G_Worte() As TM_Worte
  74. ' CD-Laufwerk
  75. Global GM_Drive As String * 2
  76. ' Spy-Datenbank Dateiname
  77. Global GM_DBName As String * 12
  78. ' W÷rterdatenbank Dateiname
  79. Global GM_DBWorte As String * 40
  80. ' Vorkommendatenbank Dateiname
  81. Global GM_DBOccurs As String * 40
  82. ' Array das alle gefundenen Stichwortpositionen enthΣlt
  83. Global GM_Occurs() As TM_OccursRec
  84. ' Flags
  85. Global GM_Refresh As Integer
  86. ' Aktuell ausgewΣhltes Element
  87. Global GM_AktElement As TM_AktElement
  88. ' Suchtext nach dem die aktuelle Suche erfolgt
  89. Global GM_Searchtext As String
  90. ' Dateihandle fⁿr die Datenbank SPY.DAT
  91. Global GM_FH_DBName As Integer
  92. ' Fensterbezeichnung fⁿr F_Search
  93. Global GM_Searchtitle As String
  94. ' Suchstring um im Editor weitersuchen zu k÷nnen
  95. Global GM_SeekString As String
  96. ' Flag, ob der Editor ein ⁿbergrosses File enthΣlt
  97. Global GM_HugeFile As Integer
  98.  
  99. ' ----------------------
  100. ' - globale Konstanten -
  101. ' ----------------------
  102.  
  103. ' Dateinamen
  104. Global Const GCM_INFOFILENAME = "CDINFO.TXT"
  105. Global Const GCM_DBNAME = "N:\SPY.DAT"
  106.  
  107. ' CDInfo.TXT Topics
  108. Global Const GCM_VERZEICHNIS = "VERZEICHNIS="
  109. Global Const GCM_PROJEKT = "PROJEKT="
  110. Global Const GCM_INFO = "INFO="
  111. Global Const GCM_DEMO = "DEMO="
  112. Global Const GCM_INSTALL = "INSTALL="
  113. Global Const GCM_STARTABLE = "STARTABLE="
  114. Global Const GCM_README = "README="
  115.  
  116. ' Allgemeine Konstanten
  117. Global Const GCM_SEPERATOR = ","
  118. Global Const GCM_OWNER_ERROR = 32767
  119.  
  120. ' INI-Datei Topics
  121. Global Const GCM_EINSTELLUNGEN = "Einstellungen"
  122. Global Const GCM_SPLITT = "Splitt"
  123.  
  124. ' SchaltflΣchen im Cmd_Array
  125. Global Const GCM_CMD_INFO = 0
  126. Global Const GCM_CMD_START = 1
  127. Global Const GCM_CMD_DEMO = 2
  128. Global Const GCM_CMD_COPY = 3
  129. Global Const GCM_CMD_INSTALL = 4
  130. Global Const GCM_CMD_CODE = 5
  131. Global Const GCM_CMD_HILFE = 6
  132. Global Const GCM_CMD_README = 7
  133.  
  134. ' Konstanten fⁿr Textboxhandling
  135. Global Const ON_TAB = 1
  136. Global Const ON_ALT = 2
  137. Global Const ON_MOUSE = 3
  138. Global Const ON_ELSE = 4
  139.  
  140. ' allgemeine Konstanten
  141. Global Const GCM_ENABLE = -1
  142. Global Const GCM_DISABLE = 0
  143. Global Const GCM_STICHWORTSUCHE = "Stichwortsuche"
  144. Global Const GCM_TITELTEXTSUCHE = "Titeltextsuche"
  145.  
  146. ' ---------------------
  147. ' - API-Deklarationen -
  148. ' ---------------------
  149.  
  150. Declare Function SendMessage Lib "User" (ByVal hWnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As String) As Long
  151. Declare Function GetModuleUsage Lib "KERNEL" (ByVal InstanceID%) As Integer
  152. Declare Function EnableWindow% Lib "User" (ByVal hWnd%, ByVal aBOOL%)
  153. 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
  154. Declare Function GetAsyncKeyState Lib "User" (ByVal vKey As Integer) As Integer
  155.  
  156. ' ------------------------------------------------------------------
  157. ' Erzeugt das ⁿbergebene Unterverzeichnis verz$.
  158. ' ------------------------------------------------------------------
  159. Function FM_CreateDirectory (verz$)
  160.   Dim L_TmpVerz$, L_Verz$, L_Res%, L_TmpDrive$
  161.   
  162.   On Error GoTo Err_FM_CreateDirectory
  163.   If FM_ExistDir(verz$) Then
  164.     FM_CreateDirectory = 2
  165.     Exit Function
  166.   End If
  167.   L_Res% = True
  168.   L_TmpDrive$ = CurDir$
  169.   ChDrive verz$
  170.   L_TmpVerz$ = CurDir$
  171.   ChDir "\"
  172.   L_Verz$ = FM_ParseZeile(verz$, "\")
  173.   Do While L_Verz$ <> ""
  174.     L_Verz$ = Left$(FM_ParseZeile("", ""), 8)
  175.     If L_Verz$ <> "" Then
  176.       MkDir (L_Verz$)
  177.       ChDir (L_Verz$)
  178.     End If
  179.   Loop
  180.   ChDrive verz$
  181.   ChDir (L_TmpVerz$)
  182.   ChDir (L_TmpDrive$)
  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. ' --------------------------------------------------------
  350. ' Liefert die Zeichenkette Verz$ mit abschliessendem \
  351. ' falls dieser nicht bereits vorhanden ist
  352. ' --------------------------------------------------------
  353. Function FM_Verz$ (verz$)
  354.   Dim L_Verz$
  355.   L_Verz$ = Trim$(verz$)
  356.   If Right$(L_Verz$, 1) <> "\" Then
  357.     L_Verz$ = L_Verz$ + "\"
  358.   End If
  359.   FM_Verz$ = L_Verz$
  360. End Function
  361.  
  362. ' --------------------------------------------------------
  363. ' L÷scht die Datenbank GCM_DBNAME
  364. ' --------------------------------------------------------
  365. Sub PM_ClearDB ()
  366.   Close
  367.   Kill GCM_DBNAME
  368.   Open GCM_DBNAME For Random As GM_FH_DBName% Len = Len(GM_DB)
  369. End Sub
  370.  
  371. ' ----------------------------------------------------------------------
  372. ' L÷scht das globale Array der gefundenen Stichworte
  373. ' ----------------------------------------------------------------------
  374. Sub PM_ClsFound ()
  375.   ReDim GM_Occurs(0)
  376. End Sub
  377.  
  378. ' --------------------------------------------------------
  379. '
  380. ' --------------------------------------------------------
  381. Sub PM_DateiKopieren ()
  382. Rem kopieren der Dateien von der CD aufs Ziellaufwerk
  383.  
  384. Dim Pfad$
  385. Dim zielpfad$
  386. Dim doscommand$
  387. Dim filename$
  388. Dim stat As Integer
  389. Dim Msg$
  390. Dim begpos As Integer
  391. Dim endpos As Integer
  392. Dim temppath$
  393. Dim file$
  394. Dim filelist$
  395. Dim i As Integer
  396. Dim Ct As Integer
  397. Dim index As Integer
  398. Dim G_Laufwerk$
  399.  
  400.     On Error Resume Next
  401.  
  402. Rem kopieren
  403.     ' bilden des Quellpfades
  404.     'F_copy.MousePointer = 11
  405.     'Pfad$ = G_Laufwerk$ + F_Main.Data1.Recordset.Fields("Pfad") + "\"
  406.     'zielpfad$ = Trim$(F_copy.Text1.Text)
  407.     If Right$(zielpfad$, 1) <> "\" Then
  408.         If Right$(zielpfad$, 3) = "*.*" Then
  409.             zielpfad$ = Left$(zielpfad$, Len(zielpfad$) - 3)
  410.         Else
  411.             zielpfad$ = zielpfad$ + "\"
  412.         End If
  413.     End If
  414.  
  415.     begpos = 4
  416.     Do While begpos < Len(zielpfad$)       ' directories suchen und erstellen
  417.         endpos = InStr(begpos, zielpfad$, "\")
  418.         If endpos = 0 Then
  419.             Exit Do
  420.         End If
  421.         temppath$ = Mid$(zielpfad$, 1, endpos - 1)
  422.         MkDir temppath$                     ' Make new directory.
  423.         Msg$ = ""
  424.         If Err = 75 And endpos = Len(zielpfad$) Then Msg$ = temppath$ & " Verzeichnis existiert bereits." + Chr$(13) + "(bestehende Dateien werden ⁿberschrieben)"' Check if directory exists.
  425.         If Err = 57 Then Msg$ = "GerΣte Ein-/Ausgabefehler."
  426.         If Err = 61 Then Msg$ = "DatentrΣger voll."
  427.         If Err = 76 Then Msg$ = "Pfad nicht gefunden."
  428.         If Err = 70 Then Msg$ = "Zugriff nicht gestattet."
  429.         Err = 0
  430.         If Msg$ <> "" Then
  431.             stat = MsgBox(Msg$, 49, "CD Spy")
  432.             If stat = 2 Then
  433.                 'F_copy.MousePointer = 0
  434.                 Exit Sub
  435.             End If
  436.         End If
  437.             
  438.         begpos = endpos + 1
  439.     Loop
  440.  
  441.     stat = 0
  442.     'P_Copyfiles Pfad$, zielpfad$, stat            ' Dateien kopieren
  443.     If stat <> 0 Then
  444.         'F_copy.MousePointer = 0
  445.         Exit Sub
  446.     End If
  447.  
  448.     'F_copy.Hide
  449.         
  450.     'F_copy.Text1.SetFocus                   ' nicht kopieren
  451.     'F_copy.MousePointer = 0
  452.  
  453. End Sub
  454.  
  455. ' --------------------------------------------------------
  456. ' Kopiert die gewⁿnschten Dateien
  457. ' --------------------------------------------------------
  458. Sub PM_FileCopy ()
  459.   
  460. End Sub
  461.  
  462. ' --------------------------------------------------------
  463. ' Analysiert den Inhalt der aktuellen Datei CDINFO.TXT in
  464. ' die Struktur d ein.
  465. ' #miki
  466. ' --------------------------------------------------------
  467. Sub PM_GetCDINFO (d As TM_DBRec)
  468.   Dim L_Tmp$, L_FileHandle%, L_Zeile$, L_Pos%, L_CDInfoDatei$
  469.   L_CDInfoDatei$ = FM_Verz$(d.Verzeichnis$) + GCM_INFOFILENAME
  470.   L_FileHandle% = FreeFile
  471.   On Error Resume Next
  472.   Open L_CDInfoDatei$ For Input As L_FileHandle%
  473.   ' Konnte Datei nicht ge÷ffnet werden Abbruch
  474.   If Err <> 0 Then Exit Sub
  475.   If Not EOF(L_FileHandle%) Then
  476.     Line Input #L_FileHandle%, L_Zeile$
  477.     L_Pos% = InStr(UCase$(L_Zeile$), GCM_VERZEICHNIS)
  478.     If L_Pos% Then
  479.       d.Bezeichnung$ = Mid$(L_Zeile$, L_Pos% + Len(GCM_VERZEICHNIS))
  480.     End If
  481.     If Not EOF(L_FileHandle%) Then
  482.       Line Input #L_FileHandle%, L_Zeile$
  483.       L_Pos% = InStr(UCase$(L_Zeile$), GCM_PROJEKT)
  484.       If L_Pos% Then
  485.         d.Code = 1
  486.       Else
  487.         d.Code = 0
  488.       End If
  489.     End If
  490.   End If
  491.   Close L_FileHandle%
  492. End Sub
  493.  
  494. ' --------------------------------------------------------
  495. ' Liefert im Array d() alle VΣter
  496. ' --------------------------------------------------------
  497. Sub PM_GetParents (ID&, d())
  498.   Dim i%
  499.   For i% = 1 To LOF(GM_FH_DBName%) / Len(GM_DB)
  500.     Get GM_FH_DBName%, i%, GM_DB
  501.     If GM_DB.Vater = ID& Then
  502.       d(UBound(d)) = i%
  503.       ReDim Preserve d(UBound(d) + 1)
  504.     End If
  505.   Next i%
  506. End Sub
  507.  
  508. ' --------------------------------------------------------
  509. ' Liest die Datei CDINFO im Verzeichnis$ in die globale
  510. ' Variable G_CDInfoFile$ ein
  511. ' --------------------------------------------------------
  512. Sub PM_LiesCDInfo (Verzeichnis$)
  513.   Dim L_FileHandle%
  514.   Dim L_LΣnge&
  515.   Dim L_CDInfoFilename$
  516.   On Error Resume Next
  517.   L_CDInfoFilename$ = FM_Verz$(Verzeichnis$) & GCM_INFOFILENAME
  518.   L_LΣnge& = FileLen(L_CDInfoFilename$)
  519.   G_CDInfoFile$ = Space$(L_LΣnge&)
  520.   L_FileHandle% = FreeFile
  521.   Open L_CDInfoFilename$ For Binary As L_FileHandle% Len = L_LΣnge&
  522.   Get #L_FileHandle%, , G_CDInfoFile$
  523.   Close L_FileHandle%
  524. End Sub
  525.  
  526. ' --------------------------------------------------------
  527. ' Liest den Verzeichnisbaum vom Verzeichnis Path$ an in
  528. ' das Array d ein. Wird fⁿr die Endversion nicht ben÷tigt
  529. ' --------------------------------------------------------
  530. Sub PM_ListSubDirs (path$, d() As TM_DBRec)
  531.   Const ATTR_DIRECTORY = 16
  532.   Dim position%, Count%, Vater%
  533.  
  534.   Dim i, dirname
  535.  
  536.   On Error Resume Next
  537.   If Right$(path$, 1) <> "\" Then path$ = path$ + "\"
  538.   If FM_ExistDir(path$) Then
  539.     position% = 1
  540.     Count% = 1
  541.     dirname = Dir(path, ATTR_DIRECTORY) ' Erster Verzeichnisname
  542.  
  543.     'Alle Verzeichnisse innerhalb dieses Verzeichnisses in D() speichern
  544.     ReDim d(Count%)
  545.     d(Count%).Verzeichnis$ = path$
  546.     d(Count%).Vater = 0
  547.     'PM_GetCDINFO d(Count%)
  548.     Count% = Count% + 1
  549.     Do
  550.       Do While dirname <> ""
  551.         DoEvents
  552.         If dirname <> "." And dirname <> ".." Then
  553.           If (GetAttr(path + dirname) And ATTR_DIRECTORY) = ATTR_DIRECTORY Then
  554.             ReDim Preserve d(Count%)
  555.             d(Count%).Verzeichnis = path + dirname
  556.             d(Count%).Vater = position%
  557.             PM_GetCDINFO d(Count%)
  558.             Count% = Count% + 1
  559.           End If
  560.         End If
  561.         dirname = Dir   ' Get another directory name.
  562.       Loop
  563.       position% = position% + 1
  564.       If position% >= Count% Then Exit Do
  565.       path$ = Trim$(d(position%).Verzeichnis$) + "\"
  566.       dirname = Dir(path, ATTR_DIRECTORY)
  567.     Loop
  568.   End If
  569. End Sub
  570.  
  571. Sub PM_LookforExt (ReSourceName$)
  572.   Dim nItemFound As Integer
  573.   Dim AppPathSize As Long
  574.   Dim sExtType, ApptoLaunch  As String
  575.   Dim sAssocApp$
  576.   Dim LaunchApp, Y As Integer
  577.   On Error GoTo Err_PM_LookforExt
  578.   sExtType = Right$(ReSourceName, 3)  ' Extension lesen
  579.   ' ⁿbereinstimmenden Eintrag in WIN.INI [Extensions] suchen
  580.   sAssocApp = Space$(256)
  581.   nItemFound = GetProfileString("Extensions", ByVal sExtType, "", sAssocApp, Len(sAssocApp))
  582.   If nItemFound = 0 Then
  583.     GoTo Err_PM_LookforExt
  584.   Else
  585.     ' Applikationsname und Pfad extrahieren
  586.     sAssocApp = RTrim(sAssocApp)
  587.     AppPathSize = Len(sAssocApp)
  588.     AppPathSize = AppPathSize - 6
  589.     ApptoLaunch = Left(sAssocApp, AppPathSize)
  590.     LaunchApp = Shell((ApptoLaunch + ReSourceName), 1)
  591.     Do While GetModuleUsage(LaunchApp) > 0
  592.       Y% = DoEvents()
  593.     Loop
  594.   End If
  595.   Exit Sub
  596. Err_PM_LookforExt:
  597.   Error GCM_OWNER_ERROR
  598.   Exit Sub
  599. End Sub
  600.  
  601. Sub PM_NewWord (wort$, DS_Worte As Dynaset, DS_Occurs As Dynaset, VerzPos%)
  602.   Dim i%, ub%
  603.   On Error Resume Next
  604.   DS_Worte.AddNew
  605.   DS_Worte!wort = wort$
  606.   DS_Worte.Update
  607.   If Err <> 0 Then
  608.     Err = 0
  609.     DS_Worte.FindFirst ("Wort = '" & wort$ & "'")
  610.   Else
  611.     DS_Worte.MoveLast
  612.   End If
  613.   DS_Occurs.AddNew
  614.   DS_Occurs!ID = VerzPos%
  615.   DS_Occurs!ID_Wort = DS_Worte!ID
  616.   DS_Occurs.Update
  617. End Sub
  618.  
  619. ' --------------------------------------------------------
  620. ' Zerlegt den ⁿbergebenen String in einzelne Worte und
  621. ' fⁿgt diese an die globale W÷rterliste G_Worte an.
  622. ' --------------------------------------------------------
  623. Sub PM_Parse (x As String, DS_Worte As Dynaset, DS_Occurs As Dynaset, VerzPos%)
  624.   Dim i%, zch%, l%
  625.   Dim wort$, zeichen$
  626.   For i% = 1 To Len(x)
  627.     zeichen$ = Mid$(x, i%, 1)
  628.     zch% = Asc(UCase$(zeichen$))
  629.     If zch% >= 65 And zch% <= 90 Or zch% = 196 Or zch% = 214 Or zch% = 220 Then
  630.       wort$ = wort$ + zeichen$
  631.       l% = l% + 1
  632.     Else
  633.       If Trim(wort$) <> "" And l% > 2 And l% < 51 Then
  634.         PM_NewWord LCase(wort$), DS_Worte, DS_Occurs, VerzPos%
  635.       End If
  636.       wort$ = ""
  637.       l% = 0
  638.     End If
  639.   Next i%
  640. End Sub
  641.  
  642. Sub PM_ReadDBAll ()
  643.   Dim i&, Res&
  644.   For i& = 1 To UBound(GM_DBAll)
  645.     Res& = FM_LiesDB(i&)
  646.     GM_DBAll(i&) = GM_DB
  647.     DoEvents
  648.   Next i&
  649. End Sub
  650.  
  651. ' -----------------------------------------------------------------------
  652. ' Bestimmt, ob eine Form tatsΣchlich in einem Refresh Ereignis neue Daten
  653. ' anzeigen soll.
  654. ' -----------------------------------------------------------------------
  655. Sub PM_Refresh (mode As Integer)
  656.   GM_Refresh% = mode%
  657. End Sub
  658.  
  659. Sub PM_RefreshForms ()
  660.   Dim i%
  661.   On Error Resume Next
  662.   PM_Refresh GCM_ENABLE
  663.   For i% = 0 To Forms.Count
  664.     Forms(i%).Refresh
  665.   Next i%
  666.   PM_Refresh GCM_DISABLE
  667. End Sub
  668.  
  669. Sub PM_ScanFile (filename$, DS_Worte As Dynaset, DS_Occurs As Dynaset, VerzPos%)
  670.   Dim FileHandle%
  671.   Dim zeile$
  672.   Dim i%
  673.   Const LC_MAX = 32000
  674.   'Debug.Print "Scanstart : "; Timer
  675.   ReDim G_Worte(0)
  676.   FileHandle% = FreeFile
  677.   Open filename$ For Binary As FileHandle%
  678.   For i% = 1 To LOF(FileHandle%) \ LC_MAX
  679.     zeile$ = Space$(LC_MAX)
  680.     Get #FileHandle%, (i% - 1) * LC_MAX + 1, zeile$
  681.     PM_Parse zeile$, DS_Worte, DS_Occurs, VerzPos%
  682.   Next i%
  683.   zeile$ = Space$((LOF(FileHandle%) Mod LC_MAX))
  684.   Get #FileHandle%, (i% - 1) * LC_MAX + 1, zeile$
  685.   PM_Parse zeile$, DS_Worte, DS_Occurs, VerzPos%
  686.   Close FileHandle%
  687.   Debug.Print "Scanend : "; Timer
  688. End Sub
  689.  
  690. ' --------------------------------------------------------
  691. ' Positioniert das Steuerelement Cntrl auf den Eintrag$
  692. ' --------------------------------------------------------
  693. Sub PM_SeekList (Cntrl As Control, Eintrag$)
  694.   Const LC_CB_FINDSTRINGEXACT = &H400 + 24
  695.   ' SendMessage liefert die Position resp. -1 des Eintrages
  696.   Cntrl.ListIndex = SendMessage(Cntrl.hWnd, LC_CB_FINDSTRINGEXACT, -1, Eintrag$)
  697. End Sub
  698.  
  699. ' --------------------------------------------------------
  700. ' Schⁿtzt die ⁿbergebene Textbox vor dem ⁿberschreiben
  701. ' --------------------------------------------------------
  702. Sub PM_SetReadOnly (Ctrl As TextBox)
  703.   Dim Res&
  704.   Const WM_USER = &H400
  705.   Const EM_SETREADONLY = WM_USER + 31
  706.   Res& = SendMessage(Ctrl.hWnd, EM_SETREADONLY, -1, "")
  707. End Sub
  708.  
  709. ' --------------------------------------------------------
  710. ' Wartet bis das Programm beendet worden ist
  711. ' --------------------------------------------------------
  712. Sub PM_ShellAndWait (CommandString$)
  713.   Dim L_ID%
  714.   L_ID% = Shell(CommandString$, 2)
  715.   Do
  716.     DoEvents
  717.   Loop Until GetModuleUsage(L_ID%) = 0
  718. End Sub
  719.  
  720. ' --------------------------------------------------------
  721. ' 3D-Effekt auf Formen mit ScaleMode = Pixel
  722. ' --------------------------------------------------------
  723. Sub PM_show3d (Frm As Form)
  724. ' Colors
  725.  
  726. Const BLACK = &H0&
  727. Const WHITE = &HFFFFFF
  728. Const GRAY = &HC0C0C0
  729. Const DGRAY = &H808080
  730.  
  731. Dim Ct As Control
  732. Dim i As Integer
  733.  
  734. Frm.AutoRedraw = True
  735. Frm.Cls
  736. ' Zeichne Formular
  737. Frm.BackColor = &HC0C0C0
  738. If Frm.BorderStyle = 0 Or Frm.BorderStyle = 1 Or Frm.BorderStyle = 3 Then
  739.     Frm.DrawWidth = 2
  740.     Frm.Line (0, 0)-(Frm.ScaleWidth, Frm.ScaleHeight), DGRAY, B
  741.     Frm.DrawWidth = 1
  742.     Frm.Line (0, 0)-(Frm.ScaleWidth, Frm.ScaleHeight), WHITE, B
  743. End If
  744.  
  745. For i = 0 To Frm.Controls.Count - 1
  746.     Set Ct = Frm.Controls(i)
  747.     If Ct.Visible Then
  748.       If TypeOf Ct Is Shape Then
  749.           Ct.Visible = False
  750.           Frm.DrawWidth = 2
  751.           Frm.Line (Ct.Left, Ct.Top)-(Ct.Width + 1 + Ct.Left, Ct.Top + Ct.Height), DGRAY, B
  752.           Frm.DrawWidth = 1
  753.           Frm.Line (Ct.Left - 1, Ct.Top - 1)-(Ct.Width + Ct.Left, Ct.Top + Ct.Height - 1), WHITE, B
  754.       End If
  755.       If TypeOf Ct Is PictureBox Then
  756.           Frm.Line (Ct.Left + (1), Ct.Top + (1))-(Ct.Width + Ct.Left, Ct.Top + Ct.Height), WHITE, B
  757.           Frm.Line (Ct.Left - (1), Ct.Top - (1))-(Ct.Width + (1) + Ct.Left, Ct.Top + Ct.Height + (1)), DGRAY, B
  758.           Frm.Line (Ct.Left - (2), Ct.Top - (2))-(Ct.Width + Ct.Left + (1), Ct.Top + Ct.Height + (1)), GRAY, B
  759.       End If
  760.       If TypeOf Ct Is Label Then
  761.   
  762.           Frm.FontSize = Ct.FontSize
  763.           Frm.FontName = Ct.FontName
  764.           Frm.FontBold = Ct.FontBold
  765.           Ct.Visible = False
  766.           Frm.CurrentX = Ct.Left + 1
  767.           Frm.CurrentY = Ct.Top + 1
  768.           Frm.ForeColor = WHITE
  769.           Frm.Print Ct.Caption
  770.           Frm.CurrentX = Ct.Left
  771.           Frm.CurrentY = Ct.Top
  772.           Frm.ForeColor = BLACK
  773.           Frm.Print Ct.Caption
  774.           Ct.Visible = True
  775.       End If
  776.       If TypeOf Ct Is TextBox Then
  777.           Frm.Line (Ct.Left + 1, Ct.Top + 1)-(Ct.Width + Ct.Left, Ct.Top + Ct.Height), WHITE, B
  778.           Frm.Line (Ct.Left - 1, Ct.Top - 1)-(Ct.Width + 1 + Ct.Left, Ct.Top + Ct.Height + 1), DGRAY, B
  779.           Frm.Line (Ct.Left - 2, Ct.Top - 2)-(Ct.Width + Ct.Left + 1, Ct.Top + Ct.Height + 1), GRAY, B
  780.       End If
  781.       If TypeOf Ct Is ListBox Then
  782.           Frm.Line (Ct.Left + 1, Ct.Top + 1)-(Ct.Width + Ct.Left, Ct.Top + Ct.Height), DGRAY, B
  783.           Frm.Line (Ct.Left - 1, Ct.Top - 1)-(Ct.Width + 1 + Ct.Left, Ct.Top + Ct.Height + 1), WHITE, B
  784.           Frm.Line (Ct.Left - 2, Ct.Top - 2)-(Ct.Width + Ct.Left + 1, Ct.Top + Ct.Height + 1), GRAY, B
  785.       End If
  786.       If TypeOf Ct Is ComboBox Then
  787.           Frm.Line (Ct.Left + 1, Ct.Top + 1)-(Ct.Width + Ct.Left, Ct.Top + Ct.Height), DGRAY, B
  788.           Frm.Line (Ct.Left - 1, Ct.Top - 1)-(Ct.Width + 1 + Ct.Left, Ct.Top + Ct.Height + 1), WHITE, B
  789.           Frm.Line (Ct.Left - 2, Ct.Top - 2)-(Ct.Width + Ct.Left + 1, Ct.Top + Ct.Height + 1), GRAY, B
  790.       End If
  791.       If TypeOf Ct Is Line Then
  792.           Ct.Visible = False
  793.           Frm.Line (Ct.X1 + 1, Ct.Y1 + 1)-(Ct.X2 + 1, Ct.Y2 + 1), DGRAY
  794.           Frm.Line (Ct.X1, Ct.Y1)-(Ct.X2, Ct.Y2), WHITE
  795.       End If
  796.     End If
  797. Next i
  798. Frm.AutoRedraw = False
  799.  
  800. End Sub
  801.  
  802. Sub PM_UpdateOccurs (ID_Spy&, filename$)
  803.   Dim i%, ii%
  804.   Dim FileHandle%
  805.   Dim L_Occurs As TM_OccursRec
  806.   FileHandle% = FreeFile
  807.   Open "C:\OCCURS.DAT" For Random As FileHandle% Len = Len(L_Occurs)
  808.   ii% = LOF(FileHandle%) / Len(L_Occurs) + 1
  809.   For i% = 1 To UBound(G_Worte)
  810.     L_Occurs.ID_Wort = G_Worte(i%).ID
  811.     L_Occurs.ID_Spy = ID_Spy&
  812.     L_Occurs.filename$ = filename$
  813.     Put FileHandle%, ii%, L_Occurs
  814.     ii% = ii% + 1
  815.   Next i%
  816.   Close FileHandle%
  817. End Sub
  818.  
  819. Sub PM_UpdateWords ()
  820.   Dim i%, ii%
  821.   Dim FileHandle%
  822.   Dim L_Words As TM_WordsRec
  823.   Dim found%
  824.   
  825.   Dim db As database, ds As Dynaset
  826.  
  827.   Debug.Print "Start: "; Timer
  828.   Set db = OpenDatabase("C:\TEMP.MDB")
  829.   Set ds = db.CreateDynaset("t")
  830.  
  831.   FileHandle% = FreeFile
  832.   Open "C:\WORDS.DAT" For Random As FileHandle% Len = Len(L_Words)
  833.  
  834.   On Error Resume Next
  835.   ds.BeginTrans
  836.  
  837.   For i% = 1 To UBound(G_Worte)
  838.     ds.AddNew
  839.     ds!wort = G_Worte(i%).wort
  840.     ds.Update
  841.     If Err = 0 Then ' Bereits vorhandenes Wort
  842.       ds.MoveLast
  843.       G_Worte(i%).ID& = ds!ID
  844.     End If
  845.   Next i%
  846.   
  847.   For i% = 1 To UBound(G_Worte)
  848.     If G_Worte(i%).ID& = 0 Then
  849.       L_Words.wort$ = G_Worte(i%).wort$
  850.       G_Worte(i%).ID& = ii% + i%
  851.       Put #FileHandle%, ii% + i%, L_Words
  852.     End If
  853.   Next i%
  854.   Close FileHandle%
  855.   ds.CommitTrans
  856.   ds.Close
  857.   db.Close
  858.   Debug.Print "End : "; Timer
  859.  
  860.   'For i% = 1 To UBound(G_Worte)
  861.   '  For ii% = 1 To LOF(FileHandle%) / Len(L_Words)
  862.   '    Get #FileHandle%, ii%, L_Words
  863.   '    If L_Words.wort = G_Worte(i%).wort$ Then
  864.   '      G_Worte(i%).ID& = ii%
  865.   '      found% = True
  866.   '      Exit For
  867.   '    End If
  868.   '  Next ii%
  869.   '  If Not found% Then
  870.   '    L_Words.wort = G_Worte(i%).wort$
  871.   '    Put #FileHandle%, LOF(FileHandle%) / Len(L_Words) + 1, L_Words
  872.   '    G_Worte(i%).ID = LOF(FileHandle%) / Len(L_Words)
  873.   '  End If
  874.   '  found% = False
  875.   'Next i%
  876. End Sub
  877.  
  878.