Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Daten aus Array zeichnen (https://www.delphipraxis.net/185132-daten-aus-array-zeichnen.html)

Chris211183 18. Mai 2015 11:54

Daten aus Array zeichnen
 
Hallo, ich habe es endlich hinbekommen, Werte, welche in einer Datei gespeichert sind, in ein Array einzulesen. Juhuuuuu :-D

Nun will ich diese über Canvas als Kurve zeichnen lassen, was mir absolut nicht gelingen möchte.

Die Daten aus meinem Array sind dabei jeweils meine Y-Koordinaten.

Erstamal wäre ich total zufrieden, wenn mir mal ne Kurve angezeigt wird, damit ich dann selber weiter gucken kann, über Anregungen, Kopfschütteln und Auslacher wäre ich sehr dankbar !

Delphi-Quellcode:
procedure THixHistoGraph.DrawMeasureValue(const ReadInArray : Array of Real);
var
  HistoBackround : TRect;
  i : integer;
  Range : Double;
begin
  HistoBackround := Rect(FGapLeft,
                          FGapTop,
                          Width - FGapRight,
                          Height - FGapBottom + 2);
  {Darstellungsfläche eingrenzen}
  InflateRect(HistoBackround, -1, -1);


  Range := round(Width - FGapRight);

  For I:= 1 to round(length(ReadInArray)- 1) do
  begin
    Canvas.MoveTo(FGapLeft, 500);
    Canvas.Pen.Style := FSeriesLineStyle;
    Canvas.Brush.Color := FColor;
    Canvas.Pen.Color := FSeriesColor;
    Canvas.LineTo(FGapLeft * round(Range / length(ReadInArray)), round(ReadInArray[i]));
    //ShowMessage(FloatToStr(ReadInArray[i]));
  end;
end;

Captnemo 18. Mai 2015 12:28

AW: Daten aus Array zeichnen
 
Diese Zeile kommt mir merkwürdig vor.

Delphi-Quellcode:
    Canvas.LineTo(FGapLeft * round(Range / length(ReadInArray)), round(ReadInArray[i]));
Ich gehe mal davon aus, dass du die Werte gleichmäßig auf der X-Achse verteilen möchtest.
Wäre es da nicht besser so
Delphi-Quellcode:
    Canvas.LineTo(FGapLeft + round(Range / length(ReadInArray)*i), round(ReadInArray[i]));
Hab das jetzt nicht getestet, aber irgendwie liegst doch sonst immer auf der gleichen Position der X-Achse.

Chris211183 18. Mai 2015 12:33

AW: Daten aus Array zeichnen
 
Jap, da hast Du Recht, habs mal getestet...
Source läuft durch, Canvas zeichnet aber nichts, merkwürdiger Weise....

Captnemo 18. Mai 2015 12:38

AW: Daten aus Array zeichnen
 
Worauf zeichnest du? Du solltest deinen Canvas im OnPaint des gewünschten Controls zeichnen, sonst wird das nix.

Chris211183 18. Mai 2015 12:39

AW: Daten aus Array zeichnen
 
Hier mal die Unit, mit der der Array eingelesen wird

Delphi-Quellcode:
unit HixHistographFormUnit;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, HixHistograph;

type
 THixHistographForm = class(TForm)
    HixHistoGraph1: THixHistoGraph;
 procedure FormShow(Sender: TObject);

  private
    { Private-Deklarationen }
    FileName : String;
    ASCIn   : Textfile;
    procedure ReadData(var AscIn: TextFile; FileName: String);
  public
    { Public-Deklarationen }
    ReadInArray: Array of Real;
  end;

var
  HixHistographForm: THixHistographForm;

implementation

{$R *.dfm}

procedure THixHistographForm.ReadData(var AscIn: TextFile; FileName: String);
var
  StrTemp : String;
  i, Code : integer;
  RealTemp : Real;

begin
  AssignFile(AscIn, FileName);                                                 // öffne File
  Reset(AscIn);                                                                // Zeige auf ersten Wert
  SetLength(ReadInArray, 0);                                                   // beginne am Anfang des Array
  i := 0;

  while not eof(Ascin) do                                                      // lese bis Dateiende
  begin
    ReadLn(AscIn,StrTemp);
    Val(StrTemp,RealTemp,Code);
    SetLength(ReadInArray, length(ReadInArray) + 1);
    ReadInArray[i] := RealTemp;
    i:=i+1;
  end;
  closefile(AscIn);
end;

procedure THixHistographForm.FormShow(Sender: TObject);
begin
   FileName := 'o:\Delphi6\Student\HixHistograph\Abild1.asc';
   ReadData(ASCIn,FileName);
   HixHistograph1.DrawMeasureValue(ReadInArray);
end;

end.
Das klappt soweit auch alles...

Chris211183 18. Mai 2015 12:41

AW: Daten aus Array zeichnen
 
Zitat:

Zitat von Captnemo (Beitrag 1301932)
Worauf zeichnest du? Du solltest deinen Canvas im OnPaint des gewünschten Controls zeichnen, sonst wird das nix.

zeichne auf Form1, da liegt das auch alles drauf...

Captnemo 18. Mai 2015 12:42

AW: Daten aus Array zeichnen
 
Worauf willst du denn jetzt Zeichnen?


Wenn du direkt auf der Form zeichnen willst, dann solltest du in
Delphi-Quellcode:
procedure TForm1.OnPaint(Sender: TObject);
begin
   HixHistograph1.DrawMeasureValue(ReadInArray);
end;
zeichnen.

Besser finde ich allerdings, wenn man sich dafür ein Panel oder eine Paintbox hinlegt, auf die man zeichnet.

Captnemo 18. Mai 2015 12:47

AW: Daten aus Array zeichnen
 
Der Canvas speichert nichts. Heißt, immer wenn das Control angezeigt wird, wird das Ereignis OnPaint aufgerufen, damit du dann alles zeichnen kannst, was notwendig ist. Wird z.B. die Form durch ein anderes Fenster verdeckt, und dann verdeckte Bereiche durch Verschieben der verdeckenden Form wieder sichbar gemacht, wird erneut das OnPaint aufgerufen.

Probiers mal aus, dass du deine OnPaint-Routine nur einmal durchlaufen läßt, und danach (über irgendein Bool) halt nicht mehr. Dann schau mal was passiert, dann verstehst du das ganz fix.

Chris211183 18. Mai 2015 12:48

AW: Daten aus Array zeichnen
 
Zitat:

Zitat von Captnemo (Beitrag 1301936)
Worauf willst du denn jetzt Zeichnen?


Wenn du direkt auf der Form zeichnen willst, dann solltest du in
Delphi-Quellcode:
procedure TForm1.OnPaint(Sender: TObject);
begin
   HixHistograph1.DrawMeasureValue(ReadInArray);
end;
zeichnen.

Besser finde ich allerdings, wenn man sich dafür ein Panel oder eine Paintbox hinlegt, auf die man zeichnet.

Bissl falsch ausgedrückt..., meine Komponente liegt auf Form1, in die Komponente soll reingezeichnet werden. rufe die Zeichenroutine aber auf !

Delphi-Quellcode:
procedure THixHistograph.Paint;
begin
  inherited;
    DrawComponent; // zeichnet Hintergrund etc.
    DrawMeasureValue(ReadInArray); // soll den Graphen zeichnen
end;

Chris211183 18. Mai 2015 12:51

AW: Daten aus Array zeichnen
 
Zitat:

Zitat von Captnemo (Beitrag 1301939)
Der Canvas speichert nichts. Heißt, immer wenn das Control angezeigt wird, wird das Ereignis OnPaint aufgerufen, damit du dann alles zeichnen kannst, was notwendig ist. Wird z.B. die Form durch ein anderes Fenster verdeckt, und dann verdeckte Bereiche durch Verschieben der verdeckenden Form wieder sichbar gemacht, wird erneut das OnPaint aufgerufen.

Probiers mal aus, dass du deine OnPaint-Routine nur einmal durchlaufen läßt, und danach (über irgendein Bool) halt nicht mehr. Dann schau mal was passiert, dann verstehst du das ganz fix.

Hab ich grad mal gemacht, zeichnet nichts....
Kommentiere ich mal alles aus und zeichne einfach nur eine Linie von a nach b, klappt das, kann das sein, dass er irgendwie die Arraylänge nicht hat ???

Captnemo 18. Mai 2015 12:51

AW: Daten aus Array zeichnen
 
Okay, ist aber egal.

Alles, was du auf dem Canvas machen möchtest, gehört in das OnPaint-Ereignis der Komponente, auf deren Canvas du zeichnen möchtest.

Captnemo 18. Mai 2015 12:56

AW: Daten aus Array zeichnen
 
Also, wenn ich mir was auf den Canvas zeichnen möchte, was dann aber nicht so da ankommt, wie ich es gerne hätte, dann schreibe ich mir einfach alle Werte, die ich im OnPaint verwende, in eine Textdatei, die ich hinterher auslese. Letztlich kannst du natürlich alles auch Schrittweise durchgehen, aber mir persönlich geht dann gerne die Übersicht verloren. (Vor allem, weil das OnPaint immer wieder aufgerufen wird, wenn ich von Code beim debuggen wieder ins Programm springe).

Und in der Textdatei kann man dann gut sehen, welche Werte du in deinem Array liest, und wieviele Daten du überhaupt bekommst. Alternativ kannst du ja auch mal ein Memo daneben legen, wo du dir alle Wert einfach mal aus dem OnPaint mit reinschreibt.

Darüber hinaus, verwende ich zum testen immer mal mehr Variablen, als ich später vielleicht im Code belasse.

So würde ich zum testen vielleicht so schreiben:
Delphi-Quellcode:
procedure OnPaint(Sender: TObject);
begin
  for i:=0 to length(wertearray) do
  begin
     y:=wertearray[i] + (i * abstand);
     Memo.lines.add('wert='+inttostr(wertearray[i])+' abstand='+inttostr(abstand));
//must du halt noch ein bischen ergänzen
     canvas.lineto(y, x);
  end;
end;
und kürze das später aus:
Delphi-Quellcode:
procedure OnPaint(Sender: TObject);
begin
  for i:=0 to length(wertearray) do
  begin
     canvas.lineto(wertearray[i] + (i * abstand), x);
  end;
end;
Bei einfachen Dinge geht's natürlich auch anderes, aber wenn's aus irgendwelchen Gründe kompliziert ist, dann helfe ich mir so.

Chris211183 18. Mai 2015 12:58

AW: Daten aus Array zeichnen
 
Super Idee, werd ich mal machen ! Danke Dir

Popov 18. Mai 2015 14:32

AW: Daten aus Array zeichnen
 
Guck dir evtl. dieses Beispiel an:

http://www.delphipraxis.net/1201761-post13.html

Da habe ich auch aus einem Array gezeichnet.

Chris211183 18. Mai 2015 17:52

AW: Daten aus Array zeichnen
 
Zitat:

Zitat von Popov (Beitrag 1301967)
Guck dir evtl. dieses Beispiel an:

http://www.delphipraxis.net/1201761-post13.html

Da habe ich auch aus einem Array gezeichnet.

Danke @Popov, ja so sieht das bei mir auch aus, mein Array ist ein globales Array of Real...

Kurz nochmal zusammengefasst:

Grundgerüst ist bereits als Komponente übersetzt (Hintergrund, Gaps, Colors etc.)
Ich habe eine Datei, in der lauter Werte stehen, diese sind die Y-Werte, diese lese ich in mein Array ein, über eine seperate Unit. ----BIS HIERHER FUNZ ALLES ! Werte werden auch in das Array eingelesen...
Die Unit ist auch in der uses Klausel und es kann darauf zugegriffen werden.

Wenn ich jetzt diese in meiner Zeichenroutine (welche in der procedure paint aufgefufen wird) benutze, zeichnet Canvas leider nichts..., ich steh komplett auf dem Schlauch, weshalb nicht....

Chris211183 18. Mai 2015 17:55

AW: Daten aus Array zeichnen
 
@Captnemo, hab grad erst Dein Bsp. gesehen, werd ich morgen mal machen nach der Uni ausprobieren ! Danke Dir

Chris211183 19. Mai 2015 09:10

AW: Daten aus Array zeichnen
 
Habe jetzt alles einmal ausprobiert und die Werte werden richtig eingelesen und auch in der procedure DrawMeasureValue(ReadInArray) übergeben.

Dise procedur wird in DrawComponent aufgerufen, nach DrawGrid(zeichnet das Rastergitter)

zum Schluss wird dann DrawComponent in der paint Procedure aufgerufen....

Sollte doch meines Erachtens alles so richtig sein ? :wall:

Delphi-Quellcode:
{Ausschnitt aus der HauptUnit der Komponente}

protected
   procedure Paint; override;
   { Protected-Deklarationen }

public
    MeineWerte : TMeineWerte;                                                  // globales Array zum einlesen externer Werte
    ReadInArray :Array of Real;
    procedure DrawMeasureValue(const ReadInArray : Array of Real);
    procedure SetBounds (Left, Top, Width, Height: Integer); override;
    procedure Resize; override;                                                // damit lassen sich die geerbten Abmessungen neu setzen
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    { Public-Deklarationen }


procedure THixHistoGraph.DrawComponent;
var
   {zeichnet Komponente}
   ComponentBackround         : TRect;

   {zeichnet die Darstellungsfläche der Komponente}
   HistoBackround             : TRect;

begin

 if FBorderstyle = bsSingle then
   begin
   inherited;
   if (Parent = NIL) or not visible
   then Exit;
   begin
     ComponentBackround := Rect(0, 0, Width, Height);
     Canvas.Brush.Color := FColor;
     Canvas.Pen.Color  := FColor;
     Canvas.Pen.Style  := psSolid;
     Canvas.FillRect(ComponentBackround);
     {3D Rahmen mit der Breite von 1 für Komponentenhintergrund}
     Frame3D(Canvas, ComponentBackround, clBtnHighlight, clBtnShadow, 1);
   end;

      begin
        HistoBackround := Rect(FGapLeft,
                                FGapTop,
                                Width - FGapRight,
                                Height - FGapBottom + 2);

        Canvas.Brush.Color := FHistoBkColor;
        Canvas.Pen.Color  := FHistoBkColor;
        Canvas.FillRect(HistoBackround);
        Frame3D(Canvas, HistoBackround, clBtnShadow, clBtnHighlight, 1);
        DrawGrid;
        DrawMeasureValue(ReadInArray);
      end;
   end;
end;

{zeichnet Graphenverlauf}
procedure THixHistoGraph.DrawMeasureValue(const ReadInArray : Array of Real);
var
  HistoBackround : TRect;
  i : integer;
  Range : Double;
begin
  HistoBackround := Rect(FGapLeft,
                          FGapTop,
                          Width - FGapRight,
                          Height - FGapBottom + 2);
  {Darstellungsfläche eingrenzen}
  InflateRect(HistoBackround, -1, -1);


  Range := round(Width - FGapRight);

  For I:= 1 to round(length(ReadInArray)) do
  begin
    Canvas.MoveTo(FGapLeft, round(ReadInArray[i]));
    Canvas.LineTo(FGapLeft + round(Range / length(ReadInArray) * i), round(ReadInArray[i]));
    Canvas.Pen.Style := FSeriesLineStyle;
    Canvas.Brush.Color := FColor;
    Canvas.Pen.Color := FSeriesColor;
    //ShowMessage(FloatToStr(ReadInArray[i]));
    //ShowMessage(FloatToStr(length(ReadInArray)));
  end;
end;


procedure THixHistoGraph.Paint;
begin
  inherited;
  DrawComponent;
  //DrawMeasureValue(ReadInArray); // wird in DrawComponent aufgerufen
end;

Delphi-Quellcode:
unit HixHistographFormUnit;

interface

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

type
 THixHistographForm = class(TForm)
    HixHistoGraph1: THixHistoGraph;
 procedure FormShow(Sender: TObject);

  private
    { Private-Deklarationen }
    FileName : String;
    ASCIn   : Textfile;
    procedure ReadData(var AscIn: TextFile; FileName: String);
  public
    { Public-Deklarationen }
    ReadInArray: Array of Real;
  end;

var
  HixHistographForm: THixHistographForm;

implementation

{$R *.dfm}

procedure THixHistographForm.ReadData(var AscIn: TextFile; FileName: String);
var
  StrTemp : String;
  i, Code : integer;
  RealTemp : Real;

begin
  AssignFile(AscIn, FileName);                                                 // öffne File
  Reset(AscIn);                                                                // Zeige auf ersten Wert
  SetLength(ReadInArray, 0);                                                   // beginne am Anfang des Array
  i := 0;

  while not eof(Ascin) do                                                      // lese bis Dateiende
  begin
    ReadLn(AscIn,StrTemp);
    Val(StrTemp,RealTemp,Code);
    SetLength(ReadInArray, length(ReadInArray) + 1);
    ReadInArray[i] := RealTemp;
    i:=i+1;
  end;
  closefile(AscIn);
end;

procedure THixHistographForm.FormShow(Sender: TObject);
begin
   FileName := 'o:\Delphi6\Student\HixHistograph\Abild1.asc';
   ReadData(ASCIn,FileName);
   HixHistograph1.DrawMeasureValue(ReadInArray);
end;
end.

Popov 19. Mai 2015 09:28

AW: Daten aus Array zeichnen
 
Unabhängig ob der Code nun richtig oder falsch ist, aber ich komme immer durcheinander wenn die Feldvariablen nicht mit einem F beginnen. Verwirrt nur etwas, ist aber kein Fehler.

Chris211183 19. Mai 2015 09:36

AW: Daten aus Array zeichnen
 
Zitat:

Zitat von Popov (Beitrag 1302096)
Unabhängig ob der Code nun richtig oder falsch ist, aber ich komme immer durcheinander wenn die Feldvariablen nicht mit einem F beginnen. Verwirrt nur etwas, ist aber kein Fehler.

Man möchte ja aber auch nicht alles im OI stehen haben, in den Routinen werden ja die Feldvariablen benutzt, die später, über den OI verstellt werden können...

Bringt mich aber jetzt nicht wirklich weiter Popov

Popov 19. Mai 2015 10:05

AW: Daten aus Array zeichnen
 
Zitat:

Zitat von Chris211183 (Beitrag 1302098)
Bringt mich aber jetzt nicht wirklich weiter Popov

Nein, hast du Recht, aber wenn ich so was sehe:
Delphi-Quellcode:
public
    ...
    ReadInArray :Array of Real;
    procedure DrawMeasureValue(const ReadInArray : Array of Real);
dann verbringe ich die halbe Zeit damit den Code zu analysieren. Sicher, bei Delphi haben lokale Variablen eine höhere Priorität als gleichnamige nichtlokale, es ist aber eine potentielle Fehlerquelle. Mal ist ReadInArray eine Feldvariable, mal Parameter.

Wenn ich also sage, dass mich Feldvariablen ohne ein F davor etwas durcheinander bringen, dann auch deshalb, weil ich dann beim lesen des Codes nicht sofort erkenne um was es sich handelt. Man kann es ermitteln, aber bist du sicher auch immer das richtige ReadInArray gemeint zu haben?

Tipp: F bei Feldvariablen, A bei Prozeduren. Schon kommt man nicht durcheinander.

Chris211183 19. Mai 2015 10:10

AW: Daten aus Array zeichnen
 
Zitat:

Zitat von Popov (Beitrag 1302108)
Zitat:

Zitat von Chris211183 (Beitrag 1302098)
Bringt mich aber jetzt nicht wirklich weiter Popov

Nein, hast du Recht, aber wenn ich so was sehe:
Delphi-Quellcode:
public
    ...
    ReadInArray :Array of Real;
    procedure DrawMeasureValue(const ReadInArray : Array of Real);
dann verbringe ich die halbe Zeit damit den Code zu analysieren. Sicher, bei Delphi haben lokale Variablen eine höhere Priorität als gleichnamige nichtlokale, es ist aber eine potentielle Fehlerquelle. Mal ist ReadInArray eine Feldvariable, mal Parameter.

Wenn ich also sage, dass mich Feldvariablen ohne ein F davor etwas durcheinander bringen, dann auch deshalb, weil ich dann beim lesen des Codes nicht sofort erkenne um was es sich handelt. Man kann es ermitteln, aber bist du sicher auch immer das richtige ReadInArray gemeint zu haben?

Tipp: F bei Feldvariablen, A bei Prozeduren. Schon kommt man nicht durcheinander.

Ja da hast du auch recht...
Für Dich, ReadInArray bekommt seine Werte aus einer Datei, die werden in das Array eingelesen und dann in der Paint benutzt, das Einlesen der Werte erfolgt im der FormUnit ! (es sind 600 Werte)
Beim auslesen der Werte stehen die auch so drin, alles bereits getestet :gruebel:,

find halt absolut nicht das Problem, warum er das nicht malen will...

BadenPower 19. Mai 2015 11:00

AW: Daten aus Array zeichnen
 
einmal ganz banal gefragt:

Hast Du schon überprüft, ob THixHistoGraph.DrawMeasureValue überhaupt aufgerufen wird, da es in DrawComponent ja mehrere If-Bedingungen gibt, die dies unterbinden könnten?

Wie sehen die Farben von Brush und Pen des Canvas aus? Dort verwendest Du ja Variabeln, welche eventuell nicht die richtigen oder die gleichen Werte haben.

Popov 19. Mai 2015 11:04

AW: Daten aus Array zeichnen
 
Noch einmal und dann nicht mehr, weil du anscheinend das Problem nicht als Problem siehst. Du hallst dich an keine Konventionen und mischt alles lustig durcheinander, als Komponente und Formular. So wie ich deinen Code verstehe ist es eine Komponente. Zumindest finde ich da Begriffe die darauf schließen lassen.

Variablem mit gleichem Namen tauchen mal als Feldvariablen, mal als Parameter auf. Zum Beispiel Canvas. Ich weiß nicht was du mit Canvas meinst, bzw. welche? Da du dich an die üblichen Konventionen nicht hältst, könnte Cnavas in der Komponente FCanvas sein, die du aber ohne F schreibst, es kann aber auch Form1.Canvas sein. Woher soll man das wissen?

Aber gehen wir mal davon aus, dass es eine Komponente ist, die aber auf irgendeine Canvas zeichnet, die als erste der Komponente unter die Augen kommt. Vielleicht ist es die Form Canvas. Das ist wie "ene mene muh und dran bist du" Canvas.

Gucken wir uns mal das an:
Delphi-Quellcode:
procedure THixHistoGraph.DrawComponent;
var
   {zeichnet Komponente}
   ComponentBackround : TRect; //<<<<<<

   {zeichnet die Darstellungsfläche der Komponente}
   HistoBackround : TRect;

begin

 if FBorderstyle = bsSingle then
   begin
   inherited;
   if (Parent = NIL) or not visible
   then Exit;
   begin
     ComponentBackround := Rect(0, 0, Width, Height); //<<<<<< ist das Komponenten Background?
           // oder von Form1? Was ist Width oder Height? Formularbreite und Höhe? 
     Canvas.Brush.Color := FColor; //<<<<<< welches Canvas?
     Canvas.Pen.Color := FColor;
     Canvas.Pen.Style := psSolid;
     Canvas.FillRect(ComponentBackround);
So richtig weiß man nicht auf was du zugreifst.

Chris211183 19. Mai 2015 11:04

AW: Daten aus Array zeichnen
 
Zitat:

Zitat von BadenPower (Beitrag 1302129)
einmal ganz banal gefragt:

Hast Du schon überprüft, ob THixHistoGraph.DrawMeasureValue überhaupt aufgerufen wird, da es in DrawComponent ja mehrere If-Bedingungen gibt, die dies unterbinden könnten?

Wie sehen die Farben von Brush und Pen des Canvas aus? Dort verwendest Du ja Variabeln, welche eventuell nicht die richtigen oder die gleichen Werte haben.

Gute Idee, ja habe ich breits getan...
wenn ich mit einer einfachen Line (MoveTo, LineTo) teste, zeichnet er auch, Passt da an meiner Parametriesierung etwas nicht ? meiner meinung nach sollte das Ok sein, meine letzter Gedankenstrohalm...

Chris211183 19. Mai 2015 11:07

AW: Daten aus Array zeichnen
 
Zitat:

Zitat von Popov (Beitrag 1302130)
Noch einmal und dann nicht mehr, weil du anscheinend das Problem nicht als Problem siehst. Du hallst dich an keine Konventionen und mischt alles lustig durcheinander, als Komponente und Formular. So wie ich deinen Code verstehe ist es eine Komponente. Zumindest finde ich da Begriffe die darauf schließen lassen.

Variablem mit gleichem Namen tauchen mal als Feldvariablen, mal als Parameter auf. Zum Beispiel Canvas. Ich weiß nicht was du mit Canvas meinst, bzw. welche? Da du dich an die üblichen Konventionen nicht hältst, könnte Cnavas in der Komponente FCanvas sein, die du aber ohne F schreibst, es kann aber auch Form1.Canvas sein. Woher soll man das wissen?

Aber gehen wir mal davon aus, dass es eine Komponente ist, die aber auf irgendeine Canvas zeichnet, die als erste der Komponente unter die Augen kommt. Vielleicht ist es die Form Canvas. Das ist wie "ene mene muh und dran bist du" Canvas.

Gucken wir uns mal das an:
Delphi-Quellcode:
procedure THixHistoGraph.DrawComponent;
var
   {zeichnet Komponente}
   ComponentBackround : TRect; //<<<<<<

   {zeichnet die Darstellungsfläche der Komponente}
   HistoBackround : TRect;

begin

 if FBorderstyle = bsSingle then
   begin
   inherited;
   if (Parent = NIL) or not visible
   then Exit;
   begin
     ComponentBackround := Rect(0, 0, Width, Height); //<<<<<< ist das Komponenten Background?
           // oder von Form1? Was ist Width oder Height? Formularbreite und Höhe? 
     Canvas.Brush.Color := FColor; //<<<<<< welches Canvas?
     Canvas.Pen.Color := FColor;
     Canvas.Pen.Style := psSolid;
     Canvas.FillRect(ComponentBackround);
So richtig weiß man nicht auf was du zugreifst.

Danke Popov, weiß was Du meinst !
Ja daran kann es tatsächlich liegen :wall: dummer Fehler, sorry dass ich das jetzt erst gerallt habe, was Du die ganze Zeit meintest !

Captnemo 19. Mai 2015 13:40

AW: Daten aus Array zeichnen
 
Zitat:

Zitat von Chris211183 (Beitrag 1302132)
Ja daran kann es tatsächlich liegen :wall: dummer Fehler, sorry dass ich das jetzt erst gerallt habe, was Du die ganze Zeit meintest !

Eigentlich habe ich dir im #4 Post schon den richtigen Denkanstoß gegeben:
Zitat:

Zitat von Captnemo (Beitrag 1301932)
Worauf zeichnest du? Du solltest deinen Canvas im OnPaint des gewünschten Controls zeichnen, sonst wird das nix.

Ich hab mich zwar nicht so deutlich ausgedrückt, aber ich dachte damit wäre das klar.

Chris211183 19. Mai 2015 17:52

AW: Daten aus Array zeichnen
 
Zitat:

Zitat von Captnemo (Beitrag 1302160)
Zitat:

Zitat von Chris211183 (Beitrag 1302132)
Ja daran kann es tatsächlich liegen :wall: dummer Fehler, sorry dass ich das jetzt erst gerallt habe, was Du die ganze Zeit meintest !

Eigentlich habe ich dir im #4 Post schon den richtigen Denkanstoß gegeben:
Zitat:

Zitat von Captnemo (Beitrag 1301932)
Worauf zeichnest du? Du solltest deinen Canvas im OnPaint des gewünschten Controls zeichnen, sonst wird das nix.

Ich hab mich zwar nicht so deutlich ausgedrückt, aber ich dachte damit wäre das klar.

ja, ich bin nicht so der Programmierer, aber ich arbeite dran und bin stets bemüht :lol:
dennoch vielen Dank für Deine Zeit und Nerven

Captnemo 19. Mai 2015 20:42

AW: Daten aus Array zeichnen
 
Kein Problem.

HHennig 21. Mai 2015 12:21

AW: Daten aus Array zeichnen
 
Hallo,
ich glaube den Fehler gefunden zu haben:

Zitat:

Delphi-Quellcode:
 if FBorderstyle = bsSingle then
    begin
    inherited;
    if (Parent = NIL) or not visible
    then Exit;
    begin
      ComponentBackround := Rect(0, 0, Width, Height); //<<<<<< ist das Komponenten Background?
            // oder von Form1? Was ist Width oder Height? Formularbreite und Höhe? 
      Canvas.Brush.Color := FColor; //<<<<<< welches Canvas?   //// ******** 
      Canvas.Pen.Color := FColor;                             //// ******** 
      Canvas.Pen.Style := psSolid;
      Canvas.FillRect(ComponentBackround);

Du verwendest für Pen und Brush die gleiche Farbe! Weisser Adler auf weissem Grund?

BadenPower 21. Mai 2015 12:33

AW: Daten aus Array zeichnen
 
Zitat:

Zitat von HHennig (Beitrag 1302448)
Hallo,
ich glaube den Fehler gefunden zu haben:

Du verwendest für Pen und Brush die gleiche Farbe! Weisser Adler auf weissem Grund?

Darauf wurde bereits in #22 hingewiesen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:02 Uhr.

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