![]() |
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. |
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:
und kürze das später aus:
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;
Delphi-Quellcode:
Bei einfachen Dinge geht's natürlich auch anderes, aber wenn's aus irgendwelchen Gründe kompliziert ist, dann helfe ich mir so.
procedure OnPaint(Sender: TObject);
begin for i:=0 to length(wertearray) do begin canvas.lineto(wertearray[i] + (i * abstand), x); end; end; |
AW: Daten aus Array zeichnen
Super Idee, werd ich mal machen ! Danke Dir
|
AW: Daten aus Array zeichnen
Guck dir evtl. dieses Beispiel an:
![]() Da habe ich auch aus einem Array gezeichnet. |
AW: Daten aus Array zeichnen
Zitat:
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.... |
AW: Daten aus Array zeichnen
@Captnemo, hab grad erst Dein Bsp. gesehen, werd ich morgen mal machen nach der Uni ausprobieren ! Danke Dir
|
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. |
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.
|
AW: Daten aus Array zeichnen
Zitat:
Bringt mich aber jetzt nicht wirklich weiter Popov |
AW: Daten aus Array zeichnen
Zitat:
Delphi-Quellcode:
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.
public
... ReadInArray :Array of Real; procedure DrawMeasureValue(const ReadInArray : Array of Real); 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. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:01 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