Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Paintbox + Scrollbox ? (https://www.delphipraxis.net/81359-paintbox-scrollbox.html)

mimi 25. Nov 2006 18:44


Paintbox + Scrollbox ?
 
Hallo,
ich habe immerwieder probleme beim thema scrollen. Da kam mir letzten die idee warum nutze ich nicht irgenwie die scrollbox...

also ich habe eine scrollbox z.b. ist sie 640X480 Pixel groß.
Meine paintbox ist genauso groß....
die map also das scrollfenster(ich hoffe ihr wist was ich meine) ist z.b. 5 mal so groß wie die eigetnliche scrollbox...

kann ich hier irgenwie die scrollbox nutzen ?

meine programme wo es nötig wäre nutzen meistens eine objlist:Tobjectlist....

ich hoffe ihr versteht wie ich es meine..

vielen dank für antworten bzw. tipps !

Muetze1 25. Nov 2006 19:37

Re: Paintbox + Scrollbox ?
 
Ich verstehe nicht was du meinst.

Ich kann nur sagen, dass ich einem Programm eine TPaintBox auf eine TScrollBox drauf habe. Die TPaintbox kann recht gross werden - deutlich grösser als die Scrollbox. Insgesamt macht dies kein Unterschied - ich muss mich beim Handling der PaintBox um nichts kümmern durch die Scrollbox. D.h. ich muss nichts zurück rechnen, etc, nix. Die Paintbox gibt mir immer die richtigen Koordinaten etc. Vielleicht hilft dir diese Aussage

mimi 26. Nov 2006 11:07

Re: Paintbox + Scrollbox ?
 
du meinst also ich sollte die paintbox genauso groß machen wie die scorllbox bzw. sogra größer...
meine idee war eine andere und zwar:
ich habe eine paintbox mit einer festen größe.
und eine scrollbox mit einer festen größe.
aber das scrollfenster bzw. scrollbereich muss ja irgenwie größer sein damit ich auch wirklich scrollen kann !

Muetze1 26. Nov 2006 13:00

Re: Paintbox + Scrollbox ?
 
Die Scrollbox bietet dir nur dann scrollen an, wenn die Elemente in ihr grösser sind als ihr Clientbereich. D.h. du kannst nur dann scrollen, wenn die PaintBox grösser ist. Wozu willst du überhaupt eine Scrollbox einsetzen, wenn deine TPaintBox nicht grösser ist?

Zitat:

Zitat von mimi
aber das scrollfenster bzw. scrollbereich muss ja irgenwie größer sein damit ich auch wirklich scrollen kann !

Richtig, daher muss die TPaintBox auch grösser sein als die TScrollBox!

Lannes 26. Nov 2006 14:41

Re: Paintbox + Scrollbox ?
 
Hallo,

mir erschließt sich der Sinn eigentlich auch nicht, aber
Zitat:

Zitat von Muetze1
Die Scrollbox bietet dir nur dann scrollen an, wenn die Elemente in ihr grösser sind als ihr Clientbereich. D.h. du kannst nur dann scrollen, wenn die PaintBox grösser ist.

man kann das schon durch entsprechende Margin-Werte beeinflussen, z.B. mit einem TBevel:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  Bevel1.Top := ScrollBox1.Height - Bevel1.Height-16;
  ScrollBox1.VertScrollBar.Margin := ScrollBox1.Height - Bevel1.Height-16;
end;

thkerkmann 26. Nov 2006 15:30

Re: Paintbox + Scrollbox ?
 
Zitat:

Zitat von mimi
...
also ich habe eine scrollbox z.b. ist sie 640X480 Pixel groß.
Meine paintbox ist genauso groß....
die map also das scrollfenster(ich hoffe ihr wist was ich meine) ist z.b. 5 mal so groß wie die eigetnliche scrollbox...

kann ich hier irgenwie die scrollbox nutzen ?
...

Du solltest die Paintbox so gross machen, wie deine "map". Schliesslich zeichnest Du diese map ja dort hinein.
Mit der Scrollbox kannst Du dann den Ausschnitt wählen, den Du sehen möchtest.

Gruss

mimi 26. Nov 2006 18:44

Re: Paintbox + Scrollbox ?
 
eigentlich habt ihr recht... nur ich zeichne ja auch in einen buffer bevor ich auf die paintbox zeichne
dann müste ich ja beides gleich groß machen !

aufjedenfall muss ich mich dann nicht mehr um die scroll funktion kümmern sehe ich das richtig ?

kann ich die scrollbalken denn auch manuell beinflussen ?
z.b. wenn die maus am rand ist?
z.b. oben, unten, lings, rechts, das ich dann auto. scroll könnte ?

mimi 27. Nov 2006 13:52

Re: Paintbox + Scrollbox ?
 
sagt mal wie macht ihr das eigentlich mit der größe der paintbox?
im moment habe ich aligen auf alClient stehen... passt ihr sie manuel an wenn ich die from size ändere ?

mimi 16. Jan 2007 17:10

Re: Paintbox + Scrollbox ?
 
so ich konnte jetzt erfolgreich die scrollbox in mein Paint2 projekt einbauen und es funktniert auch wunderbar... nur habe ich ein problem und zwar beim zeichnen....

ich kann inzwischen (dank eure hilfe) mehre objekte gleichzeitg verschieben oder löschen und ich kann auch die görße ändern von objekten(die objekte sind hierbei kreise, vierecke, linen und soweiter)

das eigentliche problem ist die größe... wenn ich z.b. eine größe von 10000 X 10000 Pixel einstelle stockt es bei diesem code:
Delphi-Quellcode:
procedure TPaint2Main.Paint;
var
  r1:TRect;
  px1,py1,sx1,sy1,i,sx2,sw,sh:Integer;
begin
  inherited Paint;
  if liste.AktivDocument.bg <> NIL then begin
    liste.AktivDocument.bg.Draw(buffer,false,-1,-1);
    liste.AktivDocument.bg.raster.Draw(liste.AktivDocument.bg.position.x,liste.AktivDocument.bg.position.y,liste.AktivDocument.bg.size.x,liste.AktivDocument.bg.size.y,buffer,liste.AktivDocument.bg.oldpen,liste.AktivDocument.bg.oldbrush);
  end;

  sw:=-1; sh:=-1;
  if liste.Documentindex > -1 then begin
    with Buffer.Canvas do begin
      for i:=0 to liste.AktivDocument.objlist.count-1 do begin
        with TPaint2BasesObj(liste.AktivDocument.objlist[i]) do begin
          if visible = true then begin
            with liste.AktivDocument do begin
//              sw:=size.x-(sichtfenster.Right-sichtfenster.left);
              if (Sichtfenster.Right > Position.x) and (Sichtfenster.Right-Sichtfenster.left > 0) then begin
                sw:=Position.x-((Position.x div (Sichtfenster.Right-Sichtfenster.left)) * buffer.Width);

//                Screen.Forms[0].Caption:=IntTostr(Position.x div (Sichtfenster.left) );
                sw:=sw div Position.x;
                sx2:=sw+(Size.x - position.x)
              end
              else begin
                sw:=position.x;
                sx2:=Size.x
              end;
              Screen.Forms[0].Caption:=intTostr(sw) + '\' + intTostr(Sichtfenster.left) + '\' + intTostr(Sichtfenster.Right);

            end;

            px1:=sw-5;
            py1:=position.y-5;
            sx1:=Size.x+5;
            sy1:=Size.y+5;

            buffer.canvas.Brush.style:=bsSolid;

            if (isfocus) or (liste.itemindex = i) then
               buffer.canvas.Brush.color:=clBlack
            else
             if sel then buffer.canvas.Brush.color:=clred;
            buffer.canvas.Pen.Style:=psSolid; buffer.canvas.Pen.color:=clYellow;

            if ((pointDrawDown > -
1 ) or (sel) or (isfocus)) and (typ <> alt_Line) then
FillRect(px1,py1,sx1,sy1);

// damit der makierungs rahmen gezeichnet wird
// muss geprüft werden ob ein pointDrawMove gesetzt ist
// oder das objekt den focus hat wenn ja dann zeichne
Draw(buffer,(pointDrawDown > -1) or (pointDrawMove > -1) or (isfocus = true),sw,sh);
Raster.Draw(px1+5,py1+5,sx1-5,sy-5,buffer,oldpen,oldbrush);
end;
end; // with TPaint2BasesObj(liste.liste[i])
end; // for
end; // with buffer2.canvas
end; // if Documentenindex
Canvas.Draw(0,0,Buffer);
end; // procedure Paint
[/delphi]

paint2main ist von TCustomControl abgeleitet.... bei jeder mausbeweung wird dies paint durch Invalidate aufgreufen:
Delphi-Quellcode:
procedure TPaint2Main.MouseMove(Shift: TShiftState; X,Y: Integer);
begin
  ow:=x; oh:=y; onMouseMove1(self,Shift,x,y);
  if shift <> [] then begin
    inherited MouseMove(Shift,X,Y);
    Invalidate;
  end;
  oldpos.x:=x; oldpos.y:=y;
end;
ich muss inerhalb dieses ereignies ein ereignis aufrufen wo weitere sachen drin stehen !

das problem ist jetzt wie gesagt die geschwindigkeit.... ich dachte ich könnte mit copyRect einfach den bereich ständig neuzeichnen der sich ändern aber das gibt leider unerwartet probleme:
1: dazu bräuchte ich ein zweiten buffer in den ich beim klickenden gesammten inhalt vom ersten buffer reinkopieren)
das problem ist hier bei das ändern vom ersten buffer

2: mir fällt einfach keine lösung ein wie ich nur den teilbereich neuzeichnen könnte

Muetze1 16. Jan 2007 17:49

Re: Paintbox + Scrollbox ?
 
Schau welche Objekte oder Zeichenanweisungen in das ClipRect des Canvas der PaintBox fallen (siehe dazu MSDN-Library durchsuchenIntersectRect()) und dann rufe im MouseMove nicht Invalidate auf sondern nur ein MSDN-Library durchsuchenInvalidateRect() für den Bereich, der aktuell sichtbar ist (also den unsichtbaren Bereich einfach nicht neuzeichnen).

Auch ist die Frage: warum zeichnest du ständig neu im MouseMove? Würde es nicht reichen dies nur zu tun, wenn aktiv was verschoben wird? zZ. braucht man in deinem Code z.B. nur Shift gedrück zu lassen beim Mouse Move und schon malt er...
Besser wäre hier doch ein InvalidateRect() nur für das gezogene Element mit dem Rechteck seiner Grösse in der alten Position/Ausmaß und danach nochmal in der neuen Position. Dies würde dann schon von Windows ordentlich kombiniert werden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:26 Uhr.
Seite 1 von 2  1 2      

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