Autor Beitrag
lauraelsa
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Di 06.09.11 11:36 
wir sind relativ delphi unerfahren udn haben von unserem dozenten den auftrag ein delphiprogramm zu erstellen, leider scheitern wir an der erstellung einer zeichenfläche und finden den fehler nicht, vielleicht kann jemand weiterhelfen.

viele grüße und vielen dank

laura

ausblenden volle Höhe Delphi-Quelltext
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:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
unit Bestellung;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus, ExtCtrls, Buttons, ToolWin, ComCtrls, StdCtrls;

type
TFormBestellung = class(TForm)
MenueDatei: TMainMenu;
DateiDatei: TMenuItem;
DateiOeffnen: TMenuItem;
DateiSpeichern: TMenuItem;
N1: TMenuItem;
DateiBeenden: TMenuItem;
ToolBar1: TToolBar;
SButtonEinlesen: TSpeedButton;
SButtonZeichnen: TSpeedButton;
SButtonLoeschen: TSpeedButton;
SButtonOeffnen: TSpeedButton;
SButtonSpeichern: TSpeedButton;
Splitter1: TSplitter;
BitBtnClose: TBitBtn;
PageControl1: TPageControl;
TabSheetEingabe: TTabSheet;
TabSheetBestellmenge: TTabSheet;
TabSheetGesamtkosten: TTabSheet;
TabSheetKosten: TTabSheet;
TabSheetAufgabe5: TTabSheet;
TabSheetAufgabe6: TTabSheet;
OpenDialog: TOpenDialog;
SaveDialog: TSaveDialog;
GroupBoxLieferantA: TGroupBox;
GroupBoxLieferantB: TGroupBox;
LabelVA: TLabel;
LabelPA: TLabel;
LabelFA: TLabel;
EditVA: TEdit;
EditPA: TEdit;
EditFA: TEdit;
LabelVB: TLabel;
LabelPB: TLabel;
LabelFB: TLabel;
EditVB: TEdit;
EditPB: TEdit;
EditFB: TEdit;
LabelRA: TLabel;
EditRA: TEdit;
LabelRB: TLabel;
EditRB: TEdit;
GroupBoxBEstellmenge: TGroupBox;
LabelDA: TLabel;
LabelB: TLabel;
EditD: TEdit;
EditB: TEdit;
GroupBoxOptimum: TGroupBox;
LabelLieferantA: TLabel;
LabelLieferantB: TLabel;
EditGesamtkostenA: TEdit;
EditGesamtkostenB: TEdit;
GroupBoxEntscheidung: TGroupBox;
Label3: TLabel;
EditBestellmengeUnter: TEdit;
Label4: TLabel;
EditLiefernatenwahl1: TEdit;
Label5: TLabel;
Label6: TLabel;
EditBestellmengeUeber: TEdit;
Label7: TLabel;
EditLieferantwahl2: TEdit;
Label8: TLabel;
ImageBestellung: TImage;
procedure SButtonSpeichernClick(Sender: TObject);
procedure SButtonOeffnenClick(Sender: TObject);
procedure SButtonLoeschenClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure EditDAKeyPress(Sender: TObject; var Key: Char);


private
{ Private declarations }
public
{ Public declarations }
end;

var
FormBestellung: TFormBestellung;

implementation

{$R *.dfm}

{******************Grafische Darstellung der Gesamtkosten**********************}

procedure TFormBestellung.FormCreate(Sender: TObject);
var OldPenStyle : TPenStyle;
begin
OldPenStyle := ImageBestellung.Canvas.Pen.Style;
ImageBestellung.Canvas.Pen.Style := psDash;
ImageBestellung.Canvas.MoveTo(200,0);
ImageBestellung.Canvas.LineTo(200,400);
ImageBestellung.Canvas.MoveTo(0,200);
ImageBestellung.Canvas.LineTo(400,200);
ImageBestellung.Canvas.Pen.Style := OldPenStyle;
end;

{****************************Werte löschen***************************************}
procedure TFormBestellung.SButtonLoeschenClick(Sender: TObject);
begin
EditD.Text := '';
EditB.Text := '';
EditVA.Text := '';
EditPA.Text := '';
EditVB.Text := '';
EditPB.Text := '';
{SButtonZeichnen.Enabled := False;
SButtonFlaeche.Enabled := False;
SButtonWinkel.Enabled := False;
SButtonLoeschen.Enabled := False; }

end;

{****************************Werte laden***************************************}
procedure TFormBestellung.SButtonOeffnenClick(Sender: TObject);
var Datei : TextFile;
Button : Integer;
D,B,VA,PA,VB,PB : Single;
begin
begin
Button := Application.MessageBox('Klicken Sie OK, '#13#10' wenn Sie die Werte einlesen möchten',
//'#13#10' --> gibt einen Zeilenumbruch an
'Werte',mb_OKCancel+mb_DefButton1);
if Button=idOK then
begin
if OpenDialog.Execute then
begin
SButtonLoeschenClick(Sender);
AssignFile(Datei,OpenDialog.FileName);
Reset(Datei);
ReadLn(Datei,D,B);
EditD.Text :=FloatToStr(D);
EditB.Text :=FloatToStr(B);
// Einlesen der Bestellmengen
ReadLn(Datei,VA,PA);
EditVA.Text :=FloatToStr(VA);
EditPA.Text :=FloatToStr(PA);
// Einlesen der Werte für A
ReadLn(Datei,VB,PB);
EditVB.Text :=FloatToStr(VB);
EditPB.Text :=FloatToStr(PB);
// Einlesen der Werte für B
CloseFile(Datei);
end;
end;
if Button=idCancel then ShowMessage('Vorgang abgebrochen');
end;
end;
{**********************Werte in Datei speichern********************************}
procedure TFormBestellung.SButtonSpeichernClick(Sender: TObject);
var Datei : TextFile;
begin
if MessageDlg('Klicken Sie Ja, wenn Sie die Werte speichern möchten',
mtInformation, [mbYes, mbNo], 0) = mrYes then
begin
if SaveDialog.Execute then
begin
AssignFile(Datei,SaveDialog.FileName);
Rewrite(Datei);
WriteLn(Datei,EditD.Text,' ',EditB.Text);
//Speichern der Werte der Bestellmengen
WriteLn(Datei,EditVA.Text,' ',EditPA.Text);
//Speichern der Werte des Lieferanten A innerhalb einer Zeile
WriteLn(Datei,EditVB.Text,' ',EditPB.Text);
//Speichern der Werte des Lieferanten B innerhalb einer Zeile
CloseFile(Datei);
end;

end;
end;

{*******************************************************************************
Prozedur KeyPress
*******************************************************************************}


procedure TFormBestellung.EditDAKeyPress(Sender: TObject;
var Key: Char);
begin
//prueft, ob 0-9,[,] oder Backspace gedrueckt wird:
// Wichtig !! die Prozdur kann auch anderen TEdit-Komponenten zugeordnet werden

if not (Key in ['0'..'9',',',#8]) then
begin
Key := #0;
ShowMessage('Bitte nur Ziffern bzw. Komma eingeben!');
end

end;
{*******************************************************************************
Fehlermeldung bei falscher Eingabe
*******************************************************************************}


end.


Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10181
Erhaltene Danke: 1254

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Di 06.09.11 11:42 
Moin und :welcome: im Forum!

Welche Fehlermeldung wird denn ausgegeben und an welcher Stelle im Code tritt der Fehler auf? :nixweiss:

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
lauraelsa Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Di 06.09.11 11:43 
es tritt keine fehlermeldung auf und es gibt keinen fehler im code, aber es zeigt die zeichenfläche die wir mit canvas erstellen wollten leider auch nicht an
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10181
Erhaltene Danke: 1254

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Di 06.09.11 11:45 
Moin!

user profile iconlauraelsa hat folgendes geschrieben Zum zitierten Posting springen:
es tritt keine fehlermeldung auf und es gibt keinen fehler im code, aber es zeigt die zeichenfläche die wir mit canvas erstellen wollten leider auch nicht an
OK. ;) Dann bleibt aber immer noch die Frage, an welcher Stelle im Code das Problem auftritt? :gruebel:

Tipp: Der erste Schritt zum Beheben von Fehlern ist sich klar zu machen, wo genau das Problem liegt. :idea:

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
lauraelsa Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Di 06.09.11 11:52 
ich vermute dass da irgendwo der fehler liegt
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TFormBestellung.FormCreate(Sender: TObject);
var OldPenStyle : TPenStyle;
begin
OldPenStyle := ImageBestellung.Canvas.Pen.Style;
ImageBestellung.Canvas.Pen.Style := psDash;
ImageBestellung.Canvas.MoveTo(200,0);
ImageBestellung.Canvas.LineTo(200,400);
ImageBestellung.Canvas.MoveTo(0,200);
ImageBestellung.Canvas.LineTo(400,200);
ImageBestellung.Canvas.Pen.Style := OldPenStyle;
end;


Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt
Horschdware
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 744
Erhaltene Danke: 54

Win XP Pro, Win 7 Pro x64
Delphi 7, Delphi XE, C++ Builder 5, SAP R/3
BeitragVerfasst: Di 06.09.11 12:03 
Was sollte der Code denn tun und was tut er bei dir tatsächlich?
An sich schaut der in Ordnung aus und sollte so funktionieren (gestricheltes Kreuz zeichnen?).

_________________
Delphi: XE - OS: Windows 7 Professional x64
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10181
Erhaltene Danke: 1254

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Di 06.09.11 12:06 
Moin!

Habe den Code mal in ein neues Projekt kopiert:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
type
  TForm1 = class(TForm)
    ImageBestellung: TImage;
    procedure FormCreate(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

procedure TForm1.FormCreate(Sender: TObject);
var OldPenStyle : TPenStyle;
begin
OldPenStyle := ImageBestellung.Canvas.Pen.Style;
ImageBestellung.Canvas.Pen.Style := psDash;
ImageBestellung.Canvas.MoveTo(200,0);
ImageBestellung.Canvas.LineTo(200,400);
ImageBestellung.Canvas.MoveTo(0,200);
ImageBestellung.Canvas.LineTo(400,200);
ImageBestellung.Canvas.Pen.Style := OldPenStyle;
end;
Funktioniert einwandfrei:

Form1

Was sollte denn passieren?

cu
Narses
Einloggen, um Attachments anzusehen!
_________________
There are 10 types of people - those who understand binary and those who don´t.
FinnO
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1331
Erhaltene Danke: 123

Mac OSX, Arch
TypeScript (Webstorm), Kotlin, Clojure (IDEA), Golang (VSCode)
BeitragVerfasst: Di 06.09.11 12:21 
Moin,

ich hatte schon ein paar mal Probleme mit Canvas im OnCreate, kann aber nicht beschwören, ob mir das nicht bei einer Paintbox passiert ist. Versucht mal das Gitter in einem anderen Event zu zeichnen (nur so testweise), z.B. im OnShow oder sowas.
lauraelsa Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Di 06.09.11 13:09 
hey, vielen dank

genau dass soll passieren, komischerweise tut es das im gesamten programm leider nicht, wir haben das allerdings auf einem tabsheet auf einem pagecontrol drauf, kann es vielleicht auch daran liegen?

viele grüße
Horschdware
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 744
Erhaltene Danke: 54

Win XP Pro, Win 7 Pro x64
Delphi 7, Delphi XE, C++ Builder 5, SAP R/3
BeitragVerfasst: Di 06.09.11 13:18 
Ja, genau das ist die Lösung :idea:

Das Problem bei der Sache ist, dass du direkt auf Canvas zeichnet. Verdeckt nun ein anderes Objekt (z.B. anderes Fenster) das Objekt, auf dem du gezeichnet hast (hier: TImage), dann wird ein Neuzeichnen des Objekts ausgelöst. Die Canvas-Zeichnung wird dabei überschrieben und NICHT neugezeichnet - das hast du ja nur beim Erstellen des Formulars umgesetzt.

Hier sind nun zwei Lösungen denkbar:
a) Du zeichnest erst, wenn das Tabsheet gewechselt wird, d.h. wenn die Grafik angezeigt werden soll
b) du zeichnest beim Erstellen des Formulars in eine temporäre Grafik (TPicture) und weist diese deinem TImage zu.

Lösung a) ist schneller umgesetzt, hat aber wieder den Nachteil, dass die Zeichnung "verschwindet", wenn sich ein anderes Fenster darüberschiebt. Sie würde nach einem erneuten Tabwechsel jedoch wieder erscheinen.

_________________
Delphi: XE - OS: Windows 7 Professional x64
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10181
Erhaltene Danke: 1254

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Di 06.09.11 14:06 
Moin!

user profile iconHorschdware hat folgendes geschrieben Zum zitierten Posting springen:
Das Problem bei der Sache ist, dass du direkt auf Canvas zeichnet.
Ja, das ist nicht so schön, das ist mir auch direkt aufgefallen, aber da es im Test kein Problem machte, hab ich´s auch erstmal so gelassen. :?

Zur Erläuterung: Eine TImage-Komponente ist eigentlich zum Anzeigen eines statischen Bildes gedacht, für selbst gezeichnete Sachen sollte man besser eine TPaintBox verwenden. :idea: Allerdings, wie so oft, hat das alles seine Vor- und Nachteile. Wenn man z.B. ein Bild zwar selbst "malt", dieses sich aber nur selten verändert, dann ist eine TPaintBox nicht so optimal, weil hier u.U. sehr oft ein Neuzeichnen fällig wird, was Performance kostet (wenn das Bild sehr komplex ist). Deshalb kann man durchaus auch ein TImage für selbst gezeichnetes verwenden, allerdings sollte man dann auch auf das in dem Kontainer enthaltene Bild zeichnen und nicht auf dem Formular (was dann eben nur temporär ist und ggfs. wieder verschwinden kann).

Hier mal der Code so umgebaut, dass auf einem in dem TImage-Kontainer angelegten Bild gezeichnet wird:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TForm1.FormCreate(Sender: TObject);
begin
  ImageBestellung.Picture.Bitmap.PixelFormat := pf24bit;
  ImageBestellung.Picture.Bitmap.Width := ImageBestellung.Width;
  ImageBestellung.Picture.Bitmap.Height := ImageBestellung.Height;
  ImageBestellung.Picture.Bitmap.Canvas.Pen.Style := psDash;
  ImageBestellung.Picture.Bitmap.Canvas.MoveTo(200,0);
  ImageBestellung.Picture.Bitmap.Canvas.LineTo(200,400);
  ImageBestellung.Picture.Bitmap.Canvas.MoveTo(0,200);
  ImageBestellung.Picture.Bitmap.Canvas.LineTo(400,200);
end;

Hier muss dann im restlichen Code noch darauf geachtet werden, dass das Canvas des enthaltenen Bitmaps (also ImageBestellung.Picture.Bitmap.Canvas) verwendet wird und nicht das Canvas des Kontainers (ImageBestellung.Canvas). :idea:

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.