Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Seltsames Verhalten einer Funktion (https://www.delphipraxis.net/200467-seltsames-verhalten-einer-funktion.html)

Luckie 24. Apr 2019 15:39

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.

Pytroxis 24. Apr 2019 16:00

AW: Seltsames Verhalten einer Funktion
 
Zitat:

Zitat von Luckie (Beitrag 1430881)
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ächstes mal leichter; egal in welcher Programmiersprache.

Habe das schon alles in eine extra Unit ausgelagert aber das mit der Klasse ist wirklich ne super Idee! Werde mich dann die nächsten Tage mal daran versuchen es umzuschreiben.
Theoretisch ist es ja nicht so schwierig, hoffe ich mal :D

Hatte bis jetzt immer eine schleife genutzt, welche die Funktion
Delphi-Quellcode:
zeichnen
aufruft (bei mehreren Boxplots).
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?

hoika 24. Apr 2019 16:24

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;

Luckie 24. Apr 2019 16:31

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.

Pytroxis 24. Apr 2019 21:55

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? :?:

scrat1979 24. Apr 2019 23:25

AW: Seltsames Verhalten einer Funktion
 
Zitat:

Zitat von Pytroxis (Beitrag 1430898)
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? :?:

Ich glaube du hast einen Denkfehler. Du kannst im erstellten Objekt auf Form1 das Canvas der Paintbox auf Form2 zuweisen. Vorausgesetzt die Variable (hier: Paintbox) befindet sich im Public-Abschnitt, damit du darauf über Form1 zugreifen kannst...

//EDIT: Du brauchst damit auf Form2 also keine Instanz erstellen

bcvs 25. Apr 2019 07:05

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.

Pytroxis 25. Apr 2019 14:33

AW: Seltsames Verhalten einer Funktion
 
Zitat:

Zitat von scrat1979 (Beitrag 1430901)
Du kannst im erstellten Objekt auf Form1 das Canvas der Paintbox auf Form2 zuweisen. Vorausgesetzt die Variable (hier: Paintbox) befindet sich im Public-Abschnitt, damit du darauf über Form1 zugreifen kannst...

Ich habe es jetzt mal in eine Klasse umgeschrieben, es sieht nun wie folgt aus:
Delphi-Quellcode:
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);
(Die unteren 3 Funktionen habe ich bewusst nicht in die Klasse genommen).
Ist die Deklaration soweit gut oder sollte ich etwas umändern? :)


Zitat:

Zitat von bcvs (Beitrag 1430911)
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.

Hatte ich so oder so gemacht, alleine schon weil es übersichtlicher ist :D

Zitat:

Zitat von bcvs (Beitrag 1430911)
Irgendwo in Form1 wird dann eine Instanz dieser Klasse erzeugt und diese an Form2 übergeben.

Das erstellen in Form 1 ist kein Problem allerdings habe ich beim übergeben ein Problem:
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?

hoika 25. Apr 2019 15:18

AW: Seltsames Verhalten einer Funktion
 
Hallo,
ja du hast einen Denkfehler ;)

Zitat:

die Variable auf Form2 ja "erstellen"
Die Variable in Form2 ist ein Platzhalter.
Form2.BoxPlot:= Self.BoxPlot; / Self=Form1)

BoxPlot in Form2 wird weder erstellt noch freigegeben.

Pytroxis 26. Apr 2019 10:37

AW: Seltsames Verhalten einer Funktion
 
Zitat:

Zitat von hoika (Beitrag 1430954)
Hallo,
Die Variable in Form2 ist ein Platzhalter.
Form2.BoxPlot:= Self.BoxPlot; / Self=Form1)

BoxPlot in Form2 wird weder erstellt noch freigegeben.

Jep das hat wunderbar funktioniert!
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 08:31 Uhr.
Seite 2 von 4     12 34      

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