Avatar billede kipolaks Nybegynder
03. juni 2002 - 15:46 Der er 18 kommentarer og
2 løsninger

Hjælp til Canvas!!

½øjsa!
jeg har to små problemer som jeg håbede på i lige kunne fikse i et snuptag *GG* Tag lige et kig på det her:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls;

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    Image1: TImage;
    Image2: TImage;
    procedure Timer1Timer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure FormPaint(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  stx,sty,oldx,oldy : integer;
  down : boolean;
implementation

{$R *.dfm}

procedure TForm1.Timer1Timer(Sender: TObject);
begin
image1.Left := image1.Left +1;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
image1.BringToFront;
image2.SendToBack;
form1.DoubleBuffered := true;
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
if down then with Canvas do
  begin
    Rectangle(stx,sty,oldx,oldy);
    Pen.Style := psdot;
    Pen.Mode := pmXor;
    pen.Width := 3;
    Pen.Color := clred;
    Brush.Style := bsclear;
    Rectangle(stx,sty,x,y);
    oldx := x;
    oldy := y;
  end;

end;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  down := true;
  stx := x;
  sty := y;
  oldx := x;
  oldy := y;

end;

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
down := false;
Canvas.Rectangle(stx,sty,oldx,oldy);
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
  if down then
    Canvas.Rectangle(stx,sty,oldx,oldy);
end;

end.

formen ser sådan ud:
//////////////////////////////////////////
//                                      //
//                                      //
//                                      //
//                                      // 
//  **********        **********      //
//  *        *        *        *      //
//  * image1 *        * image2 *      //
//  *        *        *        *      //
//  **********        **********      //
//                                      //
//////////////////////////////////////////

OK, så fik vi det  på plads. når man så starter programmet flytter image1 sig lige så stille ind over image2.... nu skal vi så lege at image1 & 2 er ikoner på skrivebordet og du gerne vil markere dem. fint nok: du trækker et rektangel udover dem, MEN.. Læg mærke til at når img1 kører over img2 samtidig med at du trækker rektanglet ned over dem vil rester af rktanglet ikke forsvinde...<<-- HVORDAN ER DET LIGE MAN FIXER DET???

Noget andet er at jeg vil gerne have at rektanglet ligger HELT øverst(også oven på image1 der bevæger sig)

Nogle der kan hjælpe??
Avatar billede kipolaks Nybegynder
03. juni 2002 - 15:47 #1
hmmm, den form blev vist ikke lige så god, men i regner den jo nok ud..hehe
Avatar billede kipolaks Nybegynder
03. juni 2002 - 16:09 #2
ups!, husk at sætte timerens interval til 1
Avatar billede zerohero Nybegynder
03. juni 2002 - 16:35 #3
Lad være med at bruge Timage komponenter på den måde!!! Lav i stedet det hele i én canvas det er meget lettere at styre!!!
Avatar billede kipolaks Nybegynder
03. juni 2002 - 16:36 #4
hmmmm, hvordan gør jeg det?
Avatar billede zerohero Nybegynder
03. juni 2002 - 16:41 #5
bare brug din form's canvas... For at tegne dine billeder ligesom dine Timages så brug canvas.draw(x,y,billed); eksempel:

var
  b : Tbitmap;
begin
  b := Tbitmap.create;
  b.loadfromfile(filnavn);
  canvas.draw(0,0,b);
  b.free;
end;
Avatar billede kipolaks Nybegynder
03. juni 2002 - 16:54 #6
ok, hvordan flytter jeg så billedet når jeg stadig gerne vil have et andet billede som baggrund? desuden besvarer det ikke mit oprindelige spm....
Avatar billede zerohero Nybegynder
03. juni 2002 - 17:16 #7
Du skal selvfølig bare ændre x og y i canvas.draw(x,y,billede); til det sted, hvor du vil flytte den hen til i eventuelt din Timer1Timer procedure.
Jeg har ikke besvaret dit oprindelige spørgsmål da jeg er af den overbevisning at det ikke er en særlig god idé at bruge Timage komponenter til denne opgave!!!!
Avatar billede kipolaks Nybegynder
03. juni 2002 - 17:52 #8
hmmm, så opstår der jo nye problemer.... forestil dig at jeg har omkring 50 billeder på min form som alle skal kunne flytte sig rundt på skærmen uafhængigt af hinanden...
Avatar billede zerohero Nybegynder
03. juni 2002 - 19:33 #9
og hvad er problemet med det? så laver du selvfølig bare flere canvas.draw(x,y,billede) kald!!!!

var
  b : Tbitmap;
begin
  b := Tbitmap.create;

  b.loadfromfile(filnavn01);
  canvas.draw(x,y,b);

  b.loadfromfile(filnavn02);
  canvas.draw(x,y,b);

  b.loadfromfile(filnavn03);
  canvas.draw(x,y,b);

  osv...

  b.free;
end;
Avatar billede kipolaks Nybegynder
03. juni 2002 - 22:34 #10
hmmmm, prøv lige at gøre som jeg har beskrevet øverst... jeg er ik helt sikker på at det vil komme til at virke som du siger... hvis du kan få det til det så skal du nok få rigeligt point..
Avatar billede zerohero Nybegynder
03. juni 2002 - 23:29 #11
var
  bx : integer;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  inc(bx,1);
  formpaint(nil);
end;

procedure TForm1.FormPaint(Sender: TObject);
var
  b : Tbitmap;
begin
  if down then
    Canvas.Rectangle(stx,sty,oldx,oldy);

  b := Tbitmap.create;
  //Image2
  b.loadfromfile(filnavn02);
  canvas.draw(x,y,b);

  //Image1
  b.loadfromfile(filnavn01);
  canvas.draw(x,y,b) := canvas.draw(x+1,y,b);
  b.free;
end;
 
prøv noget lign. dette... Måske skal der laves nogle små ændringer. Desuden, hvis du har en langsom computer, bør du nok skabe din bitmap (b) i din form's OnCreate og frigøre den igen i din form's OnClose event! - men husk at gøre det simpelt for dig selv! Der skal eventuelt indsættes en fillrect(clientrect); et eller andet sted...

ZeroHero
Avatar billede kipolaks Nybegynder
04. juni 2002 - 00:32 #12
Du har vist ikke helt forstået mit spm, jeg vil gerne have en baggrund, hvis du så begynder at tegne ovenpå og flytte rundt på billederne vil baggrunden forsvinde (især ved Fillrect). hvis du så vil flytte uden brugen af fillrect vil du skulle gentegne det lille stykke der ikke længere skal være et billede på. hele dette projekt er et lille spil jeg er ved at lave hvor du har en masse væsener (alla starcraft og lign.) som du så skal kunne markere og flytte rundt på med musen. derfor skal man jo også have en baggrund de kan løbe rundt og lege på og jeg har nu siddet og rodet lidt med dine ideer og det bliver ikke så godt. SÅ DERFOR SYNTES JEG AT VI SKAL HOLDE OS TIL MIT OPRINDELIGE SPM!!!! rolig rolig... ikke for at gøre dig sur, men jeg tror vi løber ud i et sidespor...
Avatar billede zerohero Nybegynder
04. juni 2002 - 08:54 #13
Kære poulseye,
Jeg har et eksempel på noget lign. spil, hvis du giver mig din mail adresse, så vil jeg sende programmet til dig, så du kan se at jeg rent faktisk mener når jeg siger: "Lad være med at bruge TImage komponenter som aktive grafikstykker på den måde!". Desuden kan canvas sagtens bruges til mindre spil, men går du over i større spil, kræver det flere grafik resourcer og det er GDI'en ikke stærk nok til. Så du bør nok overveje at kigge lidt på DirectX (eller DelphiX)...

ZeroHero
Avatar billede kipolaks Nybegynder
05. juni 2002 - 01:03 #14
oki. den eneste der virker lige nu er pol_jens@hotmail.com
Avatar billede kipolaks Nybegynder
13. juni 2002 - 14:48 #15
hmmmm, undskyld svartiden!!
kan jeg ikke få noget kode til noget lignene det program du sendte mig?
Avatar billede zerohero Nybegynder
13. juni 2002 - 22:14 #16
Jamen det har jeg jo allerede givet dig i mine svar!!! Hvad præcist mere vil du have?
Avatar billede kipolaks Nybegynder
15. juni 2002 - 21:44 #17
Zero>> Nu har jeg valgt at bruge DelphiX, men smid et svar så får du 30 point for den underholdene mand du sendte mig.

den der mand.... er det en du selv har lavet?  med hvad.. hvordan...
Avatar billede zerohero Nybegynder
15. juni 2002 - 21:53 #18
Han er modelleret og renderet i et gammelt 3D program, der hedder Simply 3D. Det er ved at være mange år siden nu!!! - og ja jeg lavede ham selv :-)) Men som du kan se, så virker canvas forrygende, hvis det vel og mærket er relative "små" applikationer man laver...

ZeroHero
Avatar billede kipolaks Nybegynder
16. juni 2002 - 01:30 #19
mokka
Avatar billede hermandsen Juniormester
16. juni 2002 - 03:17 #20
>>zerohero
Hey! Kunne du ikke også lige sende den mand til mig? :)
hermandsen@softhome.net
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester