Avatar billede cautoo Nybegynder
28. juli 2003 - 18:17 Der er 18 kommentarer og
3 løsninger

Form canvas

Jeg bruger min form til at indsætte nogle billeder i en lille animation (derfor kan jeg ikke putte dem i et Timage), men problemet er hvis formen får noget over sig (eks. et andet vindue), så forsvinder det jeg har malet på formen, der hvor det andet har været... hvordan ungår jeg det?
jeg putter et billede i formens canvas således:
Canvas.draw(0,0,Bitmap)
Avatar billede Slettet bruger
28. juli 2003 - 19:31 #1
Prøv at putte koden i onPaint.
Avatar billede eht Nybegynder
28. juli 2003 - 21:20 #2
Du kan benytte et TImage.
Indsæt f.eks. et der dækker hele formen og tegn så på TImage's canvas:

Image1.Canvas.draw(0,0,Bitmap);

Så er du ude over problemet med at tegningen bliver visket ud.
Avatar billede cautoo Nybegynder
28. juli 2003 - 21:27 #3
Hejhej> Jeg tester det lige...

eht> hmm... Prøv lige at læse spg.'et igen....
Avatar billede athlon-pascal Juniormester
28. juli 2003 - 22:27 #4
Cautoo -> Hvorfor kan du ikke bruge TImage?
Du kan også prøve med en PaintBox, der tegner du også i OnPaint, ligesom med formen.

Lav et nyt, tomt projekt.
Indsæt en TTimer på din Form1. Den skal hedde Timer1. Sæt Enabled til true og Interval til 1000.
Brug følgende kode i timerens OnTimer-event:

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  PaintBox1.Tag := PaintBox1.Tag + 1;
  PaintBox1.Repaint;
end;


Nu skal du indsætte en TPaintBox på din form. Kald den PaintBox1 og giv den en rimelig størrelse.
Brug følgende kode i paintboxens OnPaint-event:

procedure TForm1.PaintBox1Paint(Sender: TObject);
begin
  with PaintBox1 do
  begin
    Canvas.Font.Color := clRed;
    Canvas.Font.Size := 30;
    Canvas.Font.Name := 'Verdana';

    Canvas.TextOut(0, 0, IntToStr(Tag));
  end;
end;
Avatar billede eht Nybegynder
29. juli 2003 - 13:14 #5
Jeg har læst spørgsmålet igen.
Svaret er det samme.
Du kan tegne på et tomt TImage på samme måde, som du kan tegne på formen.
Du har bare ikke det problem med at det bliver visket ud af et andet vindue.

//Eht
Avatar billede zerohero Nybegynder
29. juli 2003 - 15:32 #6
Jeg kan heller ikke se hvorfor du ikke skulle kunne bruge en TImage - Jeg ville nærmest sige at det er ret oplagt at bruge denne komponent til den form for projekt som du beskriver! Men hvis du stædigt insistere på IKKE at bruge en TImage, kan du lave en procedure der modtager Windows Messages, og når der modtages beskeder fra windows der omhandler noget update/repaint-agtigt så skal din canvas repaintes. Jeg vil umiddelbart sige at det er en meget besværlig vej (med mindre du har andre ting, der også behøves "behandling" af Windows Messages) at gå når det samme kan opnåes med TImage. En lidt mere simpel løsning er vel bare at lade en TTimer opdatere din canvas med et passende interval!

Held og Lykke
ZeroHero
Avatar billede cautoo Nybegynder
29. juli 2003 - 16:38 #7
Af hensyn til TImage har jeg prøvet at benytte det, men det giver "flimmer" når jeg opdaterer billedet, har jeg også haft spurgt om hjælp til... http://www.eksperten.dk/spm/377220
hmm... det jeg er ved at lave er at enkelt præsentationssytem som gør det muligt at vise præsentationer på en computer, og styre fra en anden, sådan at man kan ændre præsentationen under igangværelse..., altså et slags interaktivt præsentationsprogram...
På styreenheden har jeg så et miniareture billede af det resultat som man har lavet, eller er i gang med at lave, dvs. det opdaterers hver gang man ændrer på end indstilling, men da jeg havde det på et TImage gav det flimmer, da jeg så brugte formens canvas i stedet virkede det fint... lige til jeg fandt ud af at det bliver slettet af overlappende objekter...
Avatar billede zerohero Nybegynder
29. juli 2003 - 17:04 #8
Må vi få lov at se koden der har med canvas'en at gøre? Det vil gøre det lettere at kunne finde løsning til dig!
Avatar billede cautoo Nybegynder
29. juli 2003 - 17:09 #9
const
  vindue1x = 240;
  vindue1y = 265;
  vindue2x = 520;
  vindue2y = 265;

procedure TForm1.Edit2Change(Sender: TObject);
var
  newlook: TBitmap;
begin
  newlook := TBitmap.Create;
  newlook.width := 256;
  newlook.height := 192;
  if RadioGroup1.ItemIndex = 0 then
  newlook.Canvas.Draw(0,0,Vindue1)
  else
  newlook.Canvas.Draw(0,0,Vindue2);
  newlook.Canvas.Font.Color := ColorBox1.Selected;
  newlook.Canvas.Font.Size := round(Spinedit6.Value/4);
  newlook.Canvas.Font.Name := Combobox1.Text;
  if CheckBox1.Checked then
  newlook.Canvas.brush.Style := bsclear
  else
  newlook.Canvas.brush.Color := ColorBox3.Selected;
  if speedbutton1.Down then
  newlook.Canvas.Font.Style := newlook.Canvas.Font.Style + [fsBold]
  else
  newlook.Canvas.Font.Style := newlook.Canvas.Font.Style - [fsBold];
  if speedbutton2.Down then
  newlook.Canvas.Font.Style := newlook.Canvas.Font.Style + [fsItalic]
  else
  newlook.Canvas.Font.Style := newlook.Canvas.Font.Style - [fsItalic];
  if speedbutton3.Down then
  newlook.Canvas.Font.Style := newlook.Canvas.Font.Style + [fsUnderline]
  else
  newlook.Canvas.Font.Style := newlook.Canvas.Font.Style - [fsUnderline];
  if speedbutton4.Down then
  newlook.Canvas.Font.Style := newlook.Canvas.Font.Style + [fsStrikeOut]
  else
  newlook.Canvas.Font.Style := newlook.Canvas.Font.Style - [fsStrikeOut];
  newlook.Canvas.TextOut(round(Spinedit2.Value/4),round(Spinedit3.Value/4), edit2.text);
  if RadioGroup1.ItemIndex = 0 then
  Canvas.Draw(vindue1x,vindue1y,newlook)
  else
  Canvas.Draw(vindue2x,vindue2y,newlook);
end;

^^den er jo så indstillet til at bruge formens canvas... efter at have haft problemer med TImage....
Avatar billede zerohero Nybegynder
29. juli 2003 - 17:11 #10
mangler du ikke at frigøre din TBitmap (newlook)?
Avatar billede cautoo Nybegynder
29. juli 2003 - 17:13 #11
hele projektet med exe fil og kode kan hentes på http://cautoo.dk/project1.zip
^^ det interaktive billede ændrer sig når man skriver en tekst i editfeltet hvor der står Tekst foran og når man ændrer i de medhørende komponenter...
Avatar billede cautoo Nybegynder
29. juli 2003 - 17:14 #12
jo.... men det får vel ikke billedet til at flimre under opdatering
Avatar billede zerohero Nybegynder
29. juli 2003 - 17:22 #13
her er et test der ikke flimre ved mig...

var
  Bitmap : TBitmap;
procedure TForm1.FormCreate(Sender: TObject);
begin
  Bitmap := TBitmap.Create;
  Bitmap.Width := 256;
  Bitmap.Height := 129;
end;

procedure TForm1.FormShow(Sender: TObject);
begin
  Edit1Change(nil);
end;

procedure TForm1.Edit1Change(Sender: TObject);
begin
  with Bitmap.Canvas do
  begin
    FillRect(Rect(0,0,Bitmap.Width,Bitmap.Height));
    TextOut(0,0,Edit1.Text);
  end;
  Image1.Picture.Assign(Bitmap);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Bitmap.Free;
end;

PS: Hvis du bare bliver ved med at create vil du hurtig optage alt hukommelse på din computer - dette vil dermed sløve den - men jeg tror nu ikke det er det :))

Held og Lykke
ZeroHero
Avatar billede cautoo Nybegynder
29. juli 2003 - 17:45 #14
går ud fra det er:    Image1.Picture.Assign(newlook) <-- som jeg skal lave ... men det får den stadig til at flimre.... og jeg har tilføjet free
Avatar billede zerohero Nybegynder
29. juli 2003 - 17:52 #15
Hat du prøvet at lave et nyt projekt med mit eksempel? (og flimre det så stadig?)

Hvornår er det præcist at det flimre? er det når du skriver til din canvas i applikationen?

Prøv at uploade exe'en når du bruger en TImage!
Avatar billede Slettet bruger
29. juli 2003 - 17:53 #16
Prøv at skrive DoubleBuffered := True; i onCreate.
Avatar billede cautoo Nybegynder
29. juli 2003 - 17:58 #17
det virker faktisk... mystisk det ikke virkede, da jeg desideret spurgte om hjælp til Image i det andet spg. tak for hjælpen....
Avatar billede Slettet bruger
29. juli 2003 - 18:00 #18
Takker for point :-)
Avatar billede cautoo Nybegynder
29. juli 2003 - 18:14 #19
hmm... virker det ikke lidt underligt, når jeg nu har lavet lidt mere, bla. smidt Image på en TGroupBox, så begynder den at blinke igen
Avatar billede cautoo Nybegynder
29. juli 2003 - 18:17 #20
høø... den havde åbenbart også doubblebuffered... hvad er ulæmpen ved at bruge den siden at den kan slåes fra?
Avatar billede Slettet bruger
29. juli 2003 - 19:28 #21
Ved det ik, men kunne forstille mig at det bruger mere hukommelse eller sådan noget, ellers kunne formen vel ligeså godt være doublebufferet som standard.
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