RMChart und Xbase++

Moderator: Moderatoren

Antworten
Rolf
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 258
Registriert: Do, 27. Apr 2006 12:28
Wohnort: Görlitz

Beitrag von Rolf »

Hallo Hubert

Ich weiß nicht so recht ob das hier noch rein gehört, aber
ich hab mich auch grad mal mit RMChart beschäftigt und mich würde mal interessieren ob du schon etwas hinbekommen hast? Und ggf. mal den Quelltext schicken könntest.

Bei der Komplexität der Funktionen würde ich denken, dass es am einfachsten ist, wenn man im RmcDesigner ein *.rmc File erzeugt. Danach nur hinten die Werte anpasst und das dann als Bild generiert, speichert und wiederum in einem xbpDialog als xbpBitmap anzeigt.
Was denkst du dazu?

Müsste man die gdiplus_dnld.exe dann auf jedem Kunden-Rechner installieren oder reicht nur wenn die gdiplus.dll vorhanden ist?

Ich glaub du hast schon mehr Erfahrung damit.

Danke Rolf
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15696
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo Rolf,

nein, mit List&Label hat es nichts zu tun, daher habe ich es mal verschoben. Es gehört eigentlich zu dem schon bestehenden Thread hier, (aber erstens wird der dauernd übersehen und zweitens weiß ich nicht wie ich 2 Threads mischen kann) :

Integration in RMChart.
Grundlagen zu F2BIN Parameterübergabe per Referenz....

Allerdings wird dieser häufig übersehen, liegt wohl am Titel, ich hatte es damals auch nicht gefunden :wink: .
Bei der Komplexität der Funktionen würde ich denken, dass es am einfachsten ist, wenn man im RmcDesigner ein *.rmc File erzeugt. Danach nur hinten die Werte anpasst und das dann als Bild generiert, speichert und wiederum in einem xbpDialog als xbpBitmap anzeigt.
Was denkst du dazu?
Ich denke, dass die RMC File plus CSV für Daten und direkt anzeigen besser ist, als die geänderte RMC File zu nutzen ... allerhings hagelt es bei mir nur so von Fehlermeldungen. Bin leider noch nicht weiter, und das obwohl die PowerBasic-Beispiele hier einwandfrei laufen.

