Einzelnen Beitrag anzeigen

Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#6

Re: Funktionszeichner verbessern

  Alt 16. Dez 2005, 16:28
Hi,
also erstmal pack bitte keine .exe mit in das File, ich habe nur einen ISDN Kanal und glaube da bin ich noch mit > 70% der Deutschen (also kein DSL) konform.

Ich hab ordentlich Kritik zu äussern
Fangen wir mal mit der positiven an:
Für ein erstes Programm nicht schlecht. Bei mir klappt auch alles mit der Einstellung der Fenstergröße.
Dein Programm funktioniert an sich sehr ordentlich, gut selbsterklärend. Der Code-Aufbau ist auch recht sauber, man erkennt auf jeden Fall mal deinen eigenen Stil, aber halt auch schön eingerückt, gut erklärt und so weiter.

Ja, dann aber auch gleich mal zu dem "negativen", nichts wirklich Wildes! Als erstes mal, du hast ein wenig wenig kommentiert. Ist hier natürlich noch nicht so wild, aber gute Programme erkennt man schon an den Kommentaren.

Leider gibt es im Menü Einträge ohne Funktion, aber ich denke die wolltest du einfach noch nachreichen?

Was ich wirklich schlimm finde ist, dass du über kreuz kompilierst. Ich weiß, kann man in Delphi mittels Interface und Implementation machen, ist aber echt nicht schön. Einfachster Fall, du tauscht dein Fenster für die Einstellung der zu zeichnenden Funktion aus, schon hast du ein Problem.
Besser ist es immer, wenn du so etwas anders löst. Am besten lässt man jede Unit immer nur das sehen, was sie kennen muss. Für dein Programm braucht das Fenster mit den Einstellungen doch eigentlich nicht wissen für wen diese Einstellungen wichtig sind. Es kann sie jedoch leicht (z.B. als public Klassenvariablen, properties etc) nach aussen zur Verfügung stellen. Da dein Hauptprogramm dieses einstellungs Fenster kennt, kann es dort dann die Wert abfragen (lässt du ja eh modal anzeigen).
Natürlich kannst du es auch anders lösen. Ein weiterer Ansatz wäre es, einen Funktionszeiger zu speichern und diese Funktion immer aufzurufen, wenn etwas geändert wurde. Die entsprechende Funktion würde dann zu deiner Hauptform gehören.
Etwas mehr OOP wäre es dann, ein Interface zu deklarieren (oder eine abstrakte Klasse) und dort dann eine solche Methode zu haben, dann müsste dein Hauptprogramm dieses Interface implementieren bzw. die abstrakte Klasse ableiten.

Ansonsten solltest du bei den if-Abfragen immer ein begin und end setzen, auch wenn nur die nächste Zeile zur Bedingung gehören soll. Das ist einfach guter Codestil, auch wenn er häufig als überflüssig bezeichnet wird, du vermeidest unnötige Fehler.
Wenn du mehrere Dinge prüfst, die disjunkt sind
Delphi-Quellcode:
if Funktion = 1 then
  y := LineareFunktion(strtoFloat(formneu.editM.text),
         strtofloat(formneu.editQ.text), x);
if Funktion = 2 then
  y := quadratischeFunktion(strtofloat(formneu.editM.text),
         strtofloat(formneu.editP.text),
         strtofloat(formneu.editQ.text),
         x);
if Funktion = 3 then
  y := PotenzFunktion3Ordnung(strtofloat(formneu.editM.text),
         strtofloat(formneu.editP.text),
         strtofloat(formneu.editQ.text),
         x);
dann solltest du ein else oder eine case-Anweisung verwenden. Da die Funktion nur einen Wert annehmen kann, wird nichts unnötig überprüft (auch wenn Compiler da eh optimieren).
Delphi-Quellcode:
if Funktion = 1 then
  begin
    y := LineareFunktion(strtoFloat(formneu.editM.text),
         strtofloat(formneu.editQ.text), x);
  end
else if Funktion = 2 then
  begin
    y := quadratischeFunktion(strtofloat(formneu.editM.text),
         strtofloat(formneu.editP.text),
         strtofloat(formneu.editQ.text),
         x);
  end;
else if Funktion = 3 then
  begin
    y := PotenzFunktion3Ordnung(strtofloat(formneu.editM.text),
         strtofloat(formneu.editP.text),
         strtofloat(formneu.editQ.text),
         x);
  end;
oder

Delphi-Quellcode:
case Funktion of
1 : y := LineareFunktion(strtoFloat(formneu.editM.text),
          strtofloat(formneu.editQ.text), x);
2: y := quadratischeFunktion(strtofloat(formneu.editM.text),
         strtofloat(formneu.editP.text),
         strtofloat(formneu.editQ.text),
         x);
3: y := PotenzFunktion3Ordnung(strtofloat(formneu.editM.text),
         strtofloat(formneu.editP.text),
         strtofloat(formneu.editQ.text),
         x);
Statt StrToFloat solltest du auch lieber ein StrToFloatDef benutzen. Würde man im Moment einen Buchstaben eingeben, kommt es zu einem Fehler, den kannst du so vermeinden (mehr verrät die OH).

Das wär's auch erstmal. Ist keine böse Kritik, ich finde es ist insgesamt ein sehr sehr gutes Programm! Die Kritik ist wirklich konstruktiv gemeint. Mein erstes Größeres hatte gar nichts an Struktur oder Ähnlichem, die Dinge die ich hier genannt habe sind echt Kleinigkeiten. Das Wichtigste ist immer, das ein Programm funktioniert und das ist definitiv bei dir erfüllt.

Ein paar Dinge, die du planen könntest :
- Zoom und bewegen mit der Maus
- Festlegen einer Area of Interest
- Eigene Funktionen
- Export des geplotteten Graphen als BMP und/oder JPEG

(nicht alles trivial und nur weitere Anregungen zu denen die du eh schon hast!)

Nur weiter so,
Gruß Der Unwissende

PS Ein teil durch rote Kästen doppelt, aber die ignorier ich jetzt (zu faul)
  Mit Zitat antworten Zitat