Balkendiagramm Chart1 ausgeben
-
Hallo,
ich habe folgendes Problem:
Ich habe eine Datei Handel.dtc, die wie folgt strukturiert ist:
struct satztyp {
char Filiale[21];
double Umsatz;
double Bestand;
double Beschaeftigte;
double Loehne;
unsigned long Quadratmeter;
double Anlagevermögen;
};Dabei befinden sich 10 Datensätze in der Datei.
Ich möchte mir wahlweise folgende Kennziffern in Form von Balkendiagrammen für die verschiedene Datensätze gegenüberstellen:
- Umsatz
- Bestand
- Löhne.Hier ein Auszug von meinem Quellcode:
for (i=0;i<Satzmax;i++) //for-Schleife zum Abarbeiten aller Datensätze
{
switch (RadioGroup1->ItemIndex) //Mehrfach-Auswahl für Alternativen von RadioGroup1
{
case 0: {
Series1->AddBar(f1[i].Umsatz,f1[i].Filiale,clRed); //Umsatzvergleich
}
break;case 1: {
Series1->AddBar(f1[i].Bestand,f1[i].Filiale,clBlue); //Bestandsverg.
}
break;case 2: {
Series1->AddBar(f1[i].Loehne,f1[i].Filiale,clGreen); //Lohnvergleich
}
break;
}
}Nun bringt er mir in meinem Diagramm aber nicht schön die double-Werte, sondern irgendwelchen Kauderwelch. Wenn ich mir die Datei mit einem Texeditor ansehe, steht dort dasselbe Kauderwelch.
Wie kann ich die Datei (vor allem die double-Werte) formatieren, dass ich ein funktionierendes Balkendiagramm bekomme? Ich habe mal was von sprintf gehört! Ist das der richtige Ansatz? Wenn ja, wie funktioniert der??
Danke im Voraus
-
Hallo
wie liest du denn die Werte ein (aus der Datei)
MfG
Klaus
-
Die Werte lese ich ein, indem ich ein struct definieren, dass die gleiche Struktur wie die Datei hat und dann lese ich die Dateikomponenten in den struct:
Quellcode aus Unit1.h:
typedef struct satztyp { //Definition Datensatz
char Filiale[21];
double Umsatz;
double Bestand;
double Beschaeftigte;
double Loehne;
unsigned long Quadratmeter;
double Anlagevermoegen;
} SFiliale;typedef SFiliale liste[Satzmax];
Quellcode aus Projekt1.bpr:
int handle=1; //Variable für Dateiarbeit
liste f1; //struct für Aufnahme der Datei//Dateiarbeit
_fmode=O_BINARY; //Datei im Binärmodus öffnen
if ((handle=open("Handel.dtc",O_RDONLY))==-1) //Lesezugriff für Datei Lit.dtc
{Application->MessageBox ("Datei kann nicht geöffnet werden","Fehler",MB_OK); //Fehlermeldung
exit(0);}
read (handle,f1,sizeof(f1)); //Lesen von "f1"-Bytes aus der durch "handle" bezeichneten Datei in den Speicherbereich "f1"
close (handle); //Schließen der durch handle bezeichneten Datei
//Ende Dateiarbeit
-
Sedlag,
Sedlag schrieb:
Nun bringt er mir in meinem Diagramm aber nicht schön die double-Werte, sondern irgendwelchen Kauderwelch.
finde zuerst einmal heraus, wo genau Dir die Werte verloren gehen. Ein Blick in die Datei ist da nicht aussagekräftig, da die structs scheinbar direkt als Bitmuster abgelegt wurden.
Nutze den Debugger, um nach dem Einlesen eines structs zu prüfen, welche Daten überhaupt eingelesen wurden. Wenn die Werte schon an dieser Stelle vermurkst sind, stimmt der Typ Deines structs vermutlich nicht mit dem Typ des structs überein, welches für das Schreiben der Daten verwendet wurde.
-
Bin Anfänger und habe den Debugger noch nie verwendet. Wie verwende ich den Debugger, um an die Informationen zu kommen???
-
-
Ich bin mir nicht sicher aber ich glaube, er liest die Daten schon falsch ein. Kann ich Dir die Datei mal schicken? Ich glaube, ein Experte kann damit mehr anfangen...
-
Noch ein Nachtrag:
Wenn ich die Datei mit dem Editor ansehe ist der Inhalt folgender:
Wintergarten €ËÝ@ÜÖÖÖÖUü@ Y@ ÀëAÀ D‘@Thekla Å@ÍÌÌÌÌŒh@ €E@ Eð@& ˆˆ@Riemann €FÁ@ d@ €B@ À ì@µ @@Taro €çÖ@ z@ ÀU@ v A$ 8@Breitenfelder €‡É@ m@ €H@ àŠò@ê €†@Renoir Á@33333Óc@ B@ ?ë@E ä@
Ist also wirklich nur ne Abfolge von Bits.
Die Datei wird dann wie oben eingelesen. Ich denke, dass das Problem ist, das Chart die Doublewerte als Bitfolge nicht interpretieren kann und die erst noch irgendwie umgewandelt werden müssen???
Wer kann mir helfen?
-
Hallo
zeig uns mal wie die Daten in die Datei kommen
bzw stell uns diese Datei zu Download irgendwohin
dann ist es leichter nachzuvollziehenMfG
Klaus
-
Die Datei ist so vorgegeben. Meine Aufgabe ist es nur, sie nach der beschriebenen Aufgabenstellung auszuwerten.
@Klaus: Kann ich Dir die Datei per Mail zukommen lassen? Habe keine andere Möglichkeit...
-
Hallo
dann muss es doch auch eine Beschreibung dieser Datei geben
daraus sollte hervorgehen in welchem Format diese Daten vorliegen
(ich glaube, das ist dein Problem)MfG
Klaus
-
In der Aufgabenstellung steht, dass die Komponenten der Datei so strukturiert sind, wie ich es in meinem ersten Beitrag geschrieben habe. Das Format der Daten wird nicht erwähnt.
Ich habe folgenden Quelltext für das Programm:
#include <vcl.h>
#pragma hdrstop
#include <stdlib.h> //wegen exit
#include <fcntl.h> //wegen _fmode, open -> Dateiarbeit
#include <io.h> //wegen open -> Dateiarbeit#include "Unit1.h" //Header-Datei einschließen
#define Satzmax 10 //Definiere maximale Satzlänge mit dem Wert 10#pragma package(smart_init)
#pragma resource "*.dfm"//Deklarationen
typedef struct satztyp { //Definition Datensatz
char Filiale[21];
double Umsatz;
double Bestand;
double Beschaeftigte;
double Loehne;
unsigned long Quadratmeter;
double Anlagevermoegen;
} SFiliale;typedef SFiliale liste[Satzmax];
TForm1 Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------void __fastcall TForm1::Button2Click(TObject *Sender)
{
exit(0); //Nutzergesteuerter Programmabbruch
}
//---------------------------------------------------------------------------void __fastcall TForm1::Button1Click(TObject *Sender)
{int i=0; //Zählvariable
int handle=1; //Variable für Dateiarbeit
liste f1; //struct für Aufnahme der Datei//Dateiarbeit
_fmode=O_BINARY; //Datei im Binärmodus öffnen
if ((handle=open("Handel.dtc",O_RDONLY))==-1) //Lesezugriff für Datei
{Application->MessageBox ("Datei kann nicht geöffnet werden","Fehler",MB_OK); //Fehlermeldung
exit(0);}
read (handle,f1,sizeof(f1)); //Lesen von "f1"-Bytes aus der durch "handle" bezeichneten Datei in den Speicherbereich "f1"
close (handle); //Schließen der durch handle bezeichneten Datei
//Ende DateiarbeitSeries1->Clear(); //Leeren des Diagramms für jedes neue Ereignis
for (i=0;i<Satzmax;i++) //for-Schleife zum Abarbeiten aller Datensätze
{
switch (RadioGroup1->ItemIndex) //Mehrfach-Auswahl RadioGroup1
{
case 0: {
Series1->AddBar(f1[i].Umsatz,f1[i].Filiale,clRed); //Umsatzvergleich
}
break;case 1: {
Series1->AddBar(f1[i].Bestand,f1[i].Filiale,clBlue); //Bestandsver.
}
break;case 2: {
Series1->AddBar(f1[i].Loehne,f1[i].Filiale,clGreen); //Lohnvergleich
}
break;
}
}
}
//---------------------------------------------------------------------------Müsste dieser Code so funtkionieren oder müssen die double Werte zur Darstellung im Balkendiagramm noch irgendwie konvertiert werden? Wie gesagt... ich bekomme da nur Kauderwelsch im Diagramm angezeigt...
-
Nur mal als Tipp (klingt besser als "Beschwerde"
): Verwende doch beim Posten von Code die Code-Tags! (unter den Smileys)
-
so besser???

#include <vcl.h> #pragma hdrstop //#include <stdio.h> //wegen sprintf #include <stdlib.h> //wegen exit #include <fcntl.h> //wegen _fmode, open -> Dateiarbeit #include <io.h> //wegen open -> Dateiarbeit #include "Unit1.h" //Header-Datei einschließen #define Satzmax 10 //Definiere maximale Satzlänge mit dem Wert 10 #pragma package(smart_init) #pragma resource "*.dfm" //Deklarationen typedef struct satztyp { //Definition Datensatz char Filiale[21]; double Umsatz; double Bestand; double Beschaeftigte; double Loehne; unsigned long Quadratmeter; double Anlagevermoegen; } SFiliale; typedef SFiliale liste[Satzmax]; TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender) { exit(0); //Nutzergesteuerter Programmabbruch } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { int i=0; //Zählvariable int handle=1; //Variable für Dateiarbeit liste f1; //struct für Aufnahme der Datei //Dateiarbeit _fmode=O_BINARY; //Datei im Binärmodus öffnen if ((handle=open("Handel.dtc",O_RDONLY))==-1) //Lesezugriff für Datei Handel.dtc {Application->MessageBox ("Datei kann nicht geöffnet werden","Fehler",MB_OK); //Fehlermeldung exit(0);} read (handle,f1,sizeof(f1)); //Lesen von "f1"-Bytes aus der durch "handle" bezeichneten Datei in den Speicherbereich "f1" close (handle); //Schließen der durch handle bezeichneten Datei //Ende Dateiarbeit Series1->Clear(); //Leeren des Diagramms für jedes neue Ereignis for (i=0;i<Satzmax;i++) //for-Schleife zum Abarbeiten aller Datensätze { switch (RadioGroup1->ItemIndex) //Mehrfach-Auswahl für Alternativen von RadioGroup1 { case 0: { Series1->AddBar(f1[i].Umsatz,f1[i].Filiale,clRed); //Umsatzvergleich } break; case 1: { Series1->AddBar(f1[i].Bestand,f1[i].Filiale,clBlue); //Bestandsvergleich } break; case 2: { Series1->AddBar(f1[i].Loehne,f1[i].Filiale,clGreen); //Lohnvergleich } break; } } } //---------------------------------------------------------------------------
-
geloescht
-
Hallo
die Loesung ist ganz einfach
Projekte->Optionen->erweiterte Compiler Optionen->Datenausrichtung
auf Byte stellenMfG
Klaus
-
Einfach aber genial...
Mein Riesendank an Klaus. Da wäre ich wohl noch dran verzweifelt...
-
mal ein paar Fragen:
Du willst ein Balkendiagramm haben, was dir für jede Filiale 1 bis 3 Balken anzeigt, wo der Umsatz rot, der Bestand blau und die Löhne grün dargestellt werden sollen, oder versteh ich das falsch?
Arbeitest du mit TChart?
Wenn ja: Warum machst du den Vergleich aller drei Werte (Umsatz, Bestand und Löhne) in eine Series? ich würd dafür 3 Series verwenden
und ausserdem ist es vielleicht sinnvoll die for-Schleife in die Case-Anweisungen zu legen
Grüße
Linnea
-
Nee... hat sich schon geklärt!
Es sollen jeweils Umsatz, Bestand und Löhne für die 10 Filialen gegenübergestellt werden. Mir ging es nur um die richtige Darstellung der Werte...