TChart mit Logarithmischer Skala? [gelöst]

Rund um die LCL und andere Komponenten
Antworten
MmVisual
Beiträge: 1581
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
CPU-Target: 32/64Bit

TChart mit Logarithmischer Skala? [gelöst]

Beitrag von MmVisual »

Hallo,

Ich möchte gerne Preisstaffeln in einem Chart anzeigen. Dazu wollte ich TChart mit TChartAxisTransformations verbinden und dann die Werte füllen.
TLineSeries.AddXY(1, 1);
TLineSeries.AddXY(10, 0.9);
TLineSeries.AddXY(100, 0,7);
TLineSeries.AddXY(1000, 0,65);

Dann sollte TChart mir eine Kurve mit den Skalenpunkten
1 2 3 4.. 10 20 30 .. 100 200 300
Zeichen.

Irgendwie klappt das nicht. Die EXE rechnet sich zu tode und ich muss diese killen.
Als "Base" der Transformation habe ich mal 10 rein geschrieben, ich verstehe allerdings nicht was das genau bezweckt.

Weiß jemand ein Demo dafür wo ich was abschauen kann?

Grüße Markus.
Zuletzt geändert von MmVisual am Fr 15. Aug 2014, 10:55, insgesamt 1-mal geändert.
EleLa - Elektronik Lagerverwaltung - www.elela.de

wp_xyz
Beiträge: 5135
Registriert: Fr 8. Apr 2011, 09:01

Re: TChart mit Logarithmischer Skala?

Beitrag von wp_xyz »

Wie funktioniert denn dein Programm ohne die Transformations? Hängt das Programm da auch? Nimm den Debugger und gehe die von dir geschriebenen Prozeduren Schritt für Schritt durch.

Die logarithmische Darstellung ist in http://wiki.lazarus.freepascal.org/TACh ... s,_Fitting anhand eines Beispiels erläutert.

Base = 10 heißt, dass du den Zehner-Logarithmus verwendest, was in der Regel sinnvoll ist (aber keinesfalls eine Totschleife erzeugt...)

MmVisual
Beiträge: 1581
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
CPU-Target: 32/64Bit

Re: TChart mit Logarithmischer Skala?

Beitrag von MmVisual »

Ohne Transformations hängt das nicht.
Also bisher habe ich zum Chart nur weniges programmiert, ich bin erst am Anfang.

Vielen Dank für den Link, das ist genau das was ich suchte.
EleLa - Elektronik Lagerverwaltung - www.elela.de

MmVisual
Beiträge: 1581
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
CPU-Target: 32/64Bit

Re: TChart mit Logarithmischer Skala?

Beitrag von MmVisual »

Ich habe mir den Demo-Code kopiert und nun stecke ich Fest. Es klappt leider nicht so wie ich will.

Die logarithmische Skala will ich nicht links sondern unten haben. Wenn ich die Transformations ChartAxisTransformations1 von der LeftAxis lösche und in BottomAxis einfüge, dann stürzt Lazarus sofort ab. Abgesehen davon dass das absolut Scheiß**e ist, ist der Bug auch in dem verlinkten Dokument auch beschrieben.

Da steht: "What can we do against that? Each series has properties AxisIndexX and AxisIndexY. The transform can use this information to calculate the logarithms of the correct coordinates before the axis labels are updated. This solves our problem."

Aber irgendwie komme ich nicht dahinter was ich erst umstellen muss damit ich die Transformation auf die BottomAxis legen kann. Ich finde im Objektinspektor keine Unterschiede.

Hat jemand einen Tipp für mich?

Grüße Markus.
EleLa - Elektronik Lagerverwaltung - www.elela.de

wp_xyz
Beiträge: 5135
Registriert: Fr 8. Apr 2011, 09:01

Re: TChart mit Logarithmischer Skala?

Beitrag von wp_xyz »

Falls ich nichts vergesse, sind folgende Schritte nötig, um die x-Achse logarithmisch darzustellen:
  • eine Transformations-Komponente zum Formular hinzufügen
  • LogarithmAxisTransform erzeugen mit Base = 10, Enabled = true
  • die Transformations-Komponente der Eigenschaft Transformations der unteren Achse (BottomAxis) zuweisen - das bewirkt, dass die untere Achse der Transformation unterzogen wird.
  • Bei der Series unbedingt die Eigenschaft AxisIndexX auf den Index der BottomAxis (weil das die transformierte Achse ist!) setzen, darauf bezieht sich der zitierte Text aus dem Tutorial. Dasselbe vorsorglich auch für die y-Achse entsprechend, aber nicht unbedingt nötig.
Um einigermaßen vernünftige Achsenbeschriftungen zu erhalten, muss man die Intervals der BottomAxis verändern:
  • Option aipGraphCoords aktivieren
  • Tolerance auf einen kleinen Wert > 0 setzen, etwa 3 oder 5.
  • Man kann mit MinLength/MaxLength experimentieren, damit die Markierungen besser ausfallen (MinLength = 30, maxLength = 100)
Meistens bin ich aber mit der automatischen Achsenbeschriftung nicht zufrieden, und ich schreibe die Werte, an denen eine Markierung erscheinen soll, in eine ListChartSource, die ich der Eigenschaft Marks.Source der entsprechenden Achse (hier BottomAxis) zuweise. In diesem Fall ist die Spielerei mit den Intervals nicht erforderlich.

Im Anhang findest du eine kleine Demo mit deinen Werten auf logarithmischer x-Achse.
Dateianhänge
TAChart hor-log-axis.zip
(2.68 KiB) 75-mal heruntergeladen

MmVisual
Beiträge: 1581
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
CPU-Target: 32/64Bit

Re: TChart mit Logarithmischer Skala?

Beitrag von MmVisual »

Vielen Dank für die gute Beschreibung und das Demo! Ohne das hätte ich es wohl nicht hin bekommen. :D :D :D

Hier ein Bild vom Chart:
Bild1.png
Bild1.png (9.36 KiB) 2197 mal betrachtet
Die Labels werden von der nachfolgenden Linie übermalt. Gibt es eine Möglichkeit dass erst die Kurve gezeichnet wird und dann die Labels oben drauf gesetzt werden?

Grüße Markus
EleLa - Elektronik Lagerverwaltung - www.elela.de

wp_xyz
Beiträge: 5135
Registriert: Fr 8. Apr 2011, 09:01

Re: TChart mit Logarithmischer Skala?

Beitrag von wp_xyz »

Das wird etwas trickreich. Jedes Element des Chart hat eine Eigenschaft ZPosition, mit der die Zeichenreihenfolge bestimmt werden kann, also auch jede Series. Ein höherer Wert bedeutet, dass das entsprechende Objekt später gezeichnet wird, also über die bereits gezeichneten. Allerdings gehören die Marks zur Series und haben dieselbe ZPosition with die Series. Egal wie du ZPosition der beteiligten Series änderst, es wird immer irgendwelche Überschneidungen der Marks der einen Series durch die andere Series geben.

Ein Ausweg ist, jede Series zu klonen; das Original hat keine Labels, die Kopie hat welche; und das Original hat Verbindungslinien, die Kopie keine. Damit die Marks der Kopie nicht von den Linien überzeichnet werden kann, muss ZPosition der Kopie größer sein als die ZPositions der Originale.

"Klonen" klingt kompliziert, lässt sich aber, wenn man nicht zuviele Ansprüche an Verallgemeinerungen stellt, mit ein paar Zeilen Code erledigen:

Code: Alles auswählen

 
uses
  TAChartUtils ...
 
function TForm1.CloneLineSeriesWithLabels(ASeries: TLineSeries): TLineSeries;
begin
  Result := TLineSeries.Create(self);
  Result.Source := ASeries.Source;             // Dadurch werden die Daten automatisch in der Kopie verwendet
  Result.LinePen.Style := psClear;             // Verbindungslinie der Kopien ausschalten
  Result.ShowPoints := false;                  // Datenpunkt-Symbole der Kopie ausschalten
  Result.Marks.Style := smsValue;              // Marks des Kopie aktivieren
  Result.Marks.Format := '%.2f';
  Result.Marks.LabelBrush.Color := ASeries.Marks.LabelBrush.Color;
    // Farbe der Marks aus Original übernehmen, am besten dort einstellen
  ASeries.Marks.Style := smsNone;              // Marks des Originals ausschalten
  Chart1.AddSeries(Result);                    // Kopie in den Chart einfügen
  Result.ZPosition := Chart1.SeriesCount;      // ... und über allen Originalkurven zeichnen
end; 
 
Hier wird eine neue LineSeries erzeugt, und es werden alle wichtigen Eigenschaften aus dem Original (ASeries) rüberkopiert. Allerdings werden die Verbindungslinien und Symbole der Kopie ausgeschaltet, die Marks eingeschaltet (in dem Beispiel die y-Werte, wegen smsValue - das kannst du nach Belieben ändern). Die Farbe des labelhintergrunds wird aus der OriginalSeries übernommen. Zum Schluss wird die neu erzeugte Series in den Chart eingefügt und die
ZPosition so gewählt, dass sie sicher über den ZPositions der Originale liegt.

Diese Funktion rufst du auf, wenn die Original-Series erzeugt sind, z.B. im OnCreate-Ereignis des Formulars:

Code: Alles auswählen

 
type
  TForm1 = class(TForm)
    Chart1: TChart;
    Chart1LineSeries1: TLineSeries;
    Chart1LineSeries2: TLineSeries;
    RandomChartSource1: TRandomChartSource;
    RandomChartSource2: TRandomChartSource;
    procedure FormCreate(Sender: TObject);
  private
    { private declarations }
    ClonedLineSeries1: TLineSeries;
    ClonedLineSeries2: TLineSeries;
    function CloneLineSeriesWithLabels(ASeries: TLineSeries): TLineSeries;
  public
    { public declarations }
  end; 
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  ClonedLineSeries1 := CloneLineSeriesWithLabels(Chart1LineSeries1);
  ClonedLineSeries2 := CloneLineSeriesWithLabels(Chart1LineSeries2);
end;  
 

MmVisual
Beiträge: 1581
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
CPU-Target: 32/64Bit

Re: TChart mit Logarithmischer Skala?

Beitrag von MmVisual »

Vielen Dank für den Tipp mit dem Kopieren :D

Ich musste in der Series noch AxisIndexX und AxisIndexY mit kopieren, ansonsten hängt sich die EXE auf sobald mehr als eine Kurve drin sind.
Auch habe ich noch "Result.Legend.Visible := False;" hinzugefügt.

So sieht das jetzt aus:

Auch die Achsbeschriftung hat nun eine spezielle Reihenfolge erhalten.
Bild1.png
Bild1.png (8.8 KiB) 2182 mal betrachtet
Anbei der Quellcode von meinem Chart-Formular.

Aufgerufen wird der aus dem Hauptformular:

Code: Alles auswählen

procedure TfrmMain.ShowChart();
Var f: TfrmChart;
begin
  f := TfrmChart.Create(Self);
  f.Caption := 'Mein Chart *g*';
  f.bWithLabel := True;
  f.AddKurve('Hallo 1');
  f.AddValue(1, 0.9);
  f.AddValue(5, 0.85);
  f.AddValue(10, 0.8);
  f.AddValue(100, 0.651); 
  f.AddKurve('Gugus 2');
  f.AddValue(1, 1.0);
  f.AddValue(10, 0.95);
  f.AddValue(25, 0.88); 
  f.ShowModal;
  f.Free;
end;
PS: Du kannst diesen Thread auch im Wiki-Artikel (von oben) verlinken, ich denke das kann vielen helfen.

Grüße Markus.
Dateianhänge
fchart.pas
(5.71 KiB) 70-mal heruntergeladen
fchart.lfm
(1.76 KiB) 62-mal heruntergeladen
EleLa - Elektronik Lagerverwaltung - www.elela.de

wp_xyz
Beiträge: 5135
Registriert: Fr 8. Apr 2011, 09:01

Re: TChart mit Logarithmischer Skala? [gelöst]

Beitrag von wp_xyz »

Ein paar Punkte sind mir beim Überfliegen deines Codes aufgefallen:
  • Du erzeugst die kopierten Plots im FormShow-Ereignis. Ich kenne dein restliches Programm nicht, aber wenn du dasselbe Formular mehrmals anzeigst und jedes mal FormShow aufgerufen wird, müllst du dir den Chart mit lauter identischen Kopien zu. Ich denke, es sollte auch gehen, wenn du die Kopie direkt nach dem Erzeugen einer Series anlegst (beim Ende von AddKurve), auch wenn die Series da noch gar keine Daten enthält. Aber das ganze ist ja so aufgebaut, dass sich Original und Kopie dieselbe Daten teilen - wenn du per AddValue Daten hinzufügst, stehen diese automatisch auch der Kopie zur Verfügung. Allerdings kommt nun die Z-Reihenfolge wieder durcheinander, wenn du die nächste Kurve per AddKurve erzeugst. Als Ausweg könntest du die kopierten Kurven kennzeichnen, z.B. indem du ihre Eigenschaft "Tag" auf einen beliebigen Wert setzt, dafür ist das da. Dann könntest du im FormShow alle Kurven durchlaufen und diejenigen mit diesem Tag in der ZPosition nach oben holen. Ein weiteres Problem sehe ich auch in der AddValue Funktion, weil du die zu betrachtende Kurve als die letzte im Chart annimmst - wegen der nun existierenden Kopie wäre jetzt die kopierte Kurve die letzte (ich glaube, dass dir diese Mehrdeutigkeit auch ohne meinen Vorschlag irgendwann um die Ohren fliegen wird...). Dazu würde ich vorschlagen, AddKurve in eine Funktion umzubauen, die die erzeugte (Original-) Series zurückgibt. Und bei AddValue könntest du die zu bearbeitende Kurve als Parameter angeben.
  • Die Liste lstSeries ist unnötig, sie existiert im chart als Eigenschaft "Series". Die Anzahl der vorhandenen Kurven kann man abfragen mit "SeriesCount".
MmVisual hat geschrieben:Du kannst diesen Thread auch im Wiki-Artikel (von oben) verlinken, ich denke das kann vielen helfen.
Nein, in dem englischen Tutorial werde ich nicht auf ein deutschsprachiges Forum verlinken. Aber ich habe ohnehin vor, demnächst ein Tutorial o.ä. zu "Runtime code with TAChart" zu machen, wo das gut reinpassen würde.

MmVisual
Beiträge: 1581
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
CPU-Target: 32/64Bit

Re: TChart mit Logarithmischer Skala? [gelöst]

Beitrag von MmVisual »

Vielen Dank für's drüber schauen.

Bei mir wird das FormShow Ereignis nur ein mal aufgerufen, das Formular ist Modal und der wird nach dem Schließen immer mit Free gelöscht. Dennoch habe ich eine Variable rein gebaut damit, wenn das FormShow doppelt kommt nicht noch ein zweites mal kopiert wird.

Jetzt da ich einigermaßen verstanden habe wie das mit den TChart.Series geht ist die List lstSeries in der Tat nicht mehr nötig. Allerdings nutze ich die noch im FormShow für das Kopieren der Originaldaten, daher ist es noch drin. Ich könnte zwar das ganze auch umbauen, wäre jedoch komplizierter. Es funktioniert so wie es soll, wenn es so eingesetzt wird wie vom Ersteller (mir) gedacht.

Hier der Original Code der das aufruft:

Code: Alles auswählen

procedure TfrmMain.ShowPriceChart(iBauteilLager_ID: Integer);
Var f: TfrmChart;
  q: TZReadOnlyQuery;
  iAdrID: Integer;
  s: String;
begin
  ErrMessagesAdd('ShowPriceChart');
  q := CreateTZReadOnlyQuery();
  q.SQL.Text := 'SELECT b.Adr_ID, b.EPMenge, b.EPreis, b.BestellNr, a.Bezeichnung';
  q.SQL.Add('FROM bauteiladr b');
  q.SQL.Add('LEFT JOIN adr a ON (a.ID=b.Adr_ID)');
  q.SQL.Add('WHERE b.BauteilLager_ID=' + IntToStr(iBauteilLager_ID));
  q.SQL.Add('ORDER BY Bezeichnung, EPMenge');
  q.Open;
  If q.IsEmpty Then // Keine Daten !!!
  Begin
    q.Close;
    q.Free;
    ErrMessagesRemove();
    Exit;
  end;
  f := TfrmChart.Create(Self);
  f.Caption := cboLagerCase.Text;
  f.bWithLabel := True;
  iAdrID := -1;
  While Not q.EOF Do
  Begin
    If iAdrID <> q.FieldByName('Adr_ID').AsInteger Then
    Begin
      iAdrID := q.FieldByName('Adr_ID').AsInteger;
      s := q.FieldByName('Bezeichnung').AsString;
      If q.FieldByName('BestellNr').AsString <> '' Then
        s := s + ': ' + q.FieldByName('BestellNr').AsString;
      f.AddKurve(s);
    end;
    f.AddValue(q.FieldByName('EPMenge').AsInteger, q.FieldByName('EPreis').AsFloat);
    q.Next;
  end;
  q.Close;
  q.Free;
  f.ShowModal;
  f.Free;
  ErrMessagesRemove();
end;
Das ganze ist im Projekt EleLa drin und zeigt für ein Bauteil alle hinterlegten Preisstaffeln. Damit man besser sehen kann ob bei einer größeren Stückzahl doch ein anderer Lieferant eventuell besser geeignet ist.
EleLa ist hier:
http://mmvisual.de/ >> EleLa
http://www.mikrocontroller.net/topic/265580
Und derzeit bin ich an der neuen Version V3 am schreiben:
http://www.mikrocontroller.net/topic/318610


Ein Tutorial wäre super, denn das TChart ist so mächtig, dass es sehr schwer ist da durch zu steigen. Ein Ablaufdiagramm, wie das ganze zusammenhängt wäre nicht schlecht.

TChart
+-Series: TLineSeries mit Beschreibung für was das gut ist
+-....

Ich denke daran hatte ich am meisten zu kämpfen.
Die speziellen Wünsche, wie z.B die Treppen-Darstellung habe ich dann schon herausgefunden.

Grüße Markus
EleLa - Elektronik Lagerverwaltung - www.elela.de

wp_xyz
Beiträge: 5135
Registriert: Fr 8. Apr 2011, 09:01

Re: TChart mit Logarithmischer Skala? [gelöst]

Beitrag von wp_xyz »

MmCisual hat geschrieben:+-Series: TLineSeries mit Beschreibung für was das gut ist
Den Satz verstehe ich nicht. Aber vielleicht wird das in der "offiziellen" Dokumentation behandelt: http://wiki.lazarus.freepascal.org/TACh ... umentation
Und vielleicht helfen dir auch die vielen Demos, die mit TAChart mitkommen und in http://wiki.lazarus.freepascal.org/TAChart_Demos zusammengefasst sind.
Und das weiter oben zitierte Tutorial ist nur eins von vielen: http://wiki.lazarus.freepascal.org/TACh ... umentation

Ja, es stimmt, TAChart ist relativ schwierig, aber m.E. sehr gut dokumentiert.

MmVisual
Beiträge: 1581
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
CPU-Target: 32/64Bit

Re: TChart mit Logarithmischer Skala? [gelöst]

Beitrag von MmVisual »

Das einzelne Detail ist schon gut dokumentiert. Was fehlt ist jedoch die Übersicht wie die ganzen Daten und Funktionen zusammen hängen.

z.B. so eine Baumansicht/Tabelle

Code: Alles auswählen

TChart
+--- AxisList : Tirgendwas Funktion so und so
|      +----- Minor : Tirgendwas Funktion so und so
+--- BoderAxis : Tirgendwas Funktion so und so
|      +----- Transformations : Tirgendwas Funktion so und so
+--- Series : Tirgendwas Funktion so und so
        +----- Transformation Tirgendwas und malt so und so
        +----- Transformation Tirgendwas und malt so und so
        +----- Transformation Tirgendwas und malt so und so
        +----- Transformation Tirgendwas und malt so und so
        +----- Transformation Tirgendwas und malt so und so
 
Was man mit dem Chart so alles anstellen kann ist hier schon gut zu sehen: http://wiki.lazarus.freepascal.org/TAChart_Demos

Beim Lazarus gibt es beim Reiter Chart viele Zusatzkomponenten die man auf die Form ziehen kann. Wenn ich das jetzt zum ersten mal sehe, dann sehe ich nur einen Wald. Da wäre eine einfache Tabelle hilfreich in der jedes der Kompos kurz beschrieben ist, was man damit anstellen kann.

Was Chart betrifft bin ich ein absoluter Anfänger und ich schreibe das, was ein Anfänger benötigt um damit leichter starten zu können, zumindest was mir leichter fallen würde. Delphi/Lazarus progge ich schon seit 15 Jahren, ganz selten auch Charts - was anhand Demos dann irgendwann auch immer irgendwie geklappt hat.
EleLa - Elektronik Lagerverwaltung - www.elela.de

wp_xyz
Beiträge: 5135
Registriert: Fr 8. Apr 2011, 09:01

Re: TChart mit Logarithmischer Skala? [gelöst]

Beitrag von wp_xyz »

Für jede Anregung bin ich dankbar. Allerdings meine ich, dass man schon fast alles wissen muss, um die genannte Baumansicht zu verstehen. Auf die vielen Komponenten in der Komponentenpalette kann man nicht verzichten, es drückt sich darin die Komplexität der Bibliothek aus. Man könnte natürlich alles in einer einzigen Komponente zusammenfassen, aber das zerstört die Baukasten-Idee, die hinter allem steckt, und der Anfänger wird dann von einer Unzahl von Properties erschlagen.

Wichtig ist, dem Anfänger einen Einstieg zu zeigen, das habe ich damals mit den genannten Tutorials versucht. Immerhin ist das zumindest bei dir gelungen, deine Chart-Aufgabe ist gelöst, und das nächste mal wird es bestimmt einfacher.

MmVisual
Beiträge: 1581
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
CPU-Target: 32/64Bit

Re: TChart mit Logarithmischer Skala? [gelöst]

Beitrag von MmVisual »

>man schon fast alles wissen muss, um die genannte Baumansicht zu verstehen.
Es soll auch nicht zu kompliziert beschrieben sein, nur grob. Kein Beschreibung der detaillierten Properties, denn die sind schon in den jeweiligen Wikis schon beschrieben. Genau dieser Zusammenhang fehlt und ist für den Start wichtig. Also auch keine Romane schreiben, die Baum-Tabelle soll einfach und übersichtlich bleiben. Details zu einzelnen Punkten könnten wiederum an anderer Position weiter unten beschrieben werden.

>aber das zerstört die Baukasten-Idee
Nein, nichts anders Programmieren. Das Chart-Baukastensystem ist genial. Nur liegt es noch daran dieses Baukasten-System auch für andere Nutzbar zu machen indem es, so wie oben mit einer Baumansicht, dokumentiert wird. Großteils ist das auch schon hier geschehen: http://wiki.lazarus.freepascal.org/TAChart_Demos

>Immerhin ist das zumindest bei dir gelungen, deine Chart-Aufgabe ist gelöst
Ja, ist gelöst, aber nur Dank Deiner Hilfe :D :D und diesem Forum.

Noch ein Tipp:
Man kann viele verschiedene Series Typen hinzufügen:
Bild2.png
Bild2.png (13.36 KiB) 2155 mal betrachtet
Hier wäre eine Tabelle Hilfreich mit dem Typ der Series (wie auswählbar) und einer Grafik nebenan wie das aussehen könnte.

PS: Mein EleLa habe ich auch komplett dokumentiert: http://mmvisual.de/Hilfe/EleLa/Index.htm
Jede Funktion beschrieben, mit Bilder, sogar die Datenbankstruktur die dahinter steckt und Tutorials wie man die DB einrichtet, 55 HTM-Seiten. Ich erhalte sehr wenige Fragen für irgend welche Funktionen.
EleLa - Elektronik Lagerverwaltung - www.elela.de

Antworten