Seite 6 von 8
Verfasst: 30.06.2007 23:13
von ts-soft
Alle Strings sind unmittelbar freizugeben, zumindest bevor ihnen ein neuer
String zugewiesen wird!
Gruß
vom abwesendem
Verfasst: 30.06.2007 23:30
von Falko
Danke Thomas
Ich hab's im obigen source vor dem Ändern der Zelle
gesetzt.
Gruß, Falko
Verfasst: 30.06.2007 23:37
von ts-soft
Falko hat geschrieben:Danke Thomas
Ich hab's im obigen source vor dem Ändern der Zelle
gesetzt.
Gruß, Falko
Aber nicht jedesmal, Du nutzt die Variable 2x, also 2x freigeben, am besten
unmittelbar nach dem Peeken. Bei erneuter Verwendung verändert sich der
Pointer, so das sonst nur der letzte freigegeben wird. So ist das mit diesen
blöden OLE-Strings.
Da sieht man mal, was einem sonst der StringManager von PB abnimmt

Verfasst: 30.06.2007 23:49
von Falko
Interessant und echt cool.
Hab's geändert.
Ich hatte da noch ein Problem mit folgendem:
dhReleaseObject(Workbooks) : Workbook = 0
Wenn ich anstelle Workbooks da Workbook stehen habe, wie im
Originalsource von kiffi, meldet sich der Debugger mit folgenden Fehler:
Line: 29 - Invalid memory access.
Nur wenn dort Workbooks dort steht, meckert der Debugger nicht.
Gruß Falko
Verfasst: 30.06.2007 23:59
von Kiffi
Falko hat geschrieben:Line: 29 - Invalid memory access.
Workbook ist bei Dir ja auch der Stringpointer und kein Objekt. Du kommst
mit den Variablen-Bezeichnungen ein wenig durcheinander.
Falko hat geschrieben:Nur wenn dort Workbooks dort steht, meckert der Debugger nicht.
ts, ts, ts, wer hat denn da sein EnableExplicit vergessen?
Grüße ... Kiffi
Verfasst: 01.07.2007 00:01
von ts-soft
Workbook und Workbooks sind keine Objekte zum freigeben, nur ExcelApp
Alles was mit chCreate erstellt wird, ist freizugeben. Alles was bei dhGetValue
ein object zurückgibt ebenfalls (erster parameter "%o"
gruss
Thomas
Verfasst: 01.07.2007 00:21
von Kiffi
Hier nochmal der Code
Code: Alles auswählen
EnableExplicit
Define.l ExcelApp
Define.l ReturnValue
Define.s NewValue
Define.s Datei
Datei = GetCurrentDirectory() + "test.xls"
dhToggleExceptions(#True)
ExcelApp = dhCreateObject("Excel.Application")
If ExcelApp
dhCallMethod(ExcelApp, ".Workbooks.Open(%T)", @Datei) ; open ExcelFile
dhGetValue("%T", @ReturnValue, ExcelApp, "Cells(%d, %d).Value", 10, 3) ; read one value
If ReturnValue
Debug PeekS(ReturnValue)
dhFreeString(ReturnValue)
EndIf
dhGetValue("%T", @ReturnValue, ExcelApp, "Cells(%d, %d).Value", 10, 4) ; read second value
If ReturnValue
Debug PeekS(ReturnValue)
dhFreeString(ReturnValue)
EndIf
NewValue = "S0"
dhPutValue(ExcelApp, "Cells(%d, %d).Value = %T", 10, 4, @NewValue) ; write a new value
MessageRequester("PureDispHelper-ExcelDemo", "Click OK to close Excel")
dhCallMethod(ExcelApp, ".Quit")
dhReleaseObject(ExcelApp) : ExcelApp = 0
Else
MessageRequester("PureDispHelper-ExcelDemo", "Couldn't create Excel-Object")
EndIf
Und zusätzlich zur Erläuterung einiger Excel-Objekte:
* ExcelApp ist die Excel-Applikation
* WorkBook ist die geladene Datei
* WorkSheet ist ein einzelnes Datenblatt innerhalb eines WorkBooks
Grüße ... Kiffi
Verfasst: 01.07.2007 00:31
von Falko
Nochmals vielen Dank für eure Erklärung und Hilfe.
Tut mir Leid, das ich etwas länger brauche dieses zu verstehen.
Ihr habt mir damit sehr weit geholfen.
Grüße, Falko
Verfasst: 01.07.2007 00:37
von Kiffi
Falko hat geschrieben:Tut mir Leid, das ich etwas länger brauche dieses zu verstehen.
ja, ja, man wird nicht jünger, nicht wahr?
Falko hat geschrieben:Nochmals vielen Dank für eure Erklärung und Hilfe.
Da nicht für. Jederzeit gerne wieder.
Grüße ... Kiffi
Verfasst: 03.07.2007 16:15
von Falko
@kiffi
hast du noch ein Beispiel, wie man eine komplette Fusszeile auslesen als auch
schreiben kann? Ich habe zwar ein VBA-Source für den Leftfooter, aber
weis nicht, wie man das in PB umsetzen muss. Oder gibt es noch andere
Informationen, mit denen das leichter ist in PB umzusetzen?
Vielleicht hätte man damals eher mit VBA oder VBasic anfangen sollen
Dieses Beispiel ist aus Herbers Excel und VBA sites
Code: Alles auswählen
StandardModule: basMain
Sub PartLeftFooter()
Dim intCounter As Integer, intChr As Integer
Dim sTxt As String
sTxt = ActiveSheet.PageSetup.LeftFooter
Do Until InStr(sTxt, vbLf) = 0
For intCounter = Len(sTxt) To 1 Step -1
If Asc(Mid(sTxt, intCounter, 1)) = 10 Then Exit Do
intChr = Asc(Mid(sTxt, intCounter, 1))
If intCounter = 1 Then Exit Sub
Next intCounter
Loop
sTxt = Right(sTxt, Len(sTxt) - intCounter)
sTxt = Trim(Right(sTxt, Len(sTxt) - InStr(sTxt, ":")))
ActiveSheet.TextBox1.Text = sTxt
End Sub
Gruß Falko