Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Abschlussprojekt Informatik Leistungskurs (https://www.delphipraxis.net/84922-abschlussprojekt-informatik-leistungskurs.html)

Christian18 23. Jan 2007 16:35


Abschlussprojekt Informatik Leistungskurs
 
Hallo,

als Abschlussprojekt im Informatik Leistungskurs, habe ich mir folgendes überlegt. Ich hab mir gedacht, das ich ein Programm schreibe, welches mir diverse mathematische Funktionen Grafisch Darstellt. Mein Projekt vorschlag ist auch schon genehmigt worden.

Es sollen später Lineare und Quadratische Funktionen eingezeichnet werden.

Bsp.:

Lineare Fkt.
f(x) = 3x + 7

Quadr. Fkt.
f(x) = x² + 4x - 9

Desweiteren sollen alle Shnittpunkte berechnet werden. Also, Nullstellen und Schnittpkt.e mit der y- Achse

Eine weitere Bedingung für die Realisierung des Projektes ist, das wir alles in einer anderen Klasse auslagern. Jetzt weiß ich leider bei der Realisierung nicht weiter. Wir haben sowas noch nicht im Unterricht besprochen.

Ich habe es mal versucht, aber es funktioniert leider nicht. Es kommt auch eine Fehlermeldung, es wird bloß nix gezeichnet.

Hier mein Code:

Delphi-Quellcode:
unit UKoordinatensystem;

interface

uses
  ExtCtrls, Controls;

type
  TKoordinatensystem = class
    constructor Create();
    procedure Koordinatensystem();
    destructor Destroy();
  private
    Image : TImage;
    FWidth : Integer;
    FHeight : Integer;
    FTop : Integer;
    FLeft : Integer;
    FRand : Integer;
    FParent : TWinControl;
  public

  published
    property Width : Integer Read FWidth Write FWidth;
    property Height : Integer Read FHeight Write FHeight;
    property Top : Integer Read FTop Write FTop;
    property Left : Integer Read FLeft Write FLeft;
    property Rand : Integer Read FRand Write FRand;
    property Parent : TWinControl Read FParent Write FParent;
  end;

implementation

constructor TKoordinatensystem.Create();
begin
  Image:=TImage.Create(FParent);

  Image.Width:=FWidth;
  Image.Height:=FHeight;
  Image.Top:=FTop;
  Image.Left:=FLeft;

  Image.Parent:=FParent;

  Koordinatensystem();
end;

procedure TKoordinatensystem.Koordinatensystem();
begin
  // Achsen zeichnen
  Image.Canvas.MoveTo(FWidth div 2, FRand);
  Image.Canvas.LineTo(FWidth div 2, FHeight - FRand);
end;

destructor TKoordinatensystem.Destroy();
begin
  Image.Free();
end;

end.
Hier der aufruf:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
  var k : TKoordinatensystem;
begin
  k:=TKoordinatensystem.Create();

  k.Width:=300;
  k.Height:=300;
  k.Top:=100;
  k.Left:=100;
  k.Rand:=10;

  k.Parent:=Form1;
end;

Thorben_K 23. Jan 2007 17:10

Re: Abschlussprojekt Informatik Leistungskurs
 
Hallo

erst ich nehme mal an du willst das auf dem bildschirm darstallen, also solltest du von TComponent oder besser noch von TPaintBox ableiten, so habe ich es gemacht als ich sowas gemacht habe


Desweiteren solltest du die ersten 3 Proceduren im Puplic teil rein packen, ist sauberer.

Sascha L 23. Jan 2007 17:12

Re: Abschlussprojekt Informatik Leistungskurs
 
Wenn du deinen Code Schritt für Schritt durchgehst, müsste dir schon mal folgendes aufallen:

- Du setzt im Create() das Parent des Images auf FParent. Zu diesem Zeitpunkt ist FParent aber nil
- Du rufst einmal im Create() die Prozedur Koordinatensystem() auf, welche das Koordinatensystem zeichnet
- Beim Aufruf wird also die Klasse erzeugt und auf dem Image gezeichnet, aber erst DANACH setzt du die Werte wie Breite, Höhe, etc. und auch erst danach setzt du das Parent

Entweder übergibst du all diese Informationen beim Aufruf der Create-Prozedur, was nicht elegant wäre, oder besser du rufst die Prozedure Koordinatensystem() selbst auf. D.h. den Aufruf im Constructor löscht du raus. Des Weiteren würde ich dann FParent der Create()-Prozedur übergeben, oder aber du schreibst eine Setter-Methode, die Image.Parent := FParent setzt.

Nachdem du dann also die Klasse erzeugst und allen Eigenschaften die Werte zugewiesen hast, würdest du dann Koordinatensystem() selbst aufrufen. Ich würde daher dann auch die Prozedur umbennen, z.B. in ZeichneKoordinatensystem() oder nur Zeichne().

Christian18 23. Jan 2007 17:13

Re: Abschlussprojekt Informatik Leistungskurs
 
Hi,

ja ich will das zeichnen, warum zeigt mir Delphi das was ich gezeichnet habe nicht an?

Christian18 23. Jan 2007 17:20

Re: Abschlussprojekt Informatik Leistungskurs
 
Hallo,

wenn ich einen Button dyn. erzeuge, dann muss ich aber nur Breit, Höhe, Top und Left setzen und die Eigenschaft Parent und dann wird er mir angezeigt. Da habe ich auch keine Weitere procedure, die ich aufrufen muss, damit alle werte gesetzt werden. Wie ist denn das Problem dort gelöst???

Der_Unwissende 23. Jan 2007 17:22

Re: Abschlussprojekt Informatik Leistungskurs
 
Zitat:

Zitat von Christian18
ja ich will das zeichnen, warum zeigt mir Delphi das was ich gezeichnet habe nicht an?

HI,
das hat Sacha Dir doch gerade erklärt. Der Parent ist die grafische Komponente, die dein Image anzeigen soll. Dem Image wird nur einmal ein solcher Parent zugewiesen und der ist nil (nicht vorhanden), das Image wird also auf keiner Komponente dargestellt. Änderst Du den Wert von FParent, so interessiert sich das Image nicht für den neuen Wert (bekommt das gar nicht mit).
Du musst also nur dafür sorgen, dass die Änderung von FParent auch zu einer Änderung von Image.Parent führt (wie das geht hat Sacha erklärt).

An sich solltest Du aber vielleicht auch gleich darüber nachdenken das Image von außen in die Komponente zu reichen, so kann der Designer des Formulars über die Position und Größe des Image entscheiden und es dann an deine Methode übergeben. Für das Formular-Design ist also zur Designzeit bereits das Bild sichtbar, für deine Klasse ist nur wichtig, dass sie eine Zeichenfläche hat, nicht wo sie herkommt.

Gruß Der Unwissende

Thorben_K 23. Jan 2007 17:25

Re: Abschlussprojekt Informatik Leistungskurs
 
Du kannst einfach mal den Parent per Parameter im Construktor mitgeben, dass könnte das probleme schön lösen

aber auch dann ist die breite und die höhe usw nicht festgelegt.

Das Image einfach später erstellen, also nicht im Construktor von TKoordinatenSystem


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:39 Uhr.

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