Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Diese prozedur gängig machen (https://www.delphipraxis.net/34684-diese-prozedur-gaengig-machen.html)

LkZ 26. Nov 2004 14:34


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:
 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;
bitte nicht verwechseln: Rad=Radius des kreises in Pixel
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

Nicodius 26. Nov 2004 15:02

Re: Diese prozedur gängig machen
 
was ist denn ANr und x2 ?

Nicodius 26. Nov 2004 15:03

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ß

LkZ 26. Nov 2004 15:04

Re: Diese prozedur gängig machen
 
ja..ne sind tippfehler

x2=x0 und ANr=AtomNr (Parameter der prozedur)

sorry

MfG

Nicodius 26. Nov 2004 15:05

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;               {Formel für bestimmung von Elektronen pro Schale: 2*n^2
AtomNr:=5 / 2; macht aber nicht das nach der formel :gruebel:


ich würde a auch mal initialisieren...

LkZ 26. Nov 2004 15:07

Re: Diese prozedur gängig machen
 
naja, also es macht keinen Unterschied.. :) immernoch das selbe problem

Matze 26. Nov 2004 15:08

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?

LkZ 26. Nov 2004 15:13

Re: Diese prozedur gängig machen
 
Hier ist nochmal der "richtige" code (ohne Tippfehler :wink: )

Delphi-Quellcode:
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;
abgesehen von der Formel, weiss ich, wegen den rundungen
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 :)

Nicodius 26. Nov 2004 15:14

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 ...

LkZ 26. Nov 2004 15:19

Re: Diese prozedur gängig machen
 
Zitat:

Zitat von Nicodius
war nur beiläufig...

aber ich glaube das dzdas besser mit ner function machen solltest - vl geht das gezeichnete verloren ...

Function mit welchem rückgabewert? Der macht doch nix ausser zeichnen, nix berechnen. :)
Oder man macht es im OOP, da hab ich aber meine mängel.

MfG

Matze 26. Nov 2004 15:19

Re: Diese prozedur gängig machen
 
Zitat:

Zitat von Nicodius
war nur beiläufig...

aber ich glaube das dzdas besser mit ner function machen solltest - vl geht das gezeichnete verloren ...

eine Function?

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. ;)

Nicodius 26. Nov 2004 15:24

Re: Diese prozedur gängig machen
 
vl ein bitmap .. was er dann im form1 mit canvas.draw zeichnet :stupid:

LkZ 26. Nov 2004 15:30

Re: Diese prozedur gängig machen
 
Zitat:

Zitat von Matze
Zitat:

Zitat von Nicodius
war nur beiläufig...

aber ich glaube das dzdas besser mit ner function machen solltest - vl geht das gezeichnete verloren ...

eine Function?

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. ;)

Wie kann man das denn hinbekommen, dass es meinen bedürfnissen entspricht? :oops:

LkZ 26. Nov 2004 15:34

Re: Diese prozedur gängig machen
 
Oder man zwischenspeichert die Kreise; Ich hab das gefühl das die "überschrieben" werden

Nothine 26. Nov 2004 17:37

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:

Matze 26. Nov 2004 17:57

Re: Diese prozedur gängig machen
 
Zitat:

Zitat von LkZ
Wie kann man das denn hinbekommen, dass es meinen bedürfnissen entspricht? :oops:

Ich meinte damit nur, es zeichnet einen Kreis, nur willst du den Kreis wahrscheinlich anders haben, weil ja etwas an dem Code nicht stimmt, laut deiner Aussage. ;)

ibp 26. Nov 2004 19:29

Re: Diese prozedur gängig machen
 
Die Lösung...


Delphi-Quellcode:
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;
es muss vom äussersten zum kleinsten kreis gezeichnet werden, da alles im kreis neu gezeichnet wird!!!

ibp 26. Nov 2004 19:53

Re: Diese prozedur gängig machen
 
Zitat:

Zitat von Nothine
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:

ooops :duck: da war ja die lösung schon!

atreju2oo0 26. Nov 2004 20:29

Re: Diese prozedur gängig machen
 
Alternativ könnte man die Brush.color auch auf durchsichtig setzen...

LkZ 27. Nov 2004 11:52

Re: Diese prozedur gängig machen
 
Ja danke leute, is mir gestern auch eingefallen.. :thumb: hab ich auch schon gemacht

bis dann
MfG LKZ

Nicodius 27. Nov 2004 11:55

Re: Diese prozedur gängig machen
 
dachte mir ja das die kreise übermalen werden s.o


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:42 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz