| Autor |
Beitrag |
M. Raab
      
Beiträge: 334
Erhaltene Danke: 1
WIN 7
Delphi XE
|
Verfasst: Mo 12.01.04 14:17
Hallo NG,
ich habe ein FORM mit nem Image.Canvas drauf. Mit dem OnShow Ereignis möchte ich auf das Canvas zeichnen - geht aber nicht. Ich habe es schon mit OnActivate und OnCreate probiert - gleiches Ergebnis.
Hat da jemand ne Lösung parat ?
Gruss
Markus
_________________ Das Leben besteht aus Bits und Bytes - nur: wo laufen sie denn ????
Super ... Du kannst das zwar lesen, toll..... aber: völlig zwecklos !!!
|
|
ShiKai
      
Beiträge: 56
|
Verfasst: Mo 12.01.04 14:50
hast du schon die größe des bitmap vom image an die größe des image angepasst?
Delphi-Quelltext 1: 2:
| Image1.Picture.Bitmap.Height := Image1.Height; Image1.Picture.Bitmap.Width := Image1.Width; |
das wird oft und gerne vergessen...
wfg,
ShiKai
Moderiert von Tino: Code- durch Delphi-Tags ersetzt.
|
|
M. Raab 
      
Beiträge: 334
Erhaltene Danke: 1
WIN 7
Delphi XE
|
Verfasst: Mo 12.01.04 14:58
Hallo,
vielen Dank - das hat nix gebracht. Ich denke es liegt daran, dass ich auf das IMAGE zeichne, es aber noch nicht existiert.
Verbinde ich die Zeichenroutine
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| form11.Image1.Picture.Bitmap.Height := Image1.Height; form11.Image1.Picture.Bitmap.Width := Image1.Width; for lauf:=1 to lauf3 do begin readln(io,BPZaehler,BPX[lauf],BPY[lauf]); form11.Image1.Canvas.Pen.Width:=2; form11.Image1.Canvas.Pen.Color:=clBlue; form11.Image1.Canvas.Brush.Color:=clBlue; form11.Image1.Canvas.Ellipse(BPX[lauf]-3,BPY[lauf]-3,BPX[lauf]+3,BPY[lauf]+3); form11.Image1.Canvas.Pen.Color:=clGreen; form11.Image1.Canvas.Brush.Color:=clWhite; form11.Image1.Canvas.Pen.Width:=2; end; |
mit nem OnClick Ereignis, wird alles sauber gezeichnet. Löse ich das OnClick jedoch mit dem OnShow aus, passiert nix. Das Form muss erst da sein, bevor es offenbar beschrieben werden kann.
Vielleicht liegt die Ursache auch daran: zur Laufzeit erzeuge ich vorher einige Memofelder und beschrifte die.
Gruss
Markus
Moderiert von Motzi: Code- durch Delphi-Tags ersetzt
_________________ Das Leben besteht aus Bits und Bytes - nur: wo laufen sie denn ????
Super ... Du kannst das zwar lesen, toll..... aber: völlig zwecklos !!!
|
|
ShiKai
      
Beiträge: 56
|
Verfasst: Mo 12.01.04 15:03
was ist die frage sein wird ist, was sind den BPZaehler, BPX, BPY und io, bzw, wo werden definiert und ihnen werte zugewiesen?
wfg,
ShiKai
|
|
ShiKai
      
Beiträge: 56
|
Verfasst: Mo 12.01.04 15:07
was mir grad aufgefallen ist, wie wär's, wenn du mit Form1.Image1.Picture.Bitmap.Canvas zeichnen würdest?
wfg,
ShiKai
|
|
M. Raab 
      
Beiträge: 334
Erhaltene Danke: 1
WIN 7
Delphi XE
|
Verfasst: Mo 12.01.04 15:26
Hallo,
Dein letzter Tipp funzt nicht - BPX,BPY sind INTEGER Felder, in denen die Positionen stehen. IO ist ne Dateivariable: aus der Datei lese ich die Zeichenkoordinaten. BPZaehler zählt lediglich mit, wieviele Sätze in der Datei stehen.
Wie ich schon sagte: verbinde ich die Routine anstatt mit dem OnShow mit einem OnKlick oder einem KeyPress Ereignis, funzt alles sauber. Die Daten stehen auch korrekt in den Feldern BPX und BPY - aber er zeichnet erst dann, wenn das FORM11 da ist.
Gruss
Markus
_________________ Das Leben besteht aus Bits und Bytes - nur: wo laufen sie denn ????
Super ... Du kannst das zwar lesen, toll..... aber: völlig zwecklos !!!
|
|
Raphael O.
      
Beiträge: 1596
VS 2013
|
Verfasst: Mo 12.01.04 15:38
@shikai:
du hast das problem ncht verstanden... die Zeichenprozedur funktioniert ja, nur direkt beim Programmstart darf/kann noch nciht in das ImageCanvas gezeichnet werden...
ich schau mir nachher mal an, wies funktionieren könnte...
ein (etwas blöder) Workaround wäre ein timer, den du enabest und der das dann beim ontimerereignis zeichnet und sich selber disabelt,... :/
|
|
M. Raab 
      
Beiträge: 334
Erhaltene Danke: 1
WIN 7
Delphi XE
|
Verfasst: Mo 12.01.04 15:41
Hallo Fiji,
so seh ich das Problem auch - der TIMER wäre ne Lösung: unschön aber vermutlihc machbar.
Ich werde das mal probieren.
Gruss
Markus
_________________ Das Leben besteht aus Bits und Bytes - nur: wo laufen sie denn ????
Super ... Du kannst das zwar lesen, toll..... aber: völlig zwecklos !!!
|
|
M. Raab 
      
Beiträge: 334
Erhaltene Danke: 1
WIN 7
Delphi XE
|
Verfasst: Mo 12.01.04 15:47
Hallo,
das mit dem Timer funzt prima - ich verbinde die Funktion mit nem OnTimer Event und setzte den Timer zu Beginn auf Disabeld. Beim On Show Event setze ich den Timer auf Enabled -> die Prozedur läuft ab und zeichnet sauber. In der Prozedur setze ich dann den Timer wieder auf disabled.
Bin gespannt ob es auch ne schönere Lösung gibt.
Gruss
Markus
_________________ Das Leben besteht aus Bits und Bytes - nur: wo laufen sie denn ????
Super ... Du kannst das zwar lesen, toll..... aber: völlig zwecklos !!!
|
|
Motzi
      
Beiträge: 2931
XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
|
Verfasst: Mo 12.01.04 15:48
Alle Unterobjekte einer Form werden bereits im Konstruktor der Form erzeugt und da der Konstruktor zum Zeitpunkt des OnCreate-Events bereits abgeschlossen ist existieren auch die Objekte bereits! Das einzige Problem ist, dass die globale Variable Form1 im OnCreate noch keine gültige Referenz enthält, da das OnCreate-Ereignis zwar nach dem Konstruktor augerufen wird, aber noch bevor der Aufruf von Application.CreateForm (im dpr-Teil) zurückkehrt.
Sofern dein Code also in einer Methode von Form1 steht lösch einfach mal die ganzen Referenzen auf Form1 raus.. dann verwendet der Compiler automatisch die Self-Referenz die ja den korrekten Wert enthält...
_________________ gringo pussy cats - eef i see you i will pull your tail out by eets roots!
|
|
M. Raab 
      
Beiträge: 334
Erhaltene Danke: 1
WIN 7
Delphi XE
|
Verfasst: Mo 12.01.04 16:19
Hallo Motzi,
jetzt weiß ich, warum Du Moderator bist
So weit ich Die verstanden habe - sollte dann ein erzwungenes Refresh nicht den gleichen Dienst tun ? Problem: wann erzwinge ich es ?
Löschen der Referenzen aus dem Form: und wie mache ich das ?
Gruss
Markus
_________________ Das Leben besteht aus Bits und Bytes - nur: wo laufen sie denn ????
Super ... Du kannst das zwar lesen, toll..... aber: völlig zwecklos !!!
|
|
Motzi
      
Beiträge: 2931
XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
|
Verfasst: Mo 12.01.04 16:34
| M. Raab hat folgendes geschrieben: | Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| form11.Image1.Picture.Bitmap.Height := Image1.Height; form11.Image1.Picture.Bitmap.Width := Image1.Width; for lauf:=1 to lauf3 do begin readln(io,BPZaehler,BPX[lauf],BPY[lauf]); form11.Image1.Canvas.Pen.Width:=2; form11.Image1.Canvas.Pen.Color:=clBlue; form11.Image1.Canvas.Brush.Color:=clBlue; form11.Image1.Canvas.Ellipse(BPX[lauf]-3,BPY[lauf]-3,BPX[lauf]+3,BPY[lauf]+3); form11.Image1.Canvas.Pen.Color:=clGreen; form11.Image1.Canvas.Brush.Color:=clWhite; form11.Image1.Canvas.Pen.Width:=2; end; | |
Oops.. seh du greifst gar nicht auf Form1 sondern auf Form11 zu...
Wo steht denn dieser Code? Im OnCreate von TForm11? Wenn ja, dann lösch einfach in jeder Zeile das "Form11." vor dem "Image1" weg...
_________________ gringo pussy cats - eef i see you i will pull your tail out by eets roots!
|
|
M. Raab 
      
Beiträge: 334
Erhaltene Danke: 1
WIN 7
Delphi XE
|
Verfasst: Do 15.01.04 11:59
Hallo Motzi,
das mit dem FORM1 war mir schon klar
Also: die Routine steht im OnShow Ereignis. Ich habe jetzt mal das Form11 weg gelöscht - gleiches Ergebnis: er zeichnet nicht.
Mit OnCreate läuft das nicht, da zu diesem Zeitpunkt die Zeichendaten noch nciht zur Verfügung stehen. Ich habe deshlab OnShow gemacht und löse das mit form11.show aus.
Mit dem TIMER Event klappt das.
Gruss
Markus
_________________ Das Leben besteht aus Bits und Bytes - nur: wo laufen sie denn ????
Super ... Du kannst das zwar lesen, toll..... aber: völlig zwecklos !!!
|
|
Motzi
      
Beiträge: 2931
XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
|
Verfasst: Do 15.01.04 12:50
Also ich hab das jetzt mal ausprobiert und bei mir wird wie erwartet alles richtig angezeigt, unabhängig davon ob ich jetzt im OnCreate, im OnShow oder im OnActivate-Ereignis auf das Image zeichne. Alles andere hätte mich ehrlich gesagt auch sehr gewundert, da ein Image sein Bild intern immer buffert (im Gegensatz zu einer Paintbox) und dafür sorgt dass es immer richtig angezeigt wird. Man kann also auch dann auf das Image zeichnen wenn dieses nicht angezeigt wird und das geänderte Bild wird korrekt angezeigt sobald das Image sichtbar ist..!
Kann es sein, dass deine Zeichendaten zu diesem Zeitpunkt noch nicht ganz korrekt sind? Überprüf das doch mal mit dem Debugger...
_________________ gringo pussy cats - eef i see you i will pull your tail out by eets roots!
|
|
M. Raab 
      
Beiträge: 334
Erhaltene Danke: 1
WIN 7
Delphi XE
|
Verfasst: Sa 17.01.04 10:09
Hallo Motzi,
die Daten habe ich schon überprüft - Daten wären da. Ich denke, es hänt mit der Tatsache zusammen, dass ich auf dem Image zur Laufzeit auch einige Memofelder erzeuge.
Wie ich oben schon beschrieben habe: löse ich beim ONShow über TIMER.enabled das Timer Event aus, funzt alles. Da irgendwo muss der Hund begraben liegen - an den Daten kann es nicht liegen, da sonst das TIMER Event nicht funzen würde - die Variablen sind global definiert und weisen laut Debugger auch den korrekten Inhalt aus.
Gruss
Markus
_________________ Das Leben besteht aus Bits und Bytes - nur: wo laufen sie denn ????
Super ... Du kannst das zwar lesen, toll..... aber: völlig zwecklos !!!
|
|
Motzi
      
Beiträge: 2931
XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
|
Verfasst: Sa 17.01.04 16:50
Probiers mal so... zeichne stat auf das Image-Canvas auf ein lokal erstelltes Bitmap und speicher das mal irgendwo ab. Funktioniert das auch nicht, dann liegt es an den Daten...!
_________________ gringo pussy cats - eef i see you i will pull your tail out by eets roots!
|
|