Autor |
Beitrag |
der organist
      
Beiträge: 467
Erhaltene Danke: 17
WIN 7
NQC, Basic, Delphi 2010
|
Verfasst: Mo 28.07.08 19:25
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
Zuletzt bearbeitet von der organist am Mi 30.07.08 21:45, insgesamt 2-mal bearbeitet
|
|
Tilman
      
Beiträge: 1405
Erhaltene Danke: 51
Win 7, Android
Turbo Delphi, Eclipse
|
Verfasst: 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.
_________________ Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)
Zuletzt bearbeitet von Tilman am Di 29.07.08 15:28, insgesamt 2-mal bearbeitet
|
|
der organist 
      
Beiträge: 467
Erhaltene Danke: 17
WIN 7
NQC, Basic, Delphi 2010
|
Verfasst: 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
      
Beiträge: 394
Erhaltene Danke: 8
Win XP
D5 Prof, C# Express 2005
|
Verfasst: Di 29.07.08 08:43
Also ich würde ja empfehlen, die PaintBox als Parameter zu übergeben.
|
|
Gausi
      
Beiträge: 8548
Erhaltene Danke: 477
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: 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. 
_________________ We are, we were and will not be.
|
|
Tilman
      
Beiträge: 1405
Erhaltene Danke: 51
Win 7, Android
Turbo Delphi, Eclipse
|
Verfasst: 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.
|
_________________ Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)
|
|
der organist 
      
Beiträge: 467
Erhaltene Danke: 17
WIN 7
NQC, Basic, Delphi 2010
|
Verfasst: 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
Zuletzt bearbeitet von der organist am Mi 30.07.08 21:51, insgesamt 1-mal bearbeitet
|
|
Gausi
      
Beiträge: 8548
Erhaltene Danke: 477
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Mi 30.07.08 21:49
Warum ist BallNr als private deklariert, wenn es doch public sein soll? 
_________________ We are, we were and will not be.
|
|
der organist 
      
Beiträge: 467
Erhaltene Danke: 17
WIN 7
NQC, Basic, Delphi 2010
|
Verfasst: 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.
_________________ »Gedanken sind mächtiger als Waffen. Wir erlauben es unseren Bürgern nicht, Waffen zu führen - warum sollten wir es ihnen erlauben, selbständig zu denken?« Josef Stalin
Zuletzt bearbeitet von der organist am Mi 30.07.08 22:20, insgesamt 2-mal bearbeitet
|
|
Tilman
      
Beiträge: 1405
Erhaltene Danke: 51
Win 7, Android
Turbo Delphi, Eclipse
|
Verfasst: Mi 30.07.08 22:07
Hm, vielleicht ist beim überschreiben von tBall.Destroy irgendwas schief gelaufen? *mutmaß*
_________________ Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)
|
|
der organist 
      
Beiträge: 467
Erhaltene Danke: 17
WIN 7
NQC, Basic, Delphi 2010
|
Verfasst: 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.
_________________ »Gedanken sind mächtiger als Waffen. Wir erlauben es unseren Bürgern nicht, Waffen zu führen - warum sollten wir es ihnen erlauben, selbständig zu denken?« Josef Stalin
|
|
wazup
      
Beiträge: 101
Windows XP
Delphi 2009
|
Verfasst: Do 31.07.08 03:52
Wenn der Fehler auftritt benutzt doch einfach Int64 statt einem normalen Integer
|
|
Logikmensch
      
Beiträge: 390
Win XP
Delphi 2007 Prof., XE2, XE5
|
Verfasst: 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.
_________________ Es gibt keine Probleme - nur Lösungen!
|
|
der organist 
      
Beiträge: 467
Erhaltene Danke: 17
WIN 7
NQC, Basic, Delphi 2010
|
Verfasst: 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).
_________________ »Gedanken sind mächtiger als Waffen. Wir erlauben es unseren Bürgern nicht, Waffen zu führen - warum sollten wir es ihnen erlauben, selbständig zu denken?« Josef Stalin
|
|