Integration von RMChart in xBase++

Moderator: Moderatoren

gf210957
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 101
Registriert: Mi, 21. Dez 2005 10:18

Integration von RMChart in xBase++

Beitrag von gf210957 »

Hallo Thomas

ich habe mir auch RMChart heruntergeladen.
Leider habe ich keine Ahnung, wie dieses Tool in meine xBase++ Anwendung integriert werden kann.
Ich verwende xBase++ 1.82.
Kannst Du mir weiterhelfen.

Günter
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9355
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Beitrag von Tom »

Hallo, Günter.

Wenn ich das richtig sehe, bietet RMChart zwei Möglichkeiten - genaugenommen sogar drei - der Integration. Erstens als Active-X-Control; dafür würdest Du entweder Xbase++ 1.9 oder die JazzAge-Library von Philippe Monteil benötigen, die aber nicht mehr erhältlich ist. Mit "plain" 1.82 geht das in dieser Variante nicht. Oder zweitens als externe DLL, die Du einfach z.B. per DLLFUNCTION funktionenweise einbindest:

Code: Alles auswählen

DLLFUNCTION RMC_CreateChart(a,b,c,d,...) USING STDCALL FROM RMCHART.DLL 
(Nur als syntaktische Anleitung; ich weiß nicht, wie die DLLs heißen und wie die Funktionen parametrisiert sind.)

Drittens bietet RMChart einen Generator, der über eine Textdatei bestückt wird. Wie diese Textdatei auszusehen hat, das geht aus den Docs hervor. In dieser Variante muß nur noch eine DLL-Funktion RMC_CreateChartFromFile eingebunden und aufgerufen werden. Klingt alles ziemlich simpel.
Herzlich,
Tom
gf210957
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 101
Registriert: Mi, 21. Dez 2005 10:18

Integration von RMChart in xBase++

Beitrag von gf210957 »

Hallo Tom,

danke für die rasche Antwort.

Hat jemand Erfahrung, oder gibt es ein Beispiel, wie das Ganze in xBase++ aufgerufen werden kann.
Da ActivX nicht funktioniert, muss ich wohl die DLL einsetzen.
Ich habe jedoch keine Ahnung wie ich meine Daten übergeben, und die Grafik aufrufen kann.

Bin für jegliche Unterstützung dankbar.

Günter
thomas
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 116
Registriert: Fr, 23. Sep 2005 16:07
Wohnort: Bad Oldesloe
Kontaktdaten:

Beitrag von thomas »

Hallo Günter.

Der Umgang mit RM-Chart ist relativ einfach. In der Help-Datei findest du alle Funktionen und deren Dokumentation. Um den Aufruf an DLL - Funktionen zu minimieren, bietet sich die Möglichkeit an, alle benötigten Daten für ein Chart in eine CSV Datei zu speichern.

Folgende Vorgehensweise ist besonders simpel :

1. Schreibe die Daten in eine CSV Datei (z.B. UMSATZ.CSV)

2. Öffne den RMC-Designer und wähle im Control Tab die gewünschten Einstellungen.

3. Im Region Tab kannst du eine Menge an Parameter einstellen( ein bisschen experimetieren)

4. Unter Series 1 wählst Du z.B. den „Series type“ Bar aus und klicks dann auf „Edit series 1“. Als Source wählst Du einfach "From File" mit
Deiner Datei UMSATZ.CSV. First line = 1 und Last Line = 12, sowie die
Nummer des Datenfeldes und den Seperator "," müssen entsprechend
dem Aufbau der CSV-Datei richtig gesetzt werden.

Das war’s schon, nun einfach das Projekt speichern und per DLL – Aufruf anzeigen lassen.
nResult (LONG) = RMC_CreateChartFromFile(
ByVal nParentHndl (LONG),
ByVal nCtrlId (LONG),
ByVal nX (LONG),
ByVal nY (LONG),
ByVal nExportOnly (LONG),
ByRef sRMCFile (ASCIIZ)
)

Um das Chart mit aktuellen Werten zu versorgen, sollte man vor dem Anzeigen die CSV-Datei aktualisieren.


Gruß

Thomas




[/img]
gf210957
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 101
Registriert: Mi, 21. Dez 2005 10:18

Beitrag von gf210957 »

Hallo Thomas,

danke für Deine Antwort.

Aber irgendwie kriege ich das hier nicht auf die Reihe. (liegt vielleicht am Weihnachtsstress)
Was muss denn in die .CSV Datei?
In den Beispielen stehen neben den eigentlichen Werten noch irgend welche anderen Daten.
Und wie rufe ich dann die Grafik aus xBase++ heraus auf?

Gibt es hier eventuell ein kleines Beispiel als Source?

Ich hoffe, mir kann irgend jemand weiterhelfen.

Günter
RMorgen

Beitrag von RMorgen »

Vielleicht kann ich helfen... 8)

Grundsätzlich gibt es mehrere Möglichkeiten, mein Tool einzusetzen. Die ActiveX-Version und die DLL-Version sind vom Leistungsumfang her identisch. Welche Version man einsetzen will hängt vom verwendeten Entwicklungswerkzeug und den persönlichen Vorlieben ab.

Verwendet man die DLL, hat man zwei grundsätzliche Optionen: entweder man benutzt RMChart wie jedes andere WIN32 Control und erzeugt eine Instanz mit dem Funktionsaufruf RMC_CreateChart: in diesem Fall übergibt man als ersten Parameter ein gültiges Handel des Fensters (Form/Dialog), in dem das Control erzeugt (= das Chart angezeigt) werden soll. Wenn das funktioniert, muß man sich weder um das Redraw während der Lebenszeit des Charts kümmern noch um die Zerstörung des Charts, wenn das Parent-Fenster geschlossen wird, das wird von RMChart bzw. WINDOWS erledigt. Sollte dieser Weg nicht funktionieren (weil z.B. die Entwicklungsumgebung bei der Erzeugung von Dialogen einen eigenen Weg geht und daher kein gültiges Fenster-Handel zur Verfügung steht), kann man RMC_CreateChartOnDC benutzen, um ein Chart zu erezugen. In diesem Fall übergibt man als ersten Parameter einen gültigen DeviceContext (DC) entweder eines Fensters oder eines ImageControls etc. RMChart nutzt dann diesen DC, um darauf das Chart zu erzeugen. Hier ist man jedoch selbst für das Redraw zuständig, d.h. in der entsprechenden Callback-Funktion muß man beim Eintreffen von WM_PAINT mit RMC_Paint dafür sorgen, daß das Chart neu gezeichnet wird.

In beiden Fällen sind die nächsten Funktionsaufrufe zur Erzeugung das Charts identisch (als Beispiel eine simple Balkengrafik):
RMC_AddRegion erzeugt eine Region innerhalb des Charts
RMC_AddGrid legt ein Grid in dieser Region an
RMC_AddDataAxis definiert die Datenachse für das Grid
RMC_AddLabelAxis definiert die Labelachse für das Grid
RMC_AddBarSeries definiert die eigentliche Balkengrafik, die im Grid angezeigt werden soll.
RMC_Draw zeigt das Chart auf dem Bildschirm an.

Neben diesem Weg gibt es auch die Möglichkeit, ein Chart z.B. im Designer (RMCDesigner.exe) interaktiv zu erstellen. Dieses Chart kann dann in eine *.rmc-Datei geschrieben werden, die sowohl die eigentlichen Daten als auch sämtliche (visuellen) Eigenschaften des Charts enthält. In der eigenen Applikation kann dieses Chart mit zwei Zeilen Code angezeigt werden:
RMC_CreateChartFromFile, wenn (s.o.) das Chart mit einem gültigen WINDOW-Handel erzeugt werden kann
oder
RMC_CreateChartFromFileOnDC, wenn das Chart über den Umweg eines DC angelegt werden soll.
In beiden Fällen muß als Parameter 6 der Name der *.rmc-Datei, die mit dem Designer erzeugt wurde, angegeben werden. Angezeigt wird das Chart dann mit
RMC_Draw.

Die *.CSV-Dateien sind "lediglich" eine Option, um die anzuzeigenden numerischen Daten an ein (auf die oben beschriebene Art) bereits erzeugtes Chart zu übergeben.

Ich empfehle, neben der Dokumentation, einen Blick in die Datei pbdemo.bas im Ordner POWERBASIC des Installationsverzeichnisses. In dieser für BASIC geschriebenen Demo kann man eine Menge der oben beschriebenen Techniken studieren, und ich denke, die BASIC-Syntax sollte auch keine Verständnisprobleme bereiten.

Gerne beantworte ich weitere Fragen (und hoffe, daß RMChart auch mit XBase erfolgreich genutzt werden kann).

Happy charting! :)
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9355
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Beitrag von Tom »

Hallo, Rainer.

Danke für die Ausführungen! Ich werde sehen, ob ich dieser Tage mal ein Beispielprogramm in Xbase zusammenbaue.

Code: Alles auswählen

in diesem Fall übergibt man als ersten Parameter ein gültiges Handel des Fensters (Form/Dialog), in dem das Control erzeugt (= das Chart angezeigt) werden soll. Wenn das funktioniert,
Das funktioniert gut, auch mit anderen Controls. In Xbase ermittelt man das Handle eines Fensters über:

Code: Alles auswählen

oWindow:getHWND()
Herzlich,
Tom
thomas
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 116
Registriert: Fr, 23. Sep 2005 16:07
Wohnort: Bad Oldesloe
Kontaktdaten:

Beitrag von thomas »

Hallo Rainer.

Nochmals großes Lob an Dein hervorragendes Tool !
Für die Xbaseler wäre es wirklich super, wenn man unter
„Get Source“ auch XBASE Code automatisch generieren könnte.
Ich weiß nicht wie Aufwendig das für Dich ist, aber vielleicht können wir Dir dabei helfen ?


Gruß

Thomas
RMorgen

Beitrag von RMorgen »

Wenn die Erzeugung des Charts via Handle funktioniert, steht dem Einsatz von RMChart unter Verwendung der DLL ja nichts im Wege!

Die Code-Erzeugung für XBase im Designer ist natürlich mit nicht unerheblichem Aufwand verbunden: zunächst muß ich die komplette Routine schreiben, die den Code generiert. Künftig muß dann jede Änderung bzw. Funktionserweiterung der DLL in die jeweilige Codegenerierung des Designers eingebaut und getestet werden. Davor steht eine Beschäftigung mit der Syntax und der Entwicklungsumgebung von XBase, da ich natürlich die Codegenerierung - wie schon erwähnt - testen muß. Wenn XBase Bestandteil des Installationspakets werden soll, müßte die Includedatei portiert und eine Demo geschrieben werden. Hier könnte man z.B. die schon erwähnte Demo für PowerBASIC als Vorlage nehmen und - komplett oder in wesentlichen Teilen - nach XBase portieren.

Wie Ihr seht, jede Menge Arbeit (wobei die letzten beiden Punkte natürlich von jemandem aus Eurer Mitte übernommen werden könnten). Die Frage ist: lohnt der Aufwand? Wie groß ist der interessierte Kreis der "XBaseler"? Vielleicht solltet Ihr zunächst mal die beiden letzten Punkte angehen und die Möglichkeiten von RMChart+XBase in Eurer "Gemeinde" publik machen. Je nachdem, wie die Resonanz ausfällt, kann man dann ggfs. über Weiterungen reden.

Beste Grüße
Rainer Morgen
thomas
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 116
Registriert: Fr, 23. Sep 2005 16:07
Wohnort: Bad Oldesloe
Kontaktdaten:

Beitrag von thomas »

Hallo Günter.

Anbei ein kleines Code-Beispiel für die Benutzung von RMChart.
Achtung: Die Koordinaten beim Aufruf von RMC_CreatChartFromFile sind nicht Xbase konform. (0,0) bedeutet oben links !



Code: Alles auswählen

STATIC nHDll
STATIC tpl_RMC_CreateChartFromFile
STATIC tpl_RMC_GetChartSizeFromFile
STATIC tpl_RMC_Draw
STATIC tpl_RMC_Paint
STATIC tpl_RMC_Reset

FUNCTION RMC_INIT
LOCAL hDll := DllLoad("RMCHART.DLL")
LOCAL lReply := .F.
IF hDll <= 0
    MsgBox("RMCHART.DLL nicht vorhanden!")
ELSE
    lReply := .T.
    tpl_RMC_CreateChartFromFile  := DllPrepareCall(hDll,DLL_STDCALL,"RMC_CREATECHARTFROMFILE")
    tpl_RMC_GetChartSizeFromFile := DllPrepareCall(hDll,DLL_STDCALL,"RMC_GETCHARTSIZEFROMFILE")
    tpl_RMC_Draw  := DllPrepareCall(hDll,DLL_STDCALL,"RMC_DRAW")
    tpl_RMC_Paint := DllPrepareCall(hDll,DLL_STDCALL,"RMC_PAINT")
    tpl_RMC_Reset := DllPrepareCall(hDll,DLL_STDCALL,"RMC_RESET")
ENDIF
RETURN(lReply)

