Für CopyRect passendes Ereignis?
Hallo,
ich habe folgende Procedure (ohne Fehler):
Delphi-Quellcode:
Es wird also ein Stück Bild kopiert und in ein anderes gefüllt. Nun soll das sofort beim Start der Anwendung passieren, aber ich finde kein passendes Ereignis dafür. OnCreate, OnShow, OnPaint oder OnResize von Form1 bring da nichts, das Ziel wird schwarz.
procedure TMainForm.BackgroundToSpectrumImage();
var Quelle, Ziel: TRect; begin Quelle := Rect(SpectrumBackgroundImage.Left{=13}, SpectrumBackgroundImage.Top{=112}, SpectrumBackgroundImage.Left + SpectrumBackgroundImage.Width{=42}, SpectrumBackgroundImage.Top + SpectrumBackgroundImage.Height{=184}); Ziel := Rect(0, 0, SpectrumBackgroundImage.Width{=30}, SpectrumBackgroundImage.Height{=73}); SpectrumBackgroundImage.Canvas.CopyRect(Ziel, MainBackgroundImage.Canvas, Quelle); end; MainBackgroundImagePictureChanged ruft einen Fehler aus... jah... bitte hier also um Hilfe. P.S. ich programmiere mit Lazarus. |
AW: Für CopyRect passendes Ereignis?
"Sofort beim Start" heisst eigentlich OnCreate. Wann füllst du denn das Quellbild mit Inhalt? Das muss natürlich vor dem Umkopieren geschehen. Im Zweifel schickst du dir selbst halt eine Message von der Methode, die das Quellbild malt ans MainForm und reagierst darauf.
|
AW: Für CopyRect passendes Ereignis?
Zitat:
|
AW: Für CopyRect passendes Ereignis?
Was spricht dagegen, die bewußte Methode dann einfach am Ende von OnShow aufzurufen? Nach dem OnShow passiert erstmal nichts mehr, bis der Anwender oder sonstwert ein Ereignis auslöst. Was bringt dich zu der Annahme, daß das Bild erst nach OnShow aus der Ressourcendatei in das TImage geladen wird?
|
AW: Für CopyRect passendes Ereignis?
In der Regel erfolgt das Malen im OnPaint Event.
Wenn man jetzt im OnPaint des MainBackgroundImages ein SpectrumBackgroundImage.Invalidate aufruft, sorgt man dafür, dass das neu gezeichnet wird. Und im OnPaint des SpectrumBackgroundImage holt man sich das darunterliegende Bild. Um die Koordinaten herauszufinden gibt es im Übrigen ClientToScreen und ScreenToClient Funktionen. http://docwiki.embarcadero.com/Libra...ClientToScreen (Sollte mit FPC analog funktionieren) @Perlsau Das Bild ist beim ersten OnShow schon geladen aber noch nicht gezeichnet, denn der Event kommt direkt vor dem Anzeigen. Wenn man jetzt vom Canvas etwas kopiert, auf dem noch nichts gezeichnet wurde, dann kopiert man nichts ;) |
AW: Für CopyRect passendes Ereignis?
@Sir Rufo
Würde da nicht ein Application.ProcessMessages das Zeichnen des geladenen Bildes anstoßen? Und erst danach kopiert man. |
AW: Für CopyRect passendes Ereignis?
Nicht zwangsläufig. OnShow beschreibt die Transition der Visible Eigenschaft von False nach True.
Ich bin immer skeptisch bei Application.ProcessMessages und innerhalb eines (nicht von mir definiertem) Event sowieso. Das kann eben auch nach hinten losgehen, weil sich z.B. die Implementierung auf eine bestimmte Reihenfolge velässt und man die damit etwas durcheinander bringen kann. Zudem kann die Message zum Zeichnen der Form auch erst nach dem OnShow geschickt werden, dann bringt es nichts die Nachrichten-Warteschlange abzuarbeiten. Die VCL-Form ist gesichert komplett gezeichnet beim ersten Application.OnIdle Event nach dem Form.OnShow Event. |
AW: Für CopyRect passendes Ereignis?
Der sauberste Weg wäre es in dem Fall doch, das Bitmap nicht über den Form-Designer zu laden, sondern es selbst in eine Ressource zu packen. Dann hat man den Ladezeitpunkt definitiv in der Hand, kann das im OnCreate erledigen, und direkt danach gut leserlich und nachvollziehbar die Kopie machen.
|
AW: Für CopyRect passendes Ereignis?
Zitat:
|
AW: Für CopyRect passendes Ereignis?
Im Kompilat gibt es einen eigenen Ressourcen-Abschnitt, darin landen u.a. alle eingebundenen Bilder. Du musst sie also nicht extern mitliefern.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:24 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz