Hallo Rainer,
verstanden habe ich ‚Bahnhof‘.
ach, du meinst das Gebäude wo die Bahnhofsuhr dranhängt? )
Du hast eine große Datei, willst die in einem Rutsch laden,
zerlegen und in ein Array schreiben.
Das hast Du gemacht, da sehe ich auch keinen Fehler, das soll
so laufen.
Angenommen, du hast eine beliebig große Datei. Gleichfalls hast du eine VB-Exe gebastelt, die beim Start mit dieser anderen Datei irgendetwas macht, in dem Fall als Flash abspielen aber das ist egal.
Dies geschieht dadurch daß du in der VB-Exe drin stehen hast, mache etwas mit der Datei xyz im Verzeichnis abc.
D.h., die VB-Exe funktioniert nur wenn die andere Datei auf einem Fremdrechner auch vorhanden ist.
Was also bedingt daß du an den Besitzer des Fremdrechners die VB-Exe Datei UND die andere Datei mailst o.ä.
Jetzt willst du aber an den Besitzer des FremdPCs nur eine VB-Exe schicken, OHNE die andere Datei.
Also muss ja die Byteinformation der anderen Datei in der VB-Exe drinstecken!
Damit dann die VB-Exe bei Aufruf aus diesen Bytes auf dem Fremdrechner eine Datei erstellt, die dann der weitere Code in der VB-Exe aufrufen kann, genauso wie wenn die andere Datei seperat mitgeliefert worden wäre.
Nun kann es ja sein, daß es in VB Möglichkeiten gibt, große Bytemengen mit in eine VB-Exe einpacken zu lassen.
Das entzieht sich meiner Kenntnis und würde mir auch nix helfen da Vba das garantiert nicht kennt.
Deshalb kam ich auf die Idee, die Bytes der anderen Datei in der VB-Exe in Modulen zu „parken“.
Jetzt glaube ich zu wissen, daß die Bytes eines Moduls auf 64 KB begrenzt sind, deshalb meine Aufteilung in Blöcke beim Einlesen der Bytes der anderen Datei.
Nachstehend ist Code, (leider noch Vba, kam noch nicht dazu das auf VB umzuschreiben ), da wird dir das was ich mit „parken“ meine evtl. klarer. Gestartet wird er mit Aufruf von „ModuleErzeugen“
Anstatt der swf-Datei kann man natürlich jede beliebige Datei nehmen.
Nach Durchführung des Codes hat man dann paar Hundert neue Module, die jeweils immer nur eine Prozedur haben in diesem Muster:
Option Explicit
’
Function Prog3() As String
Prog3 = Prog3 & Chr(202)
Prog3 = Prog3 & Chr(162)
Prog3 = Prog3 & Chr(223)
Prog3 = Prog3 & Chr(93)
Prog3 = Prog3 & Chr(214)
Prog3 = Prog3 & Chr(97)
Usw.
End Function
Leider steigt der Erzeugungscode dieser Module bei/ab Modul 422 aus, warum ist mir leider noch unklar.
Das mal weglassend,wäre der Code durchgelaufen hätte ich aber das erreicht was ich will, in der VB(A) selbst sind die Bytes der anderen Datei „Geparkt“
D.h., u.a. mit deiner Hilfe *gg* ,hätte ich dann nur noch Code basteln müssen, der auf einem beliebigen FremdPC eine datei mit Open öffnet und dann nacheinander mit „Put“ erst Prog0, dann Prog1, usw in die Datei schreibt.
Ich hoffe sehr, ich konnte mich eben besser verständlich machen.
In Excel hätte ich ja die Option, die einzelnen Bytes der anderen Datei jeweils in eine Zelle zu schreiben und dann später diese Zellen auszulesen um damit eine Datei zu befüllen, das geht, habe ich getestet, ist aber grottenlangsam.
Und zu „Append“, das war falsch gedacht, solange eine Datei im Binary-Modus geöffnet ist, hängt put automatisch Bytes „an“, das wußte ich nicht als ich von „Append“ erzählte.
Gruß
Reinhard
Option Explicit
'Declare Sub CopyMemory Lib "kernel32.dll" \_
' Alias "RtlMoveMemory" ( \_
' Destination As Any, \_
' Source As Any, \_
' ByVal Length As Long)
Public txt As String, Block() As String, Anz As Integer
'
Sub ModuleErzeugen()
' Verweis auf Microsoft Visual basic for Applications Extensibility 5.3 setzen!
Dim N As Integer, NN As Long, vbComp As VBComponent, Zei As Long
Call ModuleLoeschen
'Exit Sub
Call tt
For N = 0 To UBound(Block)
Set vbComp = ThisWorkbook.VBProject.VBComponents.Add(vbext\_ct\_StdModule)
vbComp.Name = "mdlTeil" & N
With vbComp.CodeModule
.InsertLines .CountOfLines + 1, "Function Prog" & N & "() As String"
For NN = 1 To Len(Block(N))
.InsertLines .CountOfLines + 1, "Prog" & N & " = Prog" & N & " & Chr(" & Asc(Mid(Block(N), NN, 1)) & ")"
Next NN
.InsertLines .CountOfLines + 1, "End Function"
End With
Application.StatusBar = N & " / " & UBound(Block)
Next N
End Sub
'
Sub ModuleLoeschen()
Dim mdl As VBComponent
With ThisWorkbook.VBProject
For Each mdl In .VBComponents
If mdl.Name Like "mdlTeil\*" Then .VBComponents.Remove mdl
Next mdl
End With
End Sub
'
Sub tt()
Dim Dat As String, FF As Long, Platz As Long
Dat = "H:\europeanchampionship2008\europeanchampionship2008.swf"
FF = FreeFile
Platz = FileLen(Dat)
Open Dat For Binary As #FF
txt = Input(Platz, #FF)
Close #FF
Call Teilen(txt, 1000)
End Sub
'
Sub Teilen(ByVal txt As String, Laenge As Long)
Dim N As Long, NN As Long
For N = 1 To Len(txt) Step Laenge
ReDim Preserve Block(Anz)
Block(Anz) = Mid(txt, N, Laenge)
Anz = Anz + 1
Next N
End Sub