FUNCTION RMC_CreateChartFromFile(nHwnd,nCtrId,nX,nY,nExportOnly,cRMCFile)
RETURN( DllExecuteCall(tpl_RMC_CreateChartFromFile,nHwnd,nCtrId,nX,nY,nExportOnly,cRMCFile) )

FUNCTION RMC_GetChartSizeFromFile(cRMCFile,nWidth,nHeight)
RETURN( DllExecuteCall(tpl_RMC_GetChartSizeFromFile,cRMCFile,@nWidth,@nHeight) )

FUNCTION RMC_Draw(nCtrId)
RETURN( DllExecuteCall(tpl_RMC_Draw,nCtrId) )

FUNCTION RMC_Paint(nCtrId)
RETURN( DllExecuteCall(tpl_RMC_Paint,nCtrId) )

FUNCTION RMC_Reset(nCtrId)
RETURN( DllExecuteCall(tpl_RMC_Reset,nCtrId) )

FUNCTION umsatz
LOCAL hWin  := SetAppWindow():getHWND()
LOCAL nIx
LOCAL c := ""
FOR nIx = 1 TO 12
    c += STR(nIx,2)+CRLF
NEXT nIx
MEMOWRIT("UMSATZ.CSV",c)
RMC_CreateChartFromFile(hWin,1,0,0,0,"UMSATZ.RMC")
RMC_Draw(1)
RETURN(.T.)

Gruß

Thomas
gf210957
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 101
Registriert: Mi, 21. Dez 2005 10:18

Beitrag von gf210957 »

Hallo Thomas,

Danke für Dein Beispiel.

Ich habe das Ganze ausprobiert und erhalte zwar die .CSV Datei, die Grafik wird jedoch nicht aufgerufen. Ich arbeite mit xBase++ 1.82

Woran kann das liegen?

Günter
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9355
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Beitrag von Tom »

Hybridmodus? :idea:
Herzlich,
Tom
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16508
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Günter,
ich habe zwar keine Ahnung, da ich das Tool nicht einsetze, aber so wie ich das verstanden habe, mußt Du mit dem Designer (RMCDesigner.exe) einen Chart entwerfen und unter dem Namen UMSATZ.RMC speichern, damit das Beispiel funktioniert.

Viele Grüße,
Martin
thomas
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 116
Registriert: Fr, 23. Sep 2005 16:07
Wohnort: Bad Oldesloe
Kontaktdaten:

Beitrag von thomas »

Hallo Martin und Günter.

Ganz genau. Mit dem Designer ein Chart entwerfen und unter UMSATZ.RMZ speicher.

Gruß

Thomas
Michael Rudrich
UDF-Programmierer
UDF-Programmierer
Beiträge: 94
Registriert: Do, 22. Dez 2005 16:37

RMC

Beitrag von Michael Rudrich »

Hallo Jungs!

Muss jetz auchmal mitmixen :o))

Das ist völlig egal ob Hybrid oder nicht, wichtig ist, dass Du einen
hWnD kriegst...

Allerdings hab ich es auch ausprobiert - funktioniert bei mir
nur mit Anzeige eines weißen Adlers auf einem weißen Grund!

LG
gf210957
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 101
Registriert: Mi, 21. Dez 2005 10:18

Beitrag von gf210957 »

Hallo Thomas, hallo Martin,

Genau das habe ich getan.

Dennoch "weisser Adler auf weissem Grund!!"

Habt Ihr den veröffentlichten Code selber ausprobiert?

Übrigens, ich arbeite mit Win 2000

Kann irgend jemand mal den kompletten Code als ausführbare EXE veröffentlichen.

Günter
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9355
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Beitrag von Tom »

Huhu, Michl.

Schön, daß Du endlich auch hergefunden hast! 8)

Dem Beispiel fehlt noch ein Dialog, der die Funktion Umsatz() aufruft. Der gehört dann natürlich in eine Main()-Funktion, die auch noch fehlt.
Herzlich,
Tom
thomas
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 116
Registriert: Fr, 23. Sep 2005 16:07
Wohnort: Bad Oldesloe
Kontaktdaten:

Beitrag von thomas »

Hallo Jungs.

Im Bespielprogramm einfach nur den RMC_DRAW(1) Aufruf zweimal ausführen. Kann leider nicht sagen warum. :oops:

Gruß Thomas
Michael Rudrich
UDF-Programmierer
UDF-Programmierer
Beiträge: 94
Registriert: Do, 22. Dez 2005 16:37

Beitrag von Michael Rudrich »

Tja Tom...

mich hat der Günter auf Euch gehetzt.. :o)
Eigentlich wollt ich ja nicht... aber...

Und zum Thema: Logo hatte ich ne Main drum gebastelt und auch
den Aufruf gemacht...

Das mit dem zweimal Draw wußt ich natürlich nicht...

LG
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16508
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Michael,
Michael Rudrich hat geschrieben:Eigentlich wollt ich ja nicht... aber...
na soo schlimm sind wir doch nun auch nicht, oder? :shock:

Viele Grüße und trotzdem ein herzliches Willkommen auch von mir,
Martin :D
Michael Rudrich
UDF-Programmierer
UDF-Programmierer
Beiträge: 94
Registriert: Do, 22. Dez 2005 16:37

Beitrag von Michael Rudrich »

Hallo Martin...

Tja: jetzt habt Ihr halt das Problem, dass Ihr mit meinen
Kommentaren leben müßt :)

Danke für den Gruß

Schöne Zeit
Michael Rudrich
UDF-Programmierer
UDF-Programmierer
Beiträge: 94
Registriert: Do, 22. Dez 2005 16:37

Beitrag von Michael Rudrich »

Hi Leute ...

Also ich mir mal n Stündchen genommen und das Tool ein wenig genauer
angesehen.. in Sachen DLL Nutzung mein ich...
Leider läuft es nicht Thread-Sauber, damit ist es für mich unbrauchbar!
Schade, denn die Idee und das Design gefilen mir eigentlich gut!

Obwohl die Control-ID eindeutig ist (über ne Public die vor demAufruf
erhöht wird...) steigt er völlig daneben, nachdem ein zweiter Thread
mit derselben Grafik aufgemacht wurde...
Außerdem sollte er sauber 'Redrawen', tut er aber nicht!
Sobald n neuer Dialog in neuem Thread geöffnet wird und dieser
über das Control bewegt wird, bleibt die Fläche leer...

Wirklich schade.... hätt ich wirklich in meine APP implementiert..
(vor allem weil so günstig.. :) )

Kann natürlich sein, dass das ActiveX sauber funzt, aber das probier
ich jetzt nicht denn erstens hab ich keinen 1.9 laufen und zweitens
keinen Bock auf haarsträubendes stundenlanges Gefummel mit JazzAge
:)

Grüße an Alle
RMorgen

Beitrag von RMorgen »

Ich möchte mich ja nun wirklich nicht ungefragt in Eure nette Unterhaltung einmischen, und vor allen Dingen bin ich der Letzte, der an seine eigene Unfehlbarkeit glaubt, aber: ein ganz klein wenig habe ich das Gefühl, daß im Moment bei Euch nach dem Prinzip von "trial and error" verfahren wird, vor allen Dingen in den letzten paar Stunden.
Einiges von dem, was hier problematisiert wird, hätte sich durch einen Blick in die Dokumentation vielleicht klären lassen. Das Prinzip von CSV und RMC Dateien z.B. und was es mit RMC_CreateChartFromFile auf sich hat oder wo die Probleme eventuell liegen könnten beim Einsatz von RMChart unter WINDOWS 2000 (gdiplus.dll?). Vielleicht hätte auch eine Frage an mich (z.B. hier, per Mail oder im Forum meiner Website) weiterhelfen können, was ich in meinem ersten Posting ja angeboten hatte.

Da sich nun aber jemand "mal n Stündchen genommen" hat und nach dem Stündchen zu dem apodiktischen Schluß kam, daß "das Tool" nicht "Thread-Sauber" läuft, "völlig daneben steigt" und nicht "sauber Redrawen tut" - was kann ich da noch sagen?

Nichts mehr.
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16508
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Rainer,
nicht böse sein :wink:
Vielen Dank auf jeden Fall für Deine Hinweise und Dein erneutes Hilfsangebot! Ich bin mir sicher, dass Michael sich noch auf Dein Forum stürzen wird und ich denke mal, dass wir die "Probleme" alle gemeinsam gelöst bekommen :)

Viele Grüße,
Martin
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16508
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Thema geteilt

Beitrag von Martin Altmann »

Hallo an alle:
nur zur Info - ich habe den Thread neu aufgeteilt, da es ja nun nichts mehr mit dem alten Thread von List & Label zu tun hatte.

Viele Grüße,
Martin
Antworten