Entwickler-Ecke
Multimedia / Grafik - fremd unit aus anderer unit aufrufen
comes - Do 11.12.03 16:45
Titel: fremd unit aus anderer unit aufrufen
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25:
| unit main;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls;
type TForm1 = class(TForm) Image1: TImage; Button1: TButton; private public end;
var Form1: TForm1; implementation
{$R *.dfm}
end. |
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101:
| unit planet_unit;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, main;
type TRohstoffe = record Uran : boolean; cryptonid : boolean; end;
type TStationierteSchiffe = record FrachterKlein : Integer; FrachterGross : Integer; Kriegsschiffklein : Integer; Kriegsschiffgross : Integer; end;
type TVolk = record Krieger : boolean; Handelsvolk : boolean; Mischvolk : boolean; end;
type TGebaeude = record Kraftwerk : boolean; Werft : boolean; Schutzschild : boolean; Waffensysteme : boolean; Forschungsstation : boolean; Depot : boolean; end;
type TPlanet = class Bild : TImage; Bezeichnung : String; AnzahlEinwohner : Integer; maxEineohner : Integer; Besitzer : String; Volk : TVolk; Rohstoffe : TRohstoffe; StationierteSchiffe : TStationierteSchiffe; Gebaeude : TGebaeude; neutral : boolean; end;
TWorld = class private FPlanets : array of TWorld; FClicked : Boolean; public procedure onMouseClick(X, Y : Integer); procedure addPlanet(); procedure tick; procedure draw(Sender : TObject); end;
implementation
procedure TWorld.onMouseClick(X, Y : Integer); begin end;
procedure TWorld.addPlanet(); begin end;
procedure TWorld.draw(Sender : TObject); var bild : TGraphic; begin bild.LoadFromFile('c:\test.bmp'); TForm(form1).Canvas.Draw(10,10,bild); end;
procedure TWorld.tick; VAR i : Integer; Mouse : TPoint; begin getCursorPos(Mouse); for i:= 0 to high(FPlanets) do begin FPlanets[i].tick;
if (FClicked)then FPlanets[i].onMouseClick(Mouse.X, Mouse.Y); FPlanets[i].draw(self); end; FClicked:= false; end;
end. |
warum kann ich aus der main.pas unit nicht die planet_unit.pas abrufen bzw starten? ich möchte die objecte aus planet_unit.pas auf die form einbinden.
warum geht das nicht? was mach ich falsch bzw. wo ist mein Denkfehler?
Moderiert von
Peter Lustig: Code- durch Delphi-Tags ersetzt; noch einmal und ich hole Knecht Ruprecht!
Nightmare_82 - Do 11.12.03 16:55
es muß genau umgekehrt sein:
Die MainUnit braucht unter uses die planet_unit.
Bei der PlanetUnit mußt du das "uses main" wegnehmen.
Im FormCreate erstellst du dann TWorld und beim Timer-Event rufst du den Tick auf.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| TForm1 = class(TForm) private FWorld : TWorld;
procedure TForm1.FormCreate(Sender : TObject); begin FWorld:= TWorld.create; end;
procedure TForm1.FormClose(Sender : TObject); begin FWorld.free; end;
procedure TForm1.TimerEvent; begin FWorld.tick; end; |
und bei TWorld.Click mußt du FClicked auf true setzen.
comes - Do 11.12.03 19:18
Titel: wie gestestallte ich jetzt die sache mit dem DRAW?
und wie mach ich das jetzt mit dem draw?
so wie ich es oben gestalltet habe und die änderung mit den units, die du vorgeschlagen hast, kann ich ja jetzt nicht mehr form1.draw(10,10,bild) machen... das klappt ja net mehr.... grummel... was hab ich da nur wieder angestellt... hab mich vielleicht ein bisschen übernommen, aber ich will das jetzt können.... :?
Nightmare_82 - Do 11.12.03 19:34
Du willst doch, daß sich jeder Planet zeichnet und nicht die Welt oder?
Dann änder mal folgendes :
- nimm beim planet ein TBitmap statt TImage
- gib jdem Planeten X und Y-Variablen
- übergib in der Draw-Funktion den canvas der Form
Delphi-Quelltext
1: 2: 3: 4: 5:
| procedure TPlanet.draw(Canvas : TCanvas); begin if Bild <> nil then Canvas.draw(X, Y, Bild); end; |
den Canvas kannst du ja dem TWorld-Objekt im Tick mitgeben:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| procedure TWorld.tick(Canvas : TCanvas);
procedure TForm1.TickEvent; begin FWorld.tick(Canvas); end; |
dann fehlt noch die Add-Funktion, die machst du z.B. so:
Delphi-Quelltext
1: 2: 3: 4: 5:
| procedure TWorld.addPlanet(Planet : TPlanet); begin setlength(FPlanets, length(FPlanets) + 1); FPlanets[high(FPlanets)]:= Planet; end; |
wichtig : Planeten später wieder freigeben:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| destructor TWorld.free; VAR i : Integer; begin for i:= 0 to high(FPlanets) do FPlanets[i].free: setLength(FPlanets, 0); end; |
Jetzt mußt du nur noch den Planeten ein gültiges Bitmap zuweisen und dann sollte es gehen.
Ansonsten gewöhn dir am besten gleich an für alle Klassen einen Constructor und einen Destructor zu schreiben.
comes - Do 11.12.03 22:12
Gut gut, soweit ist jetzt alles klar.
muss nur noch mal ganz dumm fragen, was ist und was macht constructor und destructor genau und wie verwend ich das genau?
constructor? wird da eine bestimmte procedure ausgeführt, beim erstellen ähnlich create? und destructor genauso?
mfg, jeremias
mstuebner - Do 11.12.03 23:29
| comes hat folgendes geschrieben: |
Gut gut, soweit ist jetzt alles klar.
muss nur noch mal ganz dumm fragen, was ist und was macht constructor und destructor genau und wie verwend ich das genau?
constructor? wird da eine bestimmte procedure ausgeführt, beim erstellen ähnlich create? und destructor genauso? |
Werden beim Erzeugen/Löschen einer Klasse aufgerufen. BTW: Steht in der Hilfe ausführlich beschrieben.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!