Rivago |
Dynamisches Array und Ausgabe in StringGrid
Hallo
Hab hier eine Aufgabe, siehe Bild:
code: |
1:
|
fs2.directupload.net/images/150601/6sxud3zn.png |
|
Programmierung mit Pascal unter Lazarus (Version 1.2.6)..
Momentan sieht mein Programm so aus:
code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
|
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, TAGraph, Forms, Controls, Graphics, Dialogs, StdCtrls,Grids, Buttons, GUI_Unit_xyChart;
type { TForm1 }
TForm1 = class(TForm)
BitBtn1: TBitBtn;
BU_EVA: TButton;
Chart1: TChart;
ED_Anzahl: TEdit;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
Label8: TLabel;
Label9: TLabel;
LB_Erg: TListBox;
SG_Erg: TStringGrid;
procedure BU_EVAClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ private declarations }
public { public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
var
y1 : Array [0..99] of Double;
y2 : Array [0..99] of Double;
dt : Array [0..99] of Double; //Array, damit t ausgegeben werden kann
//dabei ist dt = t = t + sw
procedure TForm1.FormCreate(Sender: TObject);
begin
Form1.Caption := 'Test der gui_unit_xyChart';
BU_EVA.Caption := 'Berechnung';
//Testdaten
ED_Anzahl.Text := '20';
//Listbox leeren
Form1.LB_Erg.Clear;
//StringGrid leeren
Form1.SG_Erg.Clear;
//Diagramm leeren
//Form1.Chart1.Clear; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! funktioniert so nicht
end; //Ende Prozedur FormCreate
procedure TForm1.BU_EVAClick(Sender: TObject);
//Variablen deklarieren
var
Anz, //Anz = Anzahl der Wertepaare (mind. 10, max. 100)
i: Integer; // i ist Zählvariable für for-Schleife
sw, //sw = Schrittweite
t: Double; //t für Formel
begin
//Eingabe von Anz in ED_Anzahl
Anz := StrToInt(ED_Anzahl.Text);
//Plausibilitätsprüfung, ob Anz ausreichend ist
if (Anz < 10) or (Anz > 100)
Then ShowMessage ('Wert muss >=10 und <=100 sein!');
//Edit-Feld ED_Anzahl zur erneuten Eingabe vorbereiten, falls Fehler bei //Plausibilitätsprüfung entstanden ist
Ed_Anzahl.Clear; //Edit-Feld ED_Anzahl leeren
Ed_Anzahl.SetFocus; //Cursor in Edit-Feld ED_Anzahl setzen
//Berechnung
i := 0;
sw := 20/(Anz - 1);
t := 0;
for i := 0 to Anz do
begin
y1[i] := sin(t);
y2[i] := exp(0.1*(t)) * sin(t);
dt[i] := t;
t := t + sw; //t um die Schrittweite erhöhen
end; //Ende for-Schleife
//Ausgabe
//Ausgabe für Listbox LB_Erg
LB_Erg.Items.Add(Format('%5.2s %20.2s %20.2s', ['t', 'y1', 'y2'])); //Tabellenkopf
for i:=0 to Anz - 1 do
begin
LB_Erg.Items.Add(Format('%5.2n %20.2n %20.2n', [dt[i], y1[i], y2[i]]));
end; //Ende for-Schleife
//Ausgabe für StringGrid SG_Erg
........................................
........................................
........................................
end; //Ende Prozedur BU_EVAClick
end. |
|
Soweit läuft es.
Mich würde mal interessieren, ob und wie ich ein dynamisches Array hinkrieg? Wie sieht da der Quellcode aus?
Des Weiteren weiß ich nicht, wie ich die Ausgabe in das StringGrid machen muss. Kann mir da jemand helfen?
Wenn wir das geschafft haben, wäre es cool, wenn mir noch jemand erklären kann, wie ich das Diagramm hinkrieg
Danke und Gruß
Rivago |
eulerscheZahl |
Delphi ist bei mir schon eine Weile her.
Ein dynamisches Array deklarierst du mit
y1 : Array of Double;
dann kannst du mit
setlength(y1, 100); die Größe festlegen.
Den Rest schaue ich mir morgen an, wenn mir keiner zuvorkommt. |
Rivago |
Also einfach so:
y1 : Array of Double;
setlenght(y1, 100);
Das wars?
Geht dieses Array dann bei 1 oder bei 0 los?
Denn ich hab ja ursprünglich so deklariert:
y1: Array [0..99] of Double;
Also von 0 bis 99.
Ist deine Version jetzt von 1 bis 100?
Danke schonmal für die Antwort
|
eulerscheZahl |
Ist von 0 bis 99.
Du kannst du Grenzen auch explizit angeben:
code: |
1:
2:
|
setlength(y1, 0, 99); //von 0 bis 99
setlength(y1, 1, 100); //von 1 bis 100 |
|
edit: hier das StringGrid
code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
|
procedure TForm1.Button1Click(Sender: TObject);
var i : integer;
t : real;
begin
StringGrid1.RowCount := 101;
StringGrid1.Cells[0, 0] := 't';
StringGrid1.Cells[1, 0] := 'y1';
StringGrid1.Cells[2, 0] := 'y2';
for i := 1 to 100 do
begin
t := i / 10;
StringGrid1.Cells[0, i] := FloatToStr(t);
StringGrid1.Cells[1, i] := FloatToStr(sin(t));
StringGrid1.Cells[2, i] := FloatToStr(exp(0.1*t)*sin(t));
end;
end; |
|
|
Rivago |
Hallo eulersche Zahl, Danke für deine Hilfe
|