Entwickler-Ecke

Open Source Projekte - Darstellung mathematischer Funktionen


Mathematiker - Mi 24.10.12 16:50
Titel: Darstellung mathematischer Funktionen
Hallo,
anbei ein kleines Programm, dass vielleicht hilft, schnell Funktionen zu zeichnen.

Der Hauptteil ist die Unit graf, welche die eigentliche Arbeit übernimmt. Will man eine Funktion zeichnen, so ist einfach das Darstellungsintervall [_x1,_x2] und [_y1,_y2] festzulegen, z.B.

Delphi-Quelltext
1:
    _x2:=6; _x1:=-6; _y2:=5; _y1:=-5;                    

Zweitens werden die Funktionsliste gelöscht, die Funktionsterme in Großbuchstaben(!) eingefügt und die Unit aufgerufen, z.B.

Delphi-Quelltext
1:
2:
3:
4:
    lclear;
    lwriteln(edit1.text);   //z.B. edit1.text ist X*SIN(X)
    lwriteln(edit2.text);   //z.B. edit2.text ist X^2+X-1    usw.
    fgraf.showmodal;

Im Koordinatensystem können einige Einstellungen vorgenommen, die Achsen verschoben und der Definitionsbereich eingegeben werden. Mit der linken Maustaste kann ein Rahmen aufgezogen werden. Ein Menüpunkt bzw. die Space-Taste stellt alles zurück.

Das Hauptprogramm ist nur zur Demonstration des Ganzen gedacht.
Ich vermute auch, dass es schwer ist, durch meinen chaotischen Quelltext zu kommen. :lol: Die Unit soll ja auch nur helfen, wenn jemand ohne großen Aufwand schnell den Graphen einer Funktion zeichnen will.
Irgendwann baue ich noch Speichern, Drucken und Kopieren der Abbildung ein. Wenn ich Lust dazu habe. :wink:

Beste Grüße
Mathematiker

Revisionen:
  1. Manchmal geht es schneller, als man denkt. Die Revision 1 kann jetzt den Funktionsgraphen als Vektorgrafik kopieren und drucken (auf den eingestellten Standarddrucker).
    Vielleicht hat jemand noch eine gute Idee zur Weiterentwicklung. Ich habe auch nichts dagegen, wenn die Idee im Quelltext gleich eingefügt wird. :wink:
  2. Auf Wunsch können 1. und 2.Ableitung der ersten Funktion sowie f(-x), -f(x), -f(-x) und f(f(x)) gezeichnet werden.
  3. Die Eingabe der Funktionen (im Moment max. 4) erfolgt jetzt direkt im Darstellungsfenster. Die oben gemachten Aussagen zum Aufruf der Unit graf aus einem anderen Formular heraus gelten weiter.
  4. Der Funktionsterm kann einen Parameter P enthalten. Dieser ist kontinuierlich veränderbar (Animation) und zeigt so im Verlauf des Graphen seinen Einfluss.
  5. Auf der 1.Funktion kann ein Punkt markiert werden, der mit der Maus verschoben werden kann. Zusätzlich kann eine Tangente angetragen werden.
  6. Fehler (Programmabsturz) bei starkem Zoomen beseitigt.
  7. Außer der Tangente kann auch die Normale im markierten Punkt gezeichnet werden. Während der Animation kann nun auch der Punkt verschoben werden.
  8. Ein zweiter Punkt kann eingezeichnet und mit der Maus verschoben werden. Sekante kann gezeichnet werden.
    Die Fläche unter der Funktion 1 von O bis Punkt A wird markiert und berechnet. Ebenso das bestimmte Integral. f1 und f2 können addiert und multipliziert werden. Eine Stammfunktion zu f1 wird gezeichnet.
  9. floattostr entfernt, erzeugte evtl. Programmabsturz. In die Eingabezeilen können nun auch Terme der Form PI, SQRT(2), ... usw. eingetragen werden.
  10. Die Fläche unter der Kurve und das bestimmte Integral werden im x-Intervall der Punkte A und B ermittelt. Außerdem wird die Umkehrkurve von f1 gezeichnet.
  11. Nullstellen und Extremstellen werden für die 1.Funktion berechnet und weitere kleine Änderungen.
  12. Wendepunkte werden berechnet und gezeichnet. Jetzt auch mit analytischer Differenziation des Funktionsterms!
  13. Die Wendetangenten werden ermittelt und dargestellt.
  14. Die Genauigkeit der Berechnung ist höher. Die Koordinaten der Extrem- und Wendepunkte werden vollständig angegeben.
  15. Die vier Ausgangsfunktionen sind zu- und abschaltbar. Die Schnittpunkte zwischen der 1. und 2.Funktion werden ermittelt.
  16. Die Fläche unter der Kurve wird nun als Fläche zwischen Funktion 1 und 2 ausgewertet, wenn die 2.Funktion gezeichnet wird.
  17. Eine kopierbare Ergebnisliste kann zu- und abgeschaltet werden.
  18. Ableitungsterme werden, zwar nicht vollständig, aber etwas besser zusammengefasst.
  19. Punkt B kann automatisch verschoben werden. Im Quelltext habe die Controls Namen erhalten, die Hinweis auf die Verwendung geben.
  20. Erhöhung der Übersichtlichkeit durch Auslagerung der Sonderfunktionen in das Menü. Zusätzlich Veranschaulichung eines Parametereinflusses auf das Kurvenbild.
  21. Eine Funktionsschar kann für unterschiedliche Parameter P gezeichnet werden.
  22. Einstellmöglichkeiten für das Koordinatensystem sind in das Menü integriert und weitere Änderungen.
  23. Wertetabelle inkl. Funktionswerte und Ableitungswerte enthalten.
  24. Speichern der Abbildung als GIF, BMP oder Vektorgrafik und weitere kleine Änderungen.
  25. Fehler bei der Verschiebung von Punkt A beseitigt.
  26. Erweiterung des Funktionsinterpreters um weitere Funktionsterme, auch exotische.
  27. Vollständige Überarbeitung des Quelltextes mit diversen Änderungen.


Zusätzlich hänge ich eine Variante an, bei der die eigentliche Zeichenarbeit in einer DLL ausgeführt wird. Das Zusatzprogramm demonstriert, wie die DLL verwendet werden kann.
Rev 1-3: übersichtlichere Struktur zur Datenübergabe an die DLL


gerd8888 - Mi 24.10.12 21:27

Der Funktionsplotter funktioniert einwandfrei. Gut gefaellt mir der Effekt, dass man den Kurvenverlauf verstaerken kann.
Aber ehrlich gesagt, hat mir der Funktionsplotter von Fiete aufgrund der Ableitungsfunktion besser gefallen.
Vielleicht wird das ja noch mal eingebaut... ?


Mathematiker - Mi 24.10.12 22:04

Hallo Gerd8888,
user profile icongerd8888 hat folgendes geschrieben Zum zitierten Posting springen:
Aber ehrlich gesagt, hat mir der Funktionsplotter von Fiete aufgrund der Ableitungsfunktion besser gefallen.
Vielleicht wird das ja noch mal eingebaut... ?

Kein Problem, ist schon geschehen, siehe Revision 2. Zusätzlich können auch die gespiegelten Funktionen f(-x), -f(x) und -f(-x) und die Nacheinanderausführung f(f(x)) gezeichnet werden.

Wenn Du weitere Vorschläge hast, so sind die gern gesehen. Fietes Programm ist schön, ohne Zweifel. :zustimm:

Ich möchte aber mit meiner Lösung erreichen, dass man einfach durch Einbinden der Unit graf und wenige Parameter von jedem beliebigen Hauptprogramm aus, eine Funktion zeichnen kann. :)
Vielleicht kann man meine Unit auch als Komponente schreiben. Da ich aber keinerlei Ahnung habe, wie so etwas geht, muss ich da erst einmal passen.
Kann man eigentlich in eine Komponente ein ganzes Formular mit vielen Objekten einfügen? Ich weiß es nicht. :nixweiss:

Beste Grüße
Mathematiker


Palladin007 - Mi 24.10.12 22:17

Hallo Mathematiker,

schönes Programm, allerdings kann ich persönlich damit nur wenig anfangen. Bei Mathe-Hausaufgaben vielleicht, aber da reicht mir normalerweise der Taschenrechner aus.
Was ich aber sehr viel mehr gebrauchen könnte, wäre eine DLL, mit der ich eben diese Oberfläche in anderen Programmen verwenden und darstellen kann.
Soweit ich weiß, gibt es auch Delphi.Net und ist dein Programm nicht mit Delphi geschrieben? Könntest du da nicht auch eine DLL erstellen, die man dann einfach mit z.B. C# verwenden kann?

Ich muss das fragen, weil ich den Quelltext leider wenn überhaupt nur sehr schwer verstehe und es damit auch nicht nutzen kann.


Und dann am besten nicht nur zwei Formeln darstellbar machen, sondern beliebig viele, so kann man das in mathematischen Programmen umfangreich nutzen. ^^


PS: Vielleicht kannst du auch das mm-Raster etwas dicker machen? Ich hab das nicht einmal auf den dritten Blick erkennen können, erst nachdem ich sehr genau hin geschaut habe und das ist ja nicht Sinn eines solchen Rasters. Man muss es ohne Probleme erkennen können.


Mathematiker - Mi 24.10.12 22:26

Hallo Palladin,
user profile iconPalladin007 hat folgendes geschrieben Zum zitierten Posting springen:
Was ich aber sehr viel mehr gebrauchen könnte, wäre eine DLL, mit der ich eben diese Oberfläche in anderen Programmen verwenden und darstellen kann.
Soweit ich weiß, gibt es auch Delphi.Net und ist dein Programm nicht mit Delphi geschrieben? Könntest du da nicht auch eine DLL erstellen, die man dann einfach mit z.B. C# verwenden kann?

Eine DLL ist ein gute Idee, und schon habe ich zwei neue Probleme.
1. Delphi.Net mit meinem Delphi 5? Das dürfte wohl nicht gehen.
2. Wie erstelle ich eine DLL, die ein Formular enthält und an die ich Parameter (4 Zahlen) und eine Stringliste (Funktionen) übergebe? :nixweiss:
DLLs als Datencontainer kann ich, aber das ...? Rätsel über Rätsel!

user profile iconPalladin007 hat folgendes geschrieben Zum zitierten Posting springen:
Und dann am besten nicht nur zwei Formeln darstellbar machen, sondern beliebig viele, so kann man das in mathematischen Programmen umfangreich nutzen. ^^

Das geht schon jetzt. Im aufrufenden Formular müssen einfach in die Liste mit lwriteln(term) die Funktionen term eingetragen werden. Das können auch 10 oder mehr sein. Allerdings wird es dann unübersichtlich.
In meinem Beispiel habe ich im Moment nur die zwei Eingabezeilen. Es geht aber problemlos mehr.

Was das Raster angeht, werde ich evtl. die Farbe etwas dunkler machen.

Beste Grüße
Mathematiker


gerd8888 - Mi 24.10.12 22:29

Das schaut jetzt gut aus. Etwas stoert mich die Funktionseingabe, dass wenn man eine neue Funktion laden will auf ENDE gehen muss. Ich faende es besser, wenn man oben im einfachen edit die funktion eingeben koennte.

Aber man kann damit wirklich gut arbeiten.
Da Du dich Mathematiker nennst eine kurze Frage dazu: Gibt es eigentlich ein Programm, wo man die Flaeche (Integration) festlegen kann und angezeigt bekommt.
Z.B. bei der erste Ableitung der Geschwindigkeit, die Fläche waere der Weg.

(Nur noch eine Frage am Rande. Hast Du die Verbesserung (also mit der Ableitung jetzt so schnell waerend Deines Urlaubes mal so schnell nebenbei geschrieben.)
Beachtlich!


Mathematiker - Mi 24.10.12 22:37

Hallo Gerd8888,
user profile icongerd8888 hat folgendes geschrieben Zum zitierten Posting springen:
Etwas stoert mich die Funktionseingabe, dass wenn man eine neue Funktion laden will auf ENDE gehen muss. Ich faende es besser, wenn man oben im einfachen edit die funktion eingeben koennte.

Ich werde dies ändern, d.h. das Darstellungsfenster werde ich zum Hauptformular machen. Kein großes Problem.
user profile icongerd8888 hat folgendes geschrieben Zum zitierten Posting springen:
Gibt es eigentlich ein Programm, wo man die Flaeche (Integration) festlegen kann und angezeigt bekommt. Z.B. bei der erste Ableitung der Geschwindigkeit, die Fläche waere der Weg.

Ich verstehe es so: Du möchstet einen Flächeninhalt angeben und das Programm soll von 0 oder einem anderen x aus die Fläche unter der Funktion markieren, die diesen Wert besitzt? Ist machbar, dauert aber etwas.
Denn ...
user profile icongerd8888 hat folgendes geschrieben Zum zitierten Posting springen:
Hast Du die Verbesserung (also mit der Ableitung jetzt so schnell waerend Deines Urlaubes mal so schnell nebenbei geschrieben.

Die Änderung dauerte 30 Minuten. Ich weiß, das ist Angeberei. :oops:
Es war nur ein Kurzurlaub: 2 Tage Sächsische Schweiz. Ab Freitag bin ich für 8 Tage weg, deshalb dauert das mit der Fläche etwas länger.

Beste Grüße
Mathematiker


Palladin007 - Mi 24.10.12 22:45

Problem 1 kann ich so auf Anhieb auch nicht lösen :D
Problem 2 auch nicht. :D Aber ich kann überlegen, ist nicht die Struktur der Kapselung in Delphi ähnlich aufgebaut, wie in C#? Dass du insgesamt zwei Formulare erstellst. Das Eine ist die Anzeigetafel, die eben die Daten im Konstruktor oder zum neu laden über eine entsprechende Methode (Funktion) empfängt. Das kann man ja auch über einen passenden Datentyp regeln.
Das zweite Formular ist für die Eingabe zuständig und konvertiert eine Nutzer-Eingabe in die Daten, mit denen die Anzeigetafel etwas anfangen kann. Auf diese Weise kann man in einem anderen Programm entweder vom Nutzer was zeichnen lassen, oder z.B. automatisch eine Statistik darstellen.
Keine Ahnung, ob das so funktioniert, wie ich mir das vorstelle, ich hab einfach keine Ahnung von Delphi, aber grob wüsste ich, wie ich es in C# machen würde. ^^ Natürlich kann es sein, dass gewisse Eigenarten deines Codes was gegen diese Vorgehensweise haben, aber die kann ich nicht betrachten, weil ich den Code nicht verstehe. :/


Mathematiker - Mi 24.10.12 22:55

Hallo Palladin700,
danke für Deine Hinweise. Ich werde mit das Alles mal überlegen und sehen, was machbar ist.
Irgendwie schaffe ich das schon.

Übrigens habe ich gerade die neue Revision 3 eingefügt. Es sind jetzt immerhin 4 Funktionen, alle im Darstellungsfenster eingebbar und auch das Raster ist etwas dunkler.

Beste Grüße
Mathematiker


Palladin007 - Mi 24.10.12 23:21

Ich hoffe, das wird was. ^^
Wollte nämlich auch mal einfach so aus Fun einen Rechner schreiben und so ein Fenster würde da ganz gut funktionieren.
Ach ja, gibt es in Delphi sowas wie User-Controls? Das sind Formulare, die allerdings in ein anderes Formular eingebettet werden müssen und dort dann als Objekt verwendet werden können. Wenn das ein solches nicht selbstständiges Formular wäre, dann könnte man damit viel besser arbeiten und wenn man doch einfach nur so ein Fenster haben will, dann fügt man das einfach in ein extra Formular ein und sonst nichts.
Was auch sehr gut wäre, wenn dieses Formular nur aus dem Koordinaten-System bestehen würde. Die Einstellungen können dann als Parameter übergeben werden (wieder ein neuer Typ, z.B.), so könnte man das dann nahtlos in andere Anwendungen einfügen und verwenden.

Ach und ich würde mir einen aussage-kräftigeren Namen ausdenken, damit man etwas brauchbares in der Beschreibung von einem Programm, das das verwendet, erwähnen kann. ^^



Und in der neuen Version hast du gleich eingebaut, was ich sagen wollte, aber glaube vergessen habe. :D
Ursprünglich wollte ich sagen, erst die Anzeigetafel zu öffnen und dann nachträglich kann man eine Liste öffnen, wo man dann die Funktions-Gleichungen rein schreiben kann.
So, wie du es jetzt gemacht hast, gefällt es mir aber besser. ^^


jaenicke - Do 25.10.12 07:47

User-Controls kann man in Delphi mit Frames nachahmen. Über die DLL-Grenzen hinaus kann man aber trotzdem schlecht damit arbeiten.

Zur Interaktion mit der DLL wäre eine Schnittstelle zu einem passenden Objekt keine schlechte Idee. Die kann man auch in C# nutzen. So nach dem Motto CreatePlotter als Funktion und ich bekomme ein Interface zu diesem Plotterobjekt zurück.


Mathematiker - Do 25.10.12 08:52

Hallo,
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Zur Interaktion mit der DLL wäre eine Schnittstelle zu einem passenden Objekt keine schlechte Idee. Die kann man auch in C# nutzen. So nach dem Motto CreatePlotter als Funktion und ich bekomme ein Interface zu diesem Plotterobjekt zurück.

Ich gestehe, ich verstehe wieder absolut nichts? :nixweiss:

Ich habe die Tutorials durchwühlt und Folgendes gefunden:
Die DLL habe ich, wie unter http://www.entwickler-ecke.de/topic_ein+Formular+aus+DLL+anzeigenaufrufen_8136.html?view=dl beschrieben, hergestellt.
In einem Programm rufe ich mit

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
 procedure UserForm(appHandle:THandle); stdcallexternal 'GRAFDLL.DLL';
var
  Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
begin
    UserForm(Application.Handle);
end;

das Fenster aus der DLL auf. Und es ist "cool"! :D Es funktoniert!
Die ursprüngliche Fehlermeldung "Win32 Error. Code 1400. Ungültiges Fensterhandle." konnte ich beseitigen, als ich die Create-Methode des Formularfensters geleert habe.
Dennoch komme ich mir vor, wie der berühmte Affe, der auf Tasten herumdrückt und einen Shakespeare-Text produzieren soll.

Schön wäre, wenn man beim Ruf der DLL-Routine einen Funktionsterm übergeben könnte. Allerdings habe ich gelesen, dass Stringübergaben problematisch sind. Und so habe ich das nächste Problem. :roll:

Beste Grüße
Mathematiker

Nachtrag: In der Revision 4 des Programms kann der Funktionsterm einen Parameter P enthalten. Dieser ist kontinuierlich veränderbar und zeigt so im Verlauf des Graphen seinen Einfluss, d.h., wird die Animation gestartet, ändert sich P und das Funktionsbild, inkl. Ableitungen, ..., wird sofort neugezeichnet.


bummi - Do 25.10.12 10:58

Ich würde für die Erstellung der DLL einen anderen Weg vorschlagen.
Die DLL Konzentriert sich auf das Berechnen und Zeichnen und bekommt vom Aufrufer ein Ziel vorgegeben.
Ich habe mal ein Beispiel angehängt (Exe/SRC)


Delphi-Laie - Do 25.10.12 11:45

user profile iconMathematiker hat folgendes geschrieben Zum zitierten Posting springen:
Hallo Palladin,
user profile iconPalladin007 hat folgendes geschrieben Zum zitierten Posting springen:
Was ich aber sehr viel mehr gebrauchen könnte, wäre eine DLL, mit der ich eben diese Oberfläche in anderen Programmen verwenden und darstellen kann.
Soweit ich weiß, gibt es auch Delphi.Net und ist dein Programm nicht mit Delphi geschrieben? Könntest du da nicht auch eine DLL erstellen, die man dann einfach mit z.B. C# verwenden kann?

Eine DLL ist ein gute Idee, und schon habe ich zwei neue Probleme.
1. Delphi.Net mit meinem Delphi 5? Das dürfte wohl nicht gehen.


DLLs sind Compilate mit Maschinencode und können n.m.W. mit jedem Delphi, das sog. nativen Code erzeugt (also nicht die .Net-Varianten) erstellt werden! DLLs haben erstmal überhaupt nichts damit zu tun, mit welcher Programmiersprache sie erstellt und mit welchem Compiler sie erzeugt wurden.

user profile iconMathematiker hat folgendes geschrieben Zum zitierten Posting springen:
2. Wie erstelle ich eine DLL, die ein Formular enthält


Nach meinem Wissen gar nicht: DLLs enthalten nur Routinen (Funktionen/Prozeduren) und sind nicht graphiktauglich.

user profile iconMathematiker hat folgendes geschrieben Zum zitierten Posting springen:
und an die ich Parameter (4 Zahlen) und eine Stringliste (Funktionen) übergebe? :nixweiss:
DLLs als Datencontainer kann ich, aber das ...? Rätsel über Rätsel!


Die DLL-Bibel der Delphianer ist die Anleitung von Assarbad.


Mathematiker - Do 25.10.12 11:56

Hallo Bummi,
user profile iconbummi hat folgendes geschrieben Zum zitierten Posting springen:
Die DLL Konzentriert sich auf das Berechnen und Zeichnen und bekommt vom Aufrufer ein Ziel vorgegeben.

Danke. Sieht sehr gut aus. Wenn ich es richtig verstanden habe, kann man so eine Paintbox auf dem Hauptformular mit der Zeichnung versehen. Und die Parameterübergabe funktioniert auch. Sehr schön. Es wird aber etwas dauern, bis ich das umgesetzt habe.

Hallo Delphi-Laie,
user profile iconDelphi-Laie hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconMathematiker hat folgendes geschrieben Zum zitierten Posting springen:
2. Wie erstelle ich eine DLL, die ein Formular enthält

Nach meinem Wissen gar nicht: DLLs enthalten nur Routinen (Funktionen/Prozeduren) und sind nicht graphiktauglich.

Dachte ich auch. Es geht aber, wie Du dem Anhang "graph_mit_dll" entnehmen kannst.

Beste Grüße
Mathematiker


bummi - Do 25.10.12 12:04

Zitat:

Dachte ich auch. Es geht aber, wie Du dem Anhang "graph_mit_dll" entnehmen kannst.


Komponenten (VCL) sicher verwenden in DLL und Hauptprogramm geht nur mit Laufzeitpaketen. Damit ist die DLL dann aber an die jeweilige Delphiversion gebunden. O.g. Beispiel solltest Du auch in anderen Spachen verwenden können.


Mathematiker - Do 25.10.12 12:56

Hallo Bummi,
ich habe gerade begonnen, Deine schöne Lösung mit meiner Grafikroutine zu verbinden.
Beim Compilieren Deiner DLL kam bei

Delphi-Quelltext
1:
  @DLLProc:=SaveExit;                    

die Meldung "Der linken Seite kann nichts zugewiesen werden.". Was ist denn das? Ich habe wieder keine Ahnung.

Beste Grüße
Mathematiker


Palladin007 - Do 25.10.12 13:03

Also Formulare in DLLs zu speichern geht zumindest bei C# ohne Probleme.

Ich hab auch mal ein kleines, aber vollständiges Programm mit allem Drum und Dran in einer DLL unter gebracht und dann von einer exe starten lassen. Ziel, warum ich das gemacht habe, war, dass dieses Programm ein Teil einer Gruppe war und man so schnell und einfach die einzelnen Teile mit der jeweiligen Oberfläche erneuern kann. Man muss nur die dll aus tauschen.

Ob das aber auch in dem vollen Umfang zwischen zwei verschiedenen Sprachen wie C# und Delphi funktioniert, weiß ich nicht.
Im Moment bin ich noch in der Schule, aber wenn ich Zuhause bin, wühle ich mich mal durch die einzelnen Ansätze und versuche sie in C# zu verwenden.


PS:
Und danke für den Aufwand. ^^
So eine Oberfläche ist wirklich was schönes, bloß reichen meine bisherigen Fähigkeiten noch nicht dazu aus, so etwas selber zu bauen.


Mathematiker - Do 25.10.12 16:53

Hallo,
da die Umsetzung als DLL irgendwie stockt, habe ich mir das Programm an sich noch einmal vorgenommen.
In der Revision 5 kann nun zusätzlich auf der 1.Funktion ein Punkt markiert werden, für den der Funktionswert ermittelt wird. Dieser Punkt ist mit der Maus verschiebbar.
Auf Wunsch kann bei diesem Punkt eine Tangente angetragen werden.

Beste Grüße
Mathematiker


bummi - Do 25.10.12 19:19

"Der linken Seite kann nichts zugewiesen werden."
lass die zwei Stellen mit DLLProc und SaveExit einfach mal weg


Mathematiker - Do 25.10.12 22:14

Hallo,
user profile iconbummi hat folgendes geschrieben Zum zitierten Posting springen:
lass die zwei Stellen mit DLLProc und SaveExit einfach mal weg

Danke. Funktioniert.
Als Zwischenstand habe ich mit Deiner Idee schon die Funktionen, die Einstellungen zum Koordinatensystem und die Ableitungen in die DLL ausgelagert. Es funktioniert wunderbar.
Ich denke, es wird eine ordentliche DLL entstehen, die dann (hoffentlich) auch von anderen nutzbar ist, z.B. mit C#. Dort ist mir dann aber nicht klar, wie der Aufruf der DLL-Funktionen zu realisieren ist.
Parallel werde ich aber auch das Programm ohne DLL weiterentwickeln.

Jetzt muss ich aber passen. Das erste Ergebnis in Form von Quelltext, Exe und DLL gibt's in zeitigstens 8 Tagen. So lange melde ich mich definitiv erst einmal ab. In der nächsten Woche habe ich keinen Zugang zur EE.

Beste Grüße
Mathematiker

Moderiert von user profile iconNarses: Doppelposting entfernt.


Delphi-Laie - Do 25.10.12 22:59

"Upps", da hat sich ein Beitrag selbst zitiert (ob das für Douglas Hofstadter schon eine seltsame Schleife wäre?).

Ich bin ja von Dir schon etliche Programme gewohnt, aber dieses hier sticht besonders hervor. Allerdings quälte ich es sogleich: x*sin(1/x) zoomte ich immer mehr, bis es schließlich abstürzte (erst hängenblieb und dann sich selbst beendete, wohl eher "verabschiedete", als Taskbareintrag und als Prozeß im Speicher aber noch vorhanden). Egal, es war ihm jedenfalls irgendwann zuviel des Guten.

Zu Deinen vielen Programmen, die Du hier im 1-Tages-Abstand vorstellst (spannst Du alle Schüler ein, oder hast Du gar eine Programmierabteilung unter Dir?) eine Anregung: Am besten, Du eröffnest eine zentrale Extradiskussion, in der Du alle Deine Programme (ggf. mit Kurzbeschreibung, die wenigstens den Zweck des jeweiligen Programmes erkennen läßt), von der aus man über Verweise an die jeweilige Diskussion gelangt. Das wäre doch was!


bummi - Do 25.10.12 23:15

@Delphi-Laie

Warum? Der Traffic in allen Delphiforen ist rückläufig.
Einen enthusiastischer Ideenlieferanten sehe ich eher als Bereicherung an.


Mathematiker - Do 25.10.12 23:26

Hallo Delphi-Laie,
user profile iconDelphi-Laie hat folgendes geschrieben Zum zitierten Posting springen:
"Upps", da hat sich ein Beitrag selbst zitiert (ob das für Douglas Hofstadter schon eine seltsame Schleife wäre?).

Ich war einfach zu blöd und habe statt auf Ändern auf Antworten gedrückt. :autsch: Ist aber schon behoben.

user profile iconDelphi-Laie hat folgendes geschrieben Zum zitierten Posting springen:
Ich bin ja von Dir schon etliche Programme gewohnt, aber dieses hier sticht besonders hervor. Allerdings quälte ich es sogleich: x*sin(1/x) zoomte ich immer mehr, bis es schließlich abstürzte (erst hängenblieb und dann sich selbst beendete, wohl eher "verabschiedete", als Taskbareintrag und als Prozeß im Speicher aber noch vorhanden).

Tut mir leid. Den Fehler muss ich suchen, habe aber schon eine Vermutung. Wenn durch Runden die x- oder y-Werte des Intervalls gleich werden, gibt's wohl diesen Ärger.

user profile iconDelphi-Laie hat folgendes geschrieben Zum zitierten Posting springen:
spannst Du alle Schüler ein, oder hast Du gar eine Programmierabteilung unter Dir?)

Wünsche Dir nicht die Programme meiner (normalen) Schüler. Du würdest erschrecken.
Eine Programmierabteilung habe ich leider nicht. Nur wenn es mich "packt", dann geht es oft schnell. Natürlich mit blöden Fehlern. (siehe oben)
Aber jetzt hast Du erst einmal 8 Tage Ruhe vor mir. Wir, meine bessere Hälfte und ich, haben uns kurzfristig doch noch etwas "Verrücktes" geleistet. Mal sehen, wie es in Israel ist.

Beste Grüße
Mathematiker

Nachtrag: Der Fehler ist behoben. Es war wie vermutet. siehe neue Revision.


Delphi-Laie - Do 25.10.12 23:40

user profile iconbummi hat folgendes geschrieben Zum zitierten Posting springen:
@Delphi-Laie

Warum?


Was warum?

user profile iconbummi hat folgendes geschrieben Zum zitierten Posting springen:
Der Traffic in allen Delphiforen ist rückläufig.


Was hat das mit meinem Beitrag zu tun?

user profile iconbummi hat folgendes geschrieben Zum zitierten Posting springen:
Einen enthusiastischer Ideenlieferanten sehe ich eher als Bereicherung an.


Und wer nicht?

bummi, Du sprichst in Rätseln - so kenne ich Dich ja gar nicht.

user profile iconMathematiker hat folgendes geschrieben Zum zitierten Posting springen:
Hallo Delphi-Laie,
user profile iconDelphi-Laie hat folgendes geschrieben Zum zitierten Posting springen:
"Upps", da hat sich ein Beitrag selbst zitiert (ob das für Douglas Hofstadter schon eine seltsame Schleife wäre?).

Ich war einfach zu blöd und habe statt auf Ändern auf Antworten gedrückt. :autsch: Ist aber schon behoben.


Das geht n.m.W. aber nur mit Moderations-/Administrationshilfe. Man Beiträge selbst erstellen, aber nicht selbst löschen.

Bei Objekten in der Programmiererei genauso wie bei uns Menschen ist es in gewisser Weise umgekehrt - die können sich nicht selbst erschaffen, dafür aber selbst....

Viel Spaß in Israel!


Mathematiker - Do 25.10.12 23:45

Hallo Delphi-Laie,
user profile iconDelphi-Laie hat folgendes geschrieben Zum zitierten Posting springen:
Das geht n.m.W. aber nur mit Moderations-/Administrationshilfe. Man Beiträge selbst erstellen, aber nicht selbst löschen.

Als ich gedrückt hatte und meinen Unfug sah, habe ich sofort den Virtuellen Ansprechpartner informiert.
user profile iconDelphi-Laie hat folgendes geschrieben Zum zitierten Posting springen:
Viel Spaß in Israel!

Danke. Hoffentlich kommen wir heil zurück und die Israelis machen nicht gerade jetzt mit dem Iran Ernst. :roll:

Beste Grüße
Mathematiker


bummi - Fr 26.10.12 07:50

@Delphi-Laie

Ich muss Deinen Beitrag wohl missverstanden haben.
Ich hatte den Eindruck Dich würden die vielen Threads stören und Du würdest es lieber auf einen Thread verdichtet haben.


Tranx - Fr 26.10.12 09:51

Alle Achtung, ich finde das Programm super. Und schnell genug ist es m.E. auch. Aber vielleicht bin ich ja zu anspruchslos.


Delphi-Laie - Fr 26.10.12 10:02

user profile iconbummi hat folgendes geschrieben Zum zitierten Posting springen:
Ich hatte den Eindruck Dich würden die vielen Threads stören


Nein, natürlich nicht, warum sollten sie auch?

Mein Interesse an Mathematikers Programmen zeigt sich doch daran, daß ich in einigen / etlichen seiner Programmdiskussionen mitmische.

user profile iconbummi hat folgendes geschrieben Zum zitierten Posting springen:
und Du würdest es lieber auf einen Thread verdichtet haben.


Auch das wäre zuviel des Guten, man könnte sich ja gar nicht mehr auf ein konzentrieren und keine Details besprechen, ohne den Überblick zu verlieren.

Ich sprach von einer zentralen Diskussion - eigentlich würde ein Eingangsbeitrag ausreichen, aber den kann man wohl nie losgelöst von der anschließenden Diskussionsmöglichkeit erstellen - oder doch? Falls nein, dann gibt es doch immer irgendjemanden, der etwas dazuzusenfen hat. In diesem zentralen Beitrage wären die Programme mit Namen, ggf. kurzer, (selbst)erklärender Zwecknennung und Verweise zu den jeweiligen Diskussionen aufgelistet. Bleibt Mathematikers Entscheidung (obwohl es grundsätzlich jeder könnte, weil jeder normale Forumsteilnehmer zur Erstellung neuer Beiträge / Diskussionen berechtigt ist). Bei seiner Fülle guter Programme wäre das m.E. ein Mehrwert.


Mathematiker - Fr 02.11.12 18:30

Hallo,
nach eine superinteressanten Woche in Israel melde ich mich wieder zurück.
Als erstes gibt es eine kleine Erweiterung des Funktionsprogramms: Außer der Tangente kann nun auch die Normale im markierten Punkt gezeichnet werden. Während der Animation ist wahlweise der Parameter P oder der Punkt mit den Geraden verschoben werden.
Ich finde es interessant, wenn der Punkt sich auf der Funktion bewegt und die Lage der Tangente und Normale sofort neu gezeichnet werden.
Hat jemand von Euch einen weiteren Wunsch zur Ergänzung dieses Programms, so immer her damit. Ich werde sehen, was machbar ist.

Hallo Delphi-Laie,
user profile iconDelphi-Laie hat folgendes geschrieben Zum zitierten Posting springen:
Ich sprach von einer zentralen Diskussion - eigentlich würde ein Eingangsbeitrag ausreichen, aber den kann man wohl nie losgelöst von der anschließenden Diskussionsmöglichkeit erstellen - oder doch?

Deine Idee ist nicht schlecht, ich weiß nur nicht, ob dies im Sinne der EE-Regeln ist. Aber vielleicht kann sich ja jemand dazu äußern.

Beste Grüße
Mathematiker


Delphi-Laie - Fr 02.11.12 18:37

Schön, daß Du wohlbehalten aus dem biblischen Lande zurückgekehrt bist. Hoffentlich gefiel es Dir dort gut!

user profile iconMathematiker hat folgendes geschrieben Zum zitierten Posting springen:
Hallo Delphi-Laie,
user profile iconDelphi-Laie hat folgendes geschrieben Zum zitierten Posting springen:
Ich sprach von einer zentralen Diskussion - eigentlich würde ein Eingangsbeitrag ausreichen, aber den kann man wohl nie losgelöst von der anschließenden Diskussionsmöglichkeit erstellen - oder doch?

Deine Idee ist nicht schlecht, ich weiß nur nicht, ob dies im Sinne der EE-Regeln ist. Aber vielleicht kann sich ja jemand dazu äußern.


Probieren geht über Studieren. Mehr, als daß die Moderation mit Dir schimpft und ggf. den empfohlenen Beitrag löscht, kann Dir doch nicht passieren. Doch stehst Du hier nicht inzwischen unter Natur-/Artenschutz? ;-)


Mathematiker - Fr 02.11.12 19:08

Hallo Delphi-Laie,
user profile iconDelphi-Laie hat folgendes geschrieben Zum zitierten Posting springen:
Schön, daß Du wohlbehalten aus dem biblischen Lande zurückgekehrt bist. Hoffentlich gefiel es Dir dort gut!

Das ist zwar jetzt Off-Topic: Israel ist wunderschön. Ich kann jedem nur empfehlen, wenn möglich, einmal hinzufahren. Haifa ist eine traumhafte Stadt, das Tote Meer wunderschön, Yad Vashem eine tief beeindruckende Erfahrung, die man nie wieder vergisst, und vor allem die Altstadt von Jerusalem: Eine Woche genügt nicht, um wenigstens das Wichtigste zu sehen.
user profile iconDelphi-Laie hat folgendes geschrieben Zum zitierten Posting springen:
Doch stehst Du hier nicht inzwischen unter Natur-/Artenschutz? ;-)

Wie soll ich denn das verstehen? :nut: Bin ich das "letzte Exemplar meiner Art"? :bawling:

Hallo Tranx,
user profile iconTranx hat folgendes geschrieben Zum zitierten Posting springen:
Aber vielleicht bin ich ja zu anspruchslos.

Warum? :nixweiss: Wenn Dir das Programm gefällt und es Deinen Vorstellungen entspricht, freut es mich. Solltest Du noch spezielle Wünsche haben, brauchst Du es nur zu sagen.

Beste Grüße
Mathematiker


Mathematiker - So 04.11.12 14:15

Hallo,
ich habe das Programm erneut überarbeitet. Die Neuerungen sind:

1. Ein zweiter Punkt B kann eingezeichnet und mit der Maus verschoben werden.
2. Die Sekante von A nach B wird gezeichnet.
3. Die Fläche unter der Funktion f1 vom Ursprung O bis Punkt A wird markiert und berechnet. Ebenso das bestimmte Integral. Die Berechnung erfolgt mit dem schnellen Gauß-Legendre-Verfahren, so dass es während der Animation kaum zu Verzögerungen kommt.
4. Die Funktionen f1 und f2 können addiert und multipliziert werden.
5. Eine Stammfunktion zu f1 wird gezeichnet. Dabei wird versucht, diese stets durch den Ursprung verlaufen zu lassen.
6. In die Eingabezeilen der Koordinaten, des Parameters und des Definitionsbereiches können jetzt auch Terme der Form PI, SQRT(2), SIN(PI/4), usw. eingetragen werden.

Beste Grüße
Mathematiker


gerd8888 - So 04.11.12 21:51

Ich habe mir die neue Version gerade angesehen.
Bei dem Integral kann man also "nur" vom 0-Punkt aus und einem wählbaren Punkt die Fläche berechnet werden.
Gut gefaellt mir hierbei, dass man den Punkt auch in dem Kurvenverlauf verschieben kann.
Entwickelst Du das noch weiter, so dass man die Fläche unter der Kurve von 2 beliebigen Punkten wählen kann?
Aber wirklich, soweit ich das beurteilen kann, nicht schlecht.


Mathematiker - So 04.11.12 22:02

Hallo Gerd8888,
user profile icongerd8888 hat folgendes geschrieben Zum zitierten Posting springen:
Entwickelst Du das noch weiter, so dass man die Fläche unter der Kurve von 2 beliebigen Punkten wählen kann?

Schon erledigt.
Die Fläche unter der Kurve und das bestimmte Integral werden in der Revision 10 im Intervall der x-Werte der Punkte A und B ermittelt. Da man B ändern kann (Eingabe oder Maus), kannst Du ein beliebiges Intervall wählen.
In der neuen Version wird auf Wunsch auch die Umkehrkurve von f1 gezeichnet.

Beste Grüße
Mathematiker


gerd8888 - So 04.11.12 22:22

Funktioniert einwandfrei. Sowetwas mit dem Integral ist vielleicht nicht neu, habe ich aber schon lange gesucht.
Man hat hier ein gutes Programm mit dem man Differential und Integral-Rechnungen der Analysis gezeigt bekommt.

Ist einfach zu bedienen und das Integral wird sogar noch farblich gelb hervorhehoben.
Das Programm werde ich mir gut aufheben.


Tranx - So 04.11.12 22:44

Also, das ist schon wirklich professionell. Perfekte Arbeit.


Mathematiker - Mo 05.11.12 11:50

Hallo,
user profile icongerd8888 hat folgendes geschrieben Zum zitierten Posting springen:
Man hat hier ein gutes Programm mit dem man Differential und Integral-Rechnungen der Analysis gezeigt bekommt.

user profile iconTranx hat folgendes geschrieben Zum zitierten Posting springen:
Perfekte Arbeit.

Danke an beide für das Lob.
Die nächste Erweiterung (Nullstellen- und Extremstellenberechnung) ist schon in Arbeit. Evtl. morgen fertig. :wink:

Zwischenzeitlich habe ich wieder versucht, das Projekt mit Lazarus zu compilieren. Dieses Lazarus lässt mich einfach nicht los!

Das Übersetzen und Compilieren klappt ganz gut, aber die Kreise der Punkte werden stets transparent und nicht ausgefüllt gezeichnet. Irgendwie komisch.
Im Funktionsinterpreter hat er das Zeichen 'É' angemeckert. Warum?
Außerdem werde ich den Eindruck nicht los, dass die Arithmetikgeschwindigkeit deutlich schlechter als bei Delphi 5 ist.
Lazarus kennt scheinbar auch keine Metafiles, d.h. das Kopieren und Drucken als WMF musste ich erst einmal entfernen.

Und dann die Exe-Größe! :eyecrazy: In der EE habe ich gefunden, dass Smart-Link eingeschaltet werden soll. Habe ich gemacht. Ergebnis 15 MByte-Exe im Vergleich zu 460 KByte bei Delphi, d.h. ungenügend. Der EE-Hinweis auf upx brachte auch nichts. Nach dem Komprimieren war die Exe nun gar nicht mehr lauffähig. :nixweiss:
Fazit für mich: Lazarus kostet zwar nichts, ist aber keine brauchbare Alternative zu Delphi. Ich werde wohl Lazarus deinstallieren. Dann muss ich mich nicht weiter damit herumärgern. :evil: Oder weiß jemand Rat?

Ich hänge hier einmal die Lazarus-Texte an, ohne die Exe natürlich! Hoffentlich sind die vollständig. Ich habe noch nicht ganz verstanden, was man weitergeben muss.

Beste Grüße
Mathematiker

Nachtrag: Das Problem mit den nichtausgefüllten Kreisen habe ich gelöst. Bei Lazarus muss stets

Quelltext
1:
canvas.brush.style:=bssolid;                    

aufgerufen werden, wenn zuvor bsclear gesetzt wurde. Eine Zuweisung einer neuen Farbe genügt nicht.
Nachtrag 2: So, es reicht! :motz: Lazarus kann mir gestohlen bleiben. Ich nehme jetzt wieder mein "liebes" Delphi 5. Das mag mich!


Mathematiker - Di 06.11.12 14:28

Hallo,
die vorerst letzte Erweiterung des Programms (Rev 11) berechnet und zeichnet nun für die 1.Funktion die Nullstellen und Extrempunkte im Intervall (von, bis), allerdings nur maximal 24 je Art im Intervall.
Damit die Nullstellen und Extrema auch während der Animation ermittelt werden, brauchte ich ein schnelles Iterationsverfahren, das aber "fast immer" konvergiert. Das moderne Brent-Verfahren (http://de.wikipedia.org/wiki/Brent-Verfahren) ist dafür sehr gut geeignet.

Ein Problem war noch, die "nullstellenverdächtigen" Stellen zu finden. Berechnet man aufeinanderfolgende Funktionswerte und iteriert, wenn diese unterschiedliche Vorzeichen haben, so findet man die Nullstellen nicht, die gleichzeitig Extremstellen sind.
Deshalb rufe ich das Brent-Verfahren auch auf, wenn die Anstiege aufeinanderfolgender x-Werte unterschiedliche Vorzeichen haben. Eine weitere Schwierigkeit sind auch Polstellen, denke aber, dass auch das funktioniert.
Die Extremstellen werden bestimmt, wenn der Anstieg der Funktion das Vorzeichen ändert. Damit laufe ich auch nicht Gefahr, dass Horizontalwendepunkte fälschlich als Extrema angegeben werden.

Ich habe zwar einige Funktionen getestet, bin mir aber nicht sicher, ob das Verfahren immer korrekt arbeitet. Sollte jemand eine Funktion finden, bei der die ermittelten Nullstellen und Extrema nicht stimmen, dann muss ich noch einmal weiterdenken.

Außerdem kann man jetzt auch den Parameter P und die x-Koordinaten der Punkte A und B über kleine Schalter ändern.

Ein solches Programm ist niemals fertig. Dennoch glaube ich, dass man in der jetzigen Form ganz gut damit arbeiten kann. Außerdem habe ich im Moment auch nur "exotische" Ideen. :tongue: Analytisches Differenzieren des Funktionsterms zum Beispiel.

Beste Grüße
Mathematiker


Palladin007 - Di 06.11.12 15:54

Wie wärs, wenn du etwas ähnliches mal im dreidimensionalen Bereich mit Vektoren versuchst?
Das wäre doch mal eine Herausvorderung.


Ach ja und wie steht es eigentlich mit der DLL, darf ich darauf noch hoffen?


Mathematiker - Di 06.11.12 16:29

Hallo Palladin700,
user profile iconPalladin007 hat folgendes geschrieben Zum zitierten Posting springen:
Wie wärs, wenn du etwas ähnliches mal im dreidimensionalen Bereich mit Vektoren versuchst?

Keine schlechte Idee. Mal sehen.
user profile iconPalladin007 hat folgendes geschrieben Zum zitierten Posting springen:
Ach ja und wie steht es eigentlich mit der DLL, darf ich darauf noch hoffen?

Ich bin schon am arbeiten.
Denn gegenwärtigen Stand hänge ich im ersten Eintrag an. In der DLL werden Koordinatensystem und Funktion mit einigen Parametern gezeichnet.

In dem Hauptprogramm MeinTest siehst Du, welche Größen und Parameter übergeben werden können. Dies muss ich noch erweitern. Für die Zeichnung benötigst Du außerdem eine Zeichenfläche mit Canvas-Eigenschaft.
Die Steuerung der Darstellungsintervalle muss im Hauptprogramm erfolgen, da in der DLL nur gezeichnet wird.

Das größe Problem ist aber: Wie man bei einer anderen Programmiersprache die DLL ruft, kann ich Dir nicht sagen.
Die von Bummi gegebene Lösung für Delphi mit

Delphi-Quelltext
1:
2:
3:
  TPaintIt      = Procedure (DC:HDC;grafbx,grafhx:Integer;realwerte:trealwerte;maskex:tmaske);
  TSetFormulas  = Procedure (Text:PAnsiChar);
  TListeleer    = Procedure ();

und

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
procedure Tfgraf.FormCreate(Sender: TObject);
var
 dll:String;
begin
  dll := ExtractFilePath(ParamStr(0)) + C_DLL;
  if FileExists(dll) then
    begin
        FDLLHandle := LoadLibrary(Pchar(dll));
        if FDLLHandle <> 0 then
          begin
            @FPaintIt:=GetProcAddress(FDLLHandle,'PaintIt');
            @FSetFormulas:=GetProcAddress(FDLLHandle,'SetFormulas');
            @FListeleer:=GetProcAddress(FDLLHandle,'Listeleer');
            Button1Click(nil);
          end;
    end;
end;

verstehe ich kaum unter Delphi.
Bevor ich weitere Arbeit in die DLL stecke, wäre es schön, wenn ich erfahren würde, ob die DLL z.B. auch unter C# funktioniert.

Beste Grüße
Mathematiker

Nachtrag: Trotz meiner "Hassliebe" zu Lazarus habe ich versucht, die DLL dort zu rufen. Das Ergebnis war zu erwarten. Lazarus kennt weder LoadLibrary noch GetProcAddress noch FreeLibrary.
Ich habe aber keine Lust nach einer Lösung zu suchen.


Palladin007 - Di 06.11.12 17:05

Grad bin ich zeitlich ziemlich unter Druck, sobald ich Zeit findet, versuch ich das mal zu verwenden.
Vielleicht dieses Wochenende, vielleicht aber auch nicht :/

Aber trotzdem danke erst mal für die Mühe ^^


Delphi-Laie - Di 06.11.12 17:15

user profile iconMathematiker hat folgendes geschrieben Zum zitierten Posting springen:
Nachtrag: Trotz meiner "Hassliebe" zu Lazarus habe ich versucht, die DLL dort zu rufen. Das Ergebnis war zu erwarten. Lazarus kennt weder LoadLibrary noch GetProcAddress noch FreeLibrary.


Hallo Mathematiker! Von meinem Programm "Prozesse" (das müßte ich noch mal ein wenig überarbeiten) gibt es auch eine Lazarusversion. Ich bin mir sicher, daß ich dort wenigstens LoadLibrary verwandte, evtl. auch GetProcAddress und/oder Freelibrary. Schau es Dir doch einfach mal an. Ich fummelte zugegebenermaßen auch recht lang daran herum, doch meine Hartnäckigkeit wurde irgendwann belohnt.

Lazarus kann recht viel, ist aber vergleichsweise ziemlich zickig.

Ergänzung: Alle drei Funktionen verwandte ich, hier auf die Schnelle:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
{$mode objfpc}{$H+}//dann muß bei GetProcAddress mit Pointern operiert werden
//{$mode DELPHI}{$H+}

...

function GetEntyPoints:boolean;
var lib:THandle;
begin
result:=true;
lib:=Loadlibrary('advapi32');
if lib=0 then result:=false
else
  begin
  Pointer(MyGetSecurityInfo):=GetProcAddress(lib,'GetSecurityInfo');
  if not assigned(MyGetSecurityInfo) then result:=false;
  Pointer(MyConvertSidToStringSid):=GetProcAddress(lib,'ConvertSidToStringSidA');
  if not assigned(MyConvertSidToStringSid) then result:=false;
  Pointer(MyConvertStringSidToSid):=GetProcAddress(lib,'ConvertStringSidToSidA');
  if not assigned(MyConvertStringSidToSid) then result:=false
  end;
FreeLibrary(lib)
end;


Mathematiker - Di 06.11.12 17:34

Hallo Delphi-Laie,
user profile iconDelphi-Laie hat folgendes geschrieben Zum zitierten Posting springen:
Ich bin mir sicher, daß ich dort wenigstens LoadLibrary verwandte, evtl. auch GetProcAddress und/oder Freelibrary.

Vielen Dank für Deinen Hinweis. Ich habe die Unit dynlibs eingefügt, und schon geht es. Der Aufruf der DLL funktioniert auch. Allerdings musste ich noch das Bitmap am Anfang weiß übermalen.
Verrückt ist, dass die Lazarus-Exe 14,6 MByte groß ist. Das ist echt gruselig.

Zufrieden bin ich trotzdem, dass die DLL zumindest auch bei Lazarus funktioniert, d.h. ich werde diese erweitern.
Die aktuelle DLL-Version befindet sich im 1.Eintrag. Bis auf die Markierung und Berechnung der Fläche der Funktion enthält die DLL alle Darstellungsmöglichkeiten des Programms.

Beste Grüße
Mathematiker


Delphi-Laie - Di 06.11.12 23:08

user profile iconMathematiker hat folgendes geschrieben Zum zitierten Posting springen:
Verrückt ist, dass die Lazarus-Exe 14,6 MByte groß ist. Das ist echt gruselig.


Es gibt dazu unzählige Diskussionen im Lazarusforum und in den Delphiforen.

Nimm einfach das unter http://www.entwickler-ecke.de/viewtopic.php?p=659928#659928 angebotene Miniprojekt. Es stammt genaugenommen nicht von mir, sondern aus der Delphipraxis, wo einer ein Esperantoprogramm damit vorstellte (http://www.delphipraxis.net/145648-transformilo-de-alfabeto.html). Ich konnte dem Programmautor das Geheimnis nicht entlocken und war es irgendwann leid, danach zu recherchieren. Die üblich genannten Einstellungen, die ich auch in seinem/jenem Programm fand, bewirkten bei mir jedenfalls nicht diesen kleinen Compilatsgrößen, es war noch ein Quentchen größer.

Ergänzung: Mit der Unit dynlibs machte ich auch rum, ich klammerte (kommentierte) sie allerdings wieder aus, wie ich just feststellte. Also ist sie doch nicht zwingend nötig, jedenfalls nicht beim Compilieren mit meinem Lazarusinstallationen.


Mathematiker - Mi 07.11.12 20:43

Hallo,
die neue Programmerweiterung (Rev 12) enthält jetzt eine Unit uableitung.pas zum analytischen Differenzieren von Funktionstermen.
Klickt man auf den Schalter f1'(x), so wird die Gleichung der Ableitung als 4.Funktion eingetragen. Damit kann ich jetzt auch die Wendepunkte der 1.Funktion schnell und effektiv bestimmen und zeichnen.

Das formelmäßige Differenzieren funktioniert ziemlich gut. :D Für einen gültigen Funktionsterm (Großbuchstaben!) wird mit der Methode ableitung() der Funktionsstring der Ableitung zurückgegeben.
Die Ableitungsfunktion dürfte stets stimmen, auch für die problematische logarithmische Differenziation, z.B. für die Funktion y = x^x usw.
Interessant ist, dass in der grafischen Darstellung der Graph der numerischen Ableitung von dem Graphen der analytischen, wie zu erwarten, etwas abweicht.

Allerdings habe ich noch ein Problem. Trotz intensiver Überlegungen habe ich noch keine wirklich gute Idee, wie ich die entstehenden Ableitungsterme vernünftig vereinfachen kann. :nixweiss:

Zum Beispiel erhalte ich für y = (X+1)/(X^2-1) die Ableitung y' = (X^2-1-(X+1)*(2*X))/(X^2-1)^2.
Im Normalfall würde ich "böse" werden, wenn ein Schüler mir das im Matheunterricht ohne Zusammenfassen, d.h. y' = -1/(X-1)^2, vorsetzt. Bei meinem Programm habe ich aber keine Idee, wie ich den Computer dazu bringen kann, vernünftig zu vereinfachen. Alle Versuche über eine Baumstruktur, wie bei der Differenziation, gingen "voll in die Hose". :bawling:
Die Funktion red in der Unit uableitung.pas ist nur eine hässliche Notlösung zum Abfangen der schlimmsten sinnlosen Teilterme, wie +0 oder *1, ...

Vielleicht hat jemand von Euch eine Idee zum Vereinfachen solcher Terme.

Beste Grüße
Mathematiker


Horst_H - Mi 07.11.12 22:49

Hallo,

im Grunde willst Du also, dass der Computer rausklamüsert, dass die Ausmultiplikation im Zähler
der ersten binomischen Formel entspricht
(X^2-1-(X+1)*(2*X)) ->(- (X^2+2x+1) = -(x+1)^2 ist
und der Nenner der dritten binomischen Formel.
(X^2-1)^2 -> ((X+1)*(x-1))^2 ->(X+1)^2 * (x-1)^2
und man dann letztendlich (X+1)^2 kürzen kann.
Geht das nicht einfach stur mit Polynomdivision.
(X^2-1)^2 => X^4-2*x^2+1
x^4-2*x^2+1 : -(x^2+2x+1) = x^2-2x+1

Gruß Horst

Ableitungen von Polynomen sind mit Hornerschema einfach, wenn man damit schon die Funktionswerte berechnet.
http://www.mathematik.net/Polynomdivision/py-001.htm etc pp.
der macht sehr viel auf youtube: http://www.youtube.com/watch?v=B27pn1cnwn0

und natürlich
http://www.arndt-bruenner.de/mathe/scripts/polynomdivision.htm


Mathematiker - Mi 07.11.12 22:56

Hallo Horst_H,
vielen Dank für Deinen Hinweis. Für gebrochenrationale Funktionen ist mir das schon klar. Das habe ich auch schon gelöst (siehe http://www.entwickler-ecke.de/viewtopic.php?t=109634)
Ich suche aber eine möglichst allgemeine Lösung für die Termvereinfachung, d.h. auch wenn in dem Term andere Funktionen als Polynome auftreten, z.B. Wurzeln oder trigonometrische Funktionen. Allein das Ausmultiplizieren und Erkennen, welche Produkte dann zusammengefasst werden können, ist problematisch.
Um es mathematisch zu sagen: Mir gelingt es einfach nicht, Kommutativ-, Assoziatv- und Distributivgesetz algorithmisch so umzusetzen, dass das Programm richtig rechnet.

Schwierig ist es auch, mit absoluter Sicherheit zu erkennen, von welchem Typ eine Funktion ist. Ist sie ganzrational oder gebrochenrational oder versteckt sich irgendwo ein Teilterm mit ln, exp, sin, ...

Beste Grüße
Mathematiker

Nachtrag: In der Revision 13 werden nun auch die Wendetangenten gezeichnet.
Ich beende damit vorerst die Weiterentwicklung dieses Programms. :gruebel:


Anika - Fr 09.11.12 14:48

Das Program ist schön und hilft mir bestimmt bei meinen Hausaufgaben.
Heute haben wir in der Schule x^3+x-1 untersucht. Gibt man das ein, so zeigt das Programm Extrempunkte bei -0,59 und 0,58. Sind beide richtig? In der Schule haben -0,58 gerechnet. Kann man auch die y-Werte anzeigen?
Danke, Anika


jaenicke - Fr 09.11.12 15:08

user profile iconMathematiker hat folgendes geschrieben Zum zitierten Posting springen:
Ich suche aber eine möglichst allgemeine Lösung für die Termvereinfachung, d.h. auch wenn in dem Term andere Funktionen als Polynome auftreten, z.B. Wurzeln oder trigonometrische Funktionen.
Dafür habe ich entsprechende Umformungen für den geparsten Baum, in die der Term eingelesen wird (bei dir ja auch vermute ich?), eingebaut, die dann auf die entsprechenden Knoten losgelassen wurden. So ließ sich auch die symbolische Ableitung leicht implementieren. Erst bei der symbolischen Integration bin ich nicht bis zum Ende gekommen, da gingen bis zuletzt nur einfache Terme.

Am Ende wurde dann der Baum wieder als Term ausgegeben.


Mathematiker - Fr 09.11.12 18:00

Hallo Anika,
user profile iconAnika hat folgendes geschrieben Zum zitierten Posting springen:
Sind beide richtig? In der Schule haben -0,58 gerechnet. Kann man auch die y-Werte anzeigen?

Danke für den Hinweis. In meinem Programm ist ein Genauigkeitsfehler. Entschuldigung. Ich werde überprüfen, wie dies verbessert werden kann. Die Extrem- und Wendepunkte werde ich in der nächsten Version vollständig anzeigen.
Nachtrag: In der Revision 14 umgesetzt.

Hallo Jaenicke,
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Dafür habe ich entsprechende Umformungen für den geparsten Baum, in die der Term eingelesen wird (bei dir ja auch vermute ich?), eingebaut, die dann auf die entsprechenden Knoten losgelassen wurden.

Ebenfalls Danke für den Hinweis. Das habe ich im Ansatz versucht, nur leider stelle ich mich im Moment noch zu dumm an. Wird aber noch; hoffe ich.
Findet man Deine Lösung hier in der EE?
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Erst bei der symbolischen Integration bin ich nicht bis zum Ende gekommen, da gingen bis zuletzt nur einfache Terme.

Alle Achtung, wenn Du zumindest einfache Terme schaffst. Ich hatte mir das Buch "Symbolic Integration" von Manuel Bronstein gekauft, bin aber über die ersten 30 Seiten nicht hinausgekommen. Allein die Mathe war schon für mich eine Herausforderung und da wäre dann "nur" noch die Programmierung ... :nixweiss:

Beste Grüße
Mathematiker


Martok - Fr 09.11.12 19:43

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Dafür habe ich entsprechende Umformungen für den geparsten Baum, in die der Term eingelesen wird (bei dir ja auch vermute ich?), eingebaut, die dann auf die entsprechenden Knoten losgelassen wurden. So ließ sich auch die symbolische Ableitung leicht implementieren.

user profile iconMathematiker hat folgendes geschrieben Zum zitierten Posting springen:
Findet man Deine Lösung hier in der EE?
Würde mich auch interessieren ;) Grade das Pattern-Matching auf Bäumen wäre schon mal interessant, das betrifft ja alle Arten von Transformationen.


user profile iconMathematiker hat folgendes geschrieben Zum zitierten Posting springen:
Alle Achtung, wenn Du zumindest einfache Terme schaffst. Ich hatte mir das Buch "Symbolic Integration" von Manuel Bronstein gekauft, bin aber über die ersten 30 Seiten nicht hinausgekommen.
Habs grad mal auf Google Books durchgeblättert. Ist das schlimm, wenn ich schon bei den Preliminaries aussteige? :P
Ich behaupte mal, außer 'ner Hand voll Leute bei Maplesoft hat das auch keiner verstanden.

Mal etwas rumgesponnen... könnte man die Integration nicht über Laplace machen? Hintransformieren, durch s teilen, zurücktransformieren? Keine Ahnung, wie viele fiese Sonderfälle es da nun wieder gibt.


Mathematiker - Fr 09.11.12 20:02

Hallo Martok,
user profile iconMartok hat folgendes geschrieben Zum zitierten Posting springen:
Habs grad mal auf Google Books durchgeblättert. Ist das schlimm, wenn ich schon bei den Preliminaries aussteige? :P
Ich behaupte mal, außer 'ner Hand voll Leute bei Maplesoft hat das auch keiner verstanden.

Nach einem Gerücht soll der Autor Manuel Bronstein sogar bei Wolframs "Mathematica" die Finger drin haben. Sicher ist, dass er bei Maple und Macsyma mitgewirkt hat.
Das Buch ist schon "harte" Kost und allein der 1.Teil mit 80 € auch nicht gerade preiswert. Faszinierend für mich ist, dass es einen Algorithmus zur symbolischen Integration gibt. Wer denkt sich so etwas nur aus?
user profile iconMartok hat folgendes geschrieben Zum zitierten Posting springen:
Mal etwas rumgesponnen... könnte man die Integration nicht über Laplace machen? Hintransformieren, durch s teilen, zurücktransformieren?

Klingt interessant. Noch weiß ich nicht aber nicht, was Du genau meinst.

Beste Grüße
Mathematiker


Martok - Fr 09.11.12 21:00

user profile iconMathematiker hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconMartok hat folgendes geschrieben Zum zitierten Posting springen:
Mal etwas rumgesponnen... könnte man die Integration nicht über Laplace machen? Hintransformieren, durch s teilen, zurücktransformieren?

Klingt interessant. Noch weiß ich nicht aber nicht, was Du genau meinst.
Ich weiß das auch noch nicht so genau, schau'n wir mal ;-)
Mal durch die Regelungstechnik-Unterlagen blättern. Ich hänge die Referenz hier mal an, nur zu Lehrzwecken bla Copyright blabla etc.

Nehmen wir mal als Funktion x(t):= sin(5*t) + 3e^t.

Dann gilt:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
X(s) = Laplace(x(t)) = 5 / (s^2 + 5^2)  + 3 * 1 / (s-1)

Integration ist Xs(s) = 1/s*X(s), also:
Xs(s) = 5 / (s^3 + s*5^2)  + 3 * 1 / (s^2-s)

Zusammengefasst nach s:
Xs(s) = -1/5 * s / (s^2+25) + 3 * 1/(s-1) - 14/5 * 1/s      [Sagt Wolfram Alpha]

Nimmt man wieder die Korrespondenzen, diesmal in die andere Richtung:
xs(t) = -1/5 * cos(5*t) + 3 * e^t - 14/5 * sigma(t)

Wobei der Term mit Sigma(t) eigentlich hier Quatsch ist - alle verbleibenden Terme mit 1/s zusammengefasst sind an der Stelle die Integrationskonstante. Glaube ich :angel:

Passt auffallend zur richtigen Funktion, die da wäre xs(t) = 3*e^t - 1/5*cos(5*t) + C.

Nur dass das halt ein sehr einfaches Beispiel ist, keine Ahnung ob man damit alles erschlagen kann. Im Zweifelsfall per partieller Integration vorbereiten und das für die einzelteile nehmen oder so.


Mathematiker - Fr 09.11.12 21:08

Hallo Martok,
das habe ich noch nie gesehen und das ist faszinierend!
Den PDF-Text werde ich mir sofort genau ansehen. Vielleicht eröffnen sich damit völlig neue Möglichkeiten. Danke!

Obwohl ich angekündigt hatte, vorerst nicht weiter zu machen, kann ich es nicht lassen. Ich bin wohl "besessen". :nut:
In der Revision 15 kann man nun schnell auch die vier Ausgangsfunktionen zu- und abschalten.
Außerdem, und das ist wohl interessanter, berechnet und zeichnet das Programm auch die Schnittpunkte zwischen der 1. und 2.Funktion.

Beste Grüße
Mathematiker

Nachtrag: Meine Euphorie war wohl verfrüht. Nach einer langen Nacht muss ich leider feststellen, dass die Probleme trotz Martoks Idee nicht kleiner werden.
Die Funktionstypen der einzelnen Terme müssen erkannt und aufwändig behandelt werden und schon bei solch einfachen Funktionen wie y = sin x / x bin ich ratlos. Schade.


Mathematiker - Sa 10.11.12 23:14

Hallo,
mit der neuen Revision 16 habe ich nun wirklich den Stand erreicht, bei dem mir die Ideen ausgehen.
Wird außer der 1.Funktion auch Funktion f2(x) gezeichnet, so wird jetzt nicht mehr die Fläche unter der 1.Funktion sondern die Fläche zwischen den 2 Funktionen ausgewertet, markiert und berechnet.

Weitere Programmänderungen werde ich nur noch durchführen, wenn entweder (hoffentlich nicht) sich ein Fehler versteckt hat oder von dem einen oder anderen ein Wunsch geäußert wird.

Beste Grüße und einen schönen Sonntag
Mathematiker


Anika - Mo 12.11.12 09:48

Das Programm rechnet jetzt auch mit x^3+x-1 richtig. Danke.
Kann man die Zahlen auch Speichern und Drucken? Abschreiben ist nicht schön.
Heute werde ich meinem Mathelehrer das Programm zeigen.
Anika


Mathematiker - Mo 12.11.12 10:58

Hallo,
user profile iconAnika hat folgendes geschrieben Zum zitierten Posting springen:
Kann man die Zahlen auch Speichern und Drucken? Abschreiben ist nicht schön.

Für alle jungen Damen(?), die das Abschreiben nicht mögen :wink: , enthält das Programm jetzt eine Ergebnisliste.

Alle rechts ausgewählten Punkte werden in der zu- und abschaltbaren Liste mit Ihren Koordinaten angezeigt. Über den Menüpunkt "Ergebnisliste kopieren" wird die Liste in die Zwischenablage transportiert und kann z.B. in Word oder wo anders eingefügt werden. Dort dürfte dann Drucken oder Speichern kein Problem sein.
Kopiert man zusätzlich noch die Vektorgrafik, kann man eine (fast) vollständige Kurvendiskussion erhalten.

"Fast vollständig", da das Programm nur einige Werte und außerdem nur numerisch rechnet. In einem Mathe-LK wird wohl eher ein exaktes Ergebnis, wenn möglich, notwendig sein.
Zum Beispiel würde ich bei y = x³+x+1 im LK als Minimum nur ( Wurzel(3)/3, (9-2 Wurzel(3))/9 ) akzeptieren, entsprechend für das Maximum. Mein Programm liefert mit (0,58 ; 0,62) nur eine Näherungslösung.

Beste Grüße
Mathematiker


jfheins - Mo 12.11.12 13:10

Zum Problem mit der Integration: Mein Matheprof sagt mal "Differenzieren ist Arbeit, Integrieren ist Kunst". Das symbolische Integrieren ist halt wesentlich schwerer als das differenzieren, letzteres kann i.d.R. mit den 3 Regeln vollständig gelöst werden. Symbolische Integration ist ein ganz anderes Feld, auch da es Funktionen ohne elementare Stammfunktion gibt! ein "Workaround" für sowas ist ja z.B. erf() - die Funktion ist definiert als "Stammfunktion der gaußschen Glockenkurve".

Die Laplace-Transformation ist bei manchen Problemen (Insbesondere bei Addition mehrerer einfacher Terme) extrem hilfreich. Leider nicht immer zielführend, da die Rücktransformation nicht immer gelingt.


Mathematiker - Mo 12.11.12 17:05

Hallo jfheins,
user profile iconjfheins hat folgendes geschrieben Zum zitierten Posting springen:
Zum Problem mit der Integration: Mein Matheprof sagt mal "Differenzieren ist Arbeit, Integrieren ist Kunst".

Stimme ich Dir vollkommen zu und deshalb versuche ich mich auch am symbolischen Integrieren gar nicht erst. Wer das dringend braucht, muss wohl auf Mathematica usw. zurückgreifen.

Allerdings lässt mich das Zusammenfassen der Ableitungsterme nicht los.
Da ich im Moment keine richtige Lösung sehe :cry: , habe ich eine Notlösung eingebaut, die nicht richtig zusammenfasst, aber das Gröbste hoffentlich bereinigt.
In der Ressource wverein.res (Rev 18 ) sind Terme und deren Vereinfachung enthalten, mit denen die Ableitungsfunktion überprüft wird.
Zum Beispiel ersetzt das Programm -x+x durch 0, 2*sin(x)*cos(x) durch sin(2*x) oder entfernt einige überflüssige Klammern usw.
Wie gesagt, eine unvollkommene Notlösung. :nixweiss:

Beste Grüße
Mathematiker


Mathematiker - Sa 17.11.12 01:06

Hallo,
durch die vielen Checkboxen wurde es langsam unübersichtlich. Deshalb habe ich die Sonderfunktionen f(-x), -f(x), usw. in das Menü ausgelagert. Je Menüpunkt wird auch erklärt, welche Aktion mit dem Originalgraphen dann durchgeführt wird.
Zusätzlich sind vier Menüpunkte enthalten, die den Einfluss des Parameters P auf das Kurvenbild demonstrieren, auch wenn in der Funktionsgleichung kein P enthalten ist.
Ich denke, dass es so etwas besser ist.

In der Revision 21 wird zusätzlich eine Funktionsschar der ersten Funktion gezeichnet. Dazu wird der Parameter P so lange mit dem Wert d= erhöht, bis er die Größe des ebenfalls eingebbaren Parameters Q erreicht oder überschreitet.

Beste Grüße
Mathematiker


Mathematiker - Mi 21.11.12 20:35

Hallo,
heute noch einmal eine Änderung am Funktionsprogramm.
Die Einstellmöglichkeiten für die Darstellung des Koordinatensystems habe ich ebenfalls in das Menü ausgelagert. Damit dürfte das rechte Teilfenster wieder etwas übersichtlicher werden.
Außerdem kann man jetzt außer der 1. auch die 2.Ableitung analytisch als Funktionsterme bestimmen.

Weitere Änderungen, u.a. eine Wertetabelle inkl. Anstiege für verschiedene x-Werte, werden in einigen Tagen folgen.

Beste Grüße
Mathematiker


Mathematiker - Do 29.11.12 22:34

Hallo,
bevor ab morgen Abend alle in der EE versuchen, Adventsrätsel zu lösen :wink: , komme ich noch einmal mit einer Erweiterung des Funktionsprogramms.

Wird eine Ergebnisliste angezeigt, so kann über den Auswahlpunkt "Wertetabelle" zusätzlich eine solche angezeigt werden. Start-, Endwert und Abszissenabstand wird aus von-bis-Delta entnommen. Neben den Funktionswerten zeigt die Tabelle auch die 1.Ableitungswerte.

Ein kleines programmtechnisches Problem habe ich. Wird die Wertetabelle sehr lang, müsste die Memobox eigentlich einen vertikalen Rollbalken bekommen. Immer möchte ich ihn nicht zuschalten, da er mir ganz einfach "optisch" nicht gefällt.

Wie kann man herausbekommen, ob so ein Rollbalken notwendig ist? Ab einer bestimmten Zeilenzahl ihn zuzuschalten ist nicht günstig, da ja das Fenster und somit die Memobox unterschiedlich hoch sein können.
Anders gefragt: Kann man irgendwie ausrechnen, wie viele Zeilen in einer Memo sichtbar sind? :nixweiss:

Beste Grüße
Mathematiker

Nachtrag:

Delphi-Quelltext
1:
Zeilenzahl := Memo.height div Memo.font.size                    

funktioniert nicht, da zwischen den Zeilen ein Abstand ist.
Auch wenn ich eine Variable abstand = 1, 2, 3, ... addiere,

Delphi-Quelltext
1:
Zeilenzahl := Memo.height div (Memo.font.size + abstand)                    

ergibt es nicht die korrekte Zeilenzahl. Entweder das Ergebnis ist zu groß oder bei größerem Wert von abstand zu klein.


Delete - Do 29.11.12 23:34

- Nachträglich durch die Entwickler-Ecke gelöscht -


Mathematiker - Fr 30.11.12 00:17

Hallo Frühlingsrolle,
danke für die Antwort.

Ich habe es ausprobiert, bringt aber leider nicht das Gewünschte.
Bei jedem Aufruf zeigt die Memo nun abwechselnd beide Rollbalken oder nur den vertikalen, gleichgültig, ob die Zeilenzahl nun einen Rollbalken braucht oder nicht, d.h., ich habe z.B. den vertikalen aber auch beide Rollbalken, wenn nur 5 Zeilen ohne Zeilenumbruch in der Memo stehen.

Ich muss vielleicht noch sagen, dass die Memo über

Delphi-Quelltext
1:
Memo.lines.assign(ergebnisliste)                    

mit einer Stringliste verknüpft wird, die aus einzelnen, relativ kurzen Strings besteht. Ein Umbruch tritt deshalb i.A. nicht auf.
Dennoch, nochmals Danke.

Beste Grüße
Mathematiker


Delete - Fr 30.11.12 11:39

- Nachträglich durch die Entwickler-Ecke gelöscht -


Mathematiker - Fr 30.11.12 12:01

user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
Ich würde den Code von oben im FormCreate aufrufen, dann klappt das auch mit den Balken.

Ich hab's probiert und, wie zu erwarten, funktioniert es nicht. Das Memo hat dann immer zwei Scrollbars, gleichgültig, wie viele Zeilen in ihr sind.
Da die Anzeige der vertikalen Scrollbar von der Zeilenzahl abhängig sein soll, kann in der FormCreate kaum die richtige Wirkung erzielt werden. Zum Zeitpunkt des Aufrufens der FormCreate ist die Memo ja noch leer.

Ich denke, der beste Weg müsste über die Berechnung der maximal sichtbaren Zeilenzahl in der Memo gehen.

Beste Grüße
Mathematiker

Nachtrag: Ich hab's gefunden. Bei meiner gewählten Schriftgröße von Verdana 8 ist der Zwischenraum gleich 5. Wenn ich berücksichtige, dass meine Memo "mergebnis" einen Rand hat (das hatte ich bis jetzt vergessen :autsch: ), bekomme ich mit

Delphi-Quelltext
1:
mergebnis.clientheight div (mergebnis.font.size+5)                    

die Anzahl der sichtbaren Zeilen. :zustimm:


Mathematiker - So 23.12.12 13:30

Hallo,
kurz vor Weihnachten habe ich noch einige Änderungen am Funktionsprogramm durchgeführt.

Die wesentlichste Erweiterung ist die Möglichkeit, die Funktionsgrafik wahlweise als BMP-, GIF- oder Vektorgrafikdatei zu speichern. Die Vektorgrafik ist jetzt auf "erweitert" umgestellt.
Weitere Veränderungen betreffen neue Zusatzfunktionen und interne Verbesserungen.

Beste Grüße
Mathematiker


Delphi-Laie - So 23.12.12 19:38

Hallo Mathematiker, ich sehe gerade im Beitrage darüber, daß Du Schwierigkeiten ha(tte)st, etwas im FormCreate aufzurufen.

Vieles ist in jener Prozedur noch nicht (vollständig) initialisiert. Entweder versuchst Du es mit einer anderen Prozedur, die bei Programmstart (nur dann?) ausgelöst, siehe hier [http://www.delphi-fundgrube.de/faq07.htm#topic0707], oder das Zauberwort heißt: "one shot timer". Also, ein Timer wird in FormCreate gepackt, Schußfrequenz ("Kadenz") auf Minimum (1 ms) gestellt, das reicht nach meiner Erfahrung, und beim ersten Schuß wird er deaktiviert ("diabled") und tut dann das, was Dir FormCreate verweigerte.

Schöne Weihnachten!


jaenicke - So 23.12.12 20:06

Ein Timer ist dafür nicht wirklich geeignet, besser ist es sich selbst einfach eine Windows Message zu schicken. Dann muss man nicht extra eine Komponente erstellen. Und im Grunde passiert ohnehin das gleiche, denn ein Timer funktioniert ja auch nur über eine WM_TIMER Botschaft.


Mathematiker - So 23.12.12 20:21

Hallo user profile iconDelphi-Laie,
Hallo user profile iconjaenicke,
vielen Dank für die Hinweise.
Das Problem war nur entstanden, da user profile iconFrühlingsrolle einen Vorschlag für die Rollbalken meiner Memo hatte.

Die Schwierigkeit mit den anzuzeigenden Rollbalken konnte ich ja anders lösen (siehe oben), zumal erst während der Ausführung der Berechnung entschieden werden muss, ob der vertikale Rollbalken notwendig ist.

Beste Grüße
Mathematiker


Tranx - So 23.12.12 21:36

Also, allein schon die syntaktische Ableitung (ich hoffe, das ist der richtige Begriff, denn ich bin kein Mathematiker) ist eine Wucht. Selbst schwierige Funktionen kann das Programm richtig ableiten. Alle Achtung. Muss mir mal in Ruhe ansehen, wie das gemacht wurde.

Wünsche Dir ein gesegnetes Weihnachtsfest.

Gunther


jaenicke - So 23.12.12 21:54

user profile iconTranx hat folgendes geschrieben Zum zitierten Posting springen:
Also, allein schon die syntaktische Ableitung (ich hoffe, das ist der richtige Begriff, denn ich bin kein Mathematiker)
Das nennt sich symbolische Ableitung als Abgrenzung zur numerischen Ableitung.


Delphi-Laie - Mo 24.12.12 10:49

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Ein Timer ist dafür nicht wirklich geeignet, besser ist es sich selbst einfach eine Windows Message zu schicken. Dann muss man nicht extra eine Komponente erstellen. Und im Grunde passiert ohnehin das gleiche, denn ein Timer funktioniert ja auch nur über eine WM_TIMER Botschaft.


Hallo jaenicke, wärst Du um ein paar Codezeilen, die das demonstrieren, nicht verlegen, bitte?

Ich kenne das nur mit dem Timer, z.B. auch von himitsu in der delphipraxis empfohlen, und der ist sicher eine Größe unter den Delphiprogrammierern.

Danke im voraus und schöne Weihnachten auch Dir!


jaenicke - Mo 24.12.12 15:42

So aus dem Kopf:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
const
  WM_AFTERSHOW = WM_USER + 1454;

type
  TMyForm = class(TForm)
  protected
    procedure WmAfterShow(var Msg: TMessage); message WM_AFTERSHOW;
  end;

// ...

procedure TMyForm.WmAfterShow(var Msg: TMessage);
begin
  // tu was nach dem Start
end;

// und in FormShow:
PostMessage(Handle, WM_AFTERSHOW, 00);


Mathematiker - Di 25.12.12 12:55

Hallo jaenicke,
für das Funktionsprogramm brauche ich es zwar nicht, aber es interessiert mich allgemein.
Dein Quelltext
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
2:
// und in FormShow:
PostMessage(Handle, WM_AFTERSTART, 00);

sieht vor, in FormShow die Nachricht zu senden.
Wird diese dann jedesmal, wenn das Formular aktiv wird, gesendet oder nur genau einmal durch die Nachricht WM_AFTERSTART?
Wie erkennt das Programm, dass das Formular erstmals angezeigt bzw. nur neu gezeichnet wird?

Beste Grüße
Mathematiker


jaenicke - Di 25.12.12 21:44

Ich habe die Bezeichnung mal in after show geändert um die Funktion zu verdeutlichen. Wenn man das Formular mit z.B. Show und Hide oder Visible (dein eigener Code eben) mehrfach anzeigt, wird auch das Ereignis mehrfach ausgeführt. Minimieren und Wiederherstellen oder so (alles was der User ohne Quelltext von dir machen kann) löst OnShow hingegen nicht erneut aus.


Anika - So 13.01.13 23:30

Guten Abend,
ich denke einen Fehler gefunden zu haben.
wenn ich den Punkt A anzeige und automatisch verschieben lassen will, passiert nichts. Erst wenn ich das Verschieben beende sehe ich die Änderung.
Mit dem Punkt B geht es aber.

Anika


Mathematiker - Mo 14.01.13 11:11

Hallo Anika,
user profile iconAnika hat folgendes geschrieben Zum zitierten Posting springen:
ich denke einen Fehler gefunden zu haben.

Entschuldigung und Danke für den Hinweis. Das war wieder ein typischer Fehler meinerseits. :autsch:

Bei der Erweiterung des Programms um die Verschiebung von Punkt B ist mir ein Befehl "abhanden" gekommen. In der Revision 25 ist es wieder richtig.

Beste Grüße
Mathematiker


Mathematiker - Mo 22.04.13 15:43

Hallo,
durch user profile iconDelphi-Laie (Danke!) wurde ich auf einen interessanten Beitrag aufmerksam gemacht: http://www.luschny.de/math/factorial/hadamard/HadamardsGammaFunction.html

Daraufhin habe ich den Funktionsinterpreter des Programms zur Funktionsdarstellung und -untersuchung erweitert.
Jetzt können folgende Funktionen, außer den Grundoperationen +,-,*,/,^ in der Funktionsgleichung verwendet werden:

Quelltext
1:
2:
3:
4:
5:
SQR SQRT ABS INT SGN FRAC HEAVISIDE
EXP LN LG LD
SIN COS TAN COT SEC CSC ARCSIN ARCCOS ARCTAN ARCCOT ARCSEC
SINH COSH TANH ARSINH ARCOSH ARTANH 
GAMMA GAUSS DIGAMMA

Sollte noch etwas Interessantes fehlen, bitte ich um einen kurzen Hinweis.

Soll die Hardamardsche Gamma-Funktion aus dem genannten Artikel gezeichnet werden, ist einfach
(DIGAMMA(1-X/2)-DIGAMMA(1/2-X/2))/(2*GAMMA(1-X))
als Term einzutragen, für die Luschny-Funktion
GAMMA(X+1)*(1-SIN(PI*X)/(PI*X)*(-1/2+X/2*(DIGAMMA(X/2+1/2)-DIGAMMA(X/2))))
allerdings mit einer "hässlichen" Unstetigkeit bei 0.
Beide Funktionen haben mit Schulmathematik natürlich absolut nichts zu tun, aber was soll's ...

Beste Grüße
Mathematiker


Gammatester - Mo 22.04.13 16:40

In Deutschland bzw. bei Luschny und Dt. Wiki scheint sich das Bohr-Mollerup-Theorem [http://en.wikipedia.org/wiki/Bohr-Mollerup_theorem] noch nicht herumgesprochen zu haben. :?


Mathematiker - Mo 22.04.13 17:12

Hallo,
Danke für den Hinweis. Vom Bohr-Mollerup-Theorem hatte ich noch nie gehört. Wieder etwas gelernt.
Damit sind eigentlich die beiden Pseudo-Gammafunktion hinfällig. Schade.
Was das deutsche Wikipedia anbetrifft? Nun ja. Die Mathematik ist im deutschsprachigen Raum leider ein "Stiefkind".

Beste Grüße
Mathematiker


Mathematiker - Mi 08.07.15 09:19

Hallo,
da ich Teile des Programms [http://www.entwickler-ecke.de/viewtopic.php?t=114237] mit Quelltext hier zeige, habe ich die Funktionsdarstellung noch einmal einer gründlichen Überarbeitung unterzogen.
Ein paar "Merkwürdigen" sind entfernt (da war z.B. ein Goto drin. :eyecrazy: :oops: ) und weitere Änderungen durchgeführt.

Beste Grüße
Mathematiker