Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 19.03.2009, 12:40 Titel: Syntax-Frage |
|
|
Hallo zusammen!
Mal eine Frage, wie ich es technisch löse einen bestimmten vorgang auszudrücken:
in VBA (speziell Excel) gibt es Zellbereiche. In einem Zellbereich wird eine Zelle über die reihe (row) und spalte (column) angesprochen.
relativ einfach schreibt man inhalte in eine zelle so:
cells(2,2) = "Hallo Welt!"
also in reihe 2, spalte 2 wird "Hallo Welt!" geschrieben.
So etwas in der Art möchte ich auch in FB ausdrücken.
Was dem am nächsten käme wäre eine property in einer Type. Diese können aber leider nicht mehr als jeweils einen index aufnehmen. Ansonsten wäre das ideal!
Die property könnte dafür sorgen, dass die Werte, die entgegen genommen werden sollen, erst in ein definiertes array, gleichzeitig in eine Datei und auf dem bildschirm geschrieben werden.
Zu dieser Problemstellung kommt noch etwas hinzu:
cells(2,2) = "Hallo Welt!"
bewirkt das gleiche wie:
cells(2,2).value = "Hallo Welt!"
Wie kann ich auch das in FB realisieren? |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 19.03.2009, 12:46 Titel: |
|
|
Mehrdimensionale Arrays könnten dir da helfen, so wie du es schon geschrieben hast.
Code: | Dim MArray(10, 20) as String
MArray(5, 17) = "Bla" |
Aber so wirklich hab ich nicht kapiert, was genau du machen willst.
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 19.03.2009, 13:00 Titel: |
|
|
Mit einem mehrdimensionalen array habe ich ja leider "nur" einen Datenspeicher. Der alleine an sich, hilft mir nicht dabei die daten gleichzeitig auf dem bildschirm darzustellen und in eine datei zu schreiben.
Also falls es einfacher ist meine zielsetzung zu verstehen: ich möchte einen wrapper für excel-vba mittels disphelper schreiben. Und da soll sich der syntax, der von mir bereitgestellten wrapper-api, so stark wie möglich am vba-original halten. |
|
Nach oben |
|
 |
croco97

Anmeldungsdatum: 04.11.2005 Beiträge: 260
|
Verfasst am: 19.03.2009, 23:26 Titel: |
|
|
Cells ist in VBA ein Range-Objekt. Alles an VBA ist OOP. Das "=" ist ein überladener Zuweisungsoperator. So kannst du das in FB auch realisieren.
VG!
Croco |
|
Nach oben |
|
 |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 20.03.2009, 09:23 Titel: |
|
|
Ah ok, das hab ich glaub ich mal in einem tutorial gesehen wie man operatoren überlädt, das muss ich mir dann noch mal genauer anschauen.
und wie könnte man das mit den 2 "indexe" hinbekommen? |
|
Nach oben |
|
 |
croco97

Anmeldungsdatum: 04.11.2005 Beiträge: 260
|
Verfasst am: 20.03.2009, 20:51 Titel: |
|
|
Oma-Tutorial - objektorientierte Sprachansätze in Freebasic )
http://www.askos.de/tutorial/kap311a.htm
Du brauchst aber nicht zwingend Überladung. Wichtig ist nur, dass du den Zugriff auf so ein Objekt mit Methoden nachbildest. Bei Überladung sieht das dann nur "hübscher" aus.
Wichtig ist, dass jede Zelle ein eigenes Objekt ist, das prinziell ziemlich viele Informationen aufnimmt: Inhalt, Farbe, Font-Formatierung, Number-Formatierung etc.
Das Tabellenblatt ist dann wieder ein Objekt, das du über eine "getcell", bzw. "setcell"-Methode ansprichst. Und da kommen dann die Indizes als Argumente mit.
Muss jetzt zum Abendessen, sonst schimpft meine Frau...
VG!
Croco |
|
Nach oben |
|
 |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 21.03.2009, 12:55 Titel: |
|
|
Hm ok, die überladung geht klar
Die restlichen Objekt-Strukturen bekomme ich hin, aber nach wie vor weiss ich nicht wie ich bei [VBA] cells(2,2) = "Hallo Welt!" [/VBA] die zuordnung der reihe 2 mit spalte 2 hinbekomme.
[VBA] range("A1") = "Hallo Welt!" [/VBA] würde ich sofort hinbekommen weil dort "nur" ein index in form eines strings mitgegeben wird... aber ich möchte möglichst die selben objekte in FB anbieten können wie sie in VBA existieren.
Im Idealfall könnt ich manche VBA-Makros dann 1:1 in FB übernehmen und kompilieren  |
|
Nach oben |
|
 |
croco97

Anmeldungsdatum: 04.11.2005 Beiträge: 260
|
Verfasst am: 22.03.2009, 00:08 Titel: |
|
|
VBA:
überführen in
FB:
Code: |
sheet.setcells(2,2,value)
|
Und setcells ist eine Methode von sheet.
Ich glaube, dein Problem ist, dass du keinen Parser vorschalten möchtest, sondern nach Möglichkeit dem VBA-Code nur deine eigenen inc-Dateien vorhängen und dann kompilierts schon. Aber das ist sehr ehrgeizig. Das VBA-Objektmodell ist ziemlich ausgebufft. Du musst ja dann auch solche Sachen wie
Code: |
x=Range(Cells(2,2),Cells(5,4)).top
|
hinkriegen...
Und solange wir in FB keine Überladung von Klammern haben wie in C++ bist du AFAIK syntaktisch hier mit FB sowieso limitiert.
Aber warum nicht einen einfachen Parser schreiben, der nur ein paar "Korrekturen" am VBA-Code vornimmt?
VG!
Croco
VG!
Croco |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 22.03.2009, 11:36 Titel: |
|
|
In VBScript ist das hier Genannte überhaupt kein Problem:
Code: | Option Explicit
Dim oExcel, oWbs, oWb, oWks
Set oExcel = CreateObject("Excel.Application")
oExcel.Visible = True
Set oWbs = oExcel.Workbooks
Set oWb = oWbs.Open("C:\Dokumente und Einstellungen\user\Eigene Dateien\Beispiel.xls")
Set oWks = oWb.Sheets(1)
oWks.Cells(2, 3).Value = "Hallo Welt"
oWks.Cells(1, 4).Value = 1234
Set oWks = Nothing
oWb.Save
oWb.Close
Set oWb = Nothing
Set oWbs = Nothing
oExcel.Quit
Set oExcel = Nothing |
Hinweis: Code nicht getestet!
Dieses Beispiel öffnet eine .xls-Datei, mutiert 2 Werte und speichert es geändert unter dem gleichen Namen wieder ab. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
 |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 22.03.2009, 15:54 Titel: |
|
|
Super.. d.h. ich bräuchte ein "index-überladung" für properties ... puh... Parser sind nich so mein ding, ich vergreif mich nich gerne an andererleuts quelltext und änder den.. mit einem parser wäre ich über das ziel eines "wrappers" hinausgeschossen  |
|
Nach oben |
|
 |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 22.03.2009, 15:57 Titel: |
|
|
@drael: ziel wars ja ein wrapper für fb zu schreiben.. wenn ich vbscript verwende kann ich auch gleich in vba bleiben... |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 22.03.2009, 21:22 Titel: |
|
|
OneCypher hat Folgendes geschrieben: | ziel wars ja ein wrapper für fb zu schreiben.. wenn ich vbscript verwende kann ich auch gleich in vba bleiben... |
Gute Idee, die ich übrigens ebenfalls schon mehr als einmal erwähnte! Genau so etwas, um die VBScript-Operation
Code: | Set oAutomatisierungsobjekt = CreateObject("Anwendung.Application") |
durchführen zu können mit anschliessendem Zugriff auf die gesamte Objekthierarchie, z.B. hier bekommt man vom Excel-Applikationsobjekt mit dem Workbooks-Property auf die Collection mit Arbeitsmappen, wobei dieser Objekttyp wiederum eigene Methoden besitzt, z.B. Open(), um eine bestehende Datei zu öffnen oder Add() für eine neues, leere Arbeitsmappe wie "Datei"->"Neu" in der Anwendung. Übrigens ist es tatsächlich so, dass aus dem Windows Script Host heraus die gesamten VBA-Funktionen einem zur Verfügung stehen, d.h. der WSCRIPT.EXE-Prozess steuert Excel in diesem Fall wie eine Marionette an!
Ansonsten derjenige Weg, der auch in QB immer einwandfrei funktioniert: .VBS-Datein temporär ins %TEMP% schreiben, mit
Code: | SHELL "cscript //NoLogo " + ENVIRON$("TEMP") + "\~TEMP.VBS" |
aufrufen, Datenübergabe entweder mit Kommandozeilenargumente und temporären Textdateien. Konkrete Beispiele habe ich genügend dafür:
http://beilagen.dreael.ch/QB/WORD_MKR.BAS
http://beilagen.dreael.ch/QB/WMI_TASK.BAS
http://beilagen.dreael.ch/QB/TASKKILL.BAS
http://beilagen.dreael.ch/QB/SENDKEYS.BAS
http://beilagen.dreael.ch/QB/POWERPNT.BAS
http://beilagen.dreael.ch/QB/MYSQL.BAS
http://beilagen.dreael.ch/QB/MAILSEND.BAS
http://beilagen.dreael.ch/QB/CPULOAD.BAS
Also wenn Du es als erster hier schaffst, die Notwendigkeit der temporären .VBS-Datei bei sämtlichen oberen Beispielen zu eliminieren und gleichzeitig die reichhaltigen Möglichkeiten der ActiveX-Automatisierungsobjekte und WMI-Schnittstelle nutzen zu können, werde ich künftig bei sämtlichen Beiträgen der Art "Wie frage ich die CPU-Auslastung ab? Wie erstelle ich eine Worddatei aus FB heraus?" usw. auf Dein Projekt verweisen. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
 |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 23.03.2009, 00:06 Titel: |
|
|
@dreal: Warum benutzt du nicht disphelper?
Ich hab mir deine teilprojekte nicht im detail angeschaut, aber als ich mir die sachen grob angeschaut hab, hab ich schon gesehen dass es damit ganz gut klappen könnte  |
|
Nach oben |
|
 |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 27.03.2009, 16:20 Titel: |
|
|
[feststellung] Man kann die index-datentypen von properties nicht überladen (( *ISTAMVERZWEIFELN [/feststellung]
... +EDIT: Man kann Indexe von properties nichtmal optional setzen!!! *BALDAMHEULENBIN*
... +EDIT: Man kann doch die index-datentypen von properties überladen.. SORRY!
Dafür steh ich jetzt vor einem anderen problem:
in vba kann man etwas so ausdrücken:
[vba] i = application.workbooks.count [/vba]
aber auch
[vba] application.workbooks("Mappe1").close false [/vba]
im ersten ausdruck wird die anzahl der geöffneten Workbooks in die variable i geschrieben.
im zweiten ausdruck wird das workbook "Mappe1" ausgewählt und angewiesen zu schließen ohne zu speichern.
beim 2. kann ich mir gut vorstellen das bei .workbooks("Mappe1") das workbook-objekt von "Mappe1" zurückgegeben wird und die function close mit dem parameter false aufgerufen wird - Das kann man auch in FB ausdrücken.
aber ersteres kann man nicht so einfach ausdrücken wenn man gleichzeitig den 2. ausdruck implementieren will.
anscheinend werden je nachdem ob ein index dem .workbook mitgegeben wird ein anderes objekt zurückgegeben... geht sowas irgendwie auch in FB? |
|
Nach oben |
|
 |
MisterD

Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 27.03.2009, 19:49 Titel: |
|
|
natürlich geht das.. du machst die workbooks funktion überladen:
eine workbooks() ohne parameter und eine workbooks(string) mit einem string-parameter (referenz -> OVERLOAD)
dann geht das auch irgendwie. _________________ "It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra |
|
Nach oben |
|
 |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 28.03.2009, 16:09 Titel: |
|
|
@ MisterD: ach.. ich muss die datentypen der properties überladen!.. und das geht auch ! ok, dann komm ich weiter  |
|
Nach oben |
|
 |
|