Hallo

Welkom, Gast. Alsjeblieft inloggen of registreren.

Recent

494 gasten, 0 leden

Welkom, Gast. Alsjeblieft inloggen of registreren.

28 april 2024, 17:25:58

Login met gebruikersnaam, wachtwoord en sessielengte

Nieuws

Welkom op het vernieuwde NL Computer Forum!

Auteur Topic: MSChart for VB6  (gelezen 22689 keer)

0 leden en 1 gast bekijken dit topic.

Offline jvdpeet †
  • Senior lid
  • ****
  • Berichten: 365
  • Geslacht: Man
MSChart for VB6
« Gepost op: 27 maart 2012, 20:41:02 »
Hallo,
Is er onder U iemand die ervaring heeft met toepassing van MSChart in VB6? Ik heb een lijngrafiek gemaakt en gebruik als labels de datum van het gegevenspunt, maar ik krijg een zwarte balk onder de X-as. De chart heet GrafiekKoersen en de code is in bestand MSChartcode. Beide zijn toegevoegd als attachment.

Offline Peter

  • Sysop
  • *****
  • Berichten: 5.683
  • Geslacht: Man
Re: MSChart for VB6
« Reactie #1 Gepost op: 27 maart 2012, 22:13:14 »
Dag Jan,

Vermoedelijk is de zwarte balk een verzameling streepjes op de horizontale tijdlijn (de X-as met de R nummers).
Door het aantal datawaardes lijkt het een aaneengesloten balk.

Voer deze code eens uit na de code-regel .ChartData = Koersen
'stel aantal scheidingsstreepjes in op de X-as
With chtPlot.Plot.Axis(VtChAxisIdX).CategoryScale
   .Auto = False                     
   .DivisionPerTick = chtPlot.RowCount      'scheidingsstreep tekenen na opgegeven aantal kolommen, in dit geval geen.
End with


Peter

Offline jvdpeet †
  • Senior lid
  • ****
  • Berichten: 365
  • Geslacht: Man
Re: MSChart for VB6
« Reactie #2 Gepost op: 27 maart 2012, 22:47:17 »
Hoi Peter,
Deze code geeft een "Method or data member not found". Is dit mischien code van VB.NET?
Ook zouden volgens mij de R-labels er niet mogen zijn.
 
groetjes,
 
Jan

Offline Peter

  • Sysop
  • *****
  • Berichten: 5.683
  • Geslacht: Man
Re: MSChart for VB6
« Reactie #3 Gepost op: 27 maart 2012, 23:24:19 »
Hoi Jan,

Citaat
Deze code geeft een "Method or data member not found". Is dit mischien code van VB.NET?
Nee, dit is gewoon VB5 code. Dat zou met VB6 ook moeten werken. Dat laatste heb ik niet getest.
Vervang de code die ik eerder gaf door
   with .Plot.Axis(VtChAxisIdX).CategoryScale
      .Auto = False                     
      .DivisionPerTick = chtPlot.RowCount      'scheidingsstreep tekenen na opgegeven aantal kolommen, in dit geval geen.
   End with
Probeer anders de With regel eens zelf in te typen met VB6. Na elke punt of het (-teken zal je een pop-up lijstje zien wat de volgende mogelijkheden zijn.

Citaat
Ook zouden volgens mij de R-labels er niet mogen zijn
Waarom niet? Ik zie in de code die je meegeleverd hebt geen aanwijzing die de R-labels herbenoemen.


Peter
« Laatst bewerkt op: 27 maart 2012, 23:40:12 door Peter »

Offline jvdpeet †
  • Senior lid
  • ****
  • Berichten: 365
  • Geslacht: Man
Re: MSChart for VB6
« Reactie #4 Gepost op: 28 maart 2012, 19:54:50 »
Hoi Peter, 
Op de regel "with .Plot.Axis(VtChAxisIdX).CategoryScale" krijg ik nu de fout  "Invalid or uqualified reference".
Kennelijk hoort de cht van Plot er toch voor.
Wat de R-labels betreft: Deze zouden volgens mij verdwenen moeten zijn omdat ik als X-as labels de datums
heb gebruikt:
 For i = 1 To UBound(Koersen, 1)
    If Left(Datum(i, 1), 4) <> Left(Datum(i - 1, 1), 4) Then
        Koersen(i, 0) = " " & RTrim(CSng(Left(Datum(i, 1), 4)))
    ElseIf Left(Right(Datum(i, 1), 4), 2) <> Left(Right(Datum(i - 1, 1), 4), 2) Then
        Koersen(i, 0) = " " & RTrim(CSng(Left(Right(Datum(i, 1), 4), 2)))
    End If
    Koersen(i, 1) = OpenK(i, 1)
Next i
In kolom 0 staan namelijk de rijlabels.

Offline Peter

  • Sysop
  • *****
  • Berichten: 5.683
  • Geslacht: Man
Re: MSChart for VB6
« Reactie #5 Gepost op: 28 maart 2012, 21:19:23 »
Dag Jan,

Citaat
Op de regel "with .Plot.Axis(VtChAxisIdX).CategoryScale" krijg ik nu de fout  "Invalid or uqualified reference".
Kennelijk hoort de cht van Plot er toch voor.
Net even getest met VB6 en MSChart (c:\windows\system32\mschrt20.ocx = versie 6.0.88.4)
Werkt prima met deze code:
Private Sub Command1_Click()
'verwijder de streepjes op de X-as
With chtPlot.Plot.Axis(VtChAxisIdX).CategoryScale
   .Auto = False
   .DivisionsPerTick = MSChart1.RowCount
End With
End Sub

Citaat
Wat de R-labels betreft: Deze zouden volgens mij verdwenen moeten zijn omdat ik als X-as labels de datums heb gebruikt:
De For..Next lus past niet altijd Koersen(i,0) aan. Ik snap niet helemaal wat de lus doet, er staat geen uitleg bij. Heb er even wat uitleg bij gezet wat ik denk dat het doet:
'doorloop array Koersen()
'pas de datums eventueel aan, die staan in Koersen(x,0) in het formaat "jjjjmmdd"
For i = 1 To UBound(Koersen, 1)
    If Left(Datum(i, 1), 4) <> Left(Datum(i - 1, 1), 4) Then
        'jaarcontrole: als jaar <> vorig jaar dan voeg een start-spatie toe
        Koersen(i, 0) = " " & RTrim(CSng(Left(Datum(i, 1), 4)))
    ElseIf Left(Right(Datum(i, 1), 4), 2) <> Left(Right(Datum(i - 1, 1), 4), 2) Then
        'maand en dag controle: als datum <> vorige datum dan voeg een start-spatie toe aan de maandnummer?
        Koersen(i, 0) = " " & RTrim(CSng(Left(Right(Datum(i, 1), 4), 2)))
    End If
    Koersen(i, 1) = OpenK(i, 1)
Next i

In je screenshot staan toch nog een heleboel R-labels, wat aangeeft dat die niet ingevuld worden middels de opdracht .ChartData = Koersen.

Probeer de code die ik gaf om het 'zwarte balk' probleem op te lossen. Dan worden de labels zichtbaar en zien we wat er werkelijk staat.

Kun je deze regel eens uitleggen:
Koersen(i, 0) = " " & RTrim(CSng(Left(Right(Datum(i, 1), 4), 2)))


Peter
« Laatst bewerkt op: 28 maart 2012, 21:33:11 door Peter »

Offline jvdpeet †
  • Senior lid
  • ****
  • Berichten: 365
  • Geslacht: Man
Re: MSChart for VB6
« Reactie #6 Gepost op: 29 maart 2012, 16:36:54 »
Hoi Peter,
In kolom 0 van array Koersen zet ik de Datum uit het  koersenbestand, dit is een tekstbestand. Deze is (datum vandaag) in het formaat 20120329. Om er zeker van te zijn dat deze datum als tekst wordt opgevat en niet als een getal, heb ik de datum vooraf laten gaan van een spatie. Ik wil alleen een X-as (= rij-) label afdrukken als deze verandert. Hierbij druk ik het jaar af als het jaar verandert en de maand als de maand verandert. Dit om te voorkomen dat dat het onleesbaar wordt.
Ik ga ervan uit als ik een X-as label toevoeg het R-label automatisch verdwijnt. Door de asposities steds minimaal 1 maand uit elkaar liggen, zou de balk dus ook moeten verdwijnen.
Het R-label wordt dus overschreven door ofwel de maand of het jaar of door spaties.
Hopelijk is het zo duidelijker.
 
 
m.vr.gr.,
 
Jan

Offline Peter

  • Sysop
  • *****
  • Berichten: 5.683
  • Geslacht: Man
Re: MSChart for VB6
« Reactie #7 Gepost op: 29 maart 2012, 21:56:11 »
Hoi Jan,

Je For...Next lus is m.i. niet goed.
Op de 1e plaats begint de array koersen met element 0. Die wordt in de for..next lus niet bewerkt maar wordt wel in de grafiek geplaatst.
Op de 2e plaats mis ik een Else instructie indien aan beide voorwaarden niet voldoen wordt. Daardoor blijft de variabele Koersen(i, 0) een string van 8 tekens behouden.

Probeer eens deze code:
For i = 1 To UBound(koersen, 1)
   If Left(Datum(i, 1), 4) <> Left(Datum(i - 1, 1), 4) Then
      'labeltekst: pas jaartal aan
      koersen(i, 0) = " " & RTrim(CSng(Left(Datum(i, 1), 4)))
   ElseIf Left(Right(Datum(i, 1), 4), 2) <> Left(Right(Datum(i - 1, 1), 4), 2) Then
      'labaltekst: pas maandnummer aan
      koersen(i, 0) = " " & RTrim(CSng(Left(Right(Datum(i, 1), 4), 2)))
   Else
      'labeltekst: wissen
      koersen(i, 0) = " "
   End If
Next i

Als de zwarte balk nog steeds verschijnt plaats dan deze code-regel na de regel .ChartData = Koersen zodat we kunnen zien hoe groot de array is:
MsgBox "Koersen(" & UBound(koersen, 1) & "," & UBound(koersen, 2) & ")"
Geef de tekst die de messagebox toont.


Peter



Offline jvdpeet †
  • Senior lid
  • ****
  • Berichten: 365
  • Geslacht: Man
Re: MSChart for VB6
« Reactie #8 Gepost op: 30 maart 2012, 16:31:21 »
Hoi Peter,
Er is iets geks gebeurd met mijn code. Ik krijg nu plotseling een fout op With .chtPlot, nl. invalid or  unqualified reference.
Zet ik hier de naam van het form waar chtPlot op staat voor, dan krijg ik geen fout. Wat kan hier onbedoeld veranderd zijn?
Tevens begrijp ik een regel van je eerdere code niet: .DivisionPerTick is geen eigenschap van chtPlot (= MSChart).

Offline jvdpeet †
  • Senior lid
  • ****
  • Berichten: 365
  • Geslacht: Man
Re: MSChart for VB6
« Reactie #9 Gepost op: 30 maart 2012, 16:48:33 »
Hoi Peter,
Ik heb kennelijk een black-out gehad en twee dingen door elkaar gegooid. With .chtPlot moet natuurlijk With chtPlot zijn.
De vraag over DivisionPerTick blijft. Is dat misschien uit een andere grafiek component?

Offline Peter

  • Sysop
  • *****
  • Berichten: 5.683
  • Geslacht: Man
Re: MSChart for VB6
« Reactie #10 Gepost op: 30 maart 2012, 21:48:20 »
Hoi Jan,

Citaat
With .chtPlot moet natuurlijk With chtPlot zijn.
Je maakt het jezelf moeilijk. De naam chtPlot is verwarrend en zegt mij op het eerste gezicht niets. Een component moet je duidelijk benoemen. In dit geval heeft chtPlot ook nog een sub object .Plot.
Verander daarom chtPlot in bijvoorbeeld mscGrafiek (msc is de standaard afkorting voor MSChart.)

Citaat
De vraag over DivisionPerTick blijft. Is dat misschien uit een andere grafiek component?
Nee, in een eerder bericht gaf ik het versienummer van het MSChart component hier. Komt dat overeen met de jouwe?
Het component wordt in de VB IDE aangeduidt als "Microsoft Chart Control 6.0 (SP4) (OLEDB)".

Geef ook eens antwoord op de vraag:
Citaat
Als de zwarte balk nog steeds verschijnt plaats dan deze code-regel na de regel .ChartData = Koersen zodat we kunnen zien hoe groot de array is:
Code: MsgBox "Koersen(" & UBound(koersen, 1) & "," & UBound(koersen, 2) & ")"
Geef de tekst die de messagebox toont.
Zonder duidelijke antwoorden blijft het gissen...

Peter

Offline jvdpeet †
  • Senior lid
  • ****
  • Berichten: 365
  • Geslacht: Man
Re: MSChart for VB6
« Reactie #11 Gepost op: 31 maart 2012, 13:18:47 »
Peter,
Ik heb "Microsoft Chart Control 6.0 (SP6) (OLEDB)" i.p.v. "Microsoft Chart Control 6.0 (SP4) (OLEDB)".
De messagebox geeft als tekst "Koersen(6343, 1)".
 
 
Jan

Offline Peter

  • Sysop
  • *****
  • Berichten: 5.683
  • Geslacht: Man
Re: MSChart for VB6
« Reactie #12 Gepost op: 31 maart 2012, 14:21:05 »
Hoi Jan,

Mag ik de datum en versienummer van het bestand c:\windows\system32\mschrt20.ocx even zien.

Citaat
De messagebox geeft als tekst "Koersen(6343, 1)".
Ok, even wat rekenen:
Je gaat dus 6344 punten in de grafiek zetten. Stel dat je beeldscherm resolutie 1024 x 800 pixels is en dat het grafiek component de volledige schermbreedte gebruikt. Ik tel er dan nog pakweg 200 pixels vanaf voor de Y-as informatie, dan blijven er 824 pixels over voor de datapunten in de grafiek.
Je grafiek toont dus 6344/(1024-200) = ±7.7 datapunten per pixel !!!
Dat is dus onzinnig en verklaart ook de zwarte balk.

Kun je deze code wel gebruiken om de scheidingstreepjes op de X-as uit te schakelen?
mscGrafiek.Plot.Axis(VtChAxisIdX).Tick.Style = VtChAxisTickStyleNone


Peter

Offline jvdpeet †
  • Senior lid
  • ****
  • Berichten: 365
  • Geslacht: Man
Re: MSChart for VB6
« Reactie #13 Gepost op: 31 maart 2012, 14:57:20 »
Peter,
Ja, als ik mscGrafiek vervang door chtPlot. De ticks en labels van de X-as zijn dan weg.
Zou het beter gaan als ik 6344/7,7 =  824 gegevenspunten in de grafiek zet of geeft ook wat meer nog een leesbare X-as?

Jan

Offline Peter

  • Sysop
  • *****
  • Berichten: 5.683
  • Geslacht: Man
Re: MSChart for VB6
« Reactie #14 Gepost op: 31 maart 2012, 15:23:29 »
Hoi Jan,

Citaat
Ja, als ik mscGrafiek vervang door chtPlot. De ticks en labels van de X-as zijn dan weg.
De labels van de X-as zijn ook weg?

Citaat
Zou het beter gaan als ik 6344/7,7 =  824 gegevenspunten in de grafiek zet of geeft ook wat meer nog een leesbare X-as?
[info]Begin eens met 10 datapunten.[/info] Dan heb je een beter overzicht wat er zoals gebeurt. Als dat goed werkt met ticks en labels, kun je opschalen naar 20, 50, 100 en zo verder. Meer datapunten als in grafiek passen heeft geen zin zoals ik eerder opmerkte. Is de array toch groter dan zou je kunnen middelen enof een stapgrootte instellen zodat je ipv datapunt 1,2,3,... datapunt 1,5,9,... gebruikt.


Peter