|  |  | 
|  | 
|  | 
|  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
  KompilierenMarkierenSeparieren
 Add 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
 | 
 | 
|  | 
|  |  | 
|  | 
| 
 
 
 |