AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Klassen in eigener Unit definieren

Ein Thema von Sturmrider · begonnen am 15. Sep 2006 · letzter Beitrag vom 15. Sep 2006
Antwort Antwort
Seite 1 von 2  1 2      
Sturmrider

Registriert seit: 12. Mär 2006
30 Beiträge
 
#1

Klassen in eigener Unit definieren

  Alt 15. Sep 2006, 07:15
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.
Angehängte Dateien
Dateityp: rar windm_hle_1.0_996.rar (11,0 KB, 8x aufgerufen)
  Mit Zitat antworten Zitat
MOCI

Registriert seit: 2. Aug 2006
12 Beiträge
 
#2

Re: Klassen in eigener Unit definieren

  Alt 15. Sep 2006, 07:45
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
  Mit Zitat antworten Zitat
Sturmrider

Registriert seit: 12. Mär 2006
30 Beiträge
 
#3

Re: Klassen in eigener Unit definieren

  Alt 15. Sep 2006, 07:51
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
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#4

Re: Klassen in eigener Unit definieren

  Alt 15. Sep 2006, 07:51
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
  Mit Zitat antworten Zitat
Sturmrider

Registriert seit: 12. Mär 2006
30 Beiträge
 
#5

Re: Klassen in eigener Unit definieren

  Alt 15. Sep 2006, 07:56
THX ^______^ in der Unit2 besteht jetzt noch ein Problem -> irgendwie mag der das "Form1.Image.canvas" nicht
blöde Frage, aber warum nicht?
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#6

Re: Klassen in eigener Unit definieren

  Alt 15. Sep 2006, 08:04
Hi sturmrider,


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 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
  Mit Zitat antworten Zitat
Sturmrider

Registriert seit: 12. Mär 2006
30 Beiträge
 
#7

Re: Klassen in eigener Unit definieren

  Alt 15. Sep 2006, 08:09
Achso 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?
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#8

Re: Klassen in eigener Unit definieren

  Alt 15. Sep 2006, 08:12
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
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#9

Re: Klassen in eigener Unit definieren

  Alt 15. Sep 2006, 08:21
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. 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
  Mit Zitat antworten Zitat
Sturmrider

Registriert seit: 12. Mär 2006
30 Beiträge
 
#10

Re: Klassen in eigener Unit definieren

  Alt 15. Sep 2006, 08:26
Vielen Dank!!! Für deine Hilfe!!! 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!!!

Gruß Sturmi
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 02:07 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