| Autor |
Beitrag |
Eloare
Hält's aus hier
Beiträge: 8
|
Verfasst: Do 29.01.04 15:26
also, ich habe nen Image1, auf dem ich per Koordinaten eine Bitmap einfügen möchte, das einfügen an sich funktioniert auch, bloß liegt die Bitmap dann unter dem Image1 und ich sehs dann halt nicht.
Hab da folgendermaßen geschrieben:
Delphi-Quelltext 1: 2: 3:
| Z := TBitmap.create; Z.LoadFromFile('C:\...\Z.bmp'); form1.Image1.canvas.draw(trunc(wurzel(quadrat(a)-quadrat(b)))+433,353,Z); |
Also wenn irgendwer weiß wie ich des "über" des Image1 krieg würde mir das sehr helfen. Der Befehl ist übrigens der letzte im Programm, also liegt es nicht daran dass die Bitmap danach noch überzeichnet wird.
Schonmal danke im Vorraus...
mfg Eloare
Moderiert von Peter Lustig: Code- durch Delphi-Tags ersetzt
|
|
catweasel
      
Beiträge: 487
Erhaltene Danke: 1
Win 7 64bit
Delphi 7 Second Sedition V7.2
|
Verfasst: Do 29.01.04 17:43
vielleicht hilft dir die bringtofront Prozedur weiter ...
Catweasel
_________________ Pommes werden schneller fertig wenn man sie vor dem Frittieren einige Minuten in siedendes Fett legt.
|
|
Eloare 
Hält's aus hier
Beiträge: 8
|
Verfasst: Do 29.01.04 18:58
ne, damit gehts nicht, da man damit nur Formen ansprechen kann (sagt auch die Hilfe).
mfg Eloare
|
|
Eloare 
Hält's aus hier
Beiträge: 8
|
Verfasst: Do 29.01.04 20:02
also, ich füge die Bitmap damit ein:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| if (a > b) then begin bitmap := TBitmap.create; bitmap.LoadFromFile('C:\...\Z.bmp'); form1.Image1.canvas.draw(trunc(wurzel(quadrat(a)-quadrat(b))) +433-16,353-16,bitmap); end else begin bitmap := TBitmap.create; bitmap.LoadFromFile('C:\...\Z.bmp'); form1.Image1.canvas.draw(433-16,353+trunc(wurzel(quadrat(a) -quadrat(b)))-16,bitmap); end; |
wobei a und b von Eingaben abhängig sind.
Das komische daran ist jetzt: wenn a=b fügt er die Bitmap ein und ich sehe sie, wenn a>b fügt er die Bitmap entweder nicht ein, oder er legt sie "unter" ein anderes Image drunter.
Ist also vielleicht irgendwas an der if-Anweisung falsch?
Wenn a<b spinnt er ganz und sagt auch noch: Invalid floating point operation.
Das heißt doch das irgendwas mit den Gleitkommastellen nicht past, oder?
mfg Eloare
|
|
teebee
      
Beiträge: 109
D6 Prof
|
Verfasst: Fr 30.01.04 08:23
| Eloare hat folgendes geschrieben: | Wenn a<b spinnt er ganz und sagt auch noch: Invalid floating point operation.
Das heißt doch das irgendwas mit den Gleitkommastellen nicht past, oder? |
Nein, das heisst hier, dass Du wahrscheinlich eine Wurzel aus einer negativen Zahl ziehen willst. (Ich setze einfach mal voraus, dass Deine Funktionen wurzel() und quadrat() das tun, was ihr Name verspricht.)
Wenn a<b, dann a^2<b^2, dann steht unter der Wurzel eine Zahl <0.
Du solltest Deine Berechnung nochmal überdenken.
Gruß, teebee
|
|
Eloare 
Hält's aus hier
Beiträge: 8
|
Verfasst: Fr 30.01.04 08:46
Danke, es lag an der Wurzel.
Aber wegen der Bitmap hat wohl keiner ne Idee an was es liegt?
mfg Eloare
|
|
teebee
      
Beiträge: 109
D6 Prof
|
Verfasst: Fr 30.01.04 11:12
Könnte es sein, dass die Abmessungen Deines Image nicht groß genug sind, bzw. Deine Koordinaten irgendwo außerhalb des Images liegen? In dem Fall wird nämlich das Bild abgeschnitten.
Vielleicht musst Du nochmal die Koordinaten überprüfen, die bei Deiner Berechnung enstehen.
BTW: Du solltest Dein Bitmap-Objekt auch wieder freigeben: Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| Try bm := TBitmap.Create; bm.LoadFromFile(...); image1.canvas.draw(...,bm); Finally FreeAndNil(bm); End; | Gruß, teebee
|
|
Eloare 
Hält's aus hier
Beiträge: 8
|
Verfasst: Fr 30.01.04 13:22
| teebee hat folgendes geschrieben: | Könnte es sein, dass die Abmessungen Deines Image nicht groß genug sind, bzw. Deine Koordinaten irgendwo außerhalb des Images liegen? In dem Fall wird nämlich das Bild abgeschnitten.
|
nein, weil wenn ich dir Koordinaten mit Absicht so wähle dass sie ausserhalb des Images liegen, dann sehe ich die Bitmap
mfg Eloare
Edit: das wiederfreigeben der Bitmap bringt mir doch bloß das es keinen Speicher unnötig belegt, oder?
|
|
teebee
      
Beiträge: 109
D6 Prof
|
Verfasst: Fr 30.01.04 13:33
| Eloare hat folgendes geschrieben: | | teebee hat folgendes geschrieben: | Könnte es sein, dass die Abmessungen Deines Image nicht groß genug sind, bzw. Deine Koordinaten irgendwo außerhalb des Images liegen? In dem Fall wird nämlich das Bild abgeschnitten.
|
nein, weil wenn ich dir Koordinaten mit Absicht so wähle dass sie ausserhalb des Images liegen, dann sehe ich die Bitmap |
Das verstehe ich jetzt nicht...
| Eloare hat folgendes geschrieben: | | Edit: das wiederfreigeben der Bitmap bringt mir doch bloß das es keinen Speicher unnötig belegt, oder? |
Genau. Und sobald Du aus der Funktion, in der das TBitmap.Create steht rausgehst, wird 'bitmap' entfernt, falls es sich um eine lokale Variable handelt (nur der Zeiger wohlgemerkt), und Du kommst nie mehr an den Speicher um ihn freizugeben. Falls 'bitmap' eine globale Variable ist, wird der Wert spätestens beim nächsten Funktionsaufruf überschrieben. Wenn es ein Feld in Deiner Hauptform ist, wird zwar bei Beendigung des Programms das Bitmap freigegben, aber eben nur das letzte, mehrfache Funktionsaufrufe führen dann auch zu Speicherlecks.
Prinzipiell sollte man Objekte, die man dynamisch erstellt, nach Gebrauch wieder freigeben. Dann kann man nix übersehen.
Gruß, teebee
|
|
Eloare 
Hält's aus hier
Beiträge: 8
|
Verfasst: Fr 30.01.04 13:44
Zu dem nicht verstehen:
Des Image erstreckt sich halt nicht über die ganze Form, sondern nur über einen Teil. Wenn ich die Koordinaten so wähle das die Bitmaps ausserhalb des Images aber noch auf der Form liegen, dann seh ichs.
Ich hoffe das war verständlich, sonst mach ich halt noch nen Screenshot.
mfg Eloare
|
|
teebee
      
