HB_RMChart

Moderator: Moderatoren

Antworten
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14651
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

HB_RMChart

Beitrag 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 :roll: ) die Methode GridlessSeries(). Kannst Du mir da weiterhelfen?

Mal sehen, ob ich Dich dann mit noch mehr Arbeit überhäufen kann :razz:

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Rolf
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 258
Registriert: Do, 27. Apr 2006 12:28
Wohnort: Görlitz

Re: HB_RMChart

Beitrag 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
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14651
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: HB_RMChart

Beitrag 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
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: HB_RMChart

Beitrag 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 ?
Gruß
Hubert
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14651
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: HB_RMChart

Beitrag von Jan »

Hallo Hubert,

sorry, das ich mich erst so spät wieder melde :cry:

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
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14651
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: HB_RMChart

Beitrag von Jan »

Hallo Hubert,

hast Du Dir da schon mal Gedanken drum machen können?

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: HB_RMChart

Beitrag 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.
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: HB_RMChart

Beitrag von brandelh »

Hallo Jan,

besteht dein Problem noch ?

... und ich suche schon wieder nach der HB_RMChart Veröffentlichung ...
Gruß
Hubert
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14651
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: HB_RMChart

Beitrag von Jan »

Hallo Hubert,

ja. Bin leider immer noch nicht dazu gekommen, das durchzuarbeiten.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: HB_RMChart

Beitrag 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 ?
Gruß
Hubert
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14651
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: HB_RMChart

Beitrag 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
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: HB_RMChart

Beitrag 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 ;-)
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: HB_RMChart

Beitrag 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)
Dateianhänge
NeuGrafik.JPG
NeuGrafik.JPG (56.42 KiB) 8276 mal betrachtet
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: HB_RMChart

Beitrag 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:
Dateianhänge
NeuGrafik.JPG
NeuGrafik.JPG (52.77 KiB) 8267 mal betrachtet
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: HB_RMChart

Beitrag 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
Gruß
Hubert
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14651
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: HB_RMChart

Beitrag 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
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Antworten