Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Für CopyRect passendes Ereignis? (https://www.delphipraxis.net/188019-fuer-copyrect-passendes-ereignis.html)

OrNEC 25. Jan 2016 13:37

AW: Für CopyRect passendes Ereignis?
 
Zitat:

Zitat von Perlsau (Beitrag 1328050)
Was bringt dich zu der Annahme, daß das Bild erst nach OnShow aus der Ressourcendatei in das TImage geladen wird?

Weil das Bild anscheinend in der OnShow noch nicht zur Verfügung steht.

OrNEC 25. Jan 2016 13:41

AW: Für CopyRect passendes Ereignis?
 
Zitat:

Zitat von Medium (Beitrag 1328058)
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.

Klappt auch nicht. Mit dem Klick auf den Button schon...
Delphi-Quellcode:
procedure TForm1.FormShow(Sender: TObject);
var
  Quelle, Ziel: TRect;
begin
  Image1.Picture.LoadFromLazarusResource('bg');
  Image2.Picture.LoadFromLazarusResource('5ge');

  Quelle := Rect(0, 0, 100, 100);
  Ziel := Rect(0, 0, 100, 100);
  Image2.Canvas.CopyRect(Ziel, Image1.Canvas, Quelle);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  Quelle, Ziel: TRect;
begin
  Quelle := Rect(0, 0, 100, 100);
  Ziel := Rect(0, 0, 100, 100);
  Image2.Canvas.CopyRect(Ziel, Image1.Canvas, Quelle);
end;

DeddyH 25. Jan 2016 13:45

AW: Für CopyRect passendes Ereignis?
 
Was passiert denn, wenn Du auf den Button klickst und anschließend mal ein anderes Fenster über Deins legst?

Sir Rufo 25. Jan 2016 13:51

AW: Für CopyRect passendes Ereignis?
 
Zitat:

Zitat von OrNEC (Beitrag 1328112)
Zitat:

Zitat von Perlsau (Beitrag 1328050)
Was bringt dich zu der Annahme, daß das Bild erst nach OnShow aus der Ressourcendatei in das TImage geladen wird?

Weil das Bild anscheinend in der OnShow noch nicht zur Verfügung steht.

Das eine hat mit dem anderen nicht zwangsläufig etwas zu tun und egal ist es sowieso.
  • Erst wird die Form sichbar gesetzt
  • dann kommt die Benachrichtigung
    Delphi-Quellcode:
    OnShow
  • dann wird gezeichnet
Da du auf das Gezeichnete zugreifen möchtest ist es also unerheblich ob das Image die Grafik schon geladen hat oder nicht. Die Grafik ist auf jeden Fall noch nicht gezeichnet, denn das erfolgt erst nach
Delphi-Quellcode:
OnShow
.

OrNEC 25. Jan 2016 13:53

AW: Für CopyRect passendes Ereignis?
 
Zitat:

Zitat von DeddyH (Beitrag 1328114)
Was passiert denn, wenn Du auf den Button klickst und anschließend mal ein anderes Fenster über Deins legst?

Passiert nichts, das andere Fenster hat keinen Einfluss auf mein Fenster.

OrNEC 25. Jan 2016 13:56

AW: Für CopyRect passendes Ereignis?
 
Zitat:

Zitat von Sir Rufo (Beitrag 1328117)
Die Grafik ist auf jeden Fall noch nicht gezeichnet, denn das erfolgt erst nach
Delphi-Quellcode:
OnShow
.

Das war auch meine Vermutung... dann muss ich wohl mit Timer arbeiten, oder gibt da doch eine Lösung?

Luckie 25. Jan 2016 16:27

AW: Für CopyRect passendes Ereignis?
 
Im oder nach OnPaint?

OrNEC 25. Jan 2016 16:29

AW: Für CopyRect passendes Ereignis?
 
Zitat:

Zitat von Luckie (Beitrag 1328160)
Im oder nach OnPaint?

Im OnPaint hängt sich das Programm auf. Und was meinst mit nach OnPaint?

Luckie 25. Jan 2016 17:49

AW: Für CopyRect passendes Ereignis?
 
Guck mal hier http://www.delphigroups.info/2/71/97729.html letzter Beitrag.

Perlsau 25. Jan 2016 18:00

AW: Für CopyRect passendes Ereignis?
 
Oben hatte SirRufo doch einen Hinweis auf OnIdle geliefert:

Die VCL-Form ist gesichert komplett gezeichnet beim ersten Application.OnIdle Event nach dem Form.OnShow Event.

Ist dieser Hinweis denn nicht brauchbar? Könnte man denn nicht einfach in der OnIdle-Ereignisbehandlung eine globale Boolean-Variable, die als Schalter fungiert, abfragen, so daß die Anweisungen nur dieses eine Mal ausgeführt werden? Z.B. so:
Delphi-Quellcode:
...
  private
    Var
      FirstIdlePassed : Boolean;
  public
    procedure MyOnIdleHandler(Sender: TObject; var Done: Boolean);
  end;

procedure TForm1.MyOnIdleHandler(Sender: TObject; var Done: Boolean);
begin
  Done := False;
  If FirstIdlePassed Then Exit;

  FirstIdlePassed := True;
  ShowMessage('Das erste OnIdle-Event!');
  ...
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  FirstIdlePassed := False;
  Application.OnIdle := MyOnIdleHandler;
end;
Nachtrag:
Ob das dann auch in Lazarus funktioniert, muß man gegebenenfalls ausprobieren ... Ach ja, bei Lazarus muß man das @ davor setzen:
Delphi-Quellcode:
Application.OnIdle := @MyOnIdleHandler;


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:37 Uhr.
Seite 2 von 3     12 3      

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