Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   TrackBar Zoomen in einer Paintbox (https://www.delphipraxis.net/163802-trackbar-zoomen-einer-paintbox.html)

Blubbel 17. Okt 2011 08:42

Delphi-Version: 5

TrackBar Zoomen in einer Paintbox
 
Hallo und guten Morgen,

Ich hoffe ich nerve euch nicht langsam aber jetzt habe ich ein neues Problem, wo ich im Internet nicht so recht was nützliches gefunden habe.

Ich soll eine Trackbar zum Zoomes einfügen. Habe auch schon einiges versucht, es klappt aber nichts.
Delphi-Quellcode:
rocedure TForm1.TrackBar1Change(Sender: TObject);
begin
  case TrackBar1.Position of
  0:
  begin
    PaintBox1.Width:= 100 + TrackBar1.Position;
  end;
  1:
  begin
    PaintBox1.Width:= 200 + TrackBar1.Position;
  end;
  end;
Bisher habe ich sowas versucht.

Bitte um Hilfe ;)
Danke euch schon mal

DeddyH 17. Okt 2011 09:01

AW: TrackBar Zoomen in einer Paintbox
 
Du setzt ja auch nur die Breite neu. Die Höhe fehlt, und nach dem Neusetzen musst Du auch neu zeichnen.

Blubbel 17. Okt 2011 09:06

AW: TrackBar Zoomen in einer Paintbox
 
Geändert hat sich was... ich rätsel noch ma ne runde auf jeden fall gehts einiger maßen.

WEnn ich nicht weiter komme schreib ich.

Danke

DeddyH 17. Okt 2011 09:24

AW: TrackBar Zoomen in einer Paintbox
 
Prinzipiell ist das mit ein wenig Prozentrechnung einigermaßen einfach zu realisieren. Beispiel mit einer PaintBox (align = alClient):
Delphi-Quellcode:
procedure TForm1.PaintBox1Paint(Sender: TObject);
const
  Prozent = 95;
var
  Hoehe, Breite, Links, Oben: integer;
  pb: TPaintBox;
begin
  pb := Sender as TPaintBox;
  pb.Canvas.Pen.Color := clRed;
  pb.Canvas.Pen.Width := 3;
  //Höhe und Breite der Ellipse sollen jeweils 95% des Clientbereichs betragen
  Hoehe := trunc(pb.ClientHeight / 100 * Prozent);
  Breite := trunc(pb.ClientWidth / 100 * Prozent);
  Links := trunc((pb.ClientWidth - Breite) / 2);
  Oben := trunc((pb.ClientHeight - Hoehe) / 2);
  pb.Canvas.Ellipse(Links, Oben, Links + Breite, Oben + Hoehe);
end;

Blubbel 17. Okt 2011 09:28

AW: TrackBar Zoomen in einer Paintbox
 
hmmm... sieht ja ganz gut aus... sollen es aber mit einer Trackbar realisieren. Also ganz hinter dem geheimniss bin ich noch nicht gekommen aber es wird schon mal größer... naja gezoomt wirds nicht gerade aber naja ich probiere weiter

DeddyH 17. Okt 2011 09:36

AW: TrackBar Zoomen in einer Paintbox
 
Ich reagiere lediglich auf Änderungen der Größe der PaintBox. Ob das nun durch Ändern der Formulargröße oder per Code mittels TrackBar geschieht, spielt doch keine Rolle.

Blubbel 17. Okt 2011 09:42

AW: TrackBar Zoomen in einer Paintbox
 
Ja gut denn versuche ich mal mein bestes

Bummi 17. Okt 2011 09:49

AW: TrackBar Zoomen in einer Paintbox
 
Liste der Anhänge anzeigen (Anzahl: 2)
Vielleicht kannst Du mit dieser Anregung was anfangen ...

Blubbel 17. Okt 2011 10:52

AW: TrackBar Zoomen in einer Paintbox
 
Wenn ich den Zeiger von der Trackbar wieder zurück schiebe, wird es statt Normal noch kleiner

Bummi 17. Okt 2011 10:55

AW: TrackBar Zoomen in einer Paintbox
 
Ist ein Demo um zu zeigen dass vergrößern und verkleinern geht, Du kannst die Parameter anpassen wie Du sie brauchst ....

Blubbel 17. Okt 2011 10:57

AW: TrackBar Zoomen in einer Paintbox
 
gut ok... Danke schön :thumb:

Blubbel 19. Okt 2011 09:39

AW: TrackBar Zoomen in einer Paintbox
 
Gibt es noch andere Möglichkeiten zum Zoomen?

DeddyH 19. Okt 2011 09:43

AW: TrackBar Zoomen in einer Paintbox
 
Was genau willst Du denn zoomen? Etwas Selbstgezeichnetes oder eine bestehende Pixelgrafik? Ersteres geht wie gezeigt mit Prozentrechnung oder indem man Vektorgrafik benutzt (TMetafile, TMetaFileCanvas).

Blubbel 19. Okt 2011 09:52

AW: TrackBar Zoomen in einer Paintbox
 
Also, ich habe ja die Canvas, auf der schon das Koordinatensystem gezeichnet ist.
Jetzt möchte ich ja dass die komplette Canvas gezoomt werden kann... also nicht nur größer auch kleiner. Wenn die Parabel auch schon darauf gezeichnet wurde, soll auch die mit größer/kleiner gemacht werden können.

Also, naja.... mehr oder weniger ein selbergezeichnetes... denk ich :?

DeddyH 19. Okt 2011 09:55

AW: TrackBar Zoomen in einer Paintbox
 
Was spricht denn gegen ein komplettes Neuzeichnen? Wenn die Berechnungen nicht zu langwierig sind sollte das ja kein Problem sein, anders habe ich das in meinem Beispiel ja auch nicht gemacht.

Blubbel 19. Okt 2011 09:58

AW: TrackBar Zoomen in einer Paintbox
 
Also bau ich noch mit ein, dass er den Graphen, der auf "Knopfdruck" gezeichnet wird und das Koordinatensystem neu gezeichnet werden.. hmm.. ok ich versuchs auf jeden fall mal.

Mal gucken wie weit ich komme.:wink:

DeddyH 19. Okt 2011 10:13

AW: TrackBar Zoomen in einer Paintbox
 
Wie schon gesagt, Du kannst natürlich auch eine Vektorgrafik verwenden. Beispiel:
Delphi-Quellcode:
type
  TfrmMetaFileDemo = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormPaint(Sender: TObject);
    procedure FormResize(Sender: TObject);
  private
    { Private-Deklarationen }
    FMetaFile: TMetaFile;
  public
    { Public-Deklarationen }
  end;

...

procedure TfrmMetaFileDemo.FormCreate(Sender: TObject);
var
  mcv: TMetaFileCanvas;
begin
  FMetaFile := TMetaFile.Create;
  FMetaFile.Width := ClientWidth;
  FMetaFile.Height := ClientHeight;
  mcv := TMetaFileCanvas.Create(FMetaFile, Canvas.Handle);
  try
    mcv.Pen.Style := psClear;
    mcv.Brush.Color := clRed;
    mcv.Ellipse(10, 10, 100, 100);
    mcv.Brush.Color := clBlue;
    mcv.FillRect(Rect(50, 50, 150, 150));
    mcv.Font.Name := 'Arial';
    mcv.Font.Size := 20;
    mcv.Brush.Style := bsClear;
    mcv.TextOut(20, 20, 'Hallo MetaFile');
  finally
    mcv.Free;
  end;
  DoubleBuffered := true;
end;

procedure TfrmMetaFileDemo.FormDestroy(Sender: TObject);
begin
  FMetaFile.Free;
end;

procedure TfrmMetaFileDemo.FormPaint(Sender: TObject);
begin
  Canvas.StretchDraw(ClientRect, FMetaFile);
end;

procedure TfrmMetaFileDemo.FormResize(Sender: TObject);
begin
  Invalidate;
end;

Blubbel 19. Okt 2011 10:27

AW: TrackBar Zoomen in einer Paintbox
 
Alles klr danke dir! ich guck mal was ich da so machen kann:thumb:

Blubbel 21. Okt 2011 10:39

AW: TrackBar Zoomen in einer Paintbox
 
mein Zoom funktioniert aber wenn ein Graph vorher gezeichnet wurde verschwindet er... was kann ich da machen? habe schon mal was vorbereitet...
Delphi-Quellcode:
procedure TForm1.RepaintFunction;
begin
  if btn_Zeichne.??? then
  begin

  end;

  if btn_Zeichne1.??? then
  begin

  end;
end;

Also mein Zoom Funktioniert so:
Delphi-Quellcode:
procedure TForm1.DrawGrid(ACanvas: TCanvas; AScaleFactor: Integer);
var
  lPoint: TPoint;
  lCount, lScale, i: Integer;
begin
  ACanvas.Brush.Style:= bsSolid;
  ACanvas.Brush.Color:= clWhite;
  ACanvas.FillRect(ACanvas.ClipRect);
                //X-Achse
  ACanvas.TextOut(0,0, RectToStr(ACanvas.ClipRect));
  ACanvas.MoveTo(0, GetHeight(ACanvas.ClipRect) div 2); //Graph
  ACanvas.LineTo(GetWidth(ACanvas.ClipRect), GetHeight(ACanvas.ClipRect) div 2);
  //Mittelpunkt ausrechnen
  lPoint:= GetCenter(ACanvas.ClipRect);
  //Scalierungswert festlegen

  //Mittelpunkt bis Rechts - X-Achse
  i:= lPoint.X;
  lCount:= 0;
  lScale:= AScaleFactor;

  while i < ACanvas.ClipRect.Right do
  begin
    inc(i,lScale);
    inc(lCount,1);

    DrawGridCaption(ACanvas, Point(i, lPoint.Y), 0, IntToStr(lCount));
  end;

  //Mittelpunkt bis Links der X-Achse
  i:= lPoint.X;
  lScale:= AScaleFactor;
  lCount:= 0;
  while i > ACanvas.ClipRect.Left do
  begin
    dec(i, lScale);
    dec(lCount, 1);

    DrawGridCaption(ACanvas, Point(i, lPoint.Y), 2, IntToStr(lCount));
  end;

  //Y-Achse Von Mittelpunkt nach unten
  lPoint:= GetCenter(ACanvas.Cliprect);
  lScale:= AScaleFactor;
  i:=lPoint.Y;
  lCount:= 0;
  while i < ACanvas.ClipRect.Bottom do
  begin
    inc(i, lScale);
    inc(lCount, -1);

    DrawGridCaption(ACanvas, Point(lPoint.X, i), 1, IntToStr(lCount));
  end;

  //Y-Achse von Mittelpunkt nach oben
  lPoint:= GetCenter(ACanvas.Cliprect);
  lScale:= AScaleFactor;
  i:=lPoint.Y;
  lCount:= 0;
  while i > ACanvas.ClipRect.Top do
  begin
    dec(i, lScale);
    dec(lCount, -1);

    DrawGridCaption(ACanvas, Point(lPoint.X, i), 3, IntToStr(lCount));
  end;
       //Y-Achse
  ACanvas.MoveTo(GetWidth(ACanvas.ClipRect) div 2, 0);  //Graph
  ACanvas.LineTo(GetWidth(ACanvas.ClipRect) div 2, GetHeight(ACanvas.ClipRect));
end;


.....


  function GetScaleValue(APos: Integer): Integer;
  begin
    Result:= ((APos + 10) + 1) * 10;
  end;

DeddyH 21. Okt 2011 10:44

AW: TrackBar Zoomen in einer Paintbox
 
Wann zeichnest Du denn? Anscheinend nicht im OnPaint, das genau dafür gedacht ist.

Blubbel 21. Okt 2011 10:45

AW: TrackBar Zoomen in einer Paintbox
 
also in der Paintbox selber (Also wenn ich doppelklicke) hab ich nichts gemacht... läuft alles "extern"

Blubbel 21. Okt 2011 10:50

AW: TrackBar Zoomen in einer Paintbox
 
hab mich geirrt... ist doch drin und auf OnPaint
Delphi-Quellcode:
procedure TForm1.PaintBox1Paint(Sender: TObject);
begin
  DrawGrid(PaintBox1.Canvas, GetScaleValue(TrackBar1.Position));
end;



procedure TForm1.TrackBar1Change(Sender: TObject);
begin
  DrawGrid(PaintBox1.Canvas, GetScaleValue(TrackBar1.Position));
end;

DeddyH 21. Okt 2011 11:13

AW: TrackBar Zoomen in einer Paintbox
 
Aber den Graphen scheinst Du ja nicht im OnPaint zu zeichnen. Wenn, dann alles an der selben Stelle, sonst macht es ja keinen Sinn.

Blubbel 21. Okt 2011 11:21

AW: TrackBar Zoomen in einer Paintbox
 
na doch hab ja den graphen als extra prozedur dort drin...

Blubbel 21. Okt 2011 11:32

AW: TrackBar Zoomen in einer Paintbox
 
also der Graph wird in einer extra prozedur gezeichnet die im OnPaint mit drin ist. Die Graphen zeichnen sich wenn man die werte ins edit einträgt und einen Button klickt.

DeddyH 21. Okt 2011 12:02

AW: TrackBar Zoomen in einer Paintbox
 
Wird in DrawGrid der Graph gezeichnet? Falls ja, dann verstehe ich Dein Problem nicht.

Bummi 21. Okt 2011 12:16

AW: TrackBar Zoomen in einer Paintbox
 
Liste der Anhänge anzeigen (Anzahl: 2)
Kann es sein dass Du sowas versuchst?

Blubbel 21. Okt 2011 15:37

AW: TrackBar Zoomen in einer Paintbox
 
ja genau DrawGrid is das koordinatensystem. Also der graph wird ja gezeichnet wenn man den button klickt. und wenn ich es DANACH zommen will, verschwindet der und ich muss ihn nochmal zeichnen lassen

Blubbel 21. Okt 2011 15:47

AW: TrackBar Zoomen in einer Paintbox
 
@bummi

ja so ähnlich nur das die Parabel oder graph der gezeichnet wurde ja per knopfdruck ist und beim zoom verschwindet

Bummi 21. Okt 2011 16:01

AW: TrackBar Zoomen in einer Paintbox
 
Ich fürchte ich kann Dir überhaupt nicht mehr folgen.
Am besten Du packst Dein komplettes Projekt mal in ein Zip, legst es hoch und beschreibst was ganau wie funktionieren soll, bzw. nicht so funktioniert wie es soll......

DeddyH 21. Okt 2011 16:10

AW: TrackBar Zoomen in einer Paintbox
 
Das Problem ist doch anscheinend, dass auf ButtonClick auf eine Zeichenfläche gemalt wird. Sobald diese Zeichenfläche aktualisiert wird, sind die Änderungen natürlich verschwunden. Daher kann es nur so funktionieren: im OnPaint etwas in der Art
- zeichne Koordinatensystem
- wenn Graph vorhanden, zeichne Graphen
schreiben und im ButtonClick
- definiere Graphen
- neu zeichnen
Fertig ist die Laube. Man kann das natürlich auch auf ein MetaFile oder meinetwegen Bitmap zeichnen und das dann im OnPaint aktualisieren.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:05 Uhr.

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