Es gibt allerdings Beispielcode im genannten Thread, bei dem mit ActiveX erfolgreich angezeigt wurde.
Müsste man die gdiplus_dnld.exe dann auf jedem Kunden-Rechner installieren oder reicht nur wenn die gdiplus.dll vorhanden ist?
Bei einem XP Recher braucht man gar nichts mitliefern, ansonsten reicht es aus - und wird von MS empfohlen - die gdiplus.dll ins Anwendungsverzeichnis zu kopieren (bei meinem Rechner gibt es 5 verschiedene Versionen in verschiedenen Anwendungsverzeichnissen...
Zuletzt geändert von brandelh am Mo, 19. Jun 2006 16:58, insgesamt 2-mal geändert.
Gruß
Hubert
Rolf
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 258
Registriert: Do, 27. Apr 2006 12:28
Wohnort: Görlitz

Beitrag von Rolf »

Danke Hubert

für deine Antwort, ich werde mich ggf. Morgen nochmals damit beschäftigen, je nach Zeitdruck.
Die Komponente ist auf den ersten Blick gut designed und durchdacht.

Ich hoffe RMorgen ist nicht mehr ärgerlich über die Bemerkungen in dem älteren Thread.
So viel Arbeit wie das alles macht und dann noch als Freeware. Das ist sehr zu loben.

ich hoffe es findet sich noch eine Lösung
bis Bald

Rolf
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15696
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo,

der von Thomas veröffentlichte Quellcode hat mir geholfen, da aber dort etwas fehlt (#include, main, 2x draw() und die RMC ;-) ), nochmals hier der Quellcode, der bei mir gelaufen ist:
Die SIMPLEBAR.RMC liegt im RMChart Verzeichnis.
Die DLLs und die RMC müssen in das gleiche Verzeichnis wie dieser Quellcode

Code: Alles auswählen

#include "Dll.ch"
#define CRLF chr(13)+chr(10)

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

proc main
     ? "RMC_INIT()",RMC_INIT()
     ? "UMSATZ",    umsatz()
     wait
return

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,"simplebar.rmc") // "UMSATZ.RMC")
RMC_Draw(1)
RMC_Draw(1)
RETURN(.T.)
Die Umsatzdaten werden in dieser RMC nicht berücksichtigt, aber die ursprüngliche Umsatz.RMC steht uns nicht zur Verfügung.

Nochmals Danke Thomas, dass du mir mit diesem Code gezeigt hast, dass es gehen muss ...

Im Moment bin ich dabei eine Classe _RMChart zu erstellen, welche die nötigen Funktionsaufrufe (ohne die Kurzform mit I am Ende - TYPE statt parameter) als Methoden abzubilden und die IDs intern zu verwalten.
Ich hoffe ich kann hier bald den funktionierenden Quellcode veröffentlichen ...
Zuletzt geändert von brandelh am Mi, 14. Jun 2006 17:56, insgesamt 1-mal geändert.
Gruß
Hubert
Rolf
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 258
Registriert: Do, 27. Apr 2006 12:28
Wohnort: Görlitz

Beitrag von Rolf »

Hi Hubert

hab ich dich richtig verstanden das der Quelltext bei dir so funktioniert?
:(
Ich weiß nicht bei mir bekomme ich eine Absturz in RMC_CREATECHARTFROMFILE(33) bei der Operation dllExecuteCall mit der Beschreibung "Interne Datenstrukturen beschädigt".

Das würde mir so sagen, dass mindestens ein Parameter einen falschen Datentyp hat.
Na ja in dem Thread mit den Zugriff auf Dll's wurde ja auf

cDouble := F2BIN(nDouble)
dllfunction xyz( @cDouble )

hingewiesen, das hab ich auch schon so ein bisschen versucht bisher ohne Erfolg.

Liegt das nun an meiner xBase Version 1.70 oder bist du auch noch am basteln.

Gruß Rolf
Rolf
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 258
Registriert: Do, 27. Apr 2006 12:28
Wohnort: Görlitz

Beitrag von Rolf »

Oh, Sorry

Ich hab mal wieder Flinte zu schnell ins Korn geworfen. Hab die gdiplus.dll vergessen, die rmchart.dll hatte ich bereits.

Man muss doch richtig lesen.

brandelh hat geschrieben: Die DLLs und die RMC müssen in das gleiche Verzeichnis wie dieser Quellcode
:wink:

Gruß Rolf
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15696
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Erste Testversion der RMChart-Klasse

Beitrag von brandelh »

Hallo,

die Anwort auf diesen Thread ist scheinbar nicht möglich, hier ist eine
Lösung des RMChart Problemes in Xbase++ 1.90 ActiveX:
Lösung mit AxtiveX

dennoch werde ich meine DLL-Classe weiterentwickeln, denn ActiveX geht nicht immer. Für 1.90 Anwender die ActiveX verwenden können dürte dies aber auf jeden Fall besser sein, denn das Refresh(Repaint)-Verhalten gibt bei meiner DLL Lösung noch Probleme auf.

Die DLL-Version ist fast fertig. Man kann an die KlassenMethoden direkt Xbase++ Arrays mit den Werten übergeben, die Klasse formt dies dann intern um und gibt ein C-Double-Array inkl. Anzahl der Elemente weiter.

Die endgültige Versionen werde ich als ZIP auf meiner Homepage unterbringen, und von hier bzw. der Wissensbasis verlinken.
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15696
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

HB_RMCHart - Version 1.00 ist freigegeben ...

Beitrag von brandelh »

Gruß
Hubert
thomas
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 116
Registriert: Fr, 23. Sep 2005 16:07
Wohnort: Bad Oldesloe
Kontaktdaten:

Beitrag von thomas »

Hallo Hubert.

Gerade habe ich mich ein wenig mit Deiner HB_RMChart Klasse beschäftigt und kann nur
sagen : „ Super !!!“
Im Programmbeispiel „NEUGRAFIK.PRG“ ist mir aufgefallen, das mit einem Mausklick auf die
Grafik das Programm keine Rückmeldung mehr liefert.
Hast Du vielleicht eine Idee woran das liegen könnte ?

Gruß
Thomas
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15696
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo Thomas,

das habe ich in der Liesmich.txt beschrieben. ;-)

RMChart verarbeitet selbst die Mausklicks und gibt diese nicht an Xbase++ weiter. Mal sehen ob Rainer das noch ändert. In PowerBasic kann man callback Routinen schreiben, welche dann von RMchart aufgerufen werden, bei Xbase++ soll sowas aber nicht funktionieren. Ich denke am besten würde Rainer die Mausabfrage per Parameter abschaltbar machen.
Bis dahin rate ich zur versteckten Erzeugung eines JPG und Anzeige im XbpBitmap.
Gruß
Hubert
Bernd Reinhardt
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 159
Registriert: So, 16. Apr 2006 11:12
Wohnort: Öhringen

Chart Drucken

Beitrag von Bernd Reinhardt »

:(
Hallo.
Ich habe mit rmchart und ActiveX control ein paar schöne Statistiken auf dem Monitor.
Leider kann ich diese nicht drucken.
Ich erzeuge ein Fenster oForm und übergebe die Drawing Area .
oControl := XbpActiveXControl():new( oForm:drawingArea )
oControl:CLSID := "rmchart.rmchartx"
oControl:create( ,, {20,40},{800,600} )
Soweit so gut.

Zum Drucken wollte ich nun statt der drawingArea vom xbpdialog (oFrom) ein Presspace vom Drucker übergeben. Printerobject anlegen.
oPrinterPS:create( oDC )
oControl := XbpActiveXControl():new( oPrinterPS )

Nun erhalte ich aber einen Fehler beim Erzeugen von oControl.

Wie kann ich die mit rmchart erzeugte Statistik wenn möglich auf
einem Farbdrucker ausgeben.

Gruß
Bernd
Bernd Reinhardt
fa.reinhardt@gmx.de
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15696
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo,

am einfachsten erzeugst du mit RMChart ein JPG Datei und übergibst diese dann per XbpBitmap an den Drucker.
Gruß
Hubert
Bernd Reinhardt
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 159
Registriert: So, 16. Apr 2006 11:12
Wohnort: Öhringen

Drucken mit rmchart

Beitrag von Bernd Reinhardt »

Hallo.
Ich habe die Sache von der falschen Seite angegangen.
Mit oControl:draw2file und draw2printer geht es natürlich recht einfach.
Ein Blick in die Doku und die Lösung war da.

Sorry
Bernd
Bernd Reinhardt
fa.reinhardt@gmx.de
Bernd Reinhardt
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 159
Registriert: So, 16. Apr 2006 11:12
Wohnort: Öhringen

Nur ein Teilerfolg

Beitrag von Bernd Reinhardt »

:cry:
Hallo zusammen.
Das mit dem Drucken von rmchart geht auf den Standarddrucker.
Aber auf einen ausgewählten Drucker geht es (noch) nicht.
In der Doku von rmchart steht, dass man einfach den Handle für den Drucker übergeben muss. Also hole ich den Wert und übergebe diesen an rmchart. Allerdings druckt doch nur der Standardducker.

Code: Alles auswählen

   
   cMyDrucker := "EPSON Stylus C86 Series"  // fDruckAuswahl()
   oDC := XbpPrinter():new()
   oDC:Create(cMyDrucker)
   aForms = oDC:forms()
   oDC:setupDialog()
   
   nhDC := oDC:getHDC()  
   msgbox(str(nhDC))
   oControl:draw2Printer(nhDC)
   oForm:destroy()
Ich kann den Drucker wählen, und der setupdialog vom Drucker kommt auch für den Epson. Mein Standard ist ein HP Laserjet.
Für nHDC erhalte ich aber immer einen anderen numerischen Wert 18941707 oder beim nächsten Aufruf: 220268302.
Gedruckt wird aber immer auf dem Standarddrucker.

Irgend eine Idee wo der Fehler liegt?
Benötige ich hier BAP für eine Konvertierung?

Auszug aus der Doku.
control.Draw2Printer([nPrinterDC], [nLeft], [nTop], [nWidth], [nHeight], [nFileType]))
Purpose Sends a chart to a printer
Parameter
nPrinterDC (Long) A valid printer DC. If omitted or 0: the default printer is used.


Gruß
Bernd
Bernd Reinhardt
fa.reinhardt@gmx.de
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2470
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 102 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

Beitrag von Koverhage »

Ich benutze SetPrinter (druckername) um den Standarddrucker zu setzen, nach Beendigung des Druckjobs setze ich den wieder zurück.
Diese Funktion kannst Du auf Phils Seite runterladen.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15696
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo,

draw2Printer() ist recht unflexibel (druck nur die Grafik) irgendwie aufs Papier. draw2file() und dann eine richtige XbpPrinter (HB_Printer) Druckausgabe, die die JPG Datei druckt ist wesentlich flexibler und druckt auf den Drucker, den man haben will ;-)
Gruß
Hubert
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16511
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Version 4.0

Beitrag von Martin Altmann »

Hallo allerseits.
Rainer hat mittlerweile die Version 4.0 fertiggestellt - einige neue schöne Dinge sind hinzugekommen...
Ich habe es mir aber noch nicht angeschaut - werde es wohl auch vor der DevCon nicht mehr schaffen...

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Antworten