Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi kein ZEichnen auf vergrößerten Image (https://www.delphipraxis.net/115710-kein-zeichnen-auf-vergroesserten-image.html)

punker-lili 16. Jun 2008 20:08


kein ZEichnen auf vergrößerten Image
 
Hi Leute!

Mein Programm liest Notenwerte aus einer Datei aus und zeichnet diese. Leider weiß ich nicht wie viele Wert darin stehen, das es schnell zum Fall kommen kann, das das Image voll ist. Daher wollte ichs dynamisch nach jeden Durchlauf eine neue Breit geben, leider funktioniert das nicht. Es wird nur soviel angezeigt, wie am Anfang die Maße bestimmt wurden. Woran kann das liegen?

MfG Anna

mkinzler 16. Jun 2008 20:10

Re: kein ZEichnen auf vergrößerten Image
 
Verwende doch ein 2-Pass-Verfahren. Erst Einlesen um das Maximum zu ermitteln, damm geht es einfacher

punker-lili 16. Jun 2008 20:11

Re: kein ZEichnen auf vergrößerten Image
 
Danke! ich versuchs mal...

punker-lili 16. Jun 2008 20:12

Re: kein ZEichnen auf vergrößerten Image
 
Darf ich aber wenigstens erfahren, warum das mit dem iamge nicht so einfach funktioniert?

mkinzler 16. Jun 2008 20:15

Re: kein ZEichnen auf vergrößerten Image
 
Ich hab dich falsch verstanden. Wie versuchst du das Image zu vergrößern? Warum kein 2., 3. ... Zeile?

punker-lili 16. Jun 2008 20:21

Re: kein ZEichnen auf vergrößerten Image
 
ich wollte es einfach mit image1.height oder image1.weidth vergrößern... aber das klappt nicht. Das image nimmt zwar den Platz ein, aber es wird nicht als LEinwand benutzt.
Naja ich gehe auch in die nächste Zeile, aber dort weiß ich auch nicht wie weit es geht. Daher muss ich irgendwie das Image vergrößern können... aber wie?

mkinzler 16. Jun 2008 20:30

Re: kein ZEichnen auf vergrößerten Image
 
Solle aber gehen, wo vergrößerst du?

punker-lili 16. Jun 2008 20:32

Re: kein ZEichnen auf vergrößerten Image
 
Ich stecke jeden Wert in meiner Datei in einen Array, diese lass ich dann nach einander durchs Programm laufen. Dort werden dann als erstes die Koordinaten des Kreises für den Noten berechnt. Wenn ich diese hab, weiße ich den x - WErt dem Image zu, da es ja mindestens so Breit sein muss.

mkinzler 16. Jun 2008 20:34

Re: kein ZEichnen auf vergrößerten Image
 
In welcher Methode?

extrem 16. Jun 2008 21:11

Re: kein ZEichnen auf vergrößerten Image
 
Zitat:

Zitat von punker-lili
ich wollte es einfach mit image1.height oder image1.weidth vergrößern... aber das klappt nicht. Das image nimmt zwar den Platz ein, aber es wird nicht als LEinwand benutzt.

Hi

Hast du schon mal versuch die Größe von Graphic zu ändern, ich meine etwa so:
Delphi-Quellcode:
  Image1.Canvas;//damit Graphic <> nil
  if assigned(Image1.Picture.Graphic) then
  begin
    image1.Width := ...;
    image1.Height := ...;
    Image1.Picture.Graphic.Width := image1.Width;
    Image1.Picture.Graphic.Height := image1.Height;
  end;

Namenloser 16. Jun 2008 21:26

Re: kein ZEichnen auf vergrößerten Image
 
Ich würde dir in diesem Fall zu einer Paintbox raten.

Medium 16. Jun 2008 23:23

Re: kein ZEichnen auf vergrößerten Image
 
Und ich zu einem TBitmap, dass, nachdem etwas daran geändert wurde, einer Bitmap-Property eines TImage assigned wird, bei dem AutoSize auf true gesetzt ist, welches sich in einer Scrollbox befindet.

punker-lili 21. Jun 2008 09:13

Re: kein ZEichnen auf vergrößerten Image
 
Hi Leute!
Sry das meineAntwort solange gesdauert hat, hatte aber erst jetzt Zeit eure Tips zutesten. Also:
@ extrem: ich habs ausprobiert, es ändert nichts an dem Zustand. Ich habe bloß heruasgefunden, das dass Feld sich verkleinern lässt, also es funktioniert mit allen Werten, die kleiner als die voreingestellten sind.

Ich habs probiert auf nem anderen Ding zu zeichen, aber dann funktioniert mein ganzes Programm nicht mehr. Daher würde ich gern ne Lösung fürs image haben...
Also habt ihr noch ne Idee worans liegen kann?

MfG Anna

turboPASCAL 21. Jun 2008 09:56

Re: kein ZEichnen auf vergrößerten Image
 
Wie schon beschrieben, verwende bitte ein Bitmap. Ein Image ist nur ein
Graficcontainer und nicht als Zeichenfläche geeignet.

Erstelle dir ein Bitmap in deinem Prg. und zeichne darau was du möchtest.
Wenn es vergrössert/verkleinert werden muss kannst du dies über die
Bitmap .Width/.Height -Eigenschaften erledigen. Danach musst du alles neu
Zeichnen.

Wenn dies alles erledigt ist kannst du das Bitmap direkt über Canvas.Draw()
oder über ein Image auf deinem Formular anzeigen.

extrem 21. Jun 2008 12:16

Re: kein ZEichnen auf vergrößerten Image
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von punker-lili
Hi Leute!
Sry das meineAntwort solange gesdauert hat, hatte aber erst jetzt Zeit eure Tips zutesten. Also:
@ extrem: ich habs ausprobiert, es ändert nichts an dem Zustand. Ich habe bloß heruasgefunden, das dass Feld sich verkleinern lässt, also es funktioniert mit allen Werten, die kleiner als die voreingestellten sind.

Hi

Wenn ich auch die Breite und Höhe von Graphic vergrößert habe dann hat sich auch die Leinwand mit vergrößert. Habe es gerade noch mal anhand einer Demo ausprobiert:

_frank_ 21. Jun 2008 13:21

Re: kein ZEichnen auf vergrößerten Image
 
Zitat:

Zitat von turboPASCAL
Erstelle dir ein Bitmap in deinem Prg. und zeichne darau was du möchtest.
Wenn es vergrössert/verkleinert werden muss kannst du dies über die
Bitmap .Width/.Height -Eigenschaften erledigen. Danach musst du alles neu
Zeichnen.

siehe Hier im Forum suchenStretchBlt
Zitat:

Zitat von turboPASCAL
Wenn dies alles erledigt ist kannst du das Bitmap direkt über Canvas.Draw()
oder über ein Image auf deinem Formular anzeigen.

lieber Hier im Forum suchenBitBlt im OnPaint, ist schneller.

die ganze Geschichte kannst du auch in ein TCustomControl packen, wo du im (überschriebenen) SetBounds das Bitmap-Resize und das StretchBlt machst (in separates Bitmap z.b. fBgBitmap, damit nicht bei jeder änderung resized werden muss). dann machst ne draw-Routine, wo der Hintergrund auf das eigentlich Offscreen-Bitmap (fBitmap) kopiert wird, deine eigenen Malroutinen aufgerufen werden und zum schluss Invalidate aufgerufen wird. jetzt must du nur noch in der (überschriebenen) Paint-Routine per BitBlt auf das canvas der Komponente kopieren.

so ist die Grundlage für meine selbstgemalten Controls (z.b. http://circuitboard.sf.net )

HTH Frank

punker-lili 22. Jun 2008 12:21

Re: kein ZEichnen auf vergrößerten Image
 
Danke Leute.. ich hoffe es klappt.

punker-lili 23. Jun 2008 20:03

Re: kein ZEichnen auf vergrößerten Image
 
Liste der Anhänge anzeigen (Anzahl: 1)
Also die Idee mit dem TBitmap ist gut... aber so richtig nichts für mich^^
ich hab das mal von extrem ausrobiert und es entstand folgenser Quelltext:
Delphi-Quellcode:
procedure image_groesse(image:bild;hoehe,breite:integer);
var diff_x, diff_y: integer;
begin
//bestimmung_image_groesse(sd_hoehe,hoehe,breite,image);
 if assigned(image.picture.Graphic) then
 begin
 diff_x := breite - image.width;
 diff_y := hoehe - image.Height;

 if diff_x > 0 then begin
  image.width :=image.width + diff_x;
  image.picture.graphic.width:=image.Width;
 end
 else
  diff_x := 0;

 if diff_y > 0 then begin
  image.height := image.Height + diff_y;
  image.picture.graphic.height:=image.Height;
 end
 else
  diff_y := 0;

 image.canvas.Brush.Color := clred;
 image.Canvas.FillRect(rect(image.width - diff_x, image.Height - diff_y,
                            image.Width, image.height));
end;
end;
Leider passiert das, ab dem Punkt, wo das Image vergrößert werden müsste (s. Anhang).. Woran liegt das?

_frank_ 23. Jun 2008 20:58

Re: kein ZEichnen auf vergrößerten Image
 
Liste der Anhänge anzeigen (Anzahl: 1)
ich frage mich grade, warum du erst die differenz ausrechnest und dann diese zu der aktuellen größe hinzuaddierst...
warum nicht einfach

Delphi-Quellcode:
if image.width<>breite then
  image.width:=breite;
if image.height<>hoehe then
  image.height:=hoehe;
image.graphic wird imho mit vergrößert, muss also nicht extra gemacht werden.

ich hab mal ne einfachere Version mit angehängt...was das Prinzip mal verdeutlicht und in bitBlt/stretchBlt einweist.

deine zeichenroutinen für die Noten musst du dann natürlich ins redraw reinhauen, bei Größenänderung LoadBGImage aufrufen, bei Notenänderung/erweiterung nur redraw.

wobei ich mich grade frage, warum du ein Hintergrundbild brauchst (wegen den linien?), was du relativ rechenintensiv strecken müsstest. die könntest auch malen ;)

so in etwa:

Delphi-Quellcode:
for i:=1 to 5 do
begin
  canvas.moveTo(0,i*10);
  Canvas.LineTo(width,i*10);
end;
nicht viel Arbeit, oder?

//Edit
gut, man könnte das jetzt noch aufbohren und gleich mehrzeilig machen ;) (wollte das jetzt einfach mal ausprobieren).

Delphi-Quellcode:
var i,j,y:integer;
const Ytop=20; //Abstand von oben
      YDiff=30; //abstand der zeilen
      LCount=5; //5 linien pro zeile
      LSpace=10; //Abstand der Linien in einer Zeile
      RowCount=5; //5 zeilen
begin
  for j:=0 to rowCount-1 do
  begin
    for i:=0 to LCount-1 do
    begin
      y:=Ytop+(j*YDiff)+(j*LCount*LSpace)+i*LSpace;
      canvas.moveTo(0,y);
      Canvas.LineTo(width,y);
    end;
  end;
end;
@extrem: klar, stimmt ja
aber ich kam noch nie auf die idee, das TGraphic-Objekt einer TImage-Kompo zu verändern ;) war irgendwie gedanklich beim canvas, was "mitwächst".

Gruß Frank

extrem 23. Jun 2008 21:08

Re: kein ZEichnen auf vergrößerten Image
 
Zitat:

Zitat von _frank_
image.graphic wird imho mit vergrößert, muss also nicht extra gemacht werden.

Da irrst du dich, die Zeichenfläche muss man selber vergrößern:Vergrößern von TImage bzw. Bitmap

@punker-lili Wie zeichnest du denn deine Noten, ist das ein Bild oder zeichnest du mit Hilfe von Image.canvas...? Wenn gar nicht anders, dann kannst du ja ein Mini- Projekt hier mal anhängen oder per PM schicken.

punker-lili 24. Jun 2008 12:09

Re: kein ZEichnen auf vergrößerten Image
 
also diesen Hintergrundhabe ich gemalt, damit dieser schwarze weggeht, den schwarze Noten auf schwarzen Hintergrund sieht man nicht daher wollte ich ihn weiß machen, damit ich darauf zeichnen kann Aber leider funktioniert das so nicht.
@extrem: die Noten zeichne ich via image.canvas direkt über line und move to.
für mich stellt sich erstmal die frage, warm das erweiterte image schwarz ist. dann ist noch etwas komisch, erst hat ales funktioniert dann habe ich ne procedure geschreiben die der dargestellten procedure die werte fürs image üergibt. ab da an hat es icht mehr größer gemacht. als ichs dann wider rausgemacht habe, wurde das erweiterte image wieder schwarz. :gruebel:
MfG Anna

extrem 24. Jun 2008 17:15

Re: kein ZEichnen auf vergrößerten Image
 
Zitat:

Zitat von punker-lili
für mich stellt sich erstmal die frage, warm das erweiterte image schwarz ist.

Das kann dadurch kommen, wenn vorher irgendwo im Code
Delphi-Quellcode:
image.canvas.Brush.Color := clBlack;
steht, dann wird das Bild mit dieser Farbe vergrößert. Da deine Noten auch schwarz sind, würde mich das nicht wundern. Du kannst ja zum Testen vor Aufruf der Funktion image_groesse image.canvas.Brush.Color auf eine andere Farbe setzen.

Außerdem ist wohl deine Prozedur image_groesse irgendwie fehlerhaft. Wenn du das Bild nur verbreiterst, dann wird nur unterhalb des Images gezeichnet(ist also nicht sichtbar). Ändere mal zum Test die letzten Zeilen in der Prozedur so ab so ab
Delphi-Quellcode:
...
  image.canvas.Brush.Color := clred;
  image.Canvas.FillRect(rect(image.width - diff_x, 0,//image.Height - diff_y,
                            image.width, image.height));
...
und rufe sie so auf
Delphi-Quellcode:
image_groesse(image, image.Height, image.Width+ 50);
also das Bild nur verbreitern.


Zitat:

Zitat von punker-lili
Delphi-Quellcode:
procedure image_groesse(image:bild;hoehe,breite:integer);

Noch eine Frage ist bild bei dir = TImage?


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:33 Uhr.

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