![]() |
Diese prozedur gängig machen
Hi!!
ich hab da ne prozedur, sie funktioniert (syntaktisch), aber nicht sinn gemäß. Hier mal eine kostprobe: Quellcode: zusammenfalten | markieren
Delphi-Quellcode:
bitte nicht verwechseln: Rad=Radius des kreises in Pixel
procedure TForm1.DrawModel(Canvas:TCanvas;AtomNr,Rad:integer);
var x0,y0,n,k:integer; a,sa:Real; begin x0:=Form1.ClientWidth div 2; {Mitte der Form finden} y0:=Form1.ClientHeight div 2; a:=ANr / 2; {Formel für bestimmung von Elektronen pro Schale: 2*n^2} sa:=sqrt(a); {Gleichung aufstellen: nach n auflösen; ges.:n=Anzahl SchAle} n:=round(sa); {Atom Nummer=2*n^2 | /2} {<=> Atom Nummer/2=n^2 | Wurzel} {<=> Wurzel(Atom Nummer/2) = n} Canvas.Ellipse(x0-Rad,y0-Rad,x0+Rad,y0+Rad); {Für den (Atom)Kern} for k:=1 to n do {n gefunden} begin Canvas.Ellipse(x0-(Rad*k),y0-(Rad*k),x2+(Rad*k),y0+(Rad*k));{Kreise zeichnen mit gleichem Abstand} end; end; er zeichnet statt n Kreise nur einen.. ich weiss nicht mehr, was daran so rumzufeilen ist, obwohl das echt simpel ist... :wall: Naja danke im Voraus MfG LkZ |
Re: Diese prozedur gängig machen
was ist denn ANr und x2 ?
|
Re: Diese prozedur gängig machen
ich denke das der alte kreis immer übermalen wird ... ich kanns aber nicht genau sagen weil ich Anr und x2 nicht weiß
|
Re: Diese prozedur gängig machen
ja..ne sind tippfehler
x2=x0 und ANr=AtomNr (Parameter der prozedur) sorry MfG |
Re: Diese prozedur gängig machen
"[Fehler] Unit1.pas(31): Inkompatible Typen: 'Integer' und 'Extended'"
mach mal atomnr zu ner real zahl ;)
Delphi-Quellcode:
AtomNr:=5 / 2; macht aber nicht das nach der formel :gruebel:
AtomNr:=5 / 2; {Formel für bestimmung von Elektronen pro Schale: 2*n^2
ich würde a auch mal initialisieren... |
Re: Diese prozedur gängig machen
naja, also es macht keinen Unterschied.. :) immernoch das selbe problem
|
Re: Diese prozedur gängig machen
Ich sehe nicht, wieso Anr eine real-Zahl sein sollte.
Nachtrag: Ok, zu langsam ;) Nachtrag: bei mir geht der Code einwandfrei. Zumindest wird ein Kreis gezeichnet, der abhängig von "Rad" und "AtomNr" seinen Radius ändert. Was genau geht denn nicht? |
Re: Diese prozedur gängig machen
Hier ist nochmal der "richtige" code (ohne Tippfehler :wink: )
Delphi-Quellcode:
abgesehen von der Formel, weiss ich, wegen den rundungen
procedure TForm1.DrawModel(Canvas:TCanvas;AtomNr:Real;Rad:integer);
var x0,y0,n,k:integer; a,sa:Real; begin x0:=Form1.ClientWidth div 2; {Mitte der Form finden} y0:=Form1.ClientHeight div 2; a:=AtomNr / 2; {Formel für bestimmung von Elektronen pro Schale: 2*n^2} sa:=sqrt(a); {Gleichung aufstellen: nach n auflösen; ges.:n=Anzahl SchAle} n:=round(sa); {Atom Nummer=2*n^2 | /2} {<=> Atom Nummer/2=n^2 | Wurzel} {<=> Wurzel(Atom Nummer/2) = n} Canvas.Ellipse(x0-Rad,y0-Rad,x0+Rad,y0+Rad); {Für den (Atom)Kern} for k:=1 to n do {n gefunden} begin Canvas.Ellipse(x0-(Rad*k),y0-(Rad*k),x0+(Rad*k),y0+(Rad*k)); {Kreise zeichen mit gleichem Abstand} end; end; bei der for-to-do Schleife müsste eigentl. k:=2 to n, weil die zeile vor der schleife den Atomkern zeichnet. wenn k:=1 und Rad*k = Rad, dann haut das nicht wirklich hin. Toll ....2. Problem MfG :) |
Re: Diese prozedur gängig machen
war nur beiläufig...
aber ich glaube das dzdas besser mit ner function machen solltest - vl geht das gezeichnete verloren ... |
Re: Diese prozedur gängig machen
Zitat:
Oder man macht es im OOP, da hab ich aber meine mängel. MfG |
Re: Diese prozedur gängig machen
Zitat:
Und was soll zurück gegeben werden? :gruebel: ich würde es so lassen, geht doch einwandfrei, nur, dass der Kreis evtl. nicht den Bedürfnissen von LkZ entspricht. ;) |
Re: Diese prozedur gängig machen
vl ein bitmap .. was er dann im form1 mit canvas.draw zeichnet :stupid:
|
Re: Diese prozedur gängig machen
Zitat:
|
Re: Diese prozedur gängig machen
Oder man zwischenspeichert die Kreise; Ich hab das gefühl das die "überschrieben" werden
|
Re: Diese prozedur gängig machen
hab den code grad mal überflogen und ja, deine vorherigen kreise werden überschrieben, da du von innen nach außen zeichnest, womit die immer größer werdenden neu gezeichneten kreise die alten überdecken (und der größte kommt zuletzt)... versuch mal die for-to-do schleife durch eine for-downto-do zu ersetzen und den atomkern dementsprechend als letztes zu zeichnen
//Edit: oder ich hab den code nich ordentlich überflogen und die kreise werden kleiner, dann weiß ich es auch nich :stupid: |
Re: Diese prozedur gängig machen
Zitat:
|
Re: Diese prozedur gängig machen
Die Lösung...
Delphi-Quellcode:
es muss vom äussersten zum kleinsten kreis gezeichnet werden, da alles im kreis neu gezeichnet wird!!!
procedure TForm1.DrawModel(Canvas:TCanvas;AtomNr:Real;Rad:integer);
var x0,y0,k,d:integer; begin x0:=Form1.ClientWidth div 2; y0:=Form1.ClientHeight div 2; // Canvas.Ellipse(x0-Rad,y0-Rad,x0+Rad,y0+Rad); // -> wird in der schleife gezeichnet for k:=round(sqrt(AtomNr/2)) downto 1 do // -> hier war der fehler !!!! begin d:=Rad*k; // nur einmal berechnet je durchgang! Canvas.Ellipse(x0-d,y0-d,x0+d,y0+d); end; end; |
Re: Diese prozedur gängig machen
Zitat:
|
Re: Diese prozedur gängig machen
Alternativ könnte man die Brush.color auch auf durchsichtig setzen...
|
Re: Diese prozedur gängig machen
Ja danke leute, is mir gestern auch eingefallen.. :thumb: hab ich auch schon gemacht
bis dann MfG LKZ |
Re: Diese prozedur gängig machen
dachte mir ja das die kreise übermalen werden s.o
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:11 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz