| |
|
|
Normann Strübli | Hallo,
habe die Ehre die Erste Frage hier stellen zu dürfen
Ich arbeite im Augenblick dem Datenbank-System Cheetah [...] und das ganze funzt auch fantastisch. Die Dll unterstützt den Funktionsaufruf mittels OLE Strings aber auch mit Standard null-terminierten Strings. So weit so gut...
Nun möchte ich die Memofelder nutzen um dort binäre Daten (Bilder) zu speichern. Da in der entsprechenden Funktion keine Bereichsvariable sondern nur der String übergeben wird ist die maximale länge ja auf 32767 Zeichen begrenzt - das langt aber nicht hin
Wenn ich das richtig verstanden habe sind OLE-Strings grob gesagt dynamische Strings die keine definierte Länge haben und jedes beliebige Zeichen enthalten können (verbessert mich bitte) und nicht von Profan unterstützt werden. -also Pech gehabt...
Eigentlich habe ich mir die Frage damit ja schon selbst beantwortet, oder ich habe da was übersehen???
Leider ist die Datenbank keine Freeware , aber Vielleicht hat ja jmd. Interesse die ganzen Funktionen für Profan umzusetzen - habe schon eine Include geschrieben die den Umgang vereinfacht.
Jetzt mag sich einer Fragen Warum ich die Dll überhaupt benutzte:
1. Sehr klein, stand alone 2. Sehr schnell 3. Umfangreiche Suchfunktionen 4. Will mich nicht mit SQL beschäftigen
hier nochmal kurz die Spezifikationen:
Max number of records: 2,147,483,647 Max number of fields: 1000 Max character field size: 256 Max numeric field size: 20 Max memo size: Limited by disk space Max record size: 4000 bytes
Indexes Max open indexes per database: 100 Max fields for compound indexes: 6 Total allowable open indexes: 1000 Queries
Max number of conditions: 50 Max sort expressions: 6 Multiuser
Max number of concurrent users: 255
Gruß Normann Strübli |
|
|
| |
|
|
|
Frank Abbing | Hi,
[quote:a2dedb3643]Nun möchte ich die Memofelder nutzen um dort binäre Daten (Bilder) zu speichern. Da in der entsprechenden Funktion keine Bereichsvariable sondern nur der String übergeben wird ist die maximale länge ja auf 32767 Zeichen begrenzt - das langt aber nicht hin
Wenn ich das richtig verstanden habe sind OLE-Strings grob gesagt dynamische Strings die keine definierte Länge haben und jedes beliebige Zeichen enthalten können (verbessert mich bitte) und nicht von Profan unterstützt werden. -also Pech gehabt... [/quote:a2dedb3643] Das klingt doch alles nach Bereichen. Wieso kannst du dort keine Bereichsvariable übergeben ? Sollte doch immer funktionieren... |
|
|
| |
|
|
|
Normann Strübli | Hallo,
irgendwie klappt das alles nicht so wie ich mir das denke Daher hab ich mal einen neuen kurzen (echt nicht lang ) Quellcode geschrieben und meine Include und Headerdatei gezippt drangehängt. Die Hilfedatei von Cheetah ist ebenso dabei wie Beispiele unter Power und VisualBasic.
Sind leider knapp über 300kB geworden :| Die Registrierung hab ich natürlich entfernt daher kann es möglich sein das beim Aufruf der Fehler #99999 Auftritt (weil testversion abgelaufen). Vielleicht braucht man die DLL ja auch nicht und sieht gleich wo ich da groben Mist gebaut habe.
Wie gesagt habe anscheinend Probleme das ganze für Xprofan umzusetzen - naja die einfachen Sachen gehen ja...
Gruß Normann |
|
|
| |
|
|
|
| Hmmm, ist schwer da durchzusehen, oder gar das Ganze durchzusehen. Vielleicht will die DLL nicht die Bereichsvariable, sondern nur die Adresse der Bereichsvariable, also statt bereich# einfach addr(bereich#).
Vielleicht hilfts Dir ja.
, iF |
|
|
| |
|
|
|
Frank Abbing | Hi,
wenn du den Bereich dimensioniert, addiere mal 4 dazu und lösche den Bereich mit CLEAR, bevor du ihn benutzt. Wahrscheinlich fehlt die Null am Ende, wenn du den Bereich als String in einer API nutzt. |
|
|
| |
|
|
|
Normann Strübli | Seufz :|
danke, aber hat beides leider nicht geholfen. Als letzten Anlauf hab ich nochmal die Stellen der Doku rausgesucht die, so glaub ich von interesse sind. Weiter unten dann der Quellcode für Visual-Basic, wie man Daten in Memofelder schreibt.
Sieht doch so verdammt einfach aus, wieso krieg ich das nicht hin?
Ok, das erste was wohl anders sein wird ist die Geschichte mit den Strings.
Hier ein kleiner Ausschnitt aus der Hilfe:
[quote:a91e835882] Cheetah can be interfaced with various different programming langauages. By default, Cheetah supports the Visual Basic and PowerBasic, however other programming languages can be interfaced with relative ease.
The key to interfacing to the Cheetah DLL is to understand how strings are handled by your particular programming language. In general, there are two different types of strings that most languages support: OLE Strings, and Nul Terminated Strings. Some languages support both types while others only support one or the other.
OLE Strings (or BSTR strings) are generally used in programminbg languages that allow for dynamic strings. An example is Visual Basic and PowerBasic.
Nul Terminated Strings, or ASCIIZ strings, are a pre-declared array of characters with a terminating nul (CHR$(0)) character at the end of the string. The programming language uses this nul character to mark the end of the string.
In order to support both types of strings, Cheetah has implemented each function in two forms. The regular version of the function supports OLE Strings while the second version supports Nul Terminated Strings. The functions that support Null Terminated Strings have a trailing _Z appended to their names. For example, the following is the two forms of the xdbCreate function.
OLE Version: Call xdbCreate(DBFname)NUL Version: Call xdbCreate_Z(DBFname) Basically, if your programming language only supports Null Terminated Strings then you should always use the _Z version of the Cheetah functions.
[/quote:a91e835882] Ok, Profan unterstützt nur Null-Terminierte Strings das sollte das ganze aber nicht viel komplizierter machen. Verwende ich halt die Funktion xdbAssignField_Z statt xdbAssignField um ein Feld zu beschreiben. Bei dem folgenden Beispiel in VB wird ja aber ein String übergeben? oder doch nicht?
Da bin ich wieder beim Thema OLE-Strings
Andererseits wenn ich folgendes in Profan probiere klappt es: KompilierenMarkierenSeparieren in diesem Fall steht in der Memo-Datei tatsächlich irgendwo bla bla bla Wenn ich aber mittels b$ = @String$(Pdata#, 0) (in Pdata# ist die JPG-Datei eingelesen) versuche die Binären Daten der Datei ins Memofeld zu schreiben klappt es wieder nicht
Die Bildatei ist 35240 Bytes groß womit ich wohl auch das Problem habe, das die Länge der Profan-Strings nicht ausreicht...
Am besten jmd kennt sich mit VB aus und kann mir sagen wie folgender Quellcode für Profan umzusetzten ist KompilierenMarkierenSeparierenAdd a picture to the memo file depending on which record number
is currently being used.
Select Case x&
Case 1
f& = FreeFile
Open "binoc.ico" For Binary As #f&
PictureSt$ = Space$(LOF(f&))
Get #f&, , PictureSt$
Close #f&
Case 2
f& = FreeFile
Open "rabbit.wmf" For Binary As #f&
PictureSt$ = Space$(LOF(f&))
Get #f&, , PictureSt$
Close #f&
also store an AVI clip in the memo file
f& = FreeFile
Open "FileCopy.avi" For Binary As #f&
AVIst$ = Space$(LOF(f&))
Get #f&, , AVIst$
Close #f&
Case 3
f& = FreeFile
Open "tennis.wmf" For Binary As #f&
PictureSt$ = Space$(LOF(f&))
Get #f&, , PictureSt$
Close #f&
End Select
If PictureSt$ > "" Then
Call xdbAssignField(cust.dbHandle, "", PictureField&, PictureSt$)
PictureSt$ = ""
End If
If AVIst$ > "" Then
Call xdbAssignField(cust.dbHandle, "", AVIField&, AVIst$)
AVIst$ = ""
End If
|
|
|
| |
|
|
|
Normann Strübli | So da bin ich wieder bei meinem alten und neuen Problem,
ich weiß jetzt wo der Fehler liegt! -das ist gut leider hab ich jetzt ein neues Problem! das ist schlecht!
will mich mal kurzfassen:
Die Funktion der Dll ich aufrufen möchte erwartet als letzten Parameter die Adresse des Strings! der die Daten enthält. Damit gilt (was ich befürchtet habe) das die Daten nicht beliebig lang sein dürfen (max 32767 Zeichen) und nicht beliebige Zeichen enthalten können.
Aus der Profan Hilfe:
[quote:3ebb2e12fb] (ACHTUNG: Strings, die ein Nullbyte enthalten, werden bei Übergabe an DLLs und API nur bis zu diesem übergeben. Das gilt auch für über die API realisierte Funktionen wie GETTEXT$ oder SETTEXT. Für DELPHIaner: Es handelt sich bei den Profan-Strings um die Ansi-Strings von Delphi.) [/quote:3ebb2e12fb] Toll, gaaanz toll! wie soll ich also die binären daten einer z.B. jpg-Datei an die Dll übermitteln wenn bereits nach dem Header der Datei ein Nullbyte folgt???
Als kleines Beispiel nochmal:
Der Aufruf: KompilierenMarkierenSeparieren mit Textdateien und so klappts ja ganz toll, nützt mir aber nix!
Kennt jemand eine Zauber-API die ich nicht kenne und mir weiterhilft? Assembler? (kenn ich mich *noch* nicht gut mit aus -Frank) Hab mich daran schon so festgebissen das ich nix anderes mehr geschafft habe |
|
|
| |
|
|
|
Michael Wodrich | KompilierenMarkierenSeparieren Dieses xdbAssignField_Z nutzt, wie das Z schon andeutet, nullterminierte Strings. Gibt es da denn keine Funktion, wo man die Adresse des Datenbereiches und dessen Länge angeben muß?
Dann ließe sich das über eine Bereichsvariable lösen. Die Angabe der Bereichsvariablen in der Funktion liefert die Adresse auf den Bereich. Aber ohne eine expliziete Längenangabe kann die externe Funktion ja garnicht wissen, wo Schluß ist...
Mal sehen, ob ich ein wenig Zeit finde. Dann lese ich mich da mal hindurch...
MfG Michael Wodrich
Was wird eigentlich alles benötigt, um diesen Affen von Tarzans Gnaden auf dem eigenen Rechner zum Laufen zu bringen? |
|
|
| Programmieren, das spannendste Detektivspiel der Welt. | 07.07.2004 ▲ |
|
|
|
|
| Nun, du könntest deine Binärdaten auch in eine Hexdatenkette umwandeln, um diese via string zu übergeben.
Der Nachteil ist nur, das die Daten genau doppelt so groß werden.
Bis denne, iF |
|
|
| |
|
|
|
Normann Strübli | @Miachael: [quote:852fb8c5ee] Dieses xdbAssignField_Z nutzt, wie das Z schon andeutet, nullterminierte Strings. Gibt es da denn keine Funktion, wo man die Adresse des Datenbereiches und dessen Länge angeben muß? [/quote:852fb8c5ee] Nein eben nicht! oder ich bin zu blöd.
[quote:852fb8c5ee] Was wird eigentlich alles benötigt, um diesen Affen von Tarzans Gnaden auf dem eigenen Rechner zum Laufen zu bringen? [/quote:852fb8c5ee] Eigentlich brauchst Du dir nur die Demoversion runterladen: (sind auch nur ca. 230kb) [...] Und ich hab da noch mal die von mir (nicht ganz komplett) umgeschriebene Inlude bzw. Headerdatei angehängt.
Hab ja gehört es soll wieder gaaanz schlechtes Wetter kommen und da weiß man ja immer nicht so richtig was man machen soll... Mit anderen Worten: wäre nett wenn Du die Zeit finden würdest.
@IF:
Will aber nicht!
Gruß Normann |
|
|
| |
|
|
|
Michael Wodrich | Tarzan hat seinen Affen nach einem Leoparden (oder Geparden?) benannt?
Nunja:
Außer in der Lobhudelei der DLL wird das Memofeld nirgendwo wirklich mit auch nur einem einzigen Wort oder einem Beispiel gewürdigt.
Deshalb mein Tipp: gehe dort ins Forum und frage mal ganz scheinheilig nach einem funktionsfähigen Beispiel für das Laden eines Bildes in ein Memofeld.
Ich fürchte nämlich, daß man sich die Unterstützung von Memofeldern für eine spätere Version aufgehoben hat.
MfG Michael Wodrich |
|
|
| Programmieren, das spannendste Detektivspiel der Welt. | 08.07.2004 ▲ |
|
|
|
|
Normann Strübli | Ja, recht hast Du in der Hilfe steht darüber bedenklich wenig. Aber das mit den Memofeldern funktioniert DEFINITIV! Sonst hätte ich mich nicht zum Affen gemacht und das Teil gekauft
Auf die Idee mit dem Forum bin ich natürlich auch schon gekommen, hab sogar ne Mail direkt an den Support geschickt und die verweisen auf die Beispiele in VB usw. Im Unterverzeichnis VisualBasicBlobsamplefrmMainForm.frm ist z.B. so ein Beispiel (da geht das sogar mit mehren Memofeldern pro Datensatz!)
Und ich kann ja auch was in den Memofeldern speichern nur leider halt eben Text. Thorsten [...] hat ja auch mal eine Dll gebastelt EasyDB.dll die auch wirklich nicht schlecht ist, nur leider mit mit Bildern in der Größenordnung von 12000 Stück etwas zu langsam.
Also hab ich mein Geld wohl trotzdem leider in den Sand gesetzt, weil genau das was ich am dringensten benötige mit Xprofan so nicht zu realisieren scheint. Aber vielleicht kannst Du dir das Beispiel ja noch mal angucken hast es ja eh mit runtergeladen
Gruß Normann |
|
|
| |
|
|