Autor |
Beitrag |
Soapy
      
Beiträge: 88
Windows 2000
Delphi 2005 Personal
|
Verfasst: Do 27.12.07 23:18
Hallo
ich habe ein Programm geschrieben, das Lineare Funktionen darstellen kann.
Ich habe in einem TImage ein Koordinatensystem erstellt, in dem diese linearen Funktionen angezeigt werden.
Es läuft bis hier hin alles prima...
Es zeichnet die Funktion richtig in das Koordinatensysem...
jetzt kommt mein Problem...
Ich möchte, dass der Standartzustand (Den Zustand den ich in FormCreate geschrieben habe) wieder hergestellt wird.
Das möchte ich mit dem Löschen-Button und der zugehörigen Löschen-Prozedur bewerkstelligen.
Man beachte, dass das Koordinatensystem in einem TImage ist.
Wie müsste nun meine Löschen-Prozedur aussehen?
So sieht es aus:
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:
| unit Unit2;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls;
type TForm2 = class(TForm) Koordinatensystem: TImage; Loeschen: TButton; Zeichnen: TButton; fvonxgleich: TLabel; Steigung: TEdit; malxplus: TLabel; yachsenabschnitt: TEdit; Label1: TLabel; procedure ZeichnenClick(Sender: TObject); procedure LoeschenClick(Sender: TObject); procedure FormCreate(Sender: TObject); private public end;
var Form2: TForm2; x,y : Integer; varSteigung, varyachsenabschnitt : Real; a,b : Real; Gleitkommasteigung: Real;
implementation
{$R *.dfm}
procedure TForm2.FormCreate(Sender: TObject); begin x := Koordinatensystem.clientwidth div 2; y := 350; Koordinatensystem.Canvas.MoveTo(x,y); Koordinatensystem.Canvas.LineTo(450, 900); Koordinatensystem.Canvas.MoveTo(x,y); Koordinatensystem.Canvas.LineTo(450, 0); Koordinatensystem.Canvas.MoveTo(x,y); Koordinatensystem.Canvas.LineTo(0, 350); Koordinatensystem.Canvas.MoveTo(x,y); Koordinatensystem.Canvas.LineTo(900, 350);
end;
procedure TForm2.LoeschenClick(Sender: TObject); begin
end;
procedure TForm2.ZeichnenClick(Sender: TObject); begin Koordinatensystem.Canvas.MoveTo(x,y); varSteigung := StrToFloat(Steigung.Text); varyachsenabschnitt := StrToFloat(yachsenabschnitt.Text); a := x + (varSteigung*400);
b := y - (varyachsenabschnitt*40);
Koordinatensystem.Canvas.MoveTo(x, Trunc(b)); Koordinatensystem.Canvas.LineTo(Trunc(a), Trunc(b)-400);
Gleitkommasteigung := StrToFloat(Steigung.Text); Gleitkommasteigung := 1/Gleitkommasteigung; Label1.Caption := FloatToStr(Gleitkommasteigung); end;
end. |
Ich hoffe ihr könnt mir weiterhelfen!
Vielen Dank
Zuletzt bearbeitet von Soapy am Do 27.12.07 23:23, insgesamt 1-mal bearbeitet
|
|
DrRzf
      
Beiträge: 260
Win XP Prof
D7 Enterprise
|
Verfasst: Do 27.12.07 23:23
Lager deine Zeichenvorgänge die in FormCreate stecken in eine eigene procedure/function aus und rufe diese in FormCreate und in der Löschprocedure auf.
Und vergiss nicht das Image vor dem Neuzeichnen zu Clearen.
_________________ rein statistisch gesehen darf man keiner statistik trauen die man nicht selbst gefälscht hat.
Zuletzt bearbeitet von DrRzf am Do 27.12.07 23:26, insgesamt 1-mal bearbeitet
|
|
Soapy 
      
Beiträge: 88
Windows 2000
Delphi 2005 Personal
|
Verfasst: Do 27.12.07 23:25
|
|
DrRzf
      
Beiträge: 260
Win XP Prof
D7 Enterprise
|
Verfasst: Do 27.12.07 23:29
Zeichnest du jeden Punkt in dem koordinatensystem einzeln ?
_________________ rein statistisch gesehen darf man keiner statistik trauen die man nicht selbst gefälscht hat.
|
|
Soapy 
      
Beiträge: 88
Windows 2000
Delphi 2005 Personal
|
Verfasst: Do 27.12.07 23:32
|
|
Soapy 
      
Beiträge: 88
Windows 2000
Delphi 2005 Personal
|
Verfasst: Do 27.12.07 23:56
Mist des geht nicht!
Aber danke für deinen Vorschlag!
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure TLineareFunktionen.LoeschenClick(Sender: TObject); begin LineareFunktionen.Standart(Sender); end;
procedure TLineareFunktionen.FormCreate(Sender: TObject); begin LineareFunktionen.Standart(Sender); end; |
So sieht es aus aber das funktioniert auch nicht!
Ich habe jetzt mal die Unit hochgeladen, damit ihr sie euch selber mal anschauen könnt!
|
|
Bethsoftfan
      
Beiträge: 44
Win XP, Linux OpenSuSE 10.3 mit Compiz Fusion :cool:
Delphi 2007 Prof. Delphi 5
|
Verfasst: Fr 28.12.07 00:46
Hallo
also zwecks übersicht erstmal bissl aufräumen!
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| ... Koordinatensystem.Canvas.Pixels[10,30..710] := clblack; Koordinatensystem.Canvas.Pixels[50,30..750] := clblack; Koordinatensystem.Canvas.Pixels[90,30..710] := clblack; Koordinatensystem.Canvas.Pixels[130,30..710] := clblack; Koordinatensystem.Canvas.Pixels[170,30..710] := clblack; Koordinatensystem.Canvas.Pixels[210,30..710] := clblack; Koordinatensystem.Canvas.Pixels[250,30..710] := clblack; Koordinatensystem.Canvas.Pixels[290,30..710] := clblack; Koordinatensystem.Canvas.Pixels[330,30..710] := clblack; Koordinatensystem.Canvas.Pixels[370,30..710] := clblack; ... |
Und zur Frage: Ein einfacher Einfall
Delphi-Quelltext 1: 2: 3:
| Begin Koordinatensystem.Canvas.Pixels[x, y].Color.Free; End; |
In dem ist sicherlich ein Fehler drin!^^
Und erschlagt mich, wenn es falsch ist!
Oder :
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:
| Koordinatensystem.Canvas.MoveTo(x,y); Koordinatensystem.Canvas.LineTo(450, 900); Koordinatensystem.Canvas.MoveTo(x,y); Koordinatensystem.Canvas.LineTo(450, 0); Koordinatensystem.Canvas.MoveTo(x,y); Koordinatensystem.Canvas.LineTo(0, 350); Koordinatensystem.Canvas.MoveTo(x,y); Koordinatensystem.Canvas.LineTo(900, 350); Koordinatensystem.Canvas.Pixels[10,30] := clblack; Koordinatensystem.Canvas.Pixels[10,70] := clblack; Koordinatensystem.Canvas.Pixels[10,110] := clblack; Koordinatensystem.Canvas.Pixels[10,150] := clblack; Koordinatensystem.Canvas.Pixels[10,190] := clblack; Koordinatensystem.Canvas.Pixels[10,230] := clblack; Koordinatensystem.Canvas.Pixels[10,270] := clblack; Koordinatensystem.Canvas.Pixels[10,310] := clblack; Koordinatensystem.Canvas.Pixels[10,390] := clblack; Koordinatensystem.Canvas.Pixels[10,430] := clblack; Koordinatensystem.Canvas.Pixels[10,470] := clblack; Koordinatensystem.Canvas.Pixels[10,510] := clblack; Koordinatensystem.Canvas.Pixels[10,550] := clblack; Koordinatensystem.Canvas.Pixels[10,590] := clblack; Koordinatensystem.Canvas.Pixels[10,630] := clblack; Koordinatensystem.Canvas.Pixels[10,670] := clblack; Koordinatensystem.Canvas.Pixels[10,710] := clblack; ... |
Oder einfach :
Delphi-Quelltext
bin halt ein noob, aber versuche zu helfen
Delphi-Quelltext 1: 2:
| [DCC Fehler] Bethsoftfan.pas(1): E2029 'Brauchbare Antwort' erwartet, aber 'Müll' gefunden! [DCC Fataler Fehler] Bethsoftfan.pas konnte nicht verwendet werden! |
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| IF Bethsoft.Wissen = 0 THEN
FROM Bethsoftfan:= 0 TO Bethsoftfan:=1 DO Bethsoftfan.überlebenschancenimforum := 0; Bethsoftfan.Beliebtheit:=Bethsoftfan.Beliebtheit - 100; Bethsoftfan.Wissen := Bethsoftfan.Wissen - 1; END
ELSE Bethsoftfan.überlebenschancenimforum := 100; Bethsoftfan.Beliebtheit := Bethsoftfan.Beliebtheit + 100; Bethsoftfan.Wissen := Bethsoftfan.Wissen + 1; :think: |
So, mein Wort zum Freitag! 
|
|
DrRzf
      
Beiträge: 260
Win XP Prof
D7 Enterprise
|
Verfasst: Fr 28.12.07 01:09
Ich dachte da etwa das du das auf diese art machst.
ander möglichkeit wäre das Bitmap in einer Temporären Bitmap zwischenzuspeichern und es dann bei löschen wieder drüberzuzeichnen.
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:
| unit Unit2;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls;
type TForm2 = class(TForm) Koordinatensystem: TImage; Loeschen: TButton; Zeichnen: TButton; fvonxgleich: TLabel; Steigung: TEdit; malxplus: TLabel; yachsenabschnitt: TEdit; Label1: TLabel; procedure ZeichnenClick(Sender: TObject); procedure LoeschenClick(Sender: TObject); procedure FormCreate(Sender: TObject); private public procedure DrawRaster; end;
var Form2: TForm2; x,y : Integer; varSteigung, varyachsenabschnitt : Real; a,b : Real; Gleitkommasteigung: Real;
implementation
{$R *.dfm}
procedure TForm2.DrawRaster; begin Koordinatensystem.Canvas.Draw.Rectangle(0,0,Koordinatensystem.width,Koordinatensystem.height) x := Koordinatensystem.clientwidth div 2; y := 350; Koordinatensystem.Canvas.MoveTo(x,y); Koordinatensystem.Canvas.LineTo(450, 900); Koordinatensystem.Canvas.MoveTo(x,y); Koordinatensystem.Canvas.LineTo(450, 0); Koordinatensystem.Canvas.MoveTo(x,y); Koordinatensystem.Canvas.LineTo(0, 350); Koordinatensystem.Canvas.MoveTo(x,y); Koordinatensystem.Canvas.LineTo(900, 350);
end;
procedure TForm2.FormCreate(Sender: TObject); begin DrawRaster; end;
procedure TForm2.LoeschenClick(Sender: TObject); begin DrawRaster; end;
procedure TForm2.ZeichnenClick(Sender: TObject); begin Koordinatensystem.Canvas.MoveTo(x,y); varSteigung := StrToFloat(Steigung.Text); varyachsenabschnitt := StrToFloat(yachsenabschnitt.Text); a := x + (varSteigung*400); b := y - (varyachsenabschnitt*40); Koordinatensystem.Canvas.MoveTo(x, Trunc(b)); Koordinatensystem.Canvas.LineTo(Trunc(a), Trunc(b)-400); Gleitkommasteigung := StrToFloat(Steigung.Text); Gleitkommasteigung := 1/Gleitkommasteigung; Label1.Caption := FloatToStr(Gleitkommasteigung); end;
end. |
hier deine pünktchen...
Delphi-Quelltext 1: 2: 3:
| for i := 0 to 16 do for j := 0 to 12 do Koordinatensystem.Canvas.Pixels[10 + j * 40,30 + i * 40] := clblack; |
_________________ rein statistisch gesehen darf man keiner statistik trauen die man nicht selbst gefälscht hat.
|
|
Bethsoftfan
      
Beiträge: 44
Win XP, Linux OpenSuSE 10.3 mit Compiz Fusion :cool:
Delphi 2007 Prof. Delphi 5
|
Verfasst: Fr 28.12.07 01:55
So also um eine Schleife zu schreiben müsste ich erstmal wissen, warum du das gemacht hast?
Delphi-Quelltext 1:
| Koordinatensystem.Canvas.Pixels[50,750] := clblack; |
Bei den anderen geht das nur von [x, 710] warum also so einen Ausbrecher?
So die Schleife wäre dann :
Delphi-Quelltext 1: 2: 3: 4:
| Begin While Not Koordinatensystem.Canvas.Pixels[890,710] do Koordinatensystem.Canvas.Pixels[10..890, 30..710] := clblack; End; |
Oder auch :
Delphi-Quelltext 1: 2: 3:
| ... Koordinatensystem.Canvas.Pixels[10..890, 30..710] := clblack; ... |
Ich habe mal mein erstes Project (noch mit Delphi 5) herrausgekramt und es war vom 6.2.2006, also ne Ecke her und ich bin nicht viel besser geworden
Manchmal sollte man mir Delphi wegnehmen!
Oder auch :
Delphi-Quelltext 1: 2: 3: 4: 5:
| From x:=10 to 890 do Koordinatensystem.Canvas.Pixels[10..890] := clblack; ... From y:=30 to 710 do Koordinatensystem.Canvas.Pixels[30..710] := clblack; |
So das wars, oh schon Freitag (weil edit, wird aber nicht angezeigt!)! 
|
|
DrRzf
      
Beiträge: 260
Win XP Prof
D7 Enterprise
|
Verfasst: Fr 28.12.07 05:13
die schleife macht dir aus deinen 150 ? punkten und quelltextzeilen gerade mal 3 zeilen code.
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| Koordinatensystem.Canvas.Pixels[10,30] := clblack; Koordinatensystem.Canvas.Pixels[10,70] := clblack; Koordinatensystem.Canvas.Pixels[10,110] := clblack; ... ... ... |
was soll das werden ?
akzeptiert das überhaupt der compiler ?
Delphi-Quelltext 1:
| Koordinatensystem.Canvas.Pixels[10..890, 30..710] := clblack; |
ne Frage von mir
Bethsoftfan = Soapy ?
_________________ rein statistisch gesehen darf man keiner statistik trauen die man nicht selbst gefälscht hat.
|
|
Soapy 
      
Beiträge: 88
Windows 2000
Delphi 2005 Personal
|
Verfasst: Fr 28.12.07 10:51
Ich habe jetzt wieder ein bisschen dran rumgebastelt und siehe da es geht!
Ich habe es jetzt so gelöst:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| procedure TLineareFunktionen.LoeschenClick(Sender: TObject); begin Koordinatensystem.Canvas.Brush.Color:=clWhite; Koordinatensystem.Canvas.FillRect(Rect(0,0,Koordinatensystem.Width,Koordinatensystem.Height)); LineareFunktionen.Standart(Sender); end; |
Das mit den Punkten werde ich noch mal überarbeiten!
Mir hat das danze Punktesystem auch nicht gefallen!
Vielen Dank!
|
|
Soapy 
      
Beiträge: 88
Windows 2000
Delphi 2005 Personal
|
Verfasst: Fr 28.12.07 11:10
Noch eine Frage...
Wenn die gezeichnete Linie nicht auf der y-Achse aufhören soll, sondern auch noch in den negativen Bereich gehen soll, wie mach ich dass?
Ich habs schon mit einfachem negieren von den Punkten im positiven Bereich versucht, das funktioniert aber nicht!
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| Koordinatensystem.Canvas.MoveTo(x,y); varSteigung := StrToFloat(Steigung.Text); varyachsenabschnitt := StrToFloat(yachsenabschnitt.Text); a := x + (varSteigung*400); aminus := -(x + (varSteigung*(400))); b := y - (varyachsenabschnitt*40); bminus := - (y - (varyachsenabschnitt*40));
Koordinatensystem.Canvas.MoveTo(x, Trunc(b)); Koordinatensystem.Canvas.LineTo(Trunc(a), Trunc(b)-400); Koordinatensystem.Canvas.MoveTo(x, Trunc(b)); Koordinatensystem.Canvas.LineTo(Trunc(aminus), Trunc(bminus)+400); |
Ich weiß dass ich nerve ('  ')...
Aber ihr habt mir schon so viel geholfen, dass ich das einfach auch noch fragen muss!
|
|
Bethsoftfan
      
Beiträge: 44
Win XP, Linux OpenSuSE 10.3 mit Compiz Fusion :cool:
Delphi 2007 Prof. Delphi 5
|
Verfasst: Fr 28.12.07 12:15
DrRzf hat folgendes geschrieben: | die schleife macht dir aus deinen 150 ? punkten und quelltextzeilen gerade mal 3 zeilen code.
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| Koordinatensystem.Canvas.Pixels[10,30] := clblack; Koordinatensystem.Canvas.Pixels[10,70] := clblack; Koordinatensystem.Canvas.Pixels[10,110] := clblack; ... ... ... |
was soll das werden ?
akzeptiert das überhaupt der compiler ?
Delphi-Quelltext 1:
| Koordinatensystem.Canvas.Pixels[10..890, 30..710] := clblack; |
ne Frage von mir
Bethsoftfan = Soapy ? |
[ironie]naja, bei deiner Gleichung hättest du den Compiler geschrottet  [/ironie]
nein im ernst man hätte es anderst regeln können, bei mir würde er alle Pixel schwarz anmalen, weil ich nicht angegeben haben, in
welchen abständen
so wär es richtiger :
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| While not Koordinatensystem.Canvas.Pixels[10..890, 30] = clblack; do Koordinatensystem.Canvas.Pixels[10, 30]; .............. While not Koordinatensystem.Canvas.Pixels[10..890, 70] = clblack do Koordinatensystem.Canvas.Pixels[10, 70]; ................ |
Aber zur Frage :
Delphi-Quelltext 1:
| aminus := -(x + (varSteigung*(400))); |
vielleicht ein minus vor 400? 
|
|
Soapy 
      
Beiträge: 88
Windows 2000
Delphi 2005 Personal
|
Verfasst: Fr 28.12.07 12:33
|
|
Soapy 
      
Beiträge: 88
Windows 2000
Delphi 2005 Personal
|
Verfasst: Fr 28.12.07 12:35
Delphi-Quelltext 1:
| aminus := (x + (varSteigung*(-400))); |
So geht es!
Das Minus vor der Klammer weg und vor die 400 hängen!
Vielen Dank!
Jetzt hab ich mein erstes Programm geschrieben was man auch zu etwas gebrauchen kann!
|
|
Soapy 
      
Beiträge: 88
Windows 2000
Delphi 2005 Personal
|
Verfasst: Fr 28.12.07 12:38
Und das Koordinatensystem sieht jetzt so aus:
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:
| procedure TLineareFunktionen.Standart(Sender: TObject); var i, j: integer; var k, l: integer; begin Koordinatensystem.Canvas.MoveTo(0,0); Koordinatensystem.Canvas.LineTo(Koordinatensystem.clientwidth-1, 0); Koordinatensystem.Canvas.LineTo(Koordinatensystem.clientwidth-1, Koordinatensystem.ClientHeight-1); Koordinatensystem.Canvas.LineTo(0, Koordinatensystem.ClientHeight-1); Koordinatensystem.Canvas.LineTo(0, 0); x := (Koordinatensystem.Clientwidth div 2); y := (Koordinatensystem.ClientHeight div 2); Koordinatensystem.Canvas.MoveTo(x,y); Koordinatensystem.Canvas.LineTo(0 , y); Koordinatensystem.Canvas.MoveTo(x,y); Koordinatensystem.Canvas.LineTo(Koordinatensystem.clientwidth, y); Koordinatensystem.Canvas.MoveTo(x,y); Koordinatensystem.Canvas.LineTo(x, Koordinatensystem.Clientheight); Koordinatensystem.Canvas.MoveTo(x,y); Koordinatensystem.Canvas.LineTo(x, 0); Koordinatensystem.Canvas.TextOut(x-2, -8, 'x'); Koordinatensystem.Canvas.TextOut(Koordinatensystem.clientwidth-3, y-8, 'x'); Koordinatensystem.Canvas.TextOut(x-10, 10, 'x'); Koordinatensystem.Canvas.TextOut(Koordinatensystem.clientwidth-10, y+10, 'y'); for i := 0 to 16 do for j := 0 to 23 do Koordinatensystem.Canvas.Pixels[x + j * 40,y - i * 40] := clblack; for k := 0 to 16 do for l := 0 to 23 do Koordinatensystem.Canvas.Pixels[x - k * 40, y + l * 40] := clblack; for k := 0 to 16 do for l := 0 to 23 do Koordinatensystem.Canvas.Pixels[x + k * 40, y + l * 40] := clblack; for k := 0 to 16 do for l := 0 to 23 do Koordinatensystem.Canvas.Pixels[x - k * 40, y - l * 40] := clblack; end; |
|
|
DrRzf
      
Beiträge: 260
Win XP Prof
D7 Enterprise
|
Verfasst: Fr 28.12.07 16:38
Sieht ja schon besser aus.
und die 4 for schleifen könntest du in eine packen
Delphi-Quelltext 1: 2:
| for i := -16 to 16 do for j := -23 to 23 do |
_________________ rein statistisch gesehen darf man keiner statistik trauen die man nicht selbst gefälscht hat.
|
|
|