![]() |
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 |
Re: kein ZEichnen auf vergrößerten Image
Verwende doch ein 2-Pass-Verfahren. Erst Einlesen um das Maximum zu ermitteln, damm geht es einfacher
|
Re: kein ZEichnen auf vergrößerten Image
Danke! ich versuchs mal...
|
Re: kein ZEichnen auf vergrößerten Image
Darf ich aber wenigstens erfahren, warum das mit dem iamge nicht so einfach funktioniert?
|
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?
|
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? |
Re: kein ZEichnen auf vergrößerten Image
Solle aber gehen, wo vergrößerst du?
|
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.
|
Re: kein ZEichnen auf vergrößerten Image
In welcher Methode?
|
Re: kein ZEichnen auf vergrößerten Image
Zitat:
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; |
Re: kein ZEichnen auf vergrößerten Image
Ich würde dir in diesem Fall zu einer Paintbox raten.
|
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.
|
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 |
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. |
Re: kein ZEichnen auf vergrößerten Image
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
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: |
Re: kein ZEichnen auf vergrößerten Image
Zitat:
![]() Zitat:
![]() 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. ![]() HTH Frank |
Re: kein ZEichnen auf vergrößerten Image
Danke Leute.. ich hoffe es klappt.
|
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:
Leider passiert das, ab dem Punkt, wo das Image vergrößert werden müsste (s. Anhang).. Woran liegt das?
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; |
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:
image.graphic wird imho mit vergrößert, muss also nicht extra gemacht werden.
if image.width<>breite then
image.width:=breite; if image.height<>hoehe then image.height:=hoehe; 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:
nicht viel Arbeit, oder?
for i:=1 to 5 do
begin canvas.moveTo(0,i*10); Canvas.LineTo(width,i*10); end; //Edit gut, man könnte das jetzt noch aufbohren und gleich mehrzeilig machen ;) (wollte das jetzt einfach mal ausprobieren).
Delphi-Quellcode:
@extrem: klar, stimmt ja
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; 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 |
Re: kein ZEichnen auf vergrößerten Image
Zitat:
![]() @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. |
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 |
Re: kein ZEichnen auf vergrößerten Image
Zitat:
Delphi-Quellcode:
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.
image.canvas.Brush.Color := clBlack;
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:
und rufe sie so auf
...
image.canvas.Brush.Color := clred; image.Canvas.FillRect(rect(image.width - diff_x, 0,//image.Height - diff_y, image.width, image.height)); ...
Delphi-Quellcode:
also das Bild nur verbreitern.
image_groesse(image, image.Height, image.Width+ 50);
Zitat:
|
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