Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Chart mit sauberen Linien (https://www.delphipraxis.net/157349-chart-mit-sauberen-linien.html)

roga 8. Jan 2011 20:17

Chart mit sauberen Linien
 
Da TChart auf einem Frame Probleme bereitete, habe ich selbst eine entsprechende Komponente entwickelt, die im Prinzip nur Einnahmen und Ausgaben grafisch darstellen soll und dies auch fehlerfrei tut. Den unsauberen "Treppeneffekt" der gezeichneten Linien konnte ich erfolgreich mit einem Codebeispiel von Karstadt http://www.delphipraxis.net/475750-post3.html beseitigen. Leider wird hier die eingestellte Linienstärke (Pen.Width) nicht berücksichtigt. Vielleicht kann jemand den Code dahingehend anpassen oder entsprechende Hinweise geben.

Vielen Dank
roga

Bummi 8. Jan 2011 20:36

AW: Chart mit sauberen Linien
 
Ich würde Dir GDI+ ans Herz legen..http://www.progdigy.com/

roga 8. Jan 2011 22:31

AW: Chart mit sauberen Linien
 
Das hilft mir im Moment nicht weiter - trotzdem Danke für Deine Antwort.

roga

Jens01 9. Jan 2011 00:34

AW: Chart mit sauberen Linien
 
http://homepages.enterprise.net/murp...ine/index.html
Hier habe ich was gefunden.
Und hier in der BresenhamLibrary - Radius könnte PenWidth sein:
http://www.efg2.com/Lab/Library/Delp...ColorLines.ZIP

Diese Art eine Linie zu malen kommt von Herrn Bresenham. Hier die Anleitung dazu: :cheer:
http://de.wikipedia.org/wiki/Bresenham-Algorithmus
Oder guck mal Google durch.

Übrigens... Karstadt gibt es nicht mehr

Bummi 9. Jan 2011 09:17

AW: Chart mit sauberen Linien
 
Zitat:

Das hilft mir im Moment nicht weiter
Würde im Prinzip für Dich nur bedeuten 3 Units in den Projektordner zu kopieren und den jetzigen Aufruf durch eine neues Pendant zu ersetzen (über den Daumen ein 8 Zeiler). Installiert werden muß nichts.

roga 9. Jan 2011 17:44

AW: Chart mit sauberen Linien
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Bummi,

habe mich bisher noch nicht mit GDI+ beschäftigt und momentan fehlt mir auch echt die Zeit dazu. Aber Dein Vorschlag hört sich recht simpel an. Eigentlich hatte ich an eine kleine Anpassung der genannten Routine gedacht, denn prinzipiell brauche ich nur eine einfache grafische Darstellung. Habe mal einen Screen meiner eingesetzten Komponente als Bild angefügt. Diese befindet sich allerdings noch im Entwicklungsstatus. Für die Anzeige auf dem Monitor eigentlich ausreichend, aber für Ausdrucke etc. müssen die Linien stärker sein.

Gruß roga

Namenloser 9. Jan 2011 18:10

AW: Chart mit sauberen Linien
 
Wenn es nur um Ausdrucke geht, kannst du die Kantenglättung eigentlich gleich weglassen, weil die Auflösung des Druckers so viel höher ist, dass die Treppen nicht mehr auffallen sollten.

Ansonsten kann ich noch wärmstens die Graphics32-Bibliothek empfehlen. Vor allem die TPolygon32-Klasse dürfte für dich interessant sein.

Jens01 9. Jan 2011 18:29

AW: Chart mit sauberen Linien
 
der Graphics32-Empfehlung kann ich mich nur anschließen. Und diese Komponente ergänzen : GR32_Lines von Angus http://angusj.com/delphi/

Bummi 9. Jan 2011 19:33

AW: Chart mit sauberen Linien
 
Du kannst GDILineTo ja umbennen wie Deine bisherige Prozedur heißt SLineTo....


Die Dateien
GDIPAPI,GDIPOBJ
in Deinen Projektordner oder in den Pfad kopieren

Die Optimierung hier bestand darin, keinen bei Dir bestehenden Code anpassen zu müssen....

Delphi-Quellcode:
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,GDIPAPI,GDIPOBJ, StdCtrls, ExtCtrls;

type
  TForm2 = class(TForm)
    Image1: TImage;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

Function ColorToTGPColor (c : Tcolor; trans : Byte = 255):TGPColor;
Type
 TBarry=Array[0..3] of Byte;
Var
 Barry:TBarry;
 R:Byte;
begin
  move(C,Barry,4);
  R:=Barry[2];
  Barry[2]:=Barry[0];
  Barry[0]:=R;
  Barry[3]:=trans;
  move(Barry,Result,4);
end;

Procedure GDILineTo( C:TCanvas; x,y:Integer);
var
  G:TGPGraphics;
  P:TGPPen;
begin
  G:=TGPGraphics.Create(C.Handle);
  G.SetSmoothingMode(SmoothingModeHighQuality);
  P:=TGPPen.Create(ColorToTGPColor(C.Pen.Color),C.Pen.Width);
  G.DrawLine(p,C.PenPos.X,C.PenPos.Y,x,y);
  P.Free;
  G.Free;
  C.MoveTo(X,Y);
end;

procedure TForm2.Button1Click(Sender: TObject);
begin
  Image1.Canvas.MoveTo(10,10);
  Image1.Canvas.Pen.Color := clBlue;
  Image1.Canvas.Pen.Width := 3;
  GDILineTo(Image1.Canvas, 100,100);
  Image1.Canvas.Pen.Color := clRed;
  GDILineTo(Image1.Canvas, 400,10);
end;

end.

roga 9. Jan 2011 22:42

AW: Chart mit sauberen Linien
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Die Dateien GDIPAPI,GDIPOBJ in Deinen Projektordner oder in den Pfad kopieren
Das hat leider nicht gereicht. Nach einigen Recherchen im Internet habe ich eine neue LIB mit folgenden Dateien erstellt:

DirectDraw.pas
DirectX.inc
GDIPAPI.pas
GDIPOBJ.pas
GDIPUTIL.pas
Jedi.inc

Bei der Compilierung traten Fehler in der DirectDraw.pas beim Type PDirectDrawSurface mit folgender Meldung auf:

"[DCC Fehler] DirectDraw.pas(358): E2154 Typ 'IDirectDrawSurface' benötigt Finalization - nicht im varianten Record erlaubt"

Sicher keine saubere Lösung, aber ich habe diese Stellen vorübergehend deaktiviert und alles läuft super, die eingestellte Linienstärke wird jetzt berücksichtigt (Siehe angehängtes Bild)

Bummi, vielen DANK für Deinen Lösungsansatz! Werde mich wohl demnächst intensiver mit GDI+ und dessen Möglichkeiten beschäftigen müssen. Eine Frage noch: Wie kompatibel ist GDI zu den verschiedenen Windows- und Delphi-Versionen?

Bummi 9. Jan 2011 23:00

AW: Chart mit sauberen Linien
 
ab XP ist die benötigte gdiplus.dll an Bord, einsetzen tue ich es seit D7, müßte aber IMHO auch mit älteren Versionen laufen.
DirectDraw.pas meine ich unter D7 benötigt zu haben , die .inc Dateien müssen eigentlich über irgendwelche Fremdpakete da reinrutschen, ich benötige sie nicht.
Allerdings ist mein Paket von ca. 2002 und die drei Units umbenannt wegen Kompatibilitätsproblemen mit Chartkomponenten welche anscheinend gleichnamige, aber anders implementierte Units verwenden.
Wenn man davon ausgehen kann daß überwiegend Win7 aufwärts im Einsatz sein wird werde ich mir Direct2D etwas näher zu Gemüte führen.

roga 10. Jan 2011 08:11

AW: Chart mit sauberen Linien
 
Um nochmal auf folgende Fehlermeldung zurück zu kommen:

"[DCC Fehler] DirectDraw.pas(358): E2154 Typ 'IDirectDrawSurface' benötigt Finalization - nicht im varianten Record erlaubt"

Eine Änderung in der Datei "DirectDraw.pas" ab Zeile 328 scheint den Fehler zu beheben:
Delphi-Quellcode:
// Delphi 5 and up don't allow interfaces in variant records
// so we have to use pointers instead (which can be type-casted into interfaces):

//{$IFDEF COMPILER5_UP}
//  PDirectDrawSurface = Pointer;
//{$ELSE}
//  PDirectDrawSurface = IDirectDrawSurface;
//{$ENDIF}

  PDirectDrawSurface = Pointer;

DeddyH 10. Jan 2011 09:03

AW: Chart mit sauberen Linien
 
Ich vermute, dass Deine Compilerversion nicht korrekt erkannt wurde und das IFDEF deshalb nicht greift. Meist wird dafür eine *.inc verwendet, ich würde diese einfach erweitern, das ist m.E.n. die sauberere Lösung.

roga 10. Jan 2011 10:21

AW: Chart mit sauberen Linien
 
Du hast Recht - hab mir die aktuelle jedi.inc geladen und alles wird korrekt erkannt. Danke!

MarcoWarm 16. Mär 2011 11:00

AW: Chart mit sauberen Linien
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ein Vorschlag:
Es geht durchaus mit der freien TChart Version glatte Kanten zu zeichnen.

Den Vorschlag dazu hab ich hier gefunden: http://www.codeproject.com/KB/GDI/AntiAliasing.aspx

Im Anhang ist ein Bild einer Anwendung, die wir bei uns im Haus verwenden. Der Graph ist ein geglättetes normales TChart.

Eckpunkte der Vorgehensweise.
  • TChart unsichtbar und 4 mal so groß wie das eigentliche Bitmap erzeugen.
    Alle Schriftarten bzw. Strichstärken mit 4 multiplizieren
  • Nach Veränderung des Chart selbiges mit Chart.PaintTo auf ein Bitmap zeichen, welches ebenfalls 4 mal die Größe des Zielbildes hat
  • Dieses Große Bild wird per
    Delphi-Quellcode:
    StretchDIBits
    auf das eigentlich anzuzeigende Bitmap gemalt (
    Delphi-Quellcode:
    SetStretchBltMode(bmpSmall.Canvas.Handle, HALFTONE);
    nicht vergessen)
  • bmpSmall kannst du dann einem TImage zuweisen und du bist fertig.

Beispiel-Code auf Anfrage

Gruß
Marco


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:57 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz