| |

VB.NET - FortgeschritteneChartControl Skalierung | |  | Autor: Maas | Datum: 12.04.09 17:50 |
| Hallo,
Ich versuche mich gerade an meinem eigenen ChartControl. Bisher habe ich zwei Images. Im unteren wird der komplette Chart gezeichnet. Man kann im unteren Image einen rechteckigen Bereich auswählen. Dieser wird dann im oberen abgebildet. Als Datenbasis dient mir eine DataTable. Die Table wird durch die YahooFinance-API gefüllt. Es gibt von Januar 2000 bis zum jüngsten Handelstag eine Row pro Handelstag. (BASF-Daten)
Ein Bild sagt mehr als tausend Worte:
Jetzt möchte ich eine Skalierung zeichnen, erstmal nur die X-Achse also die Zeit-Werte. Eine statische Skalierung mit daran angepassten Datumswerten wäre kein Problem. Ich möchte es aber genau anders herum. Die Skalierung soll sich "gewissermaßen intelligent" verhalten, also an die Datumswerte im ausgewählten Bereich anpassen. Den Bereich stelle ich intern über Prozentwerte dar(beginX,endX,beginY,endY -> 0 bis 1).
Wenn z.B. der Bereich ein Jahr ist soll er am ersten Handelstag jedes zweiten Monats eine Linie zeichnen (die Funktion an sich soll bloß eine Liste mit Prozentwerten zurückgeben, nichts zeichnen).
Ich habe schon so einiges ausprobiert, aber im Endeffekt hat alles nicht wirklich was gebracht oder war zu Ressourcenfressend.
Hier mal ein Ansatz:
Private Function ScaleDatePercents(ByVal perc1 As Double, ByVal perc2 As _
Double) As Double()
Dim lst As New List(Of Double)
Dim totalDays As Integer = (GetDateAtPercent(perc2) - GetDateAtPercent( _
perc1)).TotalDays
Const month As Double = 30.4375 ' 365,25 / 12
If totalDays <= 1 * month Then
'...
ElseIf totalDays > 1 * month AndAlso totalDays <= 2 * month Then
'...
ElseIf totalDays > 2 * month AndAlso totalDays <= 6 * month Then
'...
ElseIf totalDays > 6 * month AndAlso totalDays <= 10 * month Then
'...
ElseIf totalDays > 10 * month AndAlso totalDays <= 14 * month Then
Dim startIndex As Integer = CInt((table.Rows.Count - 1) * perc1)
Dim endIndex As Integer = CInt((table.Rows.Count - 1) * perc2)
Dim i As Integer = startIndex
Do
i += 1
Loop Until CDate(table.Rows(i)("Date")).Day < CDate(table.Rows(i - _
1)("Date")).Day
Dim p As Double = (i - startIndex) / (endIndex - startIndex) 'der
' erste Handelstag im ersten "angefangenen" Monat als Prozentwert
' des Bereichs
lst.Add(p)
'...
Else
'...
End If
'...
Return lst.ToArray
End Function Hilfsfunktionen:
Private Function GetDateAtPercent(ByVal percent As Double) As Date
Return CDate(table.Rows(CInt((table.Rows.Count - 1) * percent))("Date"))
End Function Imports System.Net
Imports System.Data
Public Function DownloadData() As DataTable
If Not IO.File.Exists(My.Computer.FileSystem.SpecialDirectories.Temp & _
"\Schema.ini") Then
Dim s As String = "[table.csv]" & vbCrLf & "ColNameHeader=TRUE" & _
vbCrLf & "DecimalSymbol=." & vbCrLf & "Format=Delimited(,)"
IO.File.WriteAllText(My.Computer.FileSystem.SpecialDirectories.Temp _
& "\Schema.ini", s)
End If
Dim wc As New WebClient
Dim url As String = _
"http://ichart.yahoo.com/table.csv?s=BAS.DE&a=00&b=3&c=2000&d=03&e=1" & _
"&f=2009&g=d&ignore=.csv"
wc.DownloadFile(New Uri(url), _
My.Computer.FileSystem.SpecialDirectories.Temp & "\table.csv")
Dim connectionStr As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data" & _
"Source=" & My.Computer.FileSystem.SpecialDirectories.Temp & ";Extended" & _
"Properties=""text;HDR=YES;FMT=Delimited"""
Dim dataSet = New DataSet
Dim connection As New OleDb.OleDbConnection(connectionStr)
Dim dataAdapter As New OleDb.OleDbDataAdapter("select * from" & _
"[table.csv]", connection)
dataAdapter.Fill(dataSet)
connection.Close()
Return dataSet.Tables(0)
End Function Ich könnte jetzt noch mit weiteren Schleifen die anderen ersten Handelstage herausfinden, aber ehrlich gesagt ist das doch alles Mist. Solch eine Table hat ca. 2400 Datensätze. Wenn perc1 = 0 und perc2 = 1 ist, dann dauert das doch eine halbe Ewigkeit. Die Funktion ist ja nur ein kleiner Teil des Zeichenvorgangs. Ich kann die weiteren Punkte auch nicht wirklich brechnen, da es ja 5 Tage/Woche sind und es auch in unregelmäßigen Abständen Tage gibt an denen die Börse geschlossen hatte.
Ich hoffe jemand von euch kennt eine bessere Methode.
Frohe Ostern noch
Maas
Beitrag wurde zuletzt am 12.04.09 um 18:01:51 editiert. |  |
 | Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
  |
|
Neu! sevPopUp 2.0 
Dynamische Kontextmenüs!
Erstellen Sie mit nur wenigen Zeilen Code Kontextmenüs dynamisch zur Laufzeit. Vordefinierte Styles (XP, Office, OfficeXP, Vista oder Windows 8) erleichtern die Anpassung an die eigenen Anwendung... Weitere InfosTipp des Monats Oktober 2025 Matthias KozlowskiUmlaute konvertierenErsetzt die Umlaute in einer Zeichenkette durch die entsprechenden Doppelbuchstaben (aus ä wird ae, usw.) Access-Tools Vol.1 
Über 400 MByte Inhalt
Mehr als 250 Access-Beispiele, 25 Add-Ins und ActiveX-Komponenten, 16 VB-Projekt inkl. Source, mehr als 320 Tipps & Tricks für Access und VB
Nur 24,95 EURWeitere Infos
|
|
|
Copyright ©2000-2025 vb@rchiv Dieter Otter Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.
Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel
|
|