AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Seltsames Verhalten einer Funktion

Ein Thema von Pytroxis · begonnen am 24. Apr 2019 · letzter Beitrag vom 28. Apr 2019
Antwort Antwort
Seite 2 von 4     12 34   
Benutzerbild von Luckie
Luckie
(Moderator)

Registriert seit: 29. Mai 2002
37.270 Beiträge
 
Delphi 2006 Professional
 
#11

AW: Seltsames Verhalten einer Funktion

  Alt 24. Apr 2019, 15:39
Super. So was freut einem, wie das hier gelaufen ist. Großes Lob an den Threadersteller und an die Helfer.

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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Pytroxis

Registriert seit: 12. Apr 2019
46 Beiträge
 
#12

AW: Seltsames Verhalten einer Funktion

  Alt 24. Apr 2019, 16:00
Super. So was freut einem, wie das hier gelaufen ist. Großes Lob an den Threadersteller und an die Helfer.

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

Hatte bis jetzt immer eine schleife genutzt, welche die Funktion 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?

Geändert von Pytroxis (24. Apr 2019 um 16:24 Uhr)
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
7.178 Beiträge
 
Delphi XE4 Professional
 
#13

AW: Seltsames Verhalten einer Funktion

  Alt 24. Apr 2019, 16:24
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;
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie
(Moderator)

Registriert seit: 29. Mai 2002
37.270 Beiträge
 
Delphi 2006 Professional
 
#14

AW: Seltsames Verhalten einer Funktion

  Alt 24. Apr 2019, 16:31
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Pytroxis

Registriert seit: 12. Apr 2019
46 Beiträge
 
#15

AW: Seltsames Verhalten einer Funktion

  Alt 24. Apr 2019, 21:55
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?
  Mit Zitat antworten Zitat
Benutzerbild von scrat1979
scrat1979

Registriert seit: 12. Jan 2007
Ort: Sulzbach a.d. Murr
905 Beiträge
 
Delphi 10.3 Rio
 
#16

AW: Seltsames Verhalten einer Funktion

  Alt 24. Apr 2019, 23:25
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
Michael Kübler

Geändert von scrat1979 (24. Apr 2019 um 23:28 Uhr)
  Mit Zitat antworten Zitat
bcvs

Registriert seit: 16. Jun 2011
402 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#17

AW: Seltsames Verhalten einer Funktion

  Alt 25. Apr 2019, 07:05
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.
  Mit Zitat antworten Zitat
Pytroxis

Registriert seit: 12. Apr 2019
46 Beiträge
 
#18

AW: Seltsames Verhalten einer Funktion

  Alt 25. Apr 2019, 14:33
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?


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

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?
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
7.178 Beiträge
 
Delphi XE4 Professional
 
#19

AW: Seltsames Verhalten einer Funktion

  Alt 25. Apr 2019, 15:18
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.
Heiko
  Mit Zitat antworten Zitat
Pytroxis

Registriert seit: 12. Apr 2019
46 Beiträge
 
#20

AW: Seltsames Verhalten einer Funktion

  Alt 26. Apr 2019, 10:37
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
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?


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
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:48 Uhr.
Powered by vBulletin® Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf