Delphi-PRAXiS
Seite 4 von 5   « Erste     234 5      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Visible eines Image=true aber trotzdem unsichtbar (https://www.delphipraxis.net/73384-visible-eines-image%3Dtrue-aber-trotzdem-unsichtbar.html)

3_of_8 19. Jul 2006 20:45

Re: Visible eines Image=true aber trotzdem unsichtbar
 
:roll: Das ist ein Äpfel-und-Birnen-Vergleich.

Er hat ein Image. Du hast eine Form.

Das Canvas einer Form wird ständig überschrieben, immer wenn Repaint; aufgerufen wird.

Das Canvas eines Images wird nicht automatisch überschrieben.

Hawkeye219 19. Jul 2006 20:47

Re: Visible eines Image=true aber trotzdem unsichtbar
 
Zitat:

Zitat von Sascha L
Wenn man auf dem Canvas vom Formular ständig etwas zeichnet, weil man z.B. einen Farbverlauf als Hintergrund haben möchte, dann passiert es ständig, dass die Komponenten nicht mehr sichtbar sind.

Das dürfte aber nicht passieren, wenn man nur in der Behandlungsroutine für den dafür vorgesehenen Event zeichnet: Delphi-Referenz durchsuchenTForm.OnPaint.

Gruß Hawkeye

Sascha L 19. Jul 2006 20:54

Re: Visible eines Image=true aber trotzdem unsichtbar
 
@3_of_8: wieso? er hat doch geschrieben, dass er auf dem Formular zeichnet. Von dem Image war doch nie die Rede. Das Image ist transparent geschaltet und liegt auf dem Formular, auf dem er zeichnet.

@Hawkeye219: Richtig, aber wenn man die Fenstergröße verändert (Resize), dann wird aber nicht neu gezeichnet, sodass man manuell noch mal die Zeichnen-Prozedur aufrufen muss und dann passiert's.

3_of_8 19. Jul 2006 21:04

Re: Visible eines Image=true aber trotzdem unsichtbar
 
Das hat er aber schön kryptisch geschrieben...

Naja, wenn er unbedingt auf sein Formular schreiben muss, muss er halt OnPaint und OnResize überschreiben.

Hawkeye219 19. Jul 2006 21:10

Re: Visible eines Image=true aber trotzdem unsichtbar
 
Zitat:

Zitat von Sascha L
Richtig, aber wenn man die Fenstergröße verändert (Resize), dann wird aber nicht neu gezeichnet, sodass man manuell noch mal die Zeichnen-Prozedur aufrufen muss.

Bei einem (manuellen oder durch das Programm verursachten) Resize wird der OnPaint-Handler des Formulars im Rahmen der Behandlung von WM_PAINT aufgerufen. Ein manueller Aufruf ist nicht notwendig (gerade mit Delphi 6 getestet). Hast du ein kleines Beispielprogramm, welches das von dir beschriebene Verhalten aufweist?

Gruß Hawkeye

3_of_8 19. Jul 2006 21:12

Re: Visible eines Image=true aber trotzdem unsichtbar
 
Na dann reicht OnPaint. Oder auch gleich Repaint.

dino 19. Jul 2006 23:44

Re: Visible eines Image=true aber trotzdem unsichtbar
 
jetzt wo ich auf der anderen festplatte auf dem neuen Windows ein neues besseres Delphi (2005) habe, hab ich den alten quellcode nicht mehr

er gin aber in etwa so:
Delphi-Quellcode:
var i:Integer;
keys:array[0..127] of Boolean;
xf,yf:array[1..3] of Integer;
time,xp,yp,xs,ys,z,bier,i1,live,x1,y1,rl,xsz,ysz:integer;
feld:array[1..18,1..16] of Integer;
bmp0,bmp1,bmp2,bmp3,bmp4,bmp5: Tbitmap;
[...]
for x1:=0 to 19 do
for y1:=0 to 17 do begin
if (x1=0)or(y1=17)or(x1=19) then form1.canvas.Draw(x1*32+70-xs,y1*32+70-ys,bmp4) else begin
if Feld[x1,y1]=0 then form1.canvas.Draw(x1*32+70-xs,y1*32+70-ys,bmp0);
if Feld[x1,y1]=1 then form1.canvas.Draw(x1*32+70-xs,y1*32+70-ys,bmp1);
if Feld[x1,y1]=2 then form1.canvas.Draw(x1*32+70-xs,y1*32+70-ys,bmp2);
if Feld[x1,y1]=3 then form1.canvas.Draw(x1*32+70-xs,y1*32+70-ys,bmp3);
if Feld[x1,y1]=4 then form1.canvas.Draw(x1*32+70-xs,y1*32+70-ys,bmp4);
if Feld[x1,y1]=5 then form1.canvas.Draw(x1*32+70-xs,y1*32+70-ys,bmp5);
if Feld[x1,y1]=6 then form1.canvas.Draw(x1*32+70-xs,y1*32+70-ys,bmp1);
if (Feld[x1,y1]=7) and (bier=0) then form1.canvas.Draw(x1*32+70-xs,y1*32+70-ys,bmp2);
if (Feld[x1,y1]=7) and (bier<>0) then form1.canvas.Draw(x1*32+70-xs,y1*32+70-ys,bmp0);
if Feld[x1,y1]=8 then form1.canvas.Draw(x1*32+70-xs,y1*32+70-ys,bmp0);
if Feld[x1,y1]=9 then form1.canvas.Draw(x1*32+70-xs,y1*32+70-ys,bmp0);

end;

[...]
image1.Top:=xs;
image1.loadfromfile('bild.bmp');
(in den [...] stehen nur ein haufen ifs und son zeug)

jedenfalls hat das im Gegensatz zu bei der PaintBox in Delphi 2005 win32
auch geklappt, nur dass wie gesagt mein Image dauernd überzeichnet wurde, ich hab das mal immer wieder mit refresh glaub ich war das wieder hervorheben lassen, aber das Programm war dann viel langsamer und es flackerte(das bild des Images)
ich arbeite im Moment paar Tutorials durch, wodurch ichs vielleicht auch in Griff kriege, aber da ihr schon diskutiert, könntet ihr mir vllt auch helfen...

Danke im vorraus
MFG Dino

Hawkeye219 20. Jul 2006 08:04

Re: Visible eines Image=true aber trotzdem unsichtbar
 
Dino, wenn du auf dem Canvas des Formulars zeichnen möchtest, solltest du das nur in einer Behandlungsroutine für das Ereignis Delphi-Referenz durchsuchenTForm.OnPaint tun. Damit verhinderst du, daß deine Zeichnung durch andere Ereignisse übermalt wird.

Markiere im Objektinspektor das Formular, gehe auf die Seite "Ereignisse" und klicke doppelt in das Feld neben "OnPaint". Dann sollte Delphi eine neue leere Prozedur im Editorfenster erzeugen oder in die vorhandene Routine springen, falls schon eine da war. Nur in dieser Routine sollten deine Zeichenbefehle stehen. Beachte aber, daß diese Routine bei jedem (Neu-)Zeichnen des Formulars aufgerufen wird. Wenn du dort ständig Bilder von der Festplatte lädst, bremst du deine gesamte Anwendung enorm aus.

Zum Anzeigen von Bildern stellt Delphi die Komponente Delphi-Referenz durchsuchenTImage zur verfügung, zum Zeichnen die Komponente Delphi-Referenz durchsuchenTPaintBox. Du solltest dich intensiv mit diesen Komponenten befassen, bevor du an deinem Programm weiterarbeitest. Vielleicht helfen dir die Tutorials, welche dir an anderer Stelle bereits empfohlen wurden.

Gruß Hawkeye

Thorben77 20. Jul 2006 08:22

Re: Visible eines Image=true aber trotzdem unsichtbar
 
Delphi-Quellcode:
if Feld[x1,y1]=0 then form1.canvas.Draw(x1*32+70-xs,y1*32+70-ys,bmp0);
if Feld[x1,y1]=1 then form1.canvas.Draw(x1*32+70-xs,y1*32+70-ys,bmp1);
if Feld[x1,y1]=2 then form1.canvas.Draw(x1*32+70-xs,y1*32+70-ys,bmp2);
if Feld[x1,y1]=3 then form1.canvas.Draw(x1*32+70-xs,y1*32+70-ys,bmp3);
if Feld[x1,y1]=4 then form1.canvas.Draw(x1*32+70-xs,y1*32+70-ys,bmp4);
if Feld[x1,y1]=5 then form1.canvas.Draw(x1*32+70-xs,y1*32+70-ys,bmp5);
if Feld[x1,y1]=6 then form1.canvas.Draw(x1*32+70-xs,y1*32+70-ys,bmp1);
if (Feld[x1,y1]=7) and (bier=0) then form1.canvas.Draw(x1*32+70-xs,y1*32+70-ys,bmp2);
if (Feld[x1,y1]=7) and (bier<>0) then form1.canvas.Draw(x1*32+70-xs,y1*32+70-ys,bmp0);
if Feld[x1,y1]=8 then form1.canvas.Draw(x1*32+70-xs,y1*32+70-ys,bmp0);
if Feld[x1,y1]=9 then form1.canvas.Draw(x1*32+70-xs,y1*32+70-ys,bmp0);
Dafür gibt es eine wesentlich elegantere Methode:
Delphi-Quellcode:
case Feld[x1, y1] of
  1, 6: form1.canvas.Draw(x1*32+70-xs,y1*32+70-ys,bmp1);
  2: form1.canvas.Draw(x1*32+70-xs,y1*32+70-ys,bmp2);
  3: form1.canvas.Draw(x1*32+70-xs,y1*32+70-ys,bmp3);
  4: form1.canvas.Draw(x1*32+70-xs,y1*32+70-ys,bmp4);
  5: form1.canvas.Draw(x1*32+70-xs,y1*32+70-ys,bmp5);
  7:
    begin
      if Bier = 0 then
        Form1.Canvas.Draw(x1*32+70-xs,y1*32+70-ys,bmp2)
      else
        Form1.Canvas.Draw(x1*32+70-xs,y1*32+70-ys,bmp0);
    end;
  8, 9: form1.canvas.Draw(x1*32+70-xs,y1*32+70-ys,bmp0);
end;

dino 2. Okt 2006 13:25

Re: Visible eines Image=true aber trotzdem unsichtbar
 
nun habe ich 2 verschiedene Paintboxen! warum übermalt die eine paintbox die canvas des anderen???
und hab immernoch Probleme damit, dass der Inhalt der Paintbox sichtbar bleiben muss


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:01 Uhr.
Seite 4 von 5   « Erste     234 5      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz