![]() |
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 2 mit der Procedure
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.
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. |
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 |
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 |
Re: Klassen in eigener Unit definieren
Hi,
dein erstes Problem ist an dieser Stelle:
Delphi-Quellcode:
Du Must diesen Aufruf mit einer gültigen Instanz deiner Klasse TWindradZeichner aufrufen.
procedure TForm1.WindradTimer(Sender: TObject);
begin winkel := winkel+1; TWindradZeichner.WindradZeichnen; end; der Code muß an dieser Stelle mindestens so aussehen:
Delphi-Quellcode:
Ich habe jedoch den restlichen Code nicht geprüft!!!! An dieser Stelle steckt aber das erste richtige Problem.
procedure TForm1.WindradTimer(Sender: TObject);
var WZ : TWindradZeichner; begin winkel := winkel+1; wZ := TWindradZeichner.create; try WZ.WindradZeichnen; finally WZ.Free; end; end; Gruß oki |
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: |
Re: Klassen in eigener Unit definieren
Hi sturmrider,
Zitat:
Zitat:
Delphi-Quellcode:
Dann kannst du direkt in den übergebenen Canvas zeichnen.
type
TWindradZeichner = class(TObject) private procedure WindradZeichnen(ACanvas : TCanvas); end; gruß oki |
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:
Du meintest sicherlich, dass ich direkt mit Canvas zeichnen kann:
[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' ...
Delphi-Quellcode:
oder?
...
with canvas do begin ... |
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:
Gruß oki
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; |
Re: Klassen in eigener Unit definieren
Zitat:
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:
Das Thema mit dem übergebenen Canvas ist oben nebenbei mit abgefallen.
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; Gruß oki |
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:
Ich wünsche dir noch einen schönen Vormittag :)
[Fehler] Zeichnen.pas(8): Undefinierter Bezeichner: 'TCanvas'
[Fehler] Zeichnen.pas(23): Undefinierter Bezeichner: 'Pen' [Fehler] Zeichnen.pas(23): Undefinierter Bezeichner: 'clblack' Bis heute Nachmittag und nocheinmal BIG THX!!! :angel2: Gruß Sturmi |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:11 Uhr. |
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