Autor |
Beitrag |
lauraelsa
Hält's aus hier
Beiträge: 4
|
Verfasst: 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
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
public
end;
var FormBestellung: TFormBestellung;
implementation
{$R *.dfm}
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;
procedure TFormBestellung.SButtonLoeschenClick(Sender: TObject); begin EditD.Text := ''; EditB.Text := ''; EditVA.Text := ''; EditPA.Text := ''; EditVB.Text := ''; EditPB.Text := '';
end;
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', '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); ReadLn(Datei,VA,PA); EditVA.Text :=FloatToStr(VA); EditPA.Text :=FloatToStr(PA); ReadLn(Datei,VB,PB); EditVB.Text :=FloatToStr(VB); EditPB.Text :=FloatToStr(PB); CloseFile(Datei); end; end; if Button=idCancel then ShowMessage('Vorgang abgebrochen'); end; end;
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); WriteLn(Datei,EditVA.Text,' ',EditPA.Text); WriteLn(Datei,EditVB.Text,' ',EditPB.Text); CloseFile(Datei); end;
end; end;
procedure TFormBestellung.EditDAKeyPress(Sender: TObject; var Key: Char); begin
if not (Key in ['0'..'9',',',#8]) then begin Key := #0; ShowMessage('Bitte nur Ziffern bzw. Komma eingeben!'); end
end;
end. |
Moderiert von Narses: Delphi-Tags hinzugefügt
|
|
Narses
Beiträge: 10181
Erhaltene Danke: 1254
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Di 06.09.11 11:42
Moin und im Forum!
Welche Fehlermeldung wird denn ausgegeben und an welcher Stelle im Code tritt der Fehler auf?
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
lauraelsa
Hält's aus hier
Beiträge: 4
|
Verfasst: 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
Beiträge: 10181
Erhaltene Danke: 1254
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Di 06.09.11 11:45
Moin!
lauraelsa hat folgendes geschrieben : | 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?
Tipp: Der erste Schritt zum Beheben von Fehlern ist sich klar zu machen, wo genau das Problem liegt.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
lauraelsa
Hält's aus hier
Beiträge: 4
|
Verfasst: Di 06.09.11 11:52
|
|
Horschdware
Beiträge: 744
Erhaltene Danke: 54
Win XP Pro, Win 7 Pro x64
Delphi 7, Delphi XE, C++ Builder 5, SAP R/3
|
Verfasst: 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
Beiträge: 10181
Erhaltene Danke: 1254
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Di 06.09.11 12:06
Moin!
Habe den Code mal in ein neues Projekt kopiert:
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:
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
Beiträge: 1331
Erhaltene Danke: 123
Mac OSX, Arch
TypeScript (Webstorm), Kotlin, Clojure (IDEA), Golang (VSCode)
|
Verfasst: 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
Hält's aus hier
Beiträge: 4
|
Verfasst: 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
Beiträge: 744
Erhaltene Danke: 54
Win XP Pro, Win 7 Pro x64
Delphi 7, Delphi XE, C++ Builder 5, SAP R/3
|
Verfasst: Di 06.09.11 13:18
Ja, genau das ist die Lösung
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
Beiträge: 10181
Erhaltene Danke: 1254
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Di 06.09.11 14:06
Moin!
Horschdware hat folgendes geschrieben : | 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. 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:
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).
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
|