Jeg har lavet en ny application. (File - New application.) Lagt en label på og dobbeltklikket på Formens OnMouseDown event. Dernæst har jeg sat d.o. kode ind, og kompileret.
Når jeg kører programmet starter det med at skrive 'Label1' og hvis jeg klikker med musen, skifter teksten til "ksdjhfg2M". Jeg kan derfor ikke se andet end at det virker.
Normalt vil formen altid blive gentegnet, når applikationen er klar til at modtage nyt (user) input - "Invalidate" metoden benyttes til at tvinge gentegning af komponenter hvis indhold er skiftet. Alle standard VCL-er sætter selv sit "Invalidate" flag, når de er ændrede, så "Invalidate" skal du kun bruge til dine egne VCL'er. "Refresh" tvinger øjeblikkelig (så øjeblikkelig som Windows tillader) gentegning af komponenten, og anvendes f.eks. sammen med status-bars, som du løbende ændrer status på. Hvis dette går meget hurtigt, er der ikke lang nok pause i exekveringen af programmet til at windows kan nå i 'idle' state, og tvinge/lave gentegningen (bestilt vha. "Invalidate") for dig. Der vil "Refresh" så sikre at dit program stopper midlertigt, bedes Windows om en gentagning, og så fortsætter.
Lige et godt råd mht. "Refresh": Lav en eller anden form for intervalstyring i fbm. statusbars opdateringer - ellers refresher den hele tiden, selvom du ikke synligt kan se nogen forskel (og der måske heller ikke er det) og det sløver din applikation ned. Jeg har selv lavet et tool der løb et meget stort antal poster igennem (>50.000) med en løbende status bar. Første gang, lavede jeg bevidstløst Refresh hver gang jeg ændrede Position property'en på statusbaren. Så tog den 15 min. at gennemløbe data. Jeg ændrede da rutinen til at regne en procent ud, og kun ændre status-barens position og lave Refresh når procenten havde ændret sig - så tog det under 1 min. at gennemløbe data.
Du skriver: "Jeg har lavet en ny application. (File - New application.) Lagt en label på og dobbeltklikket på Formens OnMouseDown event. Dernæst har jeg sat d.o. kode ind, og kompileret."
Når du dobbelklikker på formens onMouseDown, mener du så ude i "object inspector"? Det kan jeg nemlig ikke. Jeg har defor selv skrevet koden til onMouseDown....... Kan det være et problem?
Ok jeg dummede mig, man kunne godt dobbeltklikke, bare man gøre det det rigtig sted... Nu virker det.....
Men jeg bruger mousedown til at gøre det mulig at tegne på en form med curseren. Det går bare for langsom, funktion bliver kaldt for få gange i sekundet. Kan der laves om, eller er det bare ikke vejen frem?
Når jeg tegnet på formen, forsvinder dette hvis man formindsker vinduet til taskbaren, og forstørre den igen. Skal man tegne i et bitmap image i stedet? Eller hvad ? Jeg giver gerne fler point.....
OnMouseDown event bliver kun udført een gang - nemlig i det øjeblik du trykker knappen ned. Hvis du herefter flytter musen, er det OnMouseMove event'en der bliver fyret af og endelig når du slipper tasten igen, er det OnMouseUp event'en der bliver fyret af.
Hvis du vil tegne med musen skal du derfor lave en eventhandler til alle tre events:
void __fastcall TForm1::FormMouseMove(TObject *Sender, int X, int Y) { if (drawWithMouse) { // Tegn line fra sidste punkt, til nuværende punkt. Canvas->Line(orgPoin.x, orgPoint.y, X, Y); orgPoint.x = X; orgPoint.y = Y; } }
void __fastcall TForm1::FormMouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { drawWithMouse = false; }
Syntaksen på d.o. er ikke afprøvet, men pricinppet skulle være korrekt.
Det er præcis havd jeg har gjort. Men den opdatere for langsom. Dvs hvis man tegner lidt huritg og i rundkreds, så bliver det til kantede cirkler. Kan man ikke få disse funktioner til at blive kaldt flere gange i sekundet?
Hvad med at tegne på et bitmap er den vejen frem? Det koster dyr processor tid at hele tiden skulle tegne bitmappet på formen.....
Jeg vil tro at Windows sætter en nedre grænse for hvor detaljeret musens flytning bliver fulgt - det er Windows der genererer OnMouseMove til dig. Du kan have ret i at det vil være smartere ikke at tegne på et synligt canvas hele tiden, men hvordan vil du så se hvad du laver ?!? hvis du bruger en TImage på formen til at tegne på/med, og simpelthen flytter/udvider den hele tiden, vil du alt andet lige få et mindre canvas at gentagne - og dermed måske lidt mere hastigehed.
Jeg ville nok i første omgang prøve at lave være med at tegne til når jeg fik en OnMouseUp event - og så gemme koordinaterne til de enkelte punkter i en lille tabel med f.eks. 4000 punkter og så prøve at se om det hjælper på detaljeringen. Hvad med Windows eget Paint program ??? Lider det af samme skavank ???
Ja psp og Windows Paint-program lider også at dette.
Synes godt om
Ny brugerNybegynder
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.