Seite 1 von 1
HB_RMChart
Verfasst: Mi, 09. Dez 2009 17:04
von Jan
Hallo Hubert,
ich spiele mit dem Gedanken, RM-Chart in der ActiveX-Variante bei mir rauszuschmeißen und auf die dll-Version umzusteigen. Das mit dem Installieren der ocx hat für mich 3 ganz gravierende Nachteile:
- Nicht jeder mag bei sich eine ActiveX installieren
- Mancher möchte mein Programm auch ohne Installation nutzen, z. B. vom USB-Stick aus
- Unter Vista und Windows 7 gibt es Rechte-Probleme bei der Installation
Dein Tool hilft dabei ungemein. Mir fehlt da aber (mindestens
) die Methode GridlessSeries(). Kannst Du mir da weiterhelfen?
Mal sehen, ob ich Dich dann mit noch mehr Arbeit überhäufen kann
Jan
Re: HB_RMChart
Verfasst: Do, 10. Dez 2009 13:29
von Rolf
Hallo Jan
ich benutze die DLL wie folgt:
1. erstelle csv
2. erstelle rmc (Grunddatei erstellt mit RMCDesigner.exe) und im Programm mit strTran angepasst
3. erzeuge mit der Dll ein jpg
4. zeige jpg an
folgender Code dazu
Code: Alles auswählen
//-------------------------------------------------------------------
// WWW.RMCHART.COM
#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_Draw2File
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_Draw2File := DllPrepareCall(hDll,DLL_STDCALL,"RMC_DRAW2FILE")
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_Draw2File(nCtrId, sFileName, nx, ny)
RETURN( DllExecuteCall(tpl_RMC_Draw2File,nCtrId,sFileName,nX,nY) )
//--
FUNCTION RMC_Paint(nCtrId)
RETURN( DllExecuteCall(tpl_RMC_Paint,nCtrId) )
//--
FUNCTION RMC_Reset(nCtrId)
RETURN( DllExecuteCall(tpl_RMC_Reset,nCtrId) )
/***********************************************************
Name : rmcCreateJpg
Parameters : cRMC := "simplebar.rmc"
cJPG := "simplebar.jpg"
***********************************************************/
FUNCTION rmcCreateJpg( cRMC, cJPG )
LOCAL hWin := SetAppWindow():getHWND()
RMC_INIT()
RMC_CreateChartFromFile(hWin,1,0,0,1,cRMC)
//-- Bei 0,0 wird die GrӇe aus der RMC-Datei verwendet
RMC_Draw2File(1,cJPG,0,0)
RETURN NIL
Ich weiß nicht ob dir das hilft, deine Funktion ist leider nicht dabei
Liebe Grüße
Rolf
Re: HB_RMChart
Verfasst: Do, 10. Dez 2009 13:42
von Jan
Hallo Rolf,
Hubert hat einen Wrapper für die dll geschrieben. Mit der man super arbeiten kann, ohne irgendwelche Verbiegungen etc. Mir fehlt halt diese eine Methode dadrin (erstmal, mal sehen, was da noch kommt).
Jan
Re: HB_RMChart
Verfasst: Fr, 11. Dez 2009 10:26
von brandelh
Hallo Jan,
es ist lange her, dass ich die geschrieben habe ...
ich dachte ich hätte alle nötigen Funktionen in der Version die alle Parameter bekommt abgehandelt.
Gibt es eventuell eine die so ähnlich heist und das Gleiche macht ?
Re: HB_RMChart
Verfasst: Sa, 02. Jan 2010 8:37
von Jan
Hallo Hubert,
sorry, das ich mich erst so spät wieder melde
Nein, leider gibt es anscheinend nichts ähnliches. Und ich habe inzwischen festgestellt, daß es sooo einfach nicht ist. Mein Programm steigt immer in dieser Zeile aus:
Code: Alles auswählen
oChart:Region(1):GridlessSeries():SetColorValue(i,
IIf(i > 12, ;
aFarben[Max(1, i - (12 * Int(i / 12)))], ;
aFarben[i]))
In aFarben habe ich einfach 12 Farben hinterlegt, die dann der Reihe nach eingetragen werden.
Es fehlen also die Region(), die GridlessSeries(), und die SetColorValue(). Die AddRegion() und AddGridlessSeries() hast Du ja schon eingebaut, erstellen kann ich die also. Ich muß aber die Farben nachträglich ändern, da es sonst
dieses Problem gibt.
Jan
Re: HB_RMChart
Verfasst: Mo, 22. Feb 2010 13:31
von Jan
Hallo Hubert,
hast Du Dir da schon mal Gedanken drum machen können?
Jan
Re: HB_RMChart
Verfasst: Mo, 22. Feb 2010 15:15
von brandelh
Sorry, aber ich bin zu gar nix gekommen
und versprechen kann ichs auch nicht.
Haben die Strukturen als Parameter ?
Sonst müsste es einfach sein ... schick mir doch bitte eine eMail mit einem kleinen
Beispielprogramm wo genau das fehlt was noch gebraucht wird.
Oder hier als Anhang dann muss ich nicht so viel machen.
Re: HB_RMChart
Verfasst: Di, 01. Jun 2010 13:21
von brandelh
Hallo Jan,
besteht dein Problem noch ?
... und ich suche schon wieder nach der HB_RMChart Veröffentlichung ...
Re: HB_RMChart
Verfasst: Di, 01. Jun 2010 13:26
von Jan
Hallo Hubert,
ja. Bin leider immer noch nicht dazu gekommen, das durchzuarbeiten.
Jan
Re: HB_RMChart
Verfasst: Di, 01. Jun 2010 14:58
von brandelh
Hallo Jan,
Jan hat geschrieben:Mein Programm steigt immer in dieser Zeile aus:
Code: Alles auswählen
oChart:Region(1):GridlessSeries():SetColorValue(i,
IIf(i > 12, ;
aFarben[Max(1, i - (12 * Int(i / 12)))], ;
aFarben[i]))
In aFarben habe ich einfach 12 Farben hinterlegt, die dann der Reihe nach eingetragen werden.
Es fehlen also die Region(), die GridlessSeries(), und die SetColorValue().
dieser Code ist kein DLL sondern ein ActiveX Code ! Das muss man trennen und teilweise auch anders behandeln.
Code: Alles auswählen
oHB:RMC_AddGridlessSeries(nRegion,aNumData,aColor,nStyle, nAlignment,;
nExplodemode, nIsLucent, nValueLabelOn,;
nHatchMode, nStartAngle)
erhält als Parameter aColor das Xbase++ Array mit den Farbwerten und setzt diese intern um.
Ich weiß nicht, ob du hier einen Fehler bei der Übergabe machst, oder einen Fehler in meiner Klasse
aufgedeckt hast, dazu brauche ich mehr Infos. Auf jeden Fall, sollte die Farbübergabe funktionieren.
In meinem Beispiel NeuGrafik.PRG erzeuge ich eine GridLessSeries(...)
Code: Alles auswählen
if oRMC:RMC_CreateChart()
oRMC:RMC_AddRegion(,,,,"TestRegion 1",.t.)
oRMC:RMC_AddCaption(1,"GRID-LESS: Tortengrafik",,,,.t.)
oRMC:RMC_AddLegend(1,"1*2*3*4*5") // wahrscheinlich erst mit Daten !!!
oRMC:RMC_AddGridlessSeries(1 ,; // nRegion
{1,2,3,4,5} ; // aNumData
; // aColor
; // nStyle
; // nAlignment
; // nExplodemode
; // nIsLucent
; // nValueLabelOn
; // nHatchMode
) // nStartAngle)
oRMC:RMC_Draw()
zu früh gefreut, ich übergebe hier keine Farben, sondern verwende Standard ... aber eventuell liegt hier ja auch kein Problem ?
Jan hat geschrieben:
Es fehlen also die Region(), die GridlessSeries(), und die SetColorValue().
dies sind alles Methoden von ActiveX, in der Hilfe gibt es kein RMC_Region(), RMC_GridlessSeries() oder RMC_SetColorValue()
Eventuell muss man RMC_SetSeriesColor() nutzen um die Farben einer Serie komplett zu ändern.
Jan hat geschrieben:
Ich muß aber die Farben nachträglich ändern, da es sonst
dieses Problem gibt.
willst du die Farben nachträglich ändern oder zwingt dich ein Fehler er Klasse dazu ?
Re: HB_RMChart
Verfasst: Di, 01. Jun 2010 21:48
von Jan
Hallo Hubert,
Hubert hat geschrieben:dieser Code ist kein DLL sondern ein ActiveX Code ! Das muss man trennen und teilweise auch anders behandeln.
Schon klar.
Hubert hat geschrieben:dies sind alles Methoden von ActiveX, in der Hilfe gibt es kein RMC_Region(), RMC_GridlessSeries() oder RMC_SetColorValue()
Eventuell muss man RMC_SetSeriesColor() nutzen um die Farben einer Serie komplett zu ändern.
Die Methoden funktionieren auf jeden Fall in der ActiveX-Variante.
Hubert hat geschrieben:willst du die Farben nachträglich ändern oder zwingt dich ein Fehler er Klasse dazu ?
Ja, da gibt es anscheinend einen Fehler. Wenn ich das hier nicht mache (und das ist nur bei dieser Chartart), dann werden zu wenig Farben genutzt. Bertram mich darauf gebracht in diesem Thread
http://www.xbaseforum.de/viewtopic.php? ... ben#p28685. Man muß also eine Reihe von Farben übergeben, die werden dann rotierend wiederholt.
Ich geb Dir mal meinen Code rüber als PN. Dann kannst Du ja mal schauen, wie ich die Unterschiede zwischen der aktuell laufenden ActiveX-Version und der bereits eingebauten, wegen der Probleme aber unvollständigen dll-Version umgesetzt habe. Vielleicht hift Dir das ja weiter.
Jan
Re: HB_RMChart
Verfasst: Di, 01. Jun 2010 22:05
von brandelh
JAN hat geschrieben:
Hubert hat geschrieben:dies sind alles Methoden von ActiveX, in der Hilfe gibt es kein RMC_Region(), RMC_GridlessSeries() oder RMC_SetColorValue()
Eventuell muss man RMC_SetSeriesColor() nutzen um die Farben einer Serie komplett zu ändern.
Die Methoden funktionieren auf jeden Fall in der ActiveX-Variante.
Das Objekt der Klasse HB_RMCHART() kann nichts mit den ActiveX Methoden anfangen !
JAN hat geschrieben:Ja, da gibt es anscheinend einen Fehler. Wenn ich das hier nicht mache (und das ist nur bei dieser Chartart), dann werden zu wenig Farben genutzt. Bertram mich darauf gebracht in diesem Thread
http://www.xbaseforum.de/viewtopic.php? ... ben#p28685. Man muß also eine Reihe von Farben übergeben, die werden dann rotierend wiederholt.
Ich geb Dir mal meinen Code rüber als PN.
Ich schaue mir das mal an, ist schon eine Weile her
Re: HB_RMChart
Verfasst: Mi, 02. Jun 2010 14:17
von brandelh
Hallo Jan,
versuche doch mal bitte die verbesserte Version dieser Funktion (in HB_RMCHart.PRG austauschen):
Code: Alles auswählen
//---------------------------------------------------------------------
function L2RefStr(uLong) // Xbase++ Array -> C LONG Array ! PER REFERENZ !
local cLong := ""
do case
case IsNil(uLong)
cLong := L2BIN(0)
case valType(uLong)="N"
if uLong > 2147483647
cLong := U2BIN(uLong)
else
cLong := L2BIN(uLong)
endif
case valType(uLong)="A"
aeval(uLong,{|nL| cLong += iif(nL > 2147483647,U2BIN(nL),L2BIN(nL))})
otherwise
msgbox("L2RefStr(uLong) hat falschen Parameter")
endcase
return cLong
Dieses Beispiel hat bei mir eine schöne Tortengrafik erzeugt (Farben sind geschmackssache
)
Code: Alles auswählen
oRMC:RMC_AddCaption(1,"GRID-LESS: Tortengrafik",,,,.t.)
oRMC:RMC_AddLegend(1,"1*2*3*4*5*6*7*8*9*10*11*12") // wahrscheinlich erst mit Daten !!!
oRMC:RMC_AddGridlessSeries( 1 ,; // nRegion
{1,3,5,7,2,4,6,8,1,2,3,4 } ,; // aNumData
{ColorAliceBlue, ColorAntiqueWhite, ColorAquamarine, ColorArmyGreen,;
ColorAutumnOrange, ColorAvocadoGreen, ColorAzure, ColorBabyBlue,;
ColorBananaYellow, ColorBeige, ColorBisque, ColorBlack } ; // aColor
; // nStyle
; // nAlignment
; // nExplodemode
; // nIsLucent
; // nValueLabelOn
; // nHatchMode
) // nStartAngle)
Re: HB_RMChart
Verfasst: Mi, 02. Jun 2010 14:31
von brandelh
Hallo Jan,
das nachträgliche Austauschen einer Farbe geht mit diesem Befehl, die Werte nRegion, nIndex, nColor etc. muss man natürlich anpassen:
Code: Alles auswählen
nSeries := 1
nColor := ColorRed
nIndex := 7
oRMC:RMC_SetSeriesColor(nRegion, nSeries, nColor, nIndex)
wenn ich das in meinem Beispiel nutze, dann sieht das Bild so aus:
Re: HB_RMChart
Verfasst: Mi, 02. Jun 2010 14:48
von brandelh
Hallo Jan,
zunächst verwirrt mich etwas deine Aufruf, besser die Parameter davon:
Code: Alles auswählen
oChart:RMC_AddGridlessSeries(1, ;
RMC_DONUT_GRADIENT, ;
RMC_FULL, ;
RMC_EXPLODE_NONE, ;
.F., ;
RMC_VLABEL_TWIN, ;
RMC_HATCHBRUSH_OFF)
eigentlich hätte ich dieses erwartet (so zumindest aus meiner aktuellen Klassendefinition)
Code: Alles auswählen
oChart:RMC_AddGridlessSeries(nRegion,aNumData,aColor,nStyle, nAlignment,;
nExplodemode, nIsLucent, nValueLabelOn,;
nHatchMode, nStartAngle)
nun zu deiner Frage mit den Farbzuweisungen ...
nAnzahl := 12 // Anzahl der Datenbereiche == Anzahl der nötigen Farben
// entweder merken oder mit RMC_GetDataCount() abfragen.
nRegion := 1 // das muss man wissen
nSeries := 1 // das muss man wissen
Code: Alles auswählen
FOR i := 1 TO nAnzahl
if i > 12
nColor := aFarben[Max(1, i - (12 * Int(i / 12)))]
else
nColor := aFarben[i]
endif
oChart:RMC_SetSeriesColor(nRegion, nSeries, nColor, nIndex)
NEXT
Re: HB_RMChart
Verfasst: Mi, 02. Jun 2010 15:22
von Jan
Halo Hubert,
noch habe ich mich nicht durch alles durchgearbeitet, was du hier inzwischen geschrieben hast. Aber prinzipiell funktioniert das jetzt. Ein paar Feinarbeiten fehlen noch, die Ausgabe ich noch nicht ganz so, wie ich die haben möchte.
Aber jetzt schon: Vielen Dank für die Arbeit, die Du schon wieder da reingesteckt hast!
Jan