home *** CD-ROM | disk | FTP | other *** search
/ Programming Tool Box / SIMS_2.iso / bp_6_93 / vbwin / regdb / starter.bas < prev    next >
BASIC Source File  |  1993-01-05  |  12KB  |  352 lines

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