Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Wiederherstellen eines TImages
Soapy - Do 27.12.07 23:18
Titel: Wiederherstellen eines TImages
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:
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:
| 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
DrRzf - 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.
Soapy - Do 27.12.07 23:25
Ich versuchs mal! Danke!
DrRzf - Do 27.12.07 23:29
Zeichnest du jeden Punkt in dem koordinatensystem einzeln ?
Soapy - Do 27.12.07 23:32
Ja bin halt Anfänger!
Soapy - 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 - Fr 28.12.07 00:46
Hallo :welcome:
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 :think:
Delphi-Quelltext
1: 2: 3:
| Begin Koordinatensystem.Canvas.Pixels[x, y].Color.Free; End; |
In dem ist sicherlich ein Fehler drin!^^ :x
Und erschlagt mich, wenn es falsch ist! :autsch:
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 :
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! :angel:
DrRzf - 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.
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:
| 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; |
Bethsoftfan - 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! :D
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!)! :shock:
DrRzf - 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 ?
Soapy - 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 - 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 (':cry:')...
Aber ihr habt mir schon so viel geholfen, dass ich das einfach auch noch fragen muss!
Bethsoftfan - 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 :mahn: [/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? :nixweiss:
Soapy - Fr 28.12.07 12:33
Ich probiers mal! Danke!
Soapy - 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 - Fr 28.12.07 12:38
Und das Koordinatensystem sieht jetzt so aus:
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:
| 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 - 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 |
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!