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!

Code: Alles auswählen

dhFreeString(Workbook)
Gruß
vom abwesendem

Verfasst: 30.06.2007 23:30
von Falko
Danke Thomas :allright:

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 :allright:

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 :wink:

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.


:allright: :allright:

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 :freak:
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