Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Unit-übergreifende Programmierung + statisches Array
der organist - Mo 28.07.08 19:25
Titel: Unit-übergreifende Programmierung + statisches Array
Neuestes Problem weiter unten, in meinem 3. Post.
ich schreibe gerade an einem Programm mit mehreren Units. Nun will ich aus einer Unit mit der Paintbox (einer anderen Unit) einen Kreis zeichnen.
Was muss ich beachten, wie rufe ich den entsprechenden Canvas auf?
Danks schonmal im Vorraus.
Moderiert von
Narses: Topic aus VCL (Visual Component Library) verschoben am Mo 28.07.2008 um 19:29
Tilman - Mo 28.07.08 20:35
Naja, zunächst mal muss die unit in der die Paintbox deklariert ist in die uses-Klausel der unit aufgenommen werden, aus der der Aufruf erfolgen soll. Gewöhlicherweise genügt hier ein aufruf in der uses-Klausel im implementation-Teil.
Sodann kannst du die fremde Paintbox ansprechen, über das Formular auf der sie sich befindet:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| unit unit2; interface .. implementation uses unit1; .. form1.paintbox1.canvas.machwas(); |
Solange du kein Multithreading benutzt musst du soweit ich weiß weiter nix beachten.
der organist - Di 29.07.08 07:23
wenn ich die Unit in die Uses-Klausel aufnehme, dann habe ich aber circuläre deklaration, da ich in der PaintboxUnit schon die andere in der Uses-Klausel habe, bzw, wenn ich es nicht aufnehme, dann habe ich undeklarierte Bezeichner (Form1, PaintBox1...):
P.S.
Was ist Multithreading?
iKilledKenny - Di 29.07.08 08:43
Also ich würde ja empfehlen, die PaintBox als Parameter zu übergeben.
Gausi - Di 29.07.08 09:01
Ja, das fände ich auch sinnvoller.
Aber: schau dir mal den Schnipsel von
Tilman genauer an. Dein Code sieht anders aus, wenn du diesen Fehler bekommst. ;-)
Tilman - Di 29.07.08 15:28
Tilman hat folgendes geschrieben: |
Naja, zunächst mal muss die unit in der die Paintbox deklariert ist in die uses-Klausel der unit aufgenommen werden, aus der der Aufruf erfolgen soll. Gewöhlicherweise genügt hier ein aufruf in der uses-Klausel im implementation-Teil.
|
der organist - Mi 30.07.08 21:44
So, mitlerweile hat das gefunzt. Aber nun stehe ich vor einem neuen Problem. Ich kann nicht auf Methoden und Felder in anderen Units zugreifen, wie in folgendem Beispiel, ich habs in der uses-Klausel drin^^.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| [....]
private BallNr : Array [1..10] of TBall; [....]
implementation
[....] procedure TFSpiel.FormClose(Sender: TObject; var Action: TCloseAction); var I : Integer; begin for I := 1 to 10 do BallNr[i].Free; end;
[....] |
im markierten Bereich gibt es eine Fehlermeldung:
Project Project 1.exe raised eception class EAccessViolation with message 'Acces violation at address 0045B995 in module 'Project 1.exe'. Read of address 0000001C'.
Moderiert von
Narses: Delphi-Tags hinzugefügt
Gausi - Mi 30.07.08 21:49
Warum ist BallNr als private deklariert, wenn es doch public sein soll? ;-)
der organist - Mi 30.07.08 21:53
is ne gute Frage, hab ich geändert, hilft aber leider nichts. Gleich Fehlermeldung. :(
Die andere Unit beinhaltet die Klasse TBall.
Tilman - Mi 30.07.08 22:07
Hm, vielleicht ist beim überschreiben von tBall.Destroy irgendwas schief gelaufen? *mutmaß*
der organist - Mi 30.07.08 22:10
übergelaufen klingt gut: im Call-Stack findet sich ein "To Large Integer", aber ich benutze keine großen zahlen in der richtung.
wazup - Do 31.07.08 03:52
Wenn der Fehler auftritt benutzt doch einfach Int64 statt einem normalen Integer
Logikmensch - Do 31.07.08 05:33
Zitat: |
im markierten Bereich gibt es eine Fehlermeldung:
Project Project 1.exe raised eception class EAccessViolation with message 'Acces violation at address 0045B995 in module 'Project 1.exe'. Read of address 0000001C' |
Ich kann zwar auch nur mutmaßen, aber vielleicht sind die 10 Elemente des Arrays nicht ordentlich mit sowas ähnlichem wie
Delphi-Quelltext
1: 2:
| for i:=1 to 10 do BallNr[i]:=TBall.Create(..); |
im FormCreate-Ereignis initialisiert worden. Solche AccessViolations treten mitunter auf, wenn das Objekt, welches Du mit Free freigeben möchtest, nicht gültig ist oder schon vorher geFreet worden ist.
der organist - Do 31.07.08 09:39
Logikmensch hat folgendes geschrieben: |
[...]
aber vielleicht sind die 10 Elemente des Arrays nicht ordentlich [...] initialisiert worden. [...] |
Ich kann mich nur bedanken, es hat geholfen und ein paar Stunden Zeitlichem Abstand und ein paar Stunden Gartenarbeit haben geholfen; Es lag am "ordentlich", ich habe for-Schleife "ballanzahl" oft durchgeführt, der Variablen aber den Wert erst nachher zugewiesen (beim Create also 0).
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 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!