![]() |
AW: Seltsames Verhalten einer Funktion
Super. So was freut einem, wie das hier gelaufen ist. Großes Lob an den Threadersteller und an die Helfer. :thumb:
Zusatzaufgabe: Jetzt noch etwas Refactoring und das ganze in eine Klasse packen. Dann kannst du beliebig viele Boxplots machen, weil jeder Boxplot ein unabhängiges Objekt mit der Klasse als Blaupause ist. Und wenn du das hier einmal kapiert und geschafft hast, fällt es beim nä htsen mal leichter; egal in welcher Programmiersprache. |
AW: Seltsames Verhalten einer Funktion
Zitat:
Theoretisch ist es ja nicht so schwierig, hoffe ich mal :D Hatte bis jetzt immer eine schleife genutzt, welche die Funktion
Delphi-Quellcode:
aufruft (bei mehreren Boxplots).
zeichnen
Meinst du ich kann das so lassen oder sollte ich das, wenn ich es zu einer Klasse umschreibe, anders lösen? :) Edit: Oder wäre folgende Option besser -> Funktion in der Klasse die zeichnen aufruft (mit Schleife etc.). Und dann in Form2 (wo gezeichnet wird), lediglich diese Funktion statt zeichnen aufzurufen? |
AW: Seltsames Verhalten einer Funktion
Hallo,
jeder Boxplot hat immer die gleichen Daten(-strukturen) und Methoden.
Delphi-Quellcode:
type
TBoxplot = class private // das haben wir später public // Variablen i: Integer; // Methoden procedure Zeichen; end; |
AW: Seltsames Verhalten einer Funktion
Und die Methode Zeichnen kennt den Canvas auf dem gezeichnet werden soll. Entweder per Parameter oder Property. Dann kannst du deine Boxplots auf alles zeichnen, was ein Canvas hat: Form, Paintbox, Image, Scrollbox, ...ohne am eigentlichen Code was ändern zu müssen.
|
AW: Seltsames Verhalten einer Funktion
Witzige Geschichte die mir gerade beim umschreiben aufgefallen ist:
Ich nutze 2 Forms, auf der ersten trägt der Nutzer den Datensatz/die Datensätze ein und auf der 2. Form ist die PaintBox auf welcher gezeichnet wird. Wenn ich das alles nun umschreibe zu einer Klasse müsste ich ja in Form 1 eine Objekt erstellen/erschaffen. Ist das aber nicht sinnlos, denn auf Form 2 musst ja ein Objekt erstellt werden um es zu zeichnen. Habe ich gerade eine Denkfehler? Oder könnte mir jemand sagen wie ich es am geschicktesten machen sollte? :?: |
AW: Seltsames Verhalten einer Funktion
Zitat:
//EDIT: Du brauchst damit auf Form2 also keine Instanz erstellen |
AW: Seltsames Verhalten einer Funktion
ich würde sowieso die Klasse TBoxplot (oder wie auch immer die heißt) in eine eigen Unit auslagern, die dann in Form1 und Form2 eingebunden wird.
Irgendwo in Form1 wird dann eine Instanz dieser Klasse erzeugt und diese an Form2 übergeben. |
AW: Seltsames Verhalten einer Funktion
Zitat:
Delphi-Quellcode:
(Die unteren 3 Funktionen habe ich bewusst nicht in die Klasse genommen).
type
TBoxplot = class private FZahlen : array of array of Double; FNamen : TStrings; FQuartils : array of array[0..1] of Double; FMedian : array of Double; FBereiche: array of array[0..3] of array of Double; FPaintBox : TPaintBox; FSize : array[0..1] of Integer; // size[0] -> Höhe; size[1] -> Breite procedure sortiereZahlen(index: integer); procedure drawLine(color: TColor; minX, minY, maxX, maxY:integer); procedure zeichnen(Boxplot : real); public procedure einlesenZahlen(datensatz : array of TStringList; bNamen: TStrings); procedure boxplotErstellen(PaintBox : TPaintBox); // Ermittelt die Anzhal der Boxplots und ruft dann n-mal die zeichen Funktion auf. published constructor Create(size : array of Integer); // Den Destruktor werde ich noch hinzufügen end; function isNumber(eingabe:string):Boolean; function checkEingabe (eingabe : String) : Boolean; procedure setButton(button:array of TButton; state : Boolean); Ist die Deklaration soweit gut oder sollte ich etwas umändern? :) Zitat:
Zitat:
Wie übergebe ich die Instanz am besten? Hatte mir überlegt auf Form2 eine variable von der Klasse zu erstellen und dann dieser in Form1 die Instanz zuzuweisen (-> Ich muss auf Form2 die ChangeSize/OnPaint nutzen, da die Größe dynamisch ist). Allerdings muss ich die Variable auf Form2 ja "erstellen". Dann müsste ich aber doch den Konstruktor erneut aufrufen und erzeuge somit doch eine neue Instanz oder habe ich auch hier ein Denkfehler? |
AW: Seltsames Verhalten einer Funktion
Hallo,
ja du hast einen Denkfehler ;) Zitat:
Form2.BoxPlot:= Self.BoxPlot; / Self=Form1) BoxPlot in Form2 wird weder erstellt noch freigegeben. |
AW: Seltsames Verhalten einer Funktion
Zitat:
Hab es jetzt so gelöst: Form1: -erstellen der Variable/Instanz mithilfe von Create. -Verschiedenen Datensätze in die Instanz einlesen. Form2: -Boxplot erstellen lassen. Ich gehe mal davon aus, dass man normalerweise für jeden Boxplot eine Instanz erstellen würde, allerdings habe ich insgesamt nur eine Instanz für alle Boxplots erstellt. Hierbei lasse ich dann einfach eine Schleife x Boxplots zeichnen, je nachdem wie viele Datensätze vorhanden sind. Aber effektiv habe ich mir doch durch den umschrieb jetzt nichts gespart :D Hätte ich einen Array vom Typ meiner Klasse erzeugt (wo jeder Index eine Instanz ist) hätte es doch mehr gebracht oder bin ich gerade nur dumm? :D Prinzipiell geht jetzt alles, vielen Dank dafür! Werde die Tage jetzt nur noch meinen Code aufräumen und versuchen so kompakt wie möglich zu schreiben :D |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:59 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 by Thomas Breitkreuz