Hallo zusammen,
ich habe hier ein VisualBasic6-Projekt, welches auf ein bestehendes Bild drei halbtransparente, schräge Rechtecke zeichnet.
Nun möchte ich das in Access 2003 umsetzen. Ich habe den Code aus dem VB6-Projekt übernommen und die Objektnamen angepasst. Leider meckert Access, wenn ich den entsprechenden Bericht öffne.
Warum geht das nicht? Soweit ich weiß, basiert VBA doch auf VB6.
Hat jemand eine Idee, wie man das in Access hinbekommen könnte? Ihr findet sowohl das VB6-Projekt als auch den mißglückten Versuch der Umsetzung auf Access im Anhang. Ich würde mich riesig freuen und sehr dankbar sein, wenn jemand das hinbekommt.
Danke im Voraus,
Sarek \\//_
P.S.: Halbtransparent (Datenbank-Versuch, File 1).zip und Halbtransparent (Datenbank-Versuch, File 2).zip bitte in ein Verzeichnis entpacken. Aufgrund der Größenbeschränkung konnte ich nicht beides in eine Datei zippen :-(
Hallo,
es ist halt auch ein klein wenig als Irrglaube zu bezeichnen, wenn man meint ein VB6 Projekt 1:1 nach Access portieren zu können.
Ich habe mir nur das erste Beispiel heruntergeladen - da kommen einige Fehler beim kompilieren zum Vorschein.
nur als Beispiel ... App.Path gibt's in Access VBA nicht, da müsste es CurrentProject.Path lauten
Auch werden Funktionsparameter angemeckert .... vbHimetric ... ist ein Parameter, der aus der VB6 Graphikprogrammierung stammt und so in der Form in Access-VBA nicht vorkommt usw.
Eventuell lassen sich diese Fehler über entsprechende Bibliotheksverweise beheben. Dazu müsstest du im VB6 Projekt nachsehen, ob solche Verweise gesetzt sind. Solange nicht alle Fehler, die beim Kompilieren des VBA-Projekts aufscheinen behoben werden wird's nicht zum Laufen kommen.
Zitat von: database am August 26, 2014, 13:13:06
Eventuell lassen sich diese Fehler über entsprechende Bibliotheksverweise beheben. Dazu müsstest du im VB6 Projekt nachsehen, ob solche Verweise gesetzt sind.
Was meinst du damit?
Damit Du es besser einschätzen kannst: Den Code für die Graphikfunktionen habe ich mir aus freien Beispielen im Internet zusammengebaut. Meine VB(A)-Kenntnisse reichen nur für die Standardfunktionen. Sobald da irgendwas mit externen Bibliotheken kommt, kann ich leider nur noch abschreiben :-(
Zitat von: database am August 26, 2014, 13:13:06Solange nicht alle Fehler, die beim Kompilieren des VBA-Projekts aufscheinen behoben werden wird's nicht zum Laufen kommen.
Wo werden die Kompilierungsfehler denn in Access angezeigt? Bei mir zeigt er keine einzelnen Fehler. Auch wenn ich im VB-Editor gleich bei der ersten Sub ein STOP setze (um den Code in Einzelschritten durchzugehen) kommt schon eine Fehlermeldung. Die scheint also schon von den Deklarationen her zu stammen. Wo kannst Du denn die einzelnen Fehler sehen?
Zitat von: database am August 26, 2014, 13:13:06Auch werden Funktionsparameter angemeckert .... vbHimetric ... ist ein Parameter, der aus der VB6 Graphikprogrammierung stammt und so in der Form in Access-VBA nicht vorkommt
Das ist natürlich der Kern des ganzen Codes. Es geht ja gerade um eine graphische Darstellung. Wenn die Funktionen in VBA nicht gehen, dann kann ich es gleich vergessen :-( :-( :-(
Hallo,
ZitatWas meinst du damit?
Damit meine ich die Verweise, die in VBA zu setzen sind um bestimmte oder benötigte Bibliotheken verwenden zu können (Extras ... Verweise) das sind nicht zwangsläufig externe Bibliotheken, VBA liefert da standardmäßig eine Menge von sich aus mit. Eventuell lassen/lässt sich eine/mehrere dahinterstehende *.dll's auch aus VB6 kopieren und in VBA einbinden.
ZitatWo werden die Kompilierungsfehler denn in Access angezeigt
Öffne eines der Module z.B. 'Zeichenfunktionen' und wähle dann aus dem Menü 'Debuggen' 'Kompilieren von Demo'
Als Erstes wird
App.Path angemeckert, das wie ich geschrieben habe
CurrentProject.Path heißen sollte.
Ändere das im Code und kompiliere weiter, so wird jeder Fehler nacheinander angezeigt.
Bezüglich der Funktionsparameter:
Es kann u.U. hilfreich sein statt der VB6 Bezeichnungen, die ja nun nicht unbedingt in VBA zur Verfügung stehen, deren Wert einzutragen.
Den Wert müsstest du im VB-Projekt wiederum 'erfragen'. In der Regel findest du die Werte in der OH von VB6, in dem Abschnitt in dem eine Funktion beschrieben wird.
Alles in Allem wird das nicht ganz einfach werden - zumindest wird sehr viel Kleinarbeit dahinterstecken.
Zitat von: database am August 26, 2014, 13:51:41
Damit meine ich die Verweise, die in VBA zu setzen sind um bestimmte oder benötigte Bibliotheken verwenden zu können (Extras ... Verweise)
Im VB6-Projekt sind das:
- Visual Basic for Applications (msvbvm60.dll)
- Visual Basic runtime objects and procedures (msvbvm60.dll/3)
- Visual Basic objects and procedures (vb6.olb)
- Ole Automation (stdole2.tlb)
"Visual Basic runtime objects and procedures" und "Ole Automation" kann ich unter Access jedoch (auch mit Durchsuchen) nicht hinzufügen.
Zitat von: database am August 26, 2014, 13:51:41
Öffne eines der Module z.B. 'Zeichenfunktionen' und wähle dann aus dem Menü 'Debuggen' 'Kompilieren von Demo'
Danke
Zitat von: database am August 26, 2014, 13:51:41
Bezüglich der Funktionsparameter:
Es kann u.U. hilfreich sein statt der VB6 Bezeichnungen, die ja nun nicht unbedingt in VBA zur Verfügung stehen, deren Wert einzutragen.
Den Wert müsstest du im VB-Projekt wiederum 'erfragen'. In der Regel findest du die Werte in der OH von VB6, in dem Abschnitt in dem eine Funktion beschrieben wird.
Das klappt ganz gut, indem ich mir die Variablen einfach per MsgBox ausgeben lasse :-)
Aber nun bin ich an einem Punkt angekommen, wo es nicht weitergeht. Bei der Zeile
P1OldPic = SelectObject(P1hdc, CreateCompatibleBitmap(Me.hdc, SW, SH))sagt Access, dass "Me" (also der Bericht?) die Methode oder das Datenobjekt .hdc nicht kennt. Und da kann ich wohl nichts gegen tun, oder? :(
Hi,
Zitat"Visual Basic runtime objects and procedures"
schau mal da rein .... http://foren.activevb.de/archiv/vba/thread-23868/beitrag-23874/Re-Praezisierung/ (http://foren.activevb.de/archiv/vba/thread-23868/beitrag-23874/Re-Praezisierung/)
P1OldPic = SelectObject(P1hdc, CreateCompatibleBitmap(Me.hdc, SW, SH))
woher stammt denn der Code? Ist das aus VB6 so original übernommen?
Ich habe hier kein VB6 zur Verfügung, kann daher auch das VB6 Projekt nicht anschauen -
Zitat von: database am August 26, 2014, 14:36:22
P1OldPic = SelectObject(P1hdc, CreateCompatibleBitmap(Me.hdc, SW, SH))
woher stammt denn der Code? Ist das aus VB6 so original übernommen?
Ich habe hier kein VB6 zur Verfügung, kann daher auch das VB6 Projekt nicht anschauen -
Ja, stammt er. Du brauchst dafür gar kein VB6, die TransparentePolygone.frm kann man auch per Editor öffnen ;)
Zitat von: database am August 26, 2014, 13:13:06
es ist halt auch ein klein wenig als Irrglaube zu bezeichnen, wenn man meint ein VB6 Projekt 1:1 nach Access portieren zu können.
Dazu noch mal eine Frage:
Mir kam gerade der Gedanke, dass ich das VB6-Programm ja so umschreiben könnte, dass ich es aus der Access-Datenbank heraus über den Shell-Befehl aufrufen und ihm die drei benötigten Parameter übergeben könnte. Das VB6-Programm kann dann die fertige Graphik im %temp%-Verzeichnis speichern, von wo aus Access sie einlesen und in den Bericht importieren könnte.
Soweit bekäme ich das wohl hin, aber es erscheint das mir nicht sonderlich elegant. Kann ich das nicht irgendwie als "Plugin" für Access programmieren, so dass das VB6-Programm seine Daten nicht erst zwischenspeichern muss, sondern direkt an Access übergeben kann?
Hallo,
wie weit bist du denn mit dem Versuch gekommen, den Code in Access zum laufen zu bringen?
Konntest du alle Kompilierfehler bereinigen? Was ist der aktuelle Stand?
Zitat von: MaggieMay am August 28, 2014, 15:45:02
wie weit bist du denn mit dem Versuch gekommen, den Code in Access zum laufen zu bringen?
Konntest du alle Kompilierfehler bereinigen? Was ist der aktuelle Stand?
Da bin ich nicht weitergekommen, siehe dazu auch meine Mail vom 26. August, 14:18 Uhr:
ZitatAber nun bin ich an einem Punkt angekommen, wo es nicht weitergeht. Bei der Zeile
P1OldPic = SelectObject(P1hdc, CreateCompatibleBitmap(Me.hdc, SW, SH))
sagt Access, dass "Me" (also der Bericht?) die Methode oder das Datenobjekt .hdc nicht kennt. Und da kann ich wohl nichts gegen tun, oder? :(
Hi,
ZitatMe.hdc
kann vermutlich durch
ZitatMe.Hwnd
ersetzt werden, doch damit sind die Probleme ja nicht beseitigt.
Zitat von: MaggieMay am August 28, 2014, 22:13:08
Hi,ZitatMe.hdc
kann vermutlich durch ZitatMe.Hwnd
ersetzt werden, doch damit sind die Probleme ja nicht beseitigt.
Richtig, vor allem da ich nicht weiß, was ich daraufhin noch alles ändern muss, weil ich weder mit hdc noch mit hwnd etwas anfangen kann. Meine Kenntnisse reichen in der Regel aus, um Codefragmente aus Foren etc. in meine Programme zu integrieren. Das heißt aber nicht, dass ich den Code auch verstehe. Normalerweise programmiere ich Tools zur Verarbeitung von Informationen, Parser, um irgendwas aus Protokolldateien zu extrahieren und so. Das kann ich, aber die höhere Programmierkunst wie eben Graphikausgaben leider nicht. Das brauche ich auch nicht so oft, um es "von der Pike auf" zu lernen.
Ich hatte gehofft, dass jemand von den Experten hier Spaß am Tüfteln hat und sich des Problems vielleicht annimmt. Das mache ich jedenfalls in anderen Foren (wo ich dann eben mehr Experte bin) gerne mal. Aber da das offenbar nicht der Fall ist, werde ich es wohl auf die weniger elegante Art lösen müssen, eben mit Mitteln, die ich beherrsche.
ZitatIch hatte gehofft, dass jemand von den Experten hier Spaß am Tüfteln hat und sich des Problems vielleicht annimmt.
Ich habe es versucht, bin dann aber daran gescheitert, dass VB6-Funktionen eben nicht 1:1 auf Access übertragen werden können, insbesondere auch wegen der im gelieferten Code fehlenden Konstanten- und Variablen-Deklarationen. Wenn dann vom (vermutlich vb-kundigen) Thread-Starter keine weitere Unterstützung kommt, läuft's halt in eine Sackgasse. Da ist es dann wohl nicht die schlechteste Lösung, sich mit dem zu begnügen, mit dem man sich auskennt.
Zitat von: MaggieMay am August 28, 2014, 22:41:04
Ich habe es versucht
Dann erst mal Danke für den Versuch!
Zitat von: MaggieMay am August 28, 2014, 22:41:04
bin dann aber daran gescheitert, dass VB6-Funktionen eben nicht 1:1 auf Access übertragen werden können, insbesondere auch wegen der im gelieferten Code fehlenden Konstanten- und Variablen-Deklarationen.
Wenn es lediglich daran liegt, kann ich vermutlich weiterhelfen. Bei mir liegt es eher daran, dass ich nicht weiß, wie ich mit diesen fortgeschrittenen Funktionen wie hdc oder hwnd umgehen muss. Die im Code verwendeten vb-Konstanten auswerten ist hingegen kein Problem.
Hallo,
Zitat
Du brauchst dafür gar kein VB6, die TransparentePolygone.frm kann man auch per Editor öffnen
Naja, soweit reichen meine Kenntnisse schon - ein ganzes Projekt jedoch in der VB6 Entwicklungsumgebung auszulesen macht aber einen viel schlankeren Fuß
Und mangelndes Interesse kannst du diesem Forum nicht so einfach vor die Füße werfen!
das größte Problem liegt bei deinem Projekt vermutlich daran, dass die Verwendung der gdi32-Bibliothek in Access nicht umgesetzt wird.
In dieser wird nämlich auch dieses .hdc verwendet. Also müsste man eine Doku bemühen in der diese Bibliothek ein wenig näher beschrieben ist, dann könnte man vielleicht auch dahintersteigen was da zu übergeben ist - in jedem Fall handelt es sich um einen LONG INTEGER - Wert.
Ob sich diese gdi32 in Access ohne Weiteres verwenden lässt kann ich nicht sagen - die dll befindet sich aber im system32 - Ordner.
sieh auch da mal:
http://msdn.microsoft.com/de-de/library/cc749770.aspx (http://msdn.microsoft.com/de-de/library/cc749770.aspx)
Ausserdem fällt es mir schwer zu glauben, dass du überhaupt Erfolg haben wirst, wenn deine Zeichnung / Bild oder was auch immer in einem Bericht
eingebaut ist - warum verwendest du nicht wie in VB6 ein Formular?
Zitat von: database am August 29, 2014, 13:16:49
Und mangelndes Interesse kannst du diesem Forum nicht so einfach vor die Füße werfen!
Oh, falls es sich so anhörte, dass ich irgendjemandem hier irgendetwas vorwerfe, dann sorry - das was nicht so gemeint.
Zitat von: database am August 29, 2014, 13:16:49
Ausserdem fällt es mir schwer zu glauben, dass du überhaupt Erfolg haben wirst, wenn deine Zeichnung / Bild oder was auch immer in einem Bericht
eingebaut ist - warum verwendest du nicht wie in VB6 ein Formular?
Weil für die (Druck)Ausgabe von Daten eigentlich Berichte vorgesehen sind - und das vermutlich aus irgendeinem Grund.
Hallo,
Zitat von: BotschafterSarek am August 29, 2014, 05:37:18Wenn es lediglich daran liegt, kann ich vermutlich weiterhelfen.
Du müsstest deine Beispiel-DB dahingehend erweitern, dass sie fehlerfrei kompiliert werden kann. Dazu gehört auch das Einfügen von "Option Explicit" in jedes Modul. Es gibt einfach zu viele Variablen ungeklärter Herkunft bzw. Bestimmung.
ZitatBei mir liegt es eher daran, dass ich nicht weiß, wie ich mit diesen fortgeschrittenen Funktionen wie hdc oder hwnd umgehen muss.
Das sind keine Funktionen sondern im speziellen Fall handelt es sich um Formulareigenschaften.
Wenn du Zugriff auf VB6 hast, sollten sich die fehlenden Informationen aus dem zugehörigen Objektkatalog holen lassen.
Hallo,
arbeite ja auch einiges mit VB6 - immer noch.
Ich würde die Funktionalität die benötigt wird in ein neues ActiveX Projekt packen (VB6 vorausgesetzt), Übergabeparameter definieren etc, und daraus eine DLL machen die in Access dann referenziert werden kann. Nur ein bisschen Ahnung von VB6 sollte man schon haben. Wie schon gesagt, VB ist nicht VBA.
Gruß Andreas
Hallo
Zitat von: MaggieMay am August 28, 2014, 22:13:08
Hi,ZitatMe.hdc
kann vermutlich durch ZitatMe.Hwnd
ersetzt werden, doch damit sind die Probleme ja nicht beseitigt.
Nein das kann mann nicht. hDC ist das Handle zum Graphics Device Interface. hWnd ist das Handle zu einem Window/Control. Mit GetDC(hwnd) kann man ein hdc erstellen. Aber einfach austauschen is nicht.