home *** CD-ROM | disk | FTP | other *** search
/ Programming Tool Box / SIMS_2.iso / bp_1_94 / vbwin / regdb2 / starter.bas < prev    next >
BASIC Source File  |  1993-11-14  |  14KB  |  398 lines

  1. Option Explicit
  2. Global Const MB_RETRYCANCEL = 5
  3. Global Const MB_ICONSTOP = 16
  4. Global Const IDCANCEL = 2
  5. Global Const IDRETRY = 4
  6. Declare Function GetProfileString% Lib "Kernel" (ByVal lpAppName$, ByVal lpKeyName$, ByVal lpDefault$, ByVal lpReturnedString$, ByVal nSize%)
  7. Declare Function RegQueryValue& Lib "shell.dll" (ByVal hkey&, ByVal subkey$, ByVal buf$, buflen&)
  8. Declare Function FindExecutable% Lib "shell.dll" (ByVal file$, ByVal dr$, ByVal result$)
  9. Declare Function getModuleHandle% Lib "Kernel" (ByVal lpModuleName$)
  10.  
  11. ' Fⁿgt einen Backslash an einen String an, wenn dessen letztes Zeichen
  12. ' kein Backslash ist. Einige Funktionen liefern z.B.
  13. ' "a:\" oder "a:\test" zurⁿck. Wⁿrde man ungeprⁿft einen
  14. ' Backslash anhΣngen, dann erhielte man "a:\\" und somit
  15. ' ein Programm, das Dateien in der Root eines Dateibaums
  16. ' nicht korrekt bearbeiten k÷nnte.
  17. Function addbslash$ (ByVal t$)
  18.     If Len(t) Then
  19.         If Right$(t, 1) <> "\" Then
  20.             addbslash = t & "\"
  21.         Else
  22.             addbslash = t
  23.         End If
  24.     Else
  25.         addbslash = ""
  26.     End If
  27. End Function
  28.  
  29. ' Prⁿft, ob eine Anwendung fⁿr eine DDE-Kommunikation
  30. ' angemeldet wurde.
  31. Function canextdde% (ByVal fext$, ByVal tp$)
  32.     Dim dde$, class$
  33.     On Error Resume Next
  34.     class = QueryRegbase("." & fext)
  35.     If Len(class) Then
  36.         dde = QueryRegbase(class & "\shell\" & tp & "\ddeexec")
  37.         If Len(dde) Then
  38.             canextdde = True
  39.         Else
  40.             canextdde = False
  41.         End If
  42.     Else
  43.         canextdde = False
  44.     End If
  45. End Function
  46.  
  47. Function CountChar% (ByVal t, ByVal z%)
  48.     Dim g&, zeichen$, n&
  49.     On Error Resume Next
  50.     zeichen = Chr$(z)
  51.     Do
  52.         g = InStr(g + 1, t, zeichen)
  53.         n = n + 1
  54.     Loop While g
  55.     CountChar = n - 1
  56. End Function
  57.  
  58. Function Exec% (c As Control, ByVal fullname$, ByVal t%)
  59.     Dim fpath$, fname$, fbody$, fext$, res%, para$, fn$, tp$
  60.     On Error Resume Next
  61.     
  62.     If t = 0 Then tp = "open" Else tp = "print"
  63.  
  64.     fn = GetAvailPart(fullname, 32, 1)
  65.     para = Right$(fullname, Len(fullname) - Len(fn) - 1)
  66.     
  67.     ' ▄bergabe in ihre Bestandteile zerlegen.
  68.     
  69.     splitpathname fullname, fpath, fname
  70.     splitfilename fname, fbody, fext
  71.  
  72.     ' Ist die Datei eventuell ein ausfⁿhrbares Programm? Die entsprechenden
  73.     ' Dateiendungen stehen in der WIN.INI.
  74.     If isfileoftype(fext, ReadWinIniString("windows", "programs", "")) Then
  75.         Exec = execprograms(fullname, para)
  76.     Else
  77.         ' Unterstⁿtzt die Anwendung, die zu fext geh÷rt, DDE?
  78.         If canextdde(fext, tp) Then
  79.             ' mit DDE Kontakt zur Anwendung aufnehmen
  80.             Exec = execdocwithdde(c, fullname, fpath, fext, tp)
  81.         Else
  82.             ' Dokument als Parameter ⁿbergeben
  83.             Exec = execdocwithprogram(fullname, fpath, fext, tp)
  84.         End If
  85.     End If
  86. End Function
  87.  
  88. ' Steuert den Kontakt mit einer Anwendung via DDE, um ein
  89. ' Dokument in diese Anwendung einzulesen.
  90. Function execdocwithdde% (c As Control, ByVal fullname$, ByVal fpath$, ByVal fext$, ByVal tp$)
  91.     Dim topic$, application$, ddeexec$, ifexec$, cmd$, class$
  92.     Dim fpath1$, fname$, fbody$, fext1$
  93.     On Error Resume Next
  94.     ' Die Klasse kann mit Hilfe der Dateierweitung gefunden werden.
  95.     ' Sie wird fⁿr alle folgenden Aufrufe ben÷tigt.
  96.     class = QueryRegbase("." & fext)
  97.     If Len(class) Then
  98.         ' Lese n÷tige Parameter aus der Registrationsdatenbank.
  99.         cmd = QueryRegbase(class & "\shell\" & tp & "\command")
  100.         ddeexec = QueryRegbase(class & "\shell\" & tp & "\ddeexec")
  101.         ifexec = QueryRegbase(class & "\shell\" & tp & "\ddeexec\ifexec")
  102.         If Len(ifexec) = 0 Then
  103.             ' Die Angabe von ifexec ist optional. Wird Sie unterlassen, dann
  104.             ' mu▀ ddeexec benutzt werden.
  105.             ifexec = ddeexec
  106.         End If
  107.         topic = QueryRegbase(class & "\shell\" & tp & "\ddeexec\topic")
  108.         If Len(topic) = 0 Then
  109.             ' Wenn kein Topic angegeben wird, dann wird System als
  110.             ' Topic vorausgesetzt.
  111.             topic = "System"
  112.         End If
  113.         application = QueryRegbase(class & "\shell\" & tp & "\ddeexec\application")
  114.         If Len(application) = 0 Then
  115.             ' Auch der Name der Applikation mu▀ nicht in der
  116.             ' Registrationsdatenbank stehen. Leider etwas mehr
  117.             ' Arbeit fⁿr den Entwickler, da fⁿr application
  118.             ' der Stammteil des Programmnamens benutzt wird.
  119.             splitpathname cmd, fpath1, fname
  120.             splitfilename fname, fbody, fext1
  121.             application = fbody
  122.         End If
  123.         ' Ist das Programm vielleicht schon aktiv?
  124.         If getModuleHandle(cmd) = 0 Then
  125.             ' Nein, dann starten
  126.             If execprograms(cmd, tp) = True Then
  127.                 ' in das ifexec-Kommando mu▀ nun noch der Dokumentname
  128.                 ' einkopiert werden. Die passende Stelle ist mit
  129.                 ' %1 gekennzeichnet. replacestringpart ⁿbernimmt
  130.                 ' die Zeichenfriemelei.
  131.                 ' Zur Erinnerung: ifexec kann gleich ddeexec sein,
  132.                 ' wenn die Anwendung hier keinen Unterschied macht.
  133.                 ifexec = ReplaceStringPart(ifexec, "%1", fullname)
  134.                 ' Endlich: Das DDE-Kommando in loaddocwithdde wird
  135.                 ' aufgerufen.
  136.                 execdocwithdde = Loaddocwithdde(c, application, topic, ifexec)
  137.             Else
  138.                 execdocwithdde = False
  139.             End If
  140.         Else
  141.             ' Das Programm ist aktiv und mu▀ nicht gestartet werden.
  142.             ' Ansonsten der gleiche Ablauf wie zuvor, jedoch mit
  143.             ' ddeexec.
  144.             ddeexec = ReplaceStringPart(ddeexec, "%1", fullname)
  145.             execdocwithdde = Loaddocwithdde(c, application, topic, ddeexec)
  146.         End If
  147.     Else
  148.         execdocwithdde = False
  149.     End If
  150. End Function
  151.  
  152. Function execdocwithprogram% (ByVal fullname$, ByVal fpath$, ByVal fext$, ByVal tp$)
  153.     Dim res%, buffer$, class$
  154.     On Error Resume Next
  155.     buffer = Space$(144)
  156.     class = QueryRegbase("." & fext)
  157.     If Len(class) Then
  158.         buffer = QueryRegbase(class & "\shell\" & tp & "\command")
  159.         If Len(buffer) Then
  160.             res = Shell(ReplaceStringPart(buffer, "%1", fullname), 1)
  161.             If Err = 0 Then
  162.                 execdocwithprogram = True
  163.             Else
  164.                 execdocwithprogram = False
  165.             End If
  166.             Exit Function
  167.         End If
  168.     End If
  169.     ' Sucht das passende Programm zur Anwendung.
  170.     res = FindExecutable(fullname, CurDir$, buffer)
  171.     If (res >= 32) Or (res < 0) Then
  172.         ' Laufwerk und Pfad als aktuell setzen.
  173.         ChDrive fpath
  174.         ChDir fpath
  175.         Err = 0
  176.         ' Programm mit commandline-Parameter starten.
  177.         res = Shell(vbstr(buffer) & " " & fullname, 1)
  178.         If Err = 0 Then
  179.             execdocwithprogram = True
  180.         Else
  181.             execdocwithprogram = False
  182.         End If
  183.     Else
  184.         execdocwithprogram = False
  185.     End If
  186. End Function
  187.  
  188. ' Startet ein Programm
  189. Function execprograms% (ByVal fullname$, ByVal p$)
  190.     Dim res%
  191.     On Error Resume Next
  192.     Err = 0
  193.     If Len(p) Then fullname = fullname & " " & p
  194.     res = Shell(fullname, 1)
  195.     If Err Then
  196.         execprograms = False
  197.     Else
  198.         execprograms = True
  199.     End If
  200. End Function
  201.  
  202. Function GetAvailPart (t, ByVal z%, ByVal nr%)
  203.     Dim Zaehler%
  204.     On Error Resume Next
  205.     Zaehler = CountChar(t, z) + 1
  206.     If Zaehler >= nr Then GetAvailPart = GetStringPartX(t, Chr$(z), nr)
  207. End Function
  208.  
  209. Function GetStringPartX (ByVal t, ByVal z$, ByVal nr%)
  210.     Dim i&, p&
  211.     On Error Resume Next
  212.     If Len(t) Then
  213.         t = t & z
  214.         nr = nr - 1
  215.         For i = 1 To nr
  216.             p = InStr(p + 1, t, z)
  217.         Next i
  218.         GetStringPartX = Mid$(t, p + 1, InStr(p + 1, t, z) - p - 1)
  219.     End If
  220. End Function
  221.  
  222. ' Prⁿft, ob eine Dateierweiterung in einer Auswahl von M÷glichkeiten vorkommt.
  223. ' Die Erweiterungen in extensions mⁿssen durch Leerzeichen voneinander
  224. ' getrennt sein. Beispiel: "exe com pif bat". Gro▀-/Kleinschreibung wird
  225. ' ignoriert.
  226. Function isfileoftype% (ByVal checkextension$, ByVal extensions$)
  227.     On Error Resume Next
  228.     If Len(checkextension) Then
  229.         If InStr(" " & UCase$(extensions) & " ", " " & UCase$(checkextension) & " ") Then
  230.             isfileoftype = True
  231.         Else
  232.             isfileoftype = False
  233.         End If
  234.     Else
  235.         isfileoftype = False
  236.     End If
  237. End Function
  238.  
  239. ' Schickt einen DDE-Befehl an eine Anwendung. Hier speziell zum Laden
  240. ' von Dokumenten.
  241. Function Loaddocwithdde% (c As Control, ByVal application$, ByVal topic$, ByVal cmd$)
  242.     On Error Resume Next
  243.     c.LinkMode = 0
  244.     c.LinkTimeout = -1
  245.     c.LinkTopic = application & "|" & topic
  246.     c.LinkMode = 2
  247.     c.LinkExecute cmd
  248.     c.LinkMode = 0
  249.     If Err = 0 Then
  250.         Loaddocwithdde = True
  251.     Else
  252.         Loaddocwithdde = False
  253.     End If
  254. End Function
  255.  
  256. ' Benutzt den Datentyp Variant.
  257. Function min (ByVal a, ByVal b)
  258.     If a > b Then min = b Else min = a
  259. End Function
  260.  
  261. ' Liest einen String aus der Registrationsdatenbank. Um die Verwaltung
  262. ' einfach zu halten, beginnt die Suche immer in der ROOT der
  263. ' Datenbank.
  264. '
  265. Function QueryRegbase$ (ByVal entry$)
  266.     Dim buf$, buflen&
  267.     On Error Resume Next
  268.     buf = Space$(80)
  269.     buflen = Len(buf)
  270.     ' 1 = von ROOT aus lesen
  271.     ' buflen wird von der Funktion geΣndert, deshalb wΣre
  272.     ' RegQueryValue(1, entry, buf, len(buf)) falsch.
  273.     If RegQueryValue(1, entry, buf, buflen) = 0 Then
  274.         If buflen > 1 Then
  275.             ' Die Rⁿckgabe in buflen zΣhlt chr$(0) am Ende mit
  276.             ' Also ein Zeichen abziehen, aber natⁿrlich nur dann,
  277.             ' wenn chr$(0) nicht das einzige Zeichen in der Rⁿckgabe ist.
  278.             QueryRegbase = Left$(buf, buflen - 1)
  279.         Else
  280.             QueryRegbase = ""
  281.         End If
  282.     Else
  283.         QueryRegbase = ""
  284.     End If
  285. End Function
  286.  
  287. ' Liest einen String aus der WIN.INI
  288. Function ReadWinIniString$ (ByVal section$, ByVal entry$, ByVal default$)
  289.     Dim buffer$, l%
  290.     On Error Resume Next
  291.     buffer = Space$(144)
  292.     l = GetProfileString(section, entry, default, buffer, Len(buffer))
  293.     ReadWinIniString = Left$(buffer, l)
  294. End Function
  295.  
  296. ' Einfache Suchen- und Ersetzenfunktion fⁿr Stringteile.
  297. ' Wenn src mehrfach gefunden wird, dann wird es auch mehrfach durch
  298. ' rpl ersetzt. Gro▀-/Kleinschreibung wird ignoriert, so da▀
  299. ' sich die Funktion speziell fⁿr Pfadoperationen und Σhnliches anbietet.
  300. Function ReplaceStringPart$ (ByVal source$, ByVal src$, ByVal rpl$)
  301.     Dim pos&
  302.     On Error Resume Next
  303.     src = UCase$(src)
  304.     pos = InStr(UCase$(source), src)
  305.     If src <> UCase$(rpl) Then
  306.         Do While pos
  307.             source = Left$(source, pos - 1) & rpl & Right$(source, Len(source) - pos - Len(src) + 1)
  308.             pos = InStr(pos + Len(rpl), UCase$(source), src)
  309.         Loop
  310.     End If
  311.     ReplaceStringPart = source
  312. End Function
  313.  
  314. ' Zerlegt einen Dateinamen ohne Pfad in den Stammteil des Namens
  315. ' und die Dateierweiterung.
  316. ' Fⁿr kompletten Dateinamen ggf. zuerst splitpathname aufrufen
  317. Sub splitfilename (ByVal fname$, fbody$, fext$)
  318.     Dim p%
  319.     On Error Resume Next
  320.     p = InStr(fname, ".")
  321.     If p Then
  322.         fbody = Left$(fname, p - 1)
  323.         fext = Mid$(fname, p + 1, Len(fname) - p)
  324.     Else
  325.         fbody = fname
  326.         fext = ""
  327.     End If
  328. End Sub
  329.  
  330. ' Zerlegt einen kompletten Dateiname in Pfad und Dateiname ohne Pfad
  331. Sub splitpathname (ByVal fullname$, fpath$, fname$)
  332.     Dim i%, p%
  333.     On Error Resume Next
  334.     Do
  335.         p = i
  336.         i = InStr(i + 1, fullname, "\")
  337.     Loop While i
  338.     If p Then
  339.         fpath = Left$(fullname, p)
  340.     End If
  341.     fname = Right$(fullname, Len(fullname) - p)
  342. End Sub
  343.  
  344. ' Verbessert gegenⁿber Version 1
  345. ' Funktioniert jetzt besser mit Large Fonts und
  346. ' Controls, die keine TAG-Eigenschaft besitzen
  347. '
  348. Sub threed (f As Form)
  349.     Dim i%, c%, m%, l!, t!, w!, h!
  350.     On Error Resume Next
  351.     If f.WindowState = 1 Then Exit Sub
  352.     m = f.ScaleMode
  353.     f.ScaleMode = 3
  354.     f.DrawWidth = 1
  355.     c = f.Controls.Count - 1
  356.     For i = 0 To c
  357.         Err = 0
  358.         If f.Controls(i).Tag = "3" And f.Controls(i).Visible Then
  359.             If Err = 0 Then
  360.                 l = f.Controls(i).Left - 1
  361.                 t = f.Controls(i).Top - 1
  362.                 w = f.Controls(i).Width + 1.5
  363.                 h = f.Controls(i).Height + 1.5
  364.                 f.Line (l, t)-Step(w, 0), &H808080
  365.                 f.Line (l, t)-Step(0, h), &H808080
  366.                 f.Line (l + w, t)-Step(0, h), &HFFFFFF
  367.                 f.Line (l, t + h)-Step(w, 0), &HFFFFFF
  368.             End If
  369.         End If
  370.     Next i
  371.     l = 1
  372.     t = 1
  373.     f.DrawWidth = 2
  374.     w = f.ScaleWidth - 2
  375.     h = f.ScaleHeight - 2
  376.     f.Line (l, t)-Step(w, 0), &HFFFFFF
  377.     f.Line (l, t)-Step(0, h), &HFFFFFF
  378.     f.Line (l + w, t)-Step(0, h), &H808080
  379.     f.Line (l, t + h)-Step(w, 0), &H808080
  380.     f.ScaleMode = m
  381. End Sub
  382.  
  383. ' Funktion zum Wandeln von ASCIIZ-Strings in VB-Strings.
  384. ' Entfernt auch fⁿhrende und folgende Leerzeichen.
  385. Function vbstr$ (ByVal c$)
  386.     Dim pos&
  387.     pos = InStr(c, Chr$(0))
  388.     Select Case pos
  389.     Case Is > 1
  390.         vbstr = Trim$(Left$(c, pos - 1))
  391.     Case 1
  392.         vbstr = ""
  393.     Case 0
  394.         vbstr = Trim$(c)
  395.     End Select
  396. End Function
  397.  
  398.