Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Klassen in eigener Unit definieren (https://www.delphipraxis.net/77134-klassen-eigener-unit-definieren.html)

Sturmrider 15. Sep 2006 07:15


Klassen in eigener Unit definieren
 
Liste der Anhänge anzeigen (Anzahl: 1)
Guten Morgen @all :)
Ich sitze hier gerade in der Schule. Wir eine Subprocedure in eine extra Unit packen und diese als Klasse definieren. Aber irgendwie weiß hier keiner wirklich wie das funktioniert :(
Das Schulbuch hilft uns da leider nicht weiter und unser "Fachlehrer"...hat leider auch nicht wirklich Ahnung :(
Nun meine Frage, wie mache ich das? (wobei zu dem Problem mit der Klasse noch kommt, dass ich in dieser Klassenprocedure auf ein Image aus der anderen Unit zugreifen muss...)

Hier als Anhängsel der Code (wäre echt super wenn ihr da mal gucken könntet ->ich habe es probiert aber funktionieren tut es leider nicht wirklich)

Unit1 mit meiner Form:
Delphi-Quellcode:
unit windmuele1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, Buttons, ExtCtrls, Zeichnen;

type
  TForm1 = class(TForm)
    Image: TImage;
    Bstart: TBitBtn;
    Windrad: TTimer;
    Bstop: TButton;
    speed: TEdit;
    Windgeschwindigkeit: TLabel;
    Windraeder: TLabel;
    procedure BstartClick(Sender: TObject);
    procedure WindradTimer(Sender: TObject);
    procedure BstopClick(Sender: TObject);
  private
//    procedure WindradZeichnen;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  winkel: integer;
implementation

{$R *.DFM}

procedure TForm1.WindradTimer(Sender: TObject);
begin
winkel := winkel+1;
TWindradZeichner.WindradZeichnen;
end;

function IsStringInteger(const AString: String): Boolean;   //prüft ob Sting vom Wert Integer
begin
  Result:=StrToIntDef(AString,0)=StrToIntDef(AString,1);
end;

procedure TForm1.BstartClick(Sender: TObject); //Startet Windrad, wenn Eigenschaften erfüllt
var windspeed: integer;
begin
if speed.text = ''   //prüft ob Eingabefeld == leer
   then begin
    showMessage('Es muss eine Windgeschwindigkeit angegeben werden!');
   end
   else begin
    if IsStringInteger(speed.text) = true //prüfen ob Sting == Integer
      then begin
        windspeed := StrToInt(speed.text);
        Windrad.Interval := windspeed;         //Timer-Interval festlegen
        Windrad.enabled := true;
       end
       else begin
        showMessage('Es müssen Zahlen für die Windgeschwindigkeit angegeben werden!');
       end
   end;
end;

procedure TForm1.BstopClick(Sender: TObject);     //Stoppt Windrad
begin
Windrad.enabled := false;
end;

end.
Unit 2 mit der Procedure
Delphi-Quellcode:
unit Zeichnen;

interface

type
  TWindradZeichner = class(TObject)
  private
    procedure WindradZeichnen(Sender: TObject);
  end;

var
  classes1: TWindradZeichner;

implementation
  uses windmuele1;

procedure TWindradZeichner.WindradZeichnen(Sender: TObject);
var FluegelLaenge: integer;
begin
with Form1.Image.canvas
  do begin
   FluegelLaenge := 100; //länge der Flügel festlegen
   Pen.Color := clblack;
   Pen.width := 3;
   MoveTo (215,190);         //Flügel Zeichnen
   LineTo (round(215+cos(winkel)*FluegelLaenge), round(190-sin(winkel)*FluegelLaenge));
   LineTo (round(215-cos(winkel)*FluegelLaenge), round(190+sin(winkel)*FluegelLaenge));
   Pen.Color := clwhite;
   Pen.width := 3;
   MoveTo (215,190);        //gezeichneter Flügel löschen
   LineTo (round(215+cos(winkel-1)*FluegelLaenge), round(190-sin(winkel-1)*FluegelLaenge));
   LineTo (round(215-cos(winkel-1)*FluegelLaenge), round(190+sin(winkel-1)*FluegelLaenge));
   Brush.Color := clblack;    //Gebäude auszeichnen
   Pen.width := 0;
   Rectangle(210, 190, 220, 300);        //Gebäude
  end;
end;


end.

MOCI 15. Sep 2006 07:45

Re: Klassen in eigener Unit definieren
 
Guten Morgen,

ich an deiner Stelle würde die Berechnungsfunktionen in die Unit2 stecken und das Zeichnen bei der FormularUnit belassen.
Man sollte von Klasse B nicht zurück auf die Klasse A greifen,
wenn Klasse A die Klasse B aufruft.

Eine andere Möglichkeit wäre vielleicht auch, dass du deiner Prozedure TWindradZeichner.WindradZeichnen
das Formular als Parameter mitgibst.

mfg
MOCI

Sturmrider 15. Sep 2006 07:51

Re: Klassen in eigener Unit definieren
 
Warum sollte man denn nicht von Klasse B auf die Klasse A zurückgreifen? (dafür gibt es doch extra uses)
Deinen zweiten Vorschlag verstehe ich erlichgesagt nicht so ganz :?
es muss doch irgendwie der Fehler in dem Source zu beheben sein, den ich geschrieben habe ^^ irgendetwas habe ich da falsch gemacht, ich weiß nur leider nicht was :(

Gruß und THX schonmal :)
Sturmi

oki 15. Sep 2006 07:51

Re: Klassen in eigener Unit definieren
 
Hi,

dein erstes Problem ist an dieser Stelle:

Delphi-Quellcode:
procedure TForm1.WindradTimer(Sender: TObject);
begin
winkel := winkel+1;
TWindradZeichner.WindradZeichnen;
end;
Du Must diesen Aufruf mit einer gültigen Instanz deiner Klasse TWindradZeichner aufrufen.

der Code muß an dieser Stelle mindestens so aussehen:
Delphi-Quellcode:
procedure TForm1.WindradTimer(Sender: TObject);
var WZ : TWindradZeichner;
begin
winkel := winkel+1;
wZ := TWindradZeichner.create;
try
WZ.WindradZeichnen;
finally WZ.Free; end;
end;
Ich habe jedoch den restlichen Code nicht geprüft!!!! An dieser Stelle steckt aber das erste richtige Problem.

Gruß oki

Sturmrider 15. Sep 2006 07:56

Re: Klassen in eigener Unit definieren
 
THX ^______^ in der Unit2 besteht jetzt noch ein Problem -> irgendwie mag der das "Form1.Image.canvas" nicht :(
blöde Frage, aber warum nicht? :gruebel:

oki 15. Sep 2006 08:04

Re: Klassen in eigener Unit definieren
 
Hi sturmrider,


Zitat:

Zitat von Sturmrider
Warum sollte man denn nicht von Klasse B auf die Klasse A zurückgreifen? (dafür gibt es doch extra uses)

wenn man das macht, hat man schnell überkreuzende Bezüge. Das ist nicht so toll.



Zitat:

Zitat von Sturmrider
irgendwie mag der das "Form1.Image.canvas" nicht :(

klar, er kennt Form1 nicht. Ändere den Funktionsaufruf wie folgt:

Delphi-Quellcode:
type
  TWindradZeichner = class(TObject)
  private
    procedure WindradZeichnen(ACanvas : TCanvas);
  end;
Dann kannst du direkt in den übergebenen Canvas zeichnen.

gruß oki

Sturmrider 15. Sep 2006 08:09

Re: Klassen in eigener Unit definieren
 
Achso :roll: naja, aber wenn alles richtig geschrieben ist, dürfte das ja kein Problem darstellen ^^

wie meinst du das denn mit: "Dann kannst du direkt in den übergebenen Canvas zeichnen"?
Wenn ich das so mache wie du sagst und einfach den Teil ersetze bekomme ich folgende Fehlermeldung:
Delphi-Quellcode:
[Fehler] Zeichnen.pas(8): Undefinierter Bezeichner: 'TCanvas'
[Fehler] Zeichnen.pas(17): Deklaration von 'WindradZeichnen' unterscheidet sich von vorheriger Deklaration
[Fehler] Zeichnen.pas(23): Undefinierter Bezeichner: 'Pen'
...
Du meintest sicherlich, dass ich direkt mit Canvas zeichnen kann:
Delphi-Quellcode:
...
with canvas
  do begin
...
oder?

oki 15. Sep 2006 08:12

Re: Klassen in eigener Unit definieren
 
Hier noch schnell ein paar Erläuterungen dazu.

Grundsätzlich ist diese Form des direkten Zugriffes auf globale Variablen nicht so schön. Gerade wenn du OOP arbeitest, ist der Sinn unteranderem auch, dass du deine werte in Form von Zuweisungen in Funktionen, Methoden und Eigenschaften übergibst. Soll deine neue klasse auch anderweitig eingesetzt werden, so wirst du in Zukunft immer über dein Form1 stolpern, da sie eine Variable aus einer anderen Unit ist.

der Aufruf für eine Übergabe mittels Parameter in deinem Fall ist dann so:
Delphi-Quellcode:
procedure TForm1.WindradTimer(Sender: TObject);
var WZ : TWindradZeichner;
begin
  winkel := winkel+1;
  wZ := TWindradZeichner.create;
  try
    WZ.WindradZeichnen(self.canvas);
  finally WZ.Free; end;
end;
Gruß oki

oki 15. Sep 2006 08:21

Re: Klassen in eigener Unit definieren
 
Zitat:

Zitat von Sturmrider
Wenn ich das so mache wie du sagst und einfach den Teil ersetze bekomme ich folgende Fehlermeldung:
Delphi-Quellcode:
[Fehler] Zeichnen.pas(8): Undefinierter Bezeichner: 'TCanvas'
[Fehler] Zeichnen.pas(17): Deklaration von 'WindradZeichnen' unterscheidet sich von vorheriger Deklaration
[Fehler] Zeichnen.pas(23): Undefinierter Bezeichner: 'Pen'
...
Du meintest sicherlich, dass ich direkt mit Canvas zeichnen kann:
Delphi-Quellcode:
...
with canvas
  do begin
...
oder?


Erster Fehler: Binde die unit graphics in dein uses mit ein. Dort ist TCanvas definiert.
zweiter Fehler: du mußt sowohl in der deklaration wie auch in der Methode gleiche Parameter definieren. Zu deutsch, du hast nur an einer Stelle auf (ACanvas : TCanvas) geändert.
Delphi-Quellcode:
type
  TWindradZeichner = class(TObject)
  private
    procedure WindradZeichnen(ACanvas : TCanvas);
  end;

procedure TWindradZeichner.WindradZeichnen(ACanvas : TCanvas);
var FluegelLaenge: integer;
begin
with ACanvas
  do begin
....

Das mit dem Pen ist mir nicht ganz klar. Aber ich habe dir was falsches gesagt. :oops: Ich habe übersehen, das du in ein Image zeichnest. damit ist der Aufruf natürlich so:

Delphi-Quellcode:
procedure TForm1.WindradTimer(Sender: TObject);
var WZ : TWindradZeichner;
begin
  winkel := winkel+1;
  wZ := TWindradZeichner.create;
  try
    WZ.WindradZeichnen(self.image.canvas);
  finally WZ.Free; end;
end;
Das Thema mit dem übergebenen Canvas ist oben nebenbei mit abgefallen.

Gruß oki

Sturmrider 15. Sep 2006 08:26

Re: Klassen in eigener Unit definieren
 
Vielen Dank!!! Für deine Hilfe!!! :mrgreen: echt super nett von dir!
Leider ist jetzt unsere Info-Stunde zuende...bin erst heute Nachmittag wieder hier.
Der Fehler tritt leider immer noch auf
Delphi-Quellcode:
[Fehler] Zeichnen.pas(8): Undefinierter Bezeichner: 'TCanvas'
[Fehler] Zeichnen.pas(23): Undefinierter Bezeichner: 'Pen'
[Fehler] Zeichnen.pas(23): Undefinierter Bezeichner: 'clblack'
Ich wünsche dir noch einen schönen Vormittag :)
Bis heute Nachmittag und nocheinmal BIG THX!!! :angel2:

Gruß Sturmi


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:11 Uhr.
Seite 1 von 2  1 2      

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-2025 by Thomas Breitkreuz