AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Eigene Objekte -> PaintBox
Thema durchsuchen
Ansicht
Themen-Optionen

Eigene Objekte -> PaintBox

Ein Thema von mimi · begonnen am 14. Aug 2005 · letzter Beitrag vom 28. Aug 2005
Antwort Antwort
Seite 1 von 2  1 2      
mimi

Registriert seit: 1. Dez 2002
Ort: Oldenburg(Oldenburg)
2.008 Beiträge
 
FreePascal / Lazarus
 
#1

Eigene Objekte -> PaintBox

  Alt 14. Aug 2005, 13:44
Hallo,
ich habe lange gesucht und leider nichts gefunden was mir wirklich weiter geholfen hätte

Ich möchte gerne eigene Delphi Zeichen objekte erstellen wie z.b. ein Kreis oder ein Stern.
Dazu habe ich mir ein kleines Paint geschrieben.
Das speichern geht schon nur das vergrößern der objekte geht leider nicht.

Das vergrößern wollte ich so machen
(hier etwas code denn ich heute geschrieben habe)
Delphi-Quellcode:
procedure FillPixel(sx,sy,zx,zy:Integer; PaintBox:TPaintBox);
var
  x,y:Integer;
begin
  for y:=sy to zy do begin
    for x:=sx to zx do begin
      PaintBox.Canvas.Pixels[x,y]:=clBlack;
    end;
  end;

end;

procedure TForm1.ObenObj(F:TFileName);
var
  i,x,y,fx,fy,ox,oy:Integer;
  l:TStringList;
begin
  ox:=-1; oy:=-1;
  if FileExists(f) = True then begin
    l:=TStringList.Create;
    l.LoadFromFile(f);
    fx:=2;
    fy:=2;

    for i:=0 to l.Count-1 do begin
      x:=StrToInt(GetToken(l.Strings[i],':',1));
      y:=StrToInt(GetToken(l.Strings[i],':',2));
// PaintBox2.Canvas.Pixels[x,y]:=clBlack;

      if (ox > -1) and (oy > -1) then
        FillPixel(ox,oy,x *fx,y *fy,PaintBox2);
      ox:=x *fx;
      oy:=y *fy;
    end;
  end
  else
    ShowMessage('Dateinamen gibt es nicht !');
end;
doch leider geht FillPixel nicht so wie ich es mir vorgestellt habe. hier ein Bild ich würde gerne nur die umrahmung und nicht das Innere, das lieg an in der FillPixl funktion und zwar bei den For y schleifen.
Michael Springwald
MFG
Michael Springwald,
Bitte nur Deutsche Links angeben Danke (benutzte überwiegend Lazarus)
  Mit Zitat antworten Zitat
Benutzerbild von turboPASCAL
turboPASCAL

Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
 
Delphi 6 Personal
 
#2

Re: Eigene Objekte -> PaintBox

  Alt 14. Aug 2005, 14:30
Zitat von mimi:
...doch leider geht FillPixel nicht so wie ich es mir vorgestellt habe. hier ein Bild ich würde gerne nur die umrahmung und nicht das Innere, das lieg an in der FillPixl funktion und zwar bei den For y schleifen.
Das habe ich jetzt nicht Verstanden, möchtest du nur einen Rahmen zeichnen ? Bild, was wo ?

Delphi-Quellcode:
procedure FillPixel(sx, sy, zx, zy: Integer; PaintBox: TPaintBox; Fill: Boolean);
begin
  PaintBox.Canvas.Pen.Color := clRed;
  PaintBox.Canvas.Brush.Color := clBlack;

  if Fill = True
    then PaintBox.Canvas.Brush.Style := bsSolid // ausmalen
    else PaintBox.Canvas.Brush.Style := bsClear; // nicht ausmalen

  PaintBox.Canvas.Rectangle( Rect(sx, sy, zx - sy, zy - sx) );
end;
Matti
Meine Software-Projekte - Homepage - Grüße vom Rüsselmops -Mops Mopser
  Mit Zitat antworten Zitat
mimi

Registriert seit: 1. Dez 2002
Ort: Oldenburg(Oldenburg)
2.008 Beiträge
 
FreePascal / Lazarus
 
#3

Re: Eigene Objekte -> PaintBox

  Alt 14. Aug 2005, 16:37
ich möchte folgendes:
ich male jetzt ein object z.b. ein Dreieck(sowas gibt es ja nicht als standart) und nun speichere ich dieses object ab und verkleire das das geht auch soweit.
Nun möchte ich es wieder öffnen aber vergrößert. und das geht leider nicht.
um deine frage zu beantworten:
Ja ich möchte nur die umrahmung selbst zeichnen bzw. was der user vorgeben hat.

das bild kommt hier

edit:
deine funktion macht leider nicht das was ich wollte: ich möchte kein rechtect oder sowas zeichnen sonder selbst ein eignes objekt schreiben bzw. zeichnen.
Angehängte Grafiken
 
Michael Springwald
MFG
Michael Springwald,
Bitte nur Deutsche Links angeben Danke (benutzte überwiegend Lazarus)
  Mit Zitat antworten Zitat
mimi

Registriert seit: 1. Dez 2002
Ort: Oldenburg(Oldenburg)
2.008 Beiträge
 
FreePascal / Lazarus
 
#4

Re: Eigene Objekte -> PaintBox

  Alt 20. Aug 2005, 21:04
ich habe mich weiter mit dem problem befasst aber noch keine passende lösung finden können.
Egal was ich versucht habe: nichts hat funkitoniert. es wahren immer lücken zwischen den einzelen pixel was letzendlich auch logisch ist: wenn ich das bild doppelt so groß haben möchte wie es voher wahr muss ich ja jeden pixel ersteinmal * 2 nehmen(oder nicht?) und dann entstehen lücken die genau zwei pixel groß sind zwischen den einzelen pixel und das problem ist jetzt diese lücken zu füllen.

Es handelt sich dabei nur um Schwartzt weis Bilder
Michael Springwald
MFG
Michael Springwald,
Bitte nur Deutsche Links angeben Danke (benutzte überwiegend Lazarus)
  Mit Zitat antworten Zitat
mimi

Registriert seit: 1. Dez 2002
Ort: Oldenburg(Oldenburg)
2.008 Beiträge
 
FreePascal / Lazarus
 
#5

Re: Eigene Objekte -> PaintBox

  Alt 21. Aug 2005, 11:23
ich habe es heute mit diese porcedure versucht:
Delphi-Quellcode:
procedure SetPixel(x,y:Integer; Canvas1:TCanvas);
begin
  Canvas1.Pixels[x,y]:=clBlack;
end;

procedure TForm1.ObenObj(F:TFileName);
var
  i,x,y:Integer;
  l:TStringList;
  bild:TCanvas;
begin
  ox:=-1; oy:=-1;
  Bild:=TCanvas.Create;
  Bild.Brush:=TBrush.Create;

  if FileExists(f) = True then begin
    l:=TStringList.Create;
    l.LoadFromFile(f);

    for i:=0 to l.Count-1 do begin
      x:=StrToInt(GetToken(l.Strings[i],':',1));
      y:=StrToInt(GetToken(l.Strings[i],':',2));
      SetPixel(x,y,bild);
    end; // for
   PaintBox1.Canvas.StretchDraw(Rect(2,2,2,2),Bild.Brush.Bitmap);

  end // If
  else
    ShowMessage('Dateinamen gibt es nicht !');
end;
aber leider gibt er einen fehler:
Zitat:
---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt CreateObject.exe ist eine Exception der Klasse EInvalidOperation aufgetreten. Meldung: 'Leinwand/Bild erlaubt kein Zeichnen'. Prozess wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen.
---------------------------
OK Hilfe
---------------------------
den kann ich nicht nachvollziehen.
Meinziel ist es später das ich das bild mit der Maus vergrößern und Verkleinern kann.

Die bilder die ich damit vergrößern möchte enhalten nur kleine objekte wie z.b. Dreiece, Häuser, und soweiter. Das was bei delphi nicht dabei ist neben.
Michael Springwald
MFG
Michael Springwald,
Bitte nur Deutsche Links angeben Danke (benutzte überwiegend Lazarus)
  Mit Zitat antworten Zitat
Benutzerbild von turboPASCAL
turboPASCAL

Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
 
Delphi 6 Personal
 
#6

Re: Eigene Objekte -> PaintBox

  Alt 21. Aug 2005, 11:41
Besteht noch ein Zugriff auf die Zeichenfläche (Canvas) von einer anderen Routine ?

Verwende Delphi-Referenz durchsuchenTCanvas.Lock und Delphi-Referenz durchsuchenTCanvas.Unlock vor bzw. nach dem Zeichnen.
Matti
Meine Software-Projekte - Homepage - Grüße vom Rüsselmops -Mops Mopser
  Mit Zitat antworten Zitat
mimi

Registriert seit: 1. Dez 2002
Ort: Oldenburg(Oldenburg)
2.008 Beiträge
 
FreePascal / Lazarus
 
#7

Re: Eigene Objekte -> PaintBox

  Alt 21. Aug 2005, 13:51
nein ! es besteht kein zugrief von einer andren zeichen funktion auser von setPixel !
du meisnt ich sollte vor dem aufruf von setpixel lock und danach wieder unlock machen ?
Michael Springwald
MFG
Michael Springwald,
Bitte nur Deutsche Links angeben Danke (benutzte überwiegend Lazarus)
  Mit Zitat antworten Zitat
mimi

Registriert seit: 1. Dez 2002
Ort: Oldenburg(Oldenburg)
2.008 Beiträge
 
FreePascal / Lazarus
 
#8

Re: Eigene Objekte -> PaintBox

  Alt 27. Aug 2005, 19:14
ich habs in der lezten woche versucht und wier nicht hinbekommen der code sieht jetzt so aus:
Delphi-Quellcode:

procedure FillPixel(sx,sy,zx,zy:Integer; PaintBox:TPaintBox);
var
  x,y:Integer;
begin

 { for x:=sx to zx do begin
    for y:=sy to zy do begin
      PaintBox.Canvas.Pixels[x,y]:=clBlack;
    end;
  end;}


  x:=sx; y:=sy;
  while (x <= zx) or (y <= zy) do begin
    inc(x);
    inc(y);

    PaintBox.Canvas.Pixels[x,y]:=clBlack;
  end;
// ShowMessage('OK');
end;

rocedure TForm1.ObenObj(F:TFileName);
var
  i,x1,y1,x2,y2,fx,fy,m:Integer;
  l:TStringList;
begin
  ox:=-1; oy:=-1; m:=0;

  if FileExists(f) = True then begin
    l:=TStringList.Create;
    l.LoadFromFile(f);
    fx:=2; fy:=2;

    for i:=0 to l.Count-1 do begin
      x1:=StrToInt(GetToken(l.Strings[i],':',1));
      y1:=StrToInt(GetToken(l.Strings[i],':',2));
      SetPixel(x1,y1,paintbox2);

      SetPixel(x1*fx,y1*fy,paintbox2);

      if i+1 <= l.Count-1 then m:=+1 else m:=0;

      if m = +1 then begin
        x2:=StrToInt(GetToken(l.Strings[i+m],':',1));
        y2:=StrToInt(GetToken(l.Strings[i+m],':',2));
        SetPixel(x2*fx,y2*fy,paintbox2);
        FillPixel(x1*fx,y1*fy,x2*fx,y2*fy,PaintBox3);
      end;
    end; // for

  end // If
  else
    ShowMessage('Dateinamen gibt es nicht !');
end;
der code sollte folgendes machen:
Wenn ich die pixle vergrößer ändert sich auch die Pos von den pixel, richtig ?
also der abstant wird größer und fillpixel sollt die lücken füllen. aber genau das passiert nicht er zeichnet ein komische 3D gebilde siehe anhang.

das schwarzte objekt ist das orgnial objekt(verkleinert da gestellt) das ganz rechte ist das neue objekte so sollte es aber nicht aussehen.
Miniaturansicht angehängter Grafiken
bild_151.jpg  
Michael Springwald
MFG
Michael Springwald,
Bitte nur Deutsche Links angeben Danke (benutzte überwiegend Lazarus)
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#9

Re: Eigene Objekte -> PaintBox

  Alt 27. Aug 2005, 19:39
Du musst für jedes Pixel auf der Paintbox aus den Daten der Stringlist errechnen, ob es gefärbt werden soll, oder du zeichnest für jeden Eintrag der Stringlist ein Rechteck:
Delphi-Quellcode:
//SetPixel(x1*fx,y1*fy,paintbox2);
FillPixel(x1 * fx, y1 * fy, (x1 + 1) * fx, (y1 + 1) * fx, Paintbox2);
Aber warum speicherst du die Pixel in einer Textdatei ? Warum nicht gleich das Bitmap speichern, oder noch besser (wenn ich mir deinen Screenshot mit deinen Funktionen ansehe): vektorbasiert?
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
mimi

Registriert seit: 1. Dez 2002
Ort: Oldenburg(Oldenburg)
2.008 Beiträge
 
FreePascal / Lazarus
 
#10

Re: Eigene Objekte -> PaintBox

  Alt 27. Aug 2005, 19:50
es sind leider immer noch lücken zwischen den pixeln.
der hauptgrund warum ich keine bmp's nehme ist der das ich es mir so schön zurecht gedachte hatte das
und texttateien sind schön klein und können problemlos kompiermiert werden *G*
ist eigentlich kein problem dastellen sollte, aber leider gibt es unerwartet probleme.

vektorbasiert:
wo ist da der genaue unterschied zu pixelbasieren ?
Michael Springwald
MFG
Michael Springwald,
Bitte nur Deutsche Links angeben Danke (benutzte überwiegend Lazarus)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:53 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