Avatar billede kipolaks Nybegynder
31. maj 2002 - 00:00 Der er 56 kommentarer og
1 løsning

det går LANGSOMT....zzzZZZzzz

Hejsa!
jeg har en timer der styrer noget grafik på min form (Interval: 50). mit problem er så at jeg samtidig med det bruger en mousemove på min form til at tegne rektangler når jeg holder venstre museknap nede(ligesom når man markerer ikoner), når jeg så begynder at tegne rektanglerne så går min timer næsten i stå... :(

Hvad gør jeg?
Avatar billede kipolaks Nybegynder
31. maj 2002 - 00:03 #1
nogen der kender en lidt bedere måde at lave sådan en "markerings boks" eller hvad jeg nu skal kalde det, det går nemlig også langsomt for den at følge med musen.
Avatar billede hermandsen Juniormester
31. maj 2002 - 00:13 #2
Hvordan laver du din markeringsbox nu?
Avatar billede zerohero Nybegynder
31. maj 2002 - 00:48 #3
bruger du din forms canvas til at tegne med? Borrisholt har i sin tid lavet en anden timer (ThreadTimer) den er meget mere stabil end delphi's standard TTimer!

Hej Hermandsen. Jeg går udfra at du har fået et nyhedsbrev fra mig i løbet af dagen. Der er kommet en tutorial mere siden nyhedsbrevet: "Lys og Materials" - synes bare lige du skulle vide det!!! :)) God Førnøjelse!
Avatar billede hermandsen Juniormester
31. maj 2002 - 01:02 #4
>>zerohero
Du kan da tro jeg har fået det!!! ;)
Avatar billede kipolaks Nybegynder
31. maj 2002 - 01:02 #5
jeg laver den med en TShape
Avatar billede hermandsen Juniormester
31. maj 2002 - 01:19 #6
Prøv at komme med lidt kode... Personligt ville jeg nok gøre således:

private
  Drawing: Boolean;
  StartX, StartY: Integer;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Drawing := False;
end;

procedure TForm1.FormMouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  Drawing := True;
  StartX := X;
  StartY := Y;
end;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  if Drawing then with Canvas do
  begin
    //Clear formen
    Brush.Color := clBtnFace;
    Pen.Color := clBtnFace;
    Rectangle(GetClientRect);
    //Tegner det nye rektangel
    Brush.Color := clBlack;
    Pen.Color := clBlack;
    Rectangle(StartX, StartY, X, Y);
  end;
end;

Ved ikke om det kunne hjæple... Personligt tror jeg faktisk også det er hurtigere end at bruge en Shape, men jeg er ikke 100% sikker...

//hermandsen
Avatar billede zerohero Nybegynder
31. maj 2002 - 01:34 #7
Jeg tror jeg ville gøre således ;))...

var
  t : integer;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  timer1.interval := 50;
  if timer1 <> nil then
  inc(t,1);
  caption := inttostr(t);
end;

var
  b : boolean;
  sx, sy : integer;
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if ssleft in shift then
  with canvas do
  begin
    if not b then
    begin
      sx := x;
      sy := y;
      b := true;
    end;
    pen.style := psdot;
    brush.color := color;
    fillrect(clientrect);
    rectangle(sx,sy,x,y);
  end;
end;

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  b := false;
end;

ZeroHero
Avatar billede zerohero Nybegynder
31. maj 2002 - 01:35 #8
Der bliver ingen påvirkelse af min TTimer ved at gøre det på denne måde :))
Avatar billede zerohero Nybegynder
31. maj 2002 - 01:37 #9
øhh Hermandesn du har 2 FormMouseDown procedure kørende - du mener vist at den sidste skal være en FormMouseMove, gør du ikke? ;)
Avatar billede zerohero Nybegynder
31. maj 2002 - 01:39 #10
faktisk behøver du kun 2 procedure, med mit eksempel:

var
  t : integer;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  timer1.interval := 50;
  if timer1 <> nil then
  inc(t,1);
  caption := inttostr(t);
end;

var
  b : boolean;
  sx, sy : integer;
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if ssleft in shift then
  with canvas do
  begin
    if not b then
    begin
      sx := x;
      sy := y;
      b := true;
    end;
    pen.style := psdot;
    brush.color := color;
    brush.Style := bsclear;
    fillrect(clientrect);
    rectangle(sx,sy,x,y);
  end
  else
    b := false;
end;
Avatar billede hermandsen Juniormester
31. maj 2002 - 01:53 #11
>>zerohero
Oups... My bad... Sad og kopierede fra hjælpen, da jeg ikke kunne huske alle de parametre der var med MouseMove og MouseDown, og så er det vist gået galt en enkelt gang... ;)
Avatar billede hermandsen Juniormester
31. maj 2002 - 03:13 #12
Hvad mangler du? Hvad var der galt med svaret?
Avatar billede kipolaks Nybegynder
31. maj 2002 - 03:14 #13
hmmm, den laver godt nok en box men.... jeg har en masse billeder på min form --> de forsvinder ved "fillrect(clientrect);"

nu har jeg rodet lidt så det passer til mine behov:

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
down := true;
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
if down then begin
    canvas.pen.style := psdot;
    canvas.pen.color := cllime;
    canvas.Brush.Style := bsclear;
    canvas.rectangle(stx,sty,x,y);
end;


procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
down := false;
end;

hvordan får jeg den så til når den opdaterer rect'en kun at fjerne den rect der blev lavet tidligere? lige nu fylder den jo hele min skærm med dem når jeg rykker musen frem og tilbage..
Avatar billede kipolaks Nybegynder
31. maj 2002 - 03:16 #14
sludder, det ser sådan ud:
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
down := true;
STx := x;
STy := y;
end;
Avatar billede hermandsen Juniormester
31. maj 2002 - 03:28 #15
Jeg er ikke helt sikker på hvad du vil, men prøv:

Canvas.Rectangle(GetClientRect);
Avatar billede kipolaks Nybegynder
31. maj 2002 - 03:41 #16
prøv dette, så vil du forstå....

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

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

{$R *.dfm}

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
down := true;
STx := x;
STy := y;
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);

begin
if down then begin
    canvas.pen.style := psdot;
    canvas.pen.color := cllime;
    canvas.Brush.Style := bsclear;
  canvas.rectangle(stx,sty,x,y);
end;
end;
procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
down := false;
end;

end.
Avatar billede hermandsen Juniormester
31. maj 2002 - 03:51 #17
Arh... I get it... ;)

Brug lige føgende i stedet:

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  Down: Boolean;
  stx, sty, oldx, oldy: integer;
implementation

{$R *.dfm}

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.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if down then with Canvas do
  begin
    Pen.Color := Color;
    Rectangle(stx,sty,oldx,oldy);
    Pen.Style := psdot;
    Pen.Color := cllime;
    Brush.Style := bsclear;
    Rectangle(stx,sty,x,y);
    oldx := x;
    oldy := y;
  end;
end;

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  down := false;
end;

end.
Avatar billede kipolaks Nybegynder
31. maj 2002 - 03:58 #18
prøv at indsætte et billede på formen og kør over med musen....
Avatar billede hermandsen Juniormester
31. maj 2002 - 04:14 #19
Prøv det her:

unit Unit1;

interface

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

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

var
  Form1: TForm1;
  Down: Boolean;
  stx, sty, oldx, oldy: integer;
implementation

{$R *.dfm}

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.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if down then with Canvas do
  begin
    Pen.Color := Color;
    Rectangle(stx,sty,oldx,oldy);
    Pen.Style := psdot;
    Pen.Color := cllime;
    Brush.Style := bsclear;
    Rectangle(stx,sty,x,y);
    oldx := x;
    oldy := y;
    Image1.Repaint;
  end;
end;

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  down := false;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  DoubleBuffered := True;
end;

end.
Avatar billede kipolaks Nybegynder
31. maj 2002 - 04:21 #20
hehe, forestil dig at jeg har omkring 50 billeder på min form....
kan man ikke slette canvas med canvas.free eller noget for det vil jo nok tage lidt tid at repainte 50 billeder. eller hvad ved jeg, er der heller ik noget der hedder 'undo' eller sådan noget.... jeg er godt nok vild efter at få det til at køre!! hehe
Avatar billede hermandsen Juniormester
31. maj 2002 - 04:27 #21
Så findes der faktisk noget RIGTIGT smart du kan!!! :)

Du får altså bare ændringerne denne her gang...

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 := pmNotXor;
    Pen.Color := clLime;
    Brush.Style := bsclear;
    Rectangle(stx,sty,x,y);
    oldx := x;
    oldy := y;
  end;
end;
Avatar billede kipolaks Nybegynder
31. maj 2002 - 04:34 #22
hmmmm det var jo lige det jeg stod og manglede..BRAVO
MEEEEEEN... jeg vil gerne have at rektanglet forsvinder når jeg slipper knappen.... det skal som jeg startede med at skrive jo være ligesom når man markerer flere ikoner på fx. skrivebordet.

tyg lidt på den....hehe
Avatar billede hermandsen Juniormester
31. maj 2002 - 04:40 #23
procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  down := false;
  Canvas.Rectangle(stx,sty,oldx,oldy);
end;

Var der mere? :)

Du kan forresten godt fjerne

procedure TForm1.FormCreate(Sender: TObject);
begin
  DoubleBuffered := True;
end;

igen... Det behøves ikke mere! :)
Avatar billede kipolaks Nybegynder
31. maj 2002 - 04:45 #24
nu har jeg sgu afvist dine svar så mange gange ...så du får sgu 100 point når det lykkes.
hmmm om der var mere....ok ja, hvis jeg laver en rect og slipper musen så kan jeg ikke få lov til at lave en ny hvis det er inde for det samme område som den forrige...(kun nogle gange)... skriv lige hvis du har brug for uddybning...
Avatar billede hermandsen Juniormester
31. maj 2002 - 04:46 #25
Uddybning! :)
Avatar billede hermandsen Juniormester
31. maj 2002 - 04:48 #26
Er det når du starter trækket fra dit billede?
Avatar billede kipolaks Nybegynder
31. maj 2002 - 04:53 #27
ikke fra billedet nej, det er kun nogle gange den gør det!! og det er efter hvad jeg kan se hvis jeg starter trækket fra et punkt som er 'inde' for den forrige rect....hmmmm jeg er sq ik så god til at forklare..sorry
Avatar billede hermandsen Juniormester
31. maj 2002 - 04:58 #28
Øhhh, nej... Lav et direkte eksempel, og sig evt. hvilke koordinater du starter og slutter trækket på...

procedure MouseDown;//gider ikke skrive parametre! ;)
begin
  Caption := Format('X = %d  ||  Y = %d', [X, Y]);
end;

procedure MouseUp;//gider ikke skrive parametre! ;)
begin
  Caption := Format('X = %d  ||  Y = %d', [X, Y]);
end;
Avatar billede kipolaks Nybegynder
31. maj 2002 - 05:05 #29
hehe, det virker nu!! der gik bare lidt ged i mit billede....sorry
kender du en måde jeg kan bruge "setCaptureControl(form1);" på, så jeg også kan starte trækket fra billedet. hvis jeg sætter det i form.create er curseren bare et timeglas når programmet starter og det virker kun en gang... :(
Avatar billede hermandsen Juniormester
31. maj 2002 - 05:11 #30
Det har jeg sgu aldrig leget med før... Kig lidt i hjælpen! :)
Avatar billede kipolaks Nybegynder
31. maj 2002 - 05:12 #31
PROBLEM!!!
sæt en timer til at køre et billede hen over skærmen og lav et træk ned over billedet..
Avatar billede hermandsen Juniormester
31. maj 2002 - 05:15 #32
Hehe... DET GØR MAN IKKE!!! :)
Avatar billede kipolaks Nybegynder
31. maj 2002 - 05:16 #33
det er netop lige det man gør!!!
Avatar billede hermandsen Juniormester
31. maj 2002 - 05:17 #34
HA!!! Løsning:

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

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

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

end.
Avatar billede hermandsen Juniormester
31. maj 2002 - 05:18 #35
Jeg stopper simpelthen dit billede når jeg laver rektanglet! :)
Avatar billede kipolaks Nybegynder
31. maj 2002 - 05:23 #36
NEJ NEJ NEJ..... *River mig i håret*
som du ser oppe for oven skriver jeg at min timer næsten går i stå når jeg laver et træk... det er lige netop det jeg ville forebygge med hele dette spm. HEHE jeg kan altså ik lade være med at grine ad (ik for at være ond eller noget)
"Jeg stopper simpelthen dit billede når jeg laver rektanglet! :)"
better luck next time....hehe
Avatar billede hermandsen Juniormester
31. maj 2002 - 05:24 #37
Så du vil altså have at billedet til at køre hen over skærmen, og derved dit regtangel, samtidig med at du trækker det?
Avatar billede kipolaks Nybegynder
31. maj 2002 - 05:28 #38
øhhhh det fattede jeg ik lige.
hør her: mine billeder kører rundt på skærmen og samtidig vil jeg gerne bare kunne trække et rektangel ud over dem...get it?
forestil dig at ikonerne på dit skrivebord flyver rundt men du stadig kan markere dem....<<-- godt eksempel
Avatar billede hermandsen Juniormester
31. maj 2002 - 05:30 #39
Okay... Så er jeg med! Kigger på det...
Avatar billede kipolaks Nybegynder
31. maj 2002 - 05:33 #40
okay godt så!.. lige en ting mere når man trækker skal rektanglet altid være HELT øverst(også over et billede der bevæger sig)..
Avatar billede hermandsen Juniormester
31. maj 2002 - 05:33 #41
I win! :)

procedure TForm1.FormPaint(Sender: TObject);
begin
  Canvas.Rectangle(stx,sty,oldx,oldy);
end;
Avatar billede hermandsen Juniormester
31. maj 2002 - 05:34 #42
Er det ikke det?
Avatar billede hermandsen Juniormester
31. maj 2002 - 05:35 #43
Hey zerohero forresten... Håber ikke vi har spammet din mailbox for meget! :)
Avatar billede kipolaks Nybegynder
31. maj 2002 - 05:41 #44
hmmm det virker ikke helt, prøv at slippe knappen over billedet
Avatar billede hermandsen Juniormester
31. maj 2002 - 05:45 #45
procedure TForm1.FormPaint(Sender: TObject);
begin
  if down then
    Canvas.Rectangle(stx,sty,oldx,oldy);
end;
Avatar billede kipolaks Nybegynder
31. maj 2002 - 05:47 #46
hvad med HELT øverst?
Avatar billede hermandsen Juniormester
31. maj 2002 - 05:48 #47
Hvor helt øverst?
Avatar billede kipolaks Nybegynder
31. maj 2002 - 05:50 #48
når man trækker skal rektanglet altid være HELT øverst(også over et billede der bevæger sig)..
Avatar billede hermandsen Juniormester
31. maj 2002 - 06:15 #49
Jeg tror altså ikke jeg kan hjælpe dig meget mere... Du har vist også fået RIGELIGT med svar! :)

Jeg skrider i seng... Skal være lydmand i Tyskland i morgen, så det vist bedst at jeg får lidt søvn! ;)

Natter!
Avatar billede kipolaks Nybegynder
31. maj 2002 - 06:18 #50
skriv lige et svar
Avatar billede hermandsen Juniormester
31. maj 2002 - 06:27 #51
Svar!
Avatar billede kipolaks Nybegynder
31. maj 2002 - 06:30 #52
hmmm jeg kan ikke vælge avanceret!! jeg opretter lige et spm så du kan få dine point
Avatar billede zerohero Nybegynder
31. maj 2002 - 09:59 #53
Hold kæft for en gang sladder tanter *G* - jeg vågendede op og modtog 48 mails - hvoraf langt de fleste var fra dette spørgsmål!!! :)) Klokken 6.30 i morges var I først færdig tsk tsk tsk - har I ikke noget liv! ;))....

ZeroHero
Avatar billede hermandsen Juniormester
31. maj 2002 - 12:59 #54
>>ZeroHero
Hehe... Sorry... Han blev jo ved med at kommer med nye spørgsmål, og mine svar blev konstant afvist... :)
Avatar billede martinlind Nybegynder
31. maj 2002 - 14:42 #55
Lige en lille komentar, dit delphi program er ikke Mutitask internt i programmet, derfor går din timer i stå dår du Bliver ved med at genere OnMouseMove events, en løsning kunne være at give din timer en chance ved at starte din OnMouseMoveEvent med Application.ProssesMessage; Det kunne godt være en løsning helt uden alle mulige krumspring og med den kode du havde lavet fra starten, man kommer langt med KIS også når man koder

/Martin
Avatar billede hermandsen Juniormester
31. maj 2002 - 14:48 #56
>>martinlind
KIS?!?
Avatar billede martinlind Nybegynder
31. maj 2002 - 22:36 #57
Keep It Simple !
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