Integration von RMChart in xBase++

Moderator: Moderatoren

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

Beitrag von Michael Rudrich »

Hallo Rainer und MItleser!

Es ist nicht nötig, dass sich jemand auf den Schlips getreten fühlt, nur
wenn man Ergebnisse und Resultate in ein Forum stellt. Ich hatte ja
gesachrieben, dass ich die Idee und das Design des Tools für Klasse
halte, - nur es halt bei mir nicht zufriedenstellend läuft!

zur Erklärung des 'Stündchens': ich sitze hier bei einer Installation vor
Ort bei einem Kunden - und ich habe mir das Tool angesehen und
ausprobiert, weil mich ein Kollege darauf hingewiesen hat und ich es
gut fand.
Und in einem 'Stündchen' kannst Du mir -glaube ich als nicht gerade
Xbase Anfänger- schon zutrauen, eine mit dem Designer vordefinierte
Grafik übergeben als String auf ein Dialogfenster zu basteln, diesen Dialog
in einem Thread zu starten und das dann dreimal hintereinander zu
machen, um zu sehen wie es sich verhält.
Wie gesagt:Die ID war eindeutig, im Thread nichts weiter los als
XbpDialog und da drauf dann die Grafik.
Ich teste sowas immer zuallererst in mehrmals geöffneten Threads,
da meine gesamte Applikation so designed ist! Bearbeitungsdialoge und
Auswertungen können aus nem Menü beliebig oft geöffnet werden..
alles ist komplett gekapselt, die Variablen alle schön lokal...

Ich nehme an Dein Tool (wenn ich mir erlauben darf sowas zu vermuten..)
hat bei Multithreading Anwendung ein Problem mit dem internen Puffer
und den Zeigern auf die Variablen und .... aber da bist Du ja der Fachmann und ich habe keine Ahnung..
Wenn jemand möchte, lege ich gern den Beispielcode hier ins Forum!

Und: Ich entschuldige mich in aller Form für meine etwas 'lockere'
Ausdrucksweise und falls ich Dich in Deiner Programmierer-Ehre gekränkt
haben sollte.
Ich sage Dir eindeutig, daß ich Deine Arbeit respektiere - so wie ich jeden
respektiere.. - und daher verspreche ich heute nochmal drei Stunden
drüber zu gehen, wenn ich im Zug sitze!

LG
Bernd Reinhardt
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 159
Registriert: So, 16. Apr 2006 11:12
Wohnort: Öhringen

RMChar

Beitrag von Bernd Reinhardt »

Hallo.
Danke das Ihr mich auf RMChart gebracht habt.
Habe das ganze mal kurz mit xBase++ (man beachte das ++)1.9 RC_2
versucht. Hat auf Anhieb mal gut geklappt. Man benötigt nur die ocx. Den Designer habe ich nicht verwendet. Auch keine csv-Datei.
Die Tortengrafik sieht schon mal gut aus.
Ich habe das Beispiel acrobat von den samples abgeändert.
Die rmchart.ch habe ich mir von dem c-Beispiel von rmchart gemacht.
Alles gelöscht was c-spezifsch ausgesehen hat.
Bernd

Code: Alles auswählen

#include "XBP.CH"
#include "AppEvent.CH"
#include "rmchart.ch"

// Include the Automation Support Library
#PRAGMA LIBRARY( "ASCOM10.LIB" )
#define CRLF   Chr(13) + Chr(10)

******************************************************************************
* Application's Main() Procedure
******************************************************************************
PROCEDURE Main()

 LOCAL oForm
 LOCAL oControl
 LOCAL nEvent
 LOCAL bOldError
 LOCAL mp1 := NIL, mp2 := NIL, oXbp := NIL
 Local obutton, oButton1

   oForm := XbpDialog():new( AppDesktop() )
   oForm:taskList := .T.
   oForm:title    := "Kalender"
   oForm:drawingArea:clipChildren := .T.
   oForm:create( ,,{100,100}, {640,480},, .F. )
   oForm:show()
   oArea := oForm:drawingArea
      
   oControl := XbpActiveXControl():new( oForm:drawingArea )
   oControl:CLSID := "rmchart.rmchartx"

   bOldError := ErrorBlock( {|e| Break(e)} )
   BEGIN SEQUENCE
      oControl:create(,, {10,60},{610,370} )
   RECOVER USING oError
      MsgBox( "Error creating ActiveX control. Please make sure" + CRLF +;
              "MsChart is installed on your computer.",           ;
              "MSChart" )
      oForm:destroy()
      return .f.
   END SEQUENCE
   ErrorBlock( bOldError )
   
   oControl:AddRegion()
   oControl:Region(1):AddCaption()
   oControl:Region(1):Caption:SetProperties("Mein Titel")
   oControl:Region(1):AddGridlessSeries()
   oControl:Region(1):GridLessSeries:SeriesStyle := RMC_PIE_3D 
   oControl:Region(1):GridLessSeries:DataString := "20*12*10*20*30*40"    
  
   SetAppWindow( oControl )
   SetAppFocus( oControl )
   oControl:draw()
   
    DO WHILE nEvent != xbeP_Close 
      nEvent := AppEvent( @mp1, @mp2, @oXbp )
      oXbp:handleEvent( nEvent, mp1, mp2 )
   ENDDO
   oForm:destroy()
RETURN
/* ********************************* end of file  ************************************** */
Bernd Reinhardt
fa.reinhardt@gmx.de
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16502
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: RMChar

Beitrag von Martin Altmann »

Hallo Bernd,
Bernd Reinhardt hat geschrieben:Habe das ganze mal kurz mit xBase++ (man beachte das ++)
fein! :D - naja, fast! Es heißt Xbase++ und nicht xBase++ :wink:
Aber vielen Dank für Deine Bestätigung bezüglich RMChart. Es wurde auch bereits in einer der Alaska Newsgroups darauf hingewiesen, dass mit der neuen 1.9.328 vieles bezüglich OCX noch besser/einfacher/fehlerfreier gehen soll.

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

Beitrag von brandelh »

Hallo,

nur zur Klarstellung:

gethwnd() wird zwar nur bei XbpWindow angegeben und XbpCrt ist davon nicht abgeleitet, aber beide Aufrufe funktionieren, somit ist auch im Hybridmodus (XbpCRT gelinkt mit /PM:PM) die Ermittlung eines Fensthandles möglich. Weiter bin ich aber beim Experimentieren noch nicht :wink:

XbpWindow:gethwnd() - wie im Handbuch
XbpCrt:gethwnd() - gibt Handle zurück, keine Fehlermeldung

SetAppWindow():gethwnd() ist für die Abfrage meist am besten.
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo,

wenn man die Grafik nur zum speichern braucht und den hinteren Parameter richtig setzt, kann man irgendeine Zahl # 0 als Windowhandle angeben.

PS: ich übersetze gerade die PowerBasic Include Datei nach Xbase++ Syntax, falls da jemand Interesse hat, einfach melden (dauert aber noch ein paar Tage, wegen der TYPE Anweisung habe ich auch noch keine Idee).
Gruß
Hubert
Michael Rudrich
UDF-Programmierer
UDF-Programmierer
Beiträge: 94
Registriert: Do, 22. Dez 2005 16:37

RMChart und Xbase 1.9

Beitrag von Michael Rudrich »

Hallo Zusammen!
Wollte an anderer Stelle vorhin schon mal antworten, hat aber nicht
funktioniert.. ;o)

Gleich mal das Gute vorweg: Ich habe soeben meine erste RMChart
Grafik 'from Scratch' -also ohne loadfile, sondern nur mit den Funktionen von Rainer - mit ActiveX erstellt und es hat prima funktioniert!

Vorher hatt ich viel Zeit investiert und mit großer Unterstützung durch
Rainer Morgen versucht, über geWrappte DLL-Calls das Gleiche zu
erreichen. Das ging schief, da es an der Übergabe der Doubles scheitert.
rainer erwartet 8-Byte große sog. Doubles, wir können 4-Byte Floats
erstellen.
Rainer war dann so nett und hat zwei,drei Funktionen so angepasst, dass
sie mit Floats versorgt werden konnten - und es hat funktioniert!
Weiter Probleme gab es, da Xbase keine Arrays an DLLs übergeben
kann! Da aber in C ein Array als nichts Anderes als ein 'contigous stream of memory' gesehen wird,
hab ich mir einfach einen String gebastelt, der Numerics in seine binären Zeichenketten umwandelt und dann klappte es!

Damit das aber wie gesagt sauber funzen könnte, müßte Rainer alle seine
Funktionen umändern in 4-Byte große Float Parameter. Das würde er
netterweise auch tun, war aber zuletzt unter starkem Zeitdruck.

Das ist aber nicht mehr nötig, denn über den ActiveX Weg scheint das
Problem nicht mehr zu existieren bzs. von der Automation abgefangen
zu werden.

Klasse - denn jetzt können wir ein starkes Tool endlich voll nutzen!
Ich teste noch ein wenig rum, und dann gibts den kompletten Code
bei genügend Interesse hier in diesem Forum!
Hab das auch gleich mit eXPress++ probiert, ging auch ohne Probleme!

@Rolf: Die 'Unstimmigkeiten' zwischen Rainer und mir sind völlig ausgeräumt!
Ich war etwas stinkig weil es nicht so funktioniert hatte wie ich wollte und er
hat es in dern falschen Hals gekriegt! Ich habe mich bei ihm dann entschuldigt und
die Sache war erledigt! Er hat mich auf meinen Gehversuchen per DLL-Call sehr unterstützt,
weil ihm auch sehr viel daran liegt, dass die Xbase'ler sein tolles Werkzeug nutzen können!

Also: falls Interesse gibts den Code hier exclusiv!

Viele Grüße

Michl
(Michael Rudrich)
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16502
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Michl,
wunderbar :!: :thumbright: :notworthy:
Ich wäre sehr interessiert, da ich gerade einen Webserver ein wenig "aufhübschen" will! Wenn das klappt und ich mit RMChart() Charts (Balken- und Kreisdiagramme) direkt in GIF-Datei schreiben kann, dann wäre das wirklich super!!
Und sehr gut zu hören, dass Du und Rainer einander noch/wieder riechen könnt - da es hier in dem Thread sehr ruhig war, hatte ich da schon meine Befürchtungen...

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.
Michael Rudrich
UDF-Programmierer
UDF-Programmierer
Beiträge: 94
Registriert: Do, 22. Dez 2005 16:37

Code

Beitrag von Michael Rudrich »

Hi Martin...

Okay...

Habe fertig - weil soooo einfach und echt geil!
Kompliment an Steffen in Sachen ActiveX - denn da haben sie wirklich
gute Arbeit gemacht!

Wie krieg ich denn den Code hier rein?? Attachments irgendwo??
Oder einfach pasten?

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

RMChart und Xbase 1.9 Sample Code

Beitrag von Michael Rudrich »

Okay... also gepastet ;o))

Viel Spaß damit!

Ich habe mir eine INCLUDE mit allen nötigen Defines gebastelt und
sie RMCHART.CH genannt!
Zunächst die:
// RMCHART Defines
// by M.Rudrich, 05/2006

// Farben
#define AliceBlue -984833
#define AntiqueWhite -332841
#define Aquamarine -8388652
#define ArmyGreen -10053274
#define AutumnOrange -39373
#define AvocadoGreen -10053325
#define Azure -983041
#define BabyBlue -10053121
#define BananaYellow -3355597
#define Beige -657956
#define Bisque -6972
#define Black -16777216
#define BlanchedAlmond -5171
#define Blue -16776961
#define BlueViolet -7722014
#define Brown -5952982
#define BurlyWood -2180985
#define CadetBlue -10510688
#define Chalk -103
#define Chartreuse -8388864
#define Chocolate -2987746
#define Coral -32944
#define CornflowerBlue -10185235
#define Cornsilk -1828
#define Crimson -2354116
#define Cyan -16711681
#define DarkBlue -16777077
#define DarkBrown -10079437
#define DarkCrimson -6737050
#define DarkCyan -16741493
#define DarkGold -3368653
#define DarkGoldenrod -4684277
#define DarkGray -5658199
#define DarkGreen -16751616
#define DarkKhaki -4343957
#define DarkMagenta -7667573
#define DarkOliveGreen -11179217
#define DarkOrange -29696
#define DarkOrchid -6737204
#define DarkRed -7667712
#define DarkSalmon -1468806
#define DarkSeaGreen -7357301
#define DarkSlateBlue -12042869
#define DarkSlateGray -13676721
#define DarkTurquoise -16724271
#define DarkViolet -7077677
#define DeepAzure -10079233
#define DeepPink -60269
#define DeepPurple -13434778
#define DeepRiver -10092340
#define DeepRose -3394663
#define DeepSkyBlue -16728065
#define DeepYellow -13312
#define Default 0
#define DesertBlue -13408615
#define DimGray -9868951
#define DodgerBlue -14774017
#define DullGreen -6697882
#define EasterPurple -3368449
#define FadeGreen -6697831
#define Firebrick -5103070
#define FloralWhite -1296
#define ForestGreen -14513374
#define Gainsboro -2302756
#define GhostWhite -460545
#define GhostGreen -3342388
#define Gold -10496
#define Goldenrod -2448096
#define Grape -10079335
#define GrassGreen -16737997
#define Gray -8355712
#define Green -16744448
#define GreenYellow -5374161
#define Honeydew -983056
#define HotPink -38476
#define IndianRed -3318692
#define Indigo -11861886
#define Ivory -16
#define Khaki -989556
#define KentuckyGreen -13395610
#define Lavender -1644806
#define LavenderBlush -3851
#define LawnGreen -8586240
#define LemonChiffon -1331
#define LightBlue -5383962
#define LightCoral -1015680
#define LightCyan -2031617
#define LightGoldenrod -1122942
#define LightGoldenrodYellow -329006
#define LightGray -2894893
#define LightGreen -7278960
#define LightOrange -26317
#define LightPink -18751
#define LightSalmon -24454
#define LightSeaGreen -14634326
#define LightSkyBlue -7876870
#define LightSlateGray -8943463
#define LightSteelBlue -5192482
#define LightViolet -26113
#define LightYellow -32
#define Lime -16711936
#define LimeGreen -13447886
#define Linen -331546
#define Magenta -65281
#define Maroon -8388608
#define MartianGreen -6697933
#define MediumAquamarine -10039894
#define MediumBlue -16777011
#define MediumOrchid -4565549
#define MediumPurple -7114533
#define MediumSeaGreen -12799119
#define MediumSlateBlue -8689426
#define MediumSpringGreen -16713062
#define MediumTurquoise -12004916
#define MediumVioletRed -3730043
#define MidnightBlue -15132304
#define MintCream -655366
#define MistyRose -6943
#define Moccasin -6987
#define MoonGreen -3342490
#define MossGreen -13408666
#define NavajoWhite -8531
#define Navy -16777088
#define OceanGreen -10053223
#define OldLace -133658
#define Olive -8355840
#define OliveDrab -9728477
#define Orange -23296
#define OrangeRed -47872
#define Orchid -2461482
#define PaleGoldenrod -1120086
#define PaleGreen -6751336
#define PaleTurquoise -5247250
#define PaleVioletRed -2396013
#define PaleYellow -52
#define PapayaWhip -4139
#define PeachPuff -9543
#define Peru -3308225
#define Pink -16181
#define Plum -2252579
#define PowderBlue -5185306
#define Purple -8388480
#define Red -65536
#define RosyBrown -4419697
#define RoyalBlue -12490271
#define SaddleBrown -7650029
#define Salmon -360334
#define Sand -13159
#define SandyBrown -744352
#define SeaGreen -13726889
#define SeaShell -2578
#define Sienna -6270419
#define Silver -4144960
#define SkyBlue -7876885
#define SlateBlue -9807155
#define SlateGray -9404272
#define Snow -1286
#define SpringGreen -16711809
#define SteelBlue -12156236
#define Tan -2968436
#define Teal -16744320
#define Thistle -2572328
#define Tomato -40121
#define Transparent -2
#define TropicalPink -39322
#define Turquoise -12525360
#define Violet -1146130
#define VioletRed -3137392
#define Walnut -10079488
#define Wheat -663885
#define White -1
#define WhiteSmoke -657931
#define Yellow -256
#define YellowGreen -6632142

// CtrlStyle
#define RMC_CTRLSTYLEFLAT 0
#define RMC_CTRLSTYLEFLATSHADOW 1
#define RMC_CTRLSTYLE3D 2
#define RMC_CTRLSTYLE3DLIGHT 3
#define RMC_CTRLSTYLEIMAGE 4
#define RMC_CTRLSTYLEIMAGETILED 5

// BarSeriesType
#define RMC_BARSINGLE 1
#define RMC_BARGROUP 2
#define RMC_BARSTACKED 3
#define RMC_BARSTACKED100 4
#define RMC_FLOATINGBAR 5
#define RMC_FLOATINGBARGROUP 6

// LineSeriesType
#define RMC_DEFAULT 0
#define RMC_LINE 21
#define RMC_AREA 22
#define RMC_LINE_INDEXED 23
#define RMC_AREA_INDEXED 24
#define RMC_AREA_STACKED 25
#define RMC_AREA_STACKED100 26

// CTypes
#define RMC_VOLBAR 31
#define RMC_HIGHLOW 41
#define RMC_GRIDLESS 51
#define RMC_CUSTOMLINE 60
#define RMC_XYCHART 70
#define RMC_GRIDBASED 10

// BarSeriesStyle
#define RMC_BAR_FLAT 1
#define RMC_BAR_FLAT_GRADIENT1 2
#define RMC_BAR_FLAT_GRADIENT2 3
#define RMC_BAR_HOVER 4
#define RMC_COLUMN_FLAT 5
#define RMC_BAR_3D 6
#define RMC_BAR_3D_GRADIENT 7
#define RMC_COLUMN_3D 8
#define RMC_COLUMN_3D_GRADIENT 9
#define RMC_COLUMN_FLUTED 10

// LineSeriesStyle
#define RMC_LINE_FLAT 21
#define RMC_LINE_FLAT_DOT 19
#define RMC_LINE_FLAT_DASH 18
#define RMC_LINE_FLAT_DASHDOT 17
#define RMC_LINE_FLAT_DASHDOTDOT 16
#define RMC_LINE_CABLE 22
#define RMC_LINE_3D 23
#define RMC_LINE_3D_GRADIENT 24
#define RMC_AREA_FLAT 25
#define RMC_AREA_FLAT_GRADIENT_V 26
#define RMC_AREA_FLAT_GRADIENT_H 27
#define RMC_AREA_FLAT_GRADIENT_C 28
#define RMC_AREA_3D 29
#define RMC_AREA_3D_GRADIENT_V 30
#define RMC_AREA_3D_GRADIENT_H 31
#define RMC_AREA_3D_GRADIENT_C 32
#define RMC_LINE_CABLE_SHADOW 34
#define RMC_LINE_SYMBOLONLY 35

// SeriesLineStyles
#define RMC_LSTYLE_LINE 1
#define RMC_LSTYLE_SPLINE 2
#define RMC_LSTYLE_STAIR 3
#define RMC_LSTYLE_LINE_AREA 4
#define RMC_LSTYLE_SPLINE_AREA 5
#define RMC_LSTYLE_STAIR_AREA 6

// SeriesSymbolStyles
#define RMC_SYMBOL_NONE 0
#define RMC_SYMBOL_BULLET 21
#define RMC_SYMBOL_ROUND 1
#define RMC_SYMBOL_DIAMOND 2
#define RMC_SYMBOL_SQUARE 3
#define RMC_SYMBOL_STAR 4
#define RMC_SYMBOL_ARROW_DOWN 5
#define RMC_SYMBOL_ARROW_UP 6
#define RMC_SYMBOL_POINT 7
#define RMC_SYMBOL_CIRCLE 8
#define RMC_SYMBOL_RECTANGLE 9
#define RMC_SYMBOL_CROSS 10
#define RMC_SYMBOL_BULLET_SMALL 22
#define RMC_SYMBOL_ROUND_SMALL 11
#define RMC_SYMBOL_DIAMOND_SMALL 12
#define RMC_SYMBOL_SQUARE_SMALL 13
#define RMC_SYMBOL_STAR_SMALL 14
#define RMC_SYMBOL_ARROW_DOWN_SMALL 15
#define RMC_SYMBOL_ARROW_UP_SMALL 16
#define RMC_SYMBOL_POINT_SMALL 17
#define RMC_SYMBOL_CIRCLE_SMALL 18
#define RMC_SYMBOL_RECTANGLE_SMALL 19
#define RMC_SYMBOL_CROSS_SMALL 20

// HighLowSeriesStyle
#define RMC_OHLC 1
#define RMC_CANDLESTICK 2
#define RMC_VOLUMEBAR 31

// GridlessSeriesStyle
#define RMC_PIE_FLAT 51
#define RMC_PIE_GRADIENT 52
#define RMC_PIE_3D 53
#define RMC_PIE_3D_GRADIENT 54
#define RMC_DONUT_FLAT 55
#define RMC_DONUT_GRADIENT 56
#define RMC_DONUT_3D 57
#define RMC_DONUT_3D_GRADIENT 58
#define RMC_PYRAMIDE 59
#define RMC_PYRAMIDE3 60

// PieDonutAlignment
#define RMC_FULL 1
#define RMC_HALF_TOP 2
#define RMC_HALF_RIGHT 3
#define RMC_HALF_BOTTOM 4
#define RMC_HALF_LEFT 5

// ExplodeMode
#define RMC_EXPLODE_NONE 0
#define RMC_EXPLODE_SMALLEST -1
#define RMC_EXPLODE_BIGGEST -2

// XYSeriesStyle
#define RMC_XY_LINE 70
#define RMC_XY_LINE_DOT 69
#define RMC_XY_LINE_DASH 68
#define RMC_XY_LINE_DASHDOT 67
#define RMC_XY_LINE_DASHDOTDOT 66
#define RMC_XY_SYMBOL 71
#define RMC_XY_CABLE 73

// Hatchmodes
#define RMC_HATCHBRUSH_OFF 0
#define RMC_HATCHBRUSH_ON 1
#define RMC_HATCHBRUSH_ONPRINTING 2

// DAxisAlignment
#define RMC_DATAAXISLEFT 1
#define RMC_DATAAXISRIGHT 2
#define RMC_DATAAXISTOP 3
#define RMC_DATAAXISBOTTOM 4

// LAxisAlignment
#define RMC_LABELAXISLEFT 5
#define RMC_LABELAXISRIGHT 6
#define RMC_LABELAXISTOP 7
#define RMC_LABELAXISBOTTOM 8

// XAxisAlignment
#define RMC_XAXISBOTTOM 12
#define RMC_XAXISTOP 11

// YAxisAlignment
#define RMC_YAXISLEFT 9
#define RMC_YAXISRIGHT 10

// AxisLineStyle
#define RMC_LINESTYLESOLID 0
#define RMC_LINESTYLEDASH 1
#define RMC_LINESTYLEDOT 2
#define RMC_LINESTYLEDASHDOT 3
#define RMC_LINESTYLENONE 6

// TextAlignment
#define RMC_TEXTCENTER 0
#define RMC_TEXTLEFT 1
#define RMC_TEXTRIGHT 2
#define RMC_TEXTDOWNWARD 3
#define RMC_TEXTUPWARD 4

// LegendAlignment
#define RMC_LEGEND_NONE -1
#define RMC_LEGEND_TOP 1
#define RMC_LEGEND_LEFT 2
#define RMC_LEGEND_RIGHT 3
#define RMC_LEGEND_BOTTOM 4
#define RMC_LEGEND_UL 5
#define RMC_LEGEND_UR 6
#define RMC_LEGEND_LL 7
#define RMC_LEGEND_LR 8
#define RMC_LEGEND_ONVLABELS 9
#define RMC_LEGEND_CUSTOM_TOP 11
#define RMC_LEGEND_CUSTOM_LEFT 12
#define RMC_LEGEND_CUSTOM_RIGHT 13
#define RMC_LEGEND_CUSTOM_BOTTOM 14
#define RMC_LEGEND_CUSTOM_UL 15
#define RMC_LEGEND_CUSTOM_UR 16
#define RMC_LEGEND_CUSTOM_LL 17
#define RMC_LEGEND_CUSTOM_LR 18
#define RMC_LEGEND_CUSTOM_CENTER 19
#define RMC_LEGEND_CUSTOM_CR 20
#define RMC_LEGEND_CUSTOM_CL 21

// LegendStyle
#define RMC_LEGENDNORECT 1
#define RMC_LEGENDRECT 2
#define RMC_LEGENDRECTSHADOW 3
#define RMC_LEGENDROUNDRECT 4
#define RMC_LEGENDROUNDRECTSHADOW 5

// ValueLabels
#define RMC_VLABEL_NONE 0
#define RMC_VLABEL_DEFAULT 1
#define RMC_VLABEL_PERCENT 5
#define RMC_VLABEL_ABSOLUTE 6
#define RMC_VLABEL_TWIN 7
#define RMC_VLABEL_LEGENDONLY 8
#define RMC_VLABEL_DEFAULT_NOZERO 11
#define RMC_VLABEL_PERCENT_NOZERO 15
#define RMC_VLABEL_ABSOLUTE_NOZERO 16
#define RMC_VLABEL_TWIN_NOZERO 17

// GridBicolorMode
#define RMC_BICOLOR_NONE 0
#define RMC_BICOLOR_DATAAXIS 1
#define RMC_BICOLOR_LABELAXIS 2
#define RMC_BICOLOR_BOTH 3

// RMCError
#define RMC_ERROR_MAXINST -1
#define RMC_ERROR_MAXREGION -2
#define RMC_ERROR_MAXSERIES -3
#define RMC_ERROR_ALLOC -4
#define RMC_ERROR_NODATA -5
#define RMC_ERROR_CTRLID -6
#define RMC_ERROR_SERIESINDEX -7
#define RMC_ERROR_CREATEBITMAP -8
#define RMC_ERROR_WRONGREGION -9
#define RMC_ERROR_PARENTHANDLE -10
#define RMC_ERROR_CREATEWINDOW -11
#define RMC_ERROR_INIGDIP -12
#define RMC_ERROR_PRINT -13
#define RMC_ERROR_NOGDIP -14
#define RMC_ERROR_RMCFILE -15
#define RMC_ERROR_FILEFOUND -16
#define RMC_ERROR_READLINES -17
#define RMC_ERROR_XYAXIS -18
#define RMC_ERROR_LEGENDTEXT -19
#define RMC_ERROR_EMF -20
#define RMC_ERROR_NODATA_COUNT -21
#define RMC_ERROR_NODATA_ZERO -22
#define RMC_ERROR_NOCOLOR -23
#define RMC_ERROR_CLIPBOARD -24
#define RMC_ERROR_CBINFO -25
#define RMC_ERROR_FILECREATE -26
#define RMC_ERROR_MAXCUSTOM -27
#define RMC_ERROR_DATAINDEX -28
#define RMC_ERROR_AXISALIGNMENT -29
#define RMC_ERROR_ARRAYDIM -90
#define RMC_ERROR_LEGENDSIZE 1

// RMCFileType
#define RMC_EMF 1
#define RMC_EMFPLUS 2
#define RMC_BMP 3

// RMC_CreateMode
#define CreateIt 0
#define ResetIt 1

// ReturnType
#define RetDouble 0
#define RetLong 1
#define RetString 2










Dann das eigentliche Progamm:
#include "Gra.ch"
#include "Xbp.ch"
#include "Appevent.ch"
#include "Font.ch"
#include "THREAD.CH"
#INCLUDE "rmchart.CH"

// Include the Automation Support Library
#PRAGMA LIBRARY( "ASCOM10.LIB" )
#define CRLF Chr(13) + Chr(10)

* ----------
procedure appsys
RETURN

* ----------

******************************************************************************
* Main()-Prozedur der Anwendung
******************************************************************************
PROCEDURE Main()

LOCAL oForm
LOCAL oControl
LOCAL nEvent
LOCAL bOldError
LOCAL mp1 := NIL, mp2 := NIL, oXbp := NIL

/*
** Erzeugen des Hauptfensters der Anwendung.
** Beachten Sie, daá die Instanzvariable
** ":clipChildren" auf .T. (wahr) gesetzt
** wird, um zu verhindern, dass der Dialog
** Bereiche des ActiveX Controls
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16502
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Michl,
wunderbar - vielen Dank!! Schaue ich mir Anfang der Woche auf jeden Fall mal an!!
Attachments werden wohl gehen, sobald die neue Version des phpBB-Forums verfügbar ist (dauert aber noch ein Weilchen...)

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

Beitrag von brandelh »

Hallo Michl,

ich denke mal, dass die eMail an mich somit erledigt ist :wink: auch ich kann in meinem anderen Thread auf den letzten Beitrag nicht mehr antworten. Er war wohl zu lange :D

Toll, dass es mit ActiveX klappt, ich vermute du hast keine Repaint-Probleme und die Multithreading-Schwierigkeiten wird Alaska wohl in ActiveX ausgeschaltet haben ?

Dennoch werde ich meine Klasse weiterentwickeln, für den Fall dass ActiveX nicht nutzbar ist (CGI-Serverprogramme, 1.82 etc.) Ich denke nicht, dass alles möglich ist (die Strukturfunktionen und die mit den DOUBLE-Parametern werde ich wohl ausklinken), aber das Laden der Daten aus einer Textdatei ist sicher kein Problem für einen 1.82 Anwender.
Gruß
Hubert
Michael Rudrich
UDF-Programmierer
UDF-Programmierer
Beiträge: 94
Registriert: Do, 22. Dez 2005 16:37

Repaint und 1.82

Beitrag von Michael Rudrich »

Hallo Hubert!

Natürlich ist das Weiterentwickeln Deiner Klasse sinnvoll, ActiveX ist nur
ein Weg. Viele Leute verwenden noch 1.82, - sogar bis runter zur 1,7
hab ich letztens gehört.
Das Laden der Textdatei funktioniert einwandfrei ohne Probleme, das
kann ich Dir bestätigen.
Wenn es Dir was helfen würde, kann ich Dir meine Wrapper und mein
Testprogramm für die 1.82 zukommen lassen. Ich hab viel Arbeit da rein
gesteckt - und so hätte sie zumindest ein bißchen einen Sinn gehabt!
;-))

Viele Grüße

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

Nochwas vergessen

Beitrag von Michael Rudrich »

Hi nochmal...

Das mit dem Thread und gePainte check ich noch! Das war mir dann
gestern abend noch zuviel!
Auch werd ich die Demo vielleicht noch ein wenig aufboren und testen!
Ein Sample für Verwendung von eXPress liegt auch vor, falls es jemanden
interessiert!

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

Re: Repaint und 1.82

Beitrag von brandelh »

Michael Rudrich hat geschrieben: Das Laden der Textdatei funktioniert einwandfrei ohne Probleme, das
kann ich Dir bestätigen. Wenn es Dir was helfen würde, kann ich Dir meine Wrapper und mein Testprogramm für die 1.82 zukommen lassen.
Hallo Michael,

das wäre nett und könnte mir Arbeit ersparen. Meine eMail-Adresse hast du ja oder ? Wenn nicht, ist ganz einfach Hubert - dann einen Punkt - Brandel hier kommt das AT Zeichen @ bei GMX.DE :wink:
Gruß
Hubert
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16502
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Michl,
habe gerade Deine Demo mal ausprobiert - klappt wunderbar (nur ein kleiner Tipp: die labels müssen als OEM-Zeichensatz übergeben werden, sonst klappt das mit den Umlauten nicht).
Aber sieht wunderbar aus - werde ich mich in der Woche drüber hermachen und dann auf meinem Webserver einige Grafiken "on the fly" erzeugen und als GIF speichern und anzeigen :D

Vielen Dank und 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.
Michael Rudrich
UDF-Programmierer
UDF-Programmierer
Beiträge: 94
Registriert: Do, 22. Dez 2005 16:37

Weiterentwicklung

Beitrag von Michael Rudrich »

Hallo Martin...
ja, hab ich ebenfalls gemerkt mit den Labels...

Ich habe heute weiter dran gearbeitet, und bin dabei auf ne
Methode gestossen, die ich Euch hier nicht vorenthalten möchte.
Sobald ich sie getestet hab, stell ich eine Demo hier rein.
Nur mal zum Zahn-Langmachen: Das ganze entwickelt sich
nun langsam zu einem Zehnzeiler.. ;o))

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

Beitrag von Martin Altmann »

Hallo Michl,
na da bin ich ja mal gespannt...

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.
Michael Rudrich
UDF-Programmierer
UDF-Programmierer
Beiträge: 94
Registriert: Do, 22. Dez 2005 16:37

Hat geklappt

Beitrag von Michael Rudrich »

Hi ...

Also:
ich bin nun so vorgegangen, dass ich mir ein kleines Programm geschrieben
habe, welches den VBasic-Code den RMChart generiert automatisch in
Xbase++ Syntax umwandelt.
Das Progrämmchen läuft los und wartet, bis RMChart was in den Clipboard
unter Get Source kopiert. Dann nehme ich das was ich von RMChart als
VBasic Code kriege, wandle es in XBase++ Syntax um und schiebe es
wieder in den Clipboard zurück.
Von dort hol ich es mir in meinen Editor und es rennt!
Gar keine dumme Idee, nicht?? ;;-)
Auf diese Weise kann ich mir nun JEDE von RMchart generierte Source
automatisch in Xbase Syntax umwandeln.

[Grübel..] darf gar nicht dran denken, was man damit noch alles anstellen
könnte.. [hihi]

Vorgehensweise nun also: RMC Designer aufrufen, Chart basteln, Code
generieren lassen, in Xbase umwandel - voila!
Geht wirklich klasse..

Das Beispiel, wie man es mit weniger Zeilen machen kann folgt
sogleich...
LG
Michl
Michael Rudrich
UDF-Programmierer
UDF-Programmierer
Beiträge: 94
Registriert: Do, 22. Dez 2005 16:37

Beispiel Nummero Zwei

Beitrag von Michael Rudrich »

Hi..
Hier wie versprochen das ganze über einen anderen Weg mittels
SetProperties() Methoden.
Spart enorm Zeilen (ich lass es mir wie beschrieben sogar automatisch
generieren..)

Bitte das Include aus dem ersten Beispiel wieder verwenden!

Viel Spaß damit!

LG
Michl


#include "Gra.ch"
#include "Xbp.ch"
#include "Appevent.ch"
#include "Font.ch"
#include "THREAD.CH"
#INCLUDE "rmchart.CH"

// Include the Automation Support Library
#PRAGMA LIBRARY( "ASCOM10.LIB" )
#define CRLF Chr(13) + Chr(10)

* ----------
procedure appsys
RETURN

* ----------

******************************************************************************
* Main()-Prozedur der Anwendung
******************************************************************************
PROCEDURE Main()

LOCAL oForm
LOCAL oControl
LOCAL nEvent
LOCAL bOldError
LOCAL mp1 := NIL, mp2 := NIL, oXbp := NIL

/*
** Erzeugen des Hauptfensters der Anwendung.
** Beachten Sie, daá die Instanzvariable
** ":clipChildren" auf .T. (wahr) gesetzt
** wird, um zu verhindern, dass der Dialog
** Bereiche des ActiveX Controls
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16502
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Michel,
vielen Dank! Ich habe es jetzt mal ausprobiert, in meinen Webserver zu integrieren - aber es klappt insofern nicht richtig, da die Anwendung mit gui=yes gelinkt sein muss (und mein Webserver läuft als Dienst, also ohne Fenster!!)
Hast Du eine Idee, wie ich das ändern kann? Ich will ja die Grafiken nicht anzeigen, sondern als Datei erzeugen (das klappt auch, nachdem ich Deine Demo angepasst habe - auch ein Kreisdiagramm habe ich hinbekommen, ohne Probleme), aber das ganze halt ohne Fenster!
Im Moment läuft es halt nur mit einem Fenster (in dem aber nichts ausgegeben wird) - was auch beim Starten als Dienst klappt, aber schöner wäre es sicherlich ohne dem...

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

Beitrag von brandelh »

Hallo Martin,

grundsätzlich muß immer GUI=YES angegeben sein, wenn man irgendetwas wie eine Presentationspace benötigt (egal ob drucken etc.) aber deshalb mußt du noch lange kein Fenster haben !

Code: Alles auswählen

function AppSys()
Return
im Quellcode verhindert das standard XbpCrt()-Fenster, einen XbpDialog brauchst du auch nicht, so reicht es aus einen PS zu erzeugen. Ob das bei ActiveX funktioniert, weiß ich nicht, aber bei meinem Beispiel hier im Forum mit meiner Klasse ist dies genau so vorgesehen - und auch als Beispiel dabei.
Nur habe ich die Übergabe der Werte noch nicht geregelt und man muß eine RMC Datei mit dem RMCDesigner erstellen ...

PS: wer mit GUI=YES linkt, bekommt GUI-Fehlermeldungen durch die Standardfehlerroutine. Also muß man dort alles was nach Meldungen aussieht abschalten. Ich nutze diese für CGI-Programme ... besser in eigener Meldung, wegen der Länge ...
Zuletzt geändert von brandelh am So, 18. Jun 2006 14:24, insgesamt 1-mal geändert.
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

CGI - Fehlerbehandlung:

Beitrag von brandelh »

Code: Alles auswählen

* Keine Wartezustände in den Fehlermeldungen !

//////////////////////////////////////////////////////////////////////
//
//  ERRORSYS.PRG
//
//  Copyright:
//      Alaska Software, (c) 1997-2006. Alle Rechte vorbehalten.
//
//  Inhalt:
//      Standard-Fehlercodeblock installieren
//
//  Bemerkungen:
//      Die Funktion ErrorsSys() wird bei jedem Programmstart automatisch
//      aufgerufen
//
//////////////////////////////////////////////////////////////////////

#include "Xbp.ch"
#include "Error.ch"

#define  DEBUG
***********************************
* Name des Errorlogs ohne Erweiterung
***********************************
#define EHS_ERRORLOG "XPPERROR"

static nErrorStack := 1

/*
 * Sprachspezifische Stringkonstanten die im Code verwendet werden
 */
#define EHS_CANCEL            "Abbrechen"
#define EHS_EXIT_WITH_LOG     "Ende mit LOG-Datei"
#define EHS_RETRY             "Wiederholen"
#define EHS_IGNORE            "Ignorieren"
#define EHS_OS_ERROR          ";Betriebsystem Fehler : "
#define EHS_CALLED_FROM       "Aufgerufen von"
#define EHS_XPP_ERROR_MESSAGE "Xbase++ Fehlermeldung"
#define EHS_ERROR             "Fehler "
#define EHS_WARNING           "Warnung "
#define EHS_DESCRIPTION       ";Beschreibung : "
#define EHS_FILE              ";Datei : "
#define EHS_OPERATION         ";Operation : "
#define EHS_LOG_OPEN_FAILED   "Datei f
Gruß
Hubert
Michael Rudrich
UDF-Programmierer
UDF-Programmierer
Beiträge: 94
Registriert: Do, 22. Dez 2005 16:37

Ohne Fenster

Beitrag von Michael Rudrich »

Hallo Martin!

Das erstellen einer Datei mit meinem Beispiel läuft
völlig ohne Fenster wenn Du willst.
Du musst nur die Zeilen
// fenster der Anwendung.
* oForm:Show()
* SetAppWindow( oForm )
* SetAppFocus( oForm )

* DO WHILE nEvent != xbeP_Quit
* nEvent := AppEvent( @mp1, @mp2, @oXbp )
* oXbp:handleEvent( nEvent, mp1, mp2 )
* ENDDO

so auskommentieren und das :draw() durch :Draw2File() ersetzen!
Dann erzeuge ich eine Datei ohne dass irgendeine Bildschimrausgabe
erfolgt!

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

Beitrag von Martin Altmann »

Hallo Michl,
oh Mann! Ich hatte ein wenig zu viel auskommentiert...
Aber nichtsdestotrotz muss ich noch immer mit /PM:PM linken...
Aber egal, es läuft ja.

Vielen Dank und viele Grüsse,
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.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Martin Altmann hat geschrieben:Aber nichtsdestotrotz muss ich noch immer mit /PM:PM linken...
wie bereits geschrieben, wenn irgendwas im Programm grafische Elemente braucht, ist /PM:PM zwingend !

Das war übrigens nicht immer so. Vor vielen Jahren hatte ich ein Programm im Textmodus, das dennoch den XbpPrinter() aufrufen konnte, bis die nächste Xbase++ Version kam...
Gruß
Hubert
Antworten