Beiträge: 109
D6 Prof
|
Verfasst: Fr 30.01.04 15:17
Das klingt jetzt echt seltsam, vielleicht postest Du mal etwas Code, und zeigst mal nen Screenshot.
Gruß, teebee
|
|
Eloare 
Hält's aus hier
Beiträge: 8
|
Verfasst: Fr 30.01.04 15:42
also. erstmal der 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: 115:
| unit Bahnen;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls;
type TForm1 = class(TForm) BerechneButton: TButton; Image1: TImage; aEdit: TLabeledEdit; bEdit: TLabeledEdit; Image2: TImage; procedure BerechneButtonClick(Sender: TObject); private { Private declarations } public { Public declarations } end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure drawFunc(a,b:real); var z,x : real; begin x := 0; Repeat z:= (x*Pi)/180; form1.image1.Canvas.Pixels [trunc(a*10*cos(z))+433,trunc(b*10*sin(z))+353]:= clblack; x := x + (1/10); Until x > 360; end;
procedure gehe_nach( c,d:integer); begin form1.image1.Canvas.pen.color:=clblack; form1.image1.Canvas.pen.width:=1; form1.image1.Canvas.moveto(c,d) end;
procedure linie(e,f:integer); begin form1.image1.Canvas.pen.color:=clblack; form1.image1.Canvas.pen.width:=1; form1.image1.Canvas.lineto(e,f); end;
function quadrat(k:real):real; begin result:=Exp(k); end;
function wurzel(m: Extended): Extended; begin result:=Sqrt(m); end;
procedure TForm1.BerechneButtonClick(Sender: TObject); var a,b:real; c,d,e,f,g,h,i,j:integer; bitmap : TBitmap; begin Image1.Picture.LoadFromFile('C:\...\blanc.bmp'); Image2.Picture.LoadFromFile('C:\...\erlaeuterung.bmp'); a:=StrToInt(aedit.text); b:=StrToInt(bedit.text); c:=trunc((a*(-10))+433); d:=trunc(353); e:=trunc((a*10)+433); f:=trunc(353); drawFunc(a,b); gehe_nach(c,d); linie(e,f); g:=trunc(433); h:=trunc((b*10)+353); i:=trunc(433); j:=trunc((b*(-10))+353); gehe_nach(g,h); linie(i,j); try if (a > b) then begin bitmap := TBitmap.create; bitmap.LoadFromFile('C:\...\Z.bmp'); form1.Image1.canvas.draw(trunc(wurzel(quadrat(a)-quadrat(b)))+433-16,353-16,bitmap); end else begin bitmap := TBitmap.create; bitmap.LoadFromFile('C:\...\Z.bmp'); form1.Image1.canvas.draw(433-16,353+trunc(wurzel(quadrat(b)-quadrat(a)))-16,bitmap); end; Finally FreeAndNil(bitmap);
end;
end;
end. |
und der screenshot:
hmm, Problem, brauch ich dafür eigenen Webspace? hab ich mämlich nicht, kann ihn Notfalls aber auch per email schicken ...
mfg Eloare
PS: danke für die Hilfe
[/url]
|
|
teebee
      
Beiträge: 109
D6 Prof
|
Verfasst: Fr 30.01.04 15:56
Also, was das seltsame Verhalten der Images angeht, da hab ich auch keine Ahnung, waoran das liegen könnte. Bei mir klappt es, wenn ich eine Bitmap lade und dann eine andere drüberpinsele.
Aber zu Deiner Funktion quadrat(): Exp(x) liefert e^x und nicht 2^x! Das geht mit sqr(x).
Gruß, teebee
|
|
Eloare 
Hält's aus hier
Beiträge: 8
|
Verfasst: Fr 30.01.04 16:54
oh du mein Held, mein Retter  , an der falschen Funktion fürs Quadrieren lags
also, nochmals Danke
mfg Eloare
|
|
catweasel
      
Beiträge: 487
Erhaltene Danke: 1
Win 7 64bit
Delphi 7 Second Sedition V7.2
|
Verfasst: Sa 31.01.04 12:49
Hi,
| Zitat: | ich hatte geschrieben : vielleicht hilft dir die bringtofront Prozedur weiter ...
ne, damit gehts nicht, da man damit nur Formen ansprechen kann (sagt auch die Hilfe). |
Nur Formen ?
Also ich bringe damit meine ganzen selbstgestrickten TWinControls dahin wo sie hinsollen :
Beispiel eine selbtgebastelte Fortschrittsanzeige für das bepflastern der Form mit Buttons....
Selbige überlagenr den Progressbar..
Mit bringtofront nach jedem update ist er sehr wohl vorne..
Sollte also icht nur mit Forms gehen... oder?
Catweasel
_________________ Pommes werden schneller fertig wenn man sie vor dem Frittieren einige Minuten in siedendes Fett legt.
|
|
|