![]() |
beim zweiten Aufruf der Procedure wird nichtmehr gezeichnet
Hi Leute!
Als o ich hab ne Procedure entworfen, welche Notenlinien zeichne. Beim ersten Aufruf auf nem Image funktioniert alles noch, aber beim zweitenmal zeichnet er nicht. Woran kann das liegen?
Delphi-Quellcode:
Ich erstelle das zweite Image zwar dynamisch, aber acuh wenn ich ein zweites statisch erstelle, zfunktiniert nichts..*grumel*
procedure notenlinie_zeichnen(shape:Timage;abstand:integer;canvas:Tcanvas);
var nl,x1,x2,y:integer; begin for nl:=1 to 5 do begin y:= shape.top + 6*abstand + (nl-1)*abstand; // 6 * Abstand = freier Abstand nach oben für Töne Oberhalb d. Notensystems -->shape1.top= oberer x,yWert von c'''' = 1 bei Schnittstellendatei x1:= shape.left; x2:=shape.left + shape.width; Canvas.Brush.Color:=clblack; Canvas.PolyLine([Point(x1,y),Point(x2,y)]); end; end; HDanke schon einmal im voraus! Anna |
Re: beim zweiten Aufruf der Procedure wird nichtmehr gezeich
Überleg Dir mal, auf wessen Canvas Du zeichnest.
|
Re: beim zweiten Aufruf der Procedure wird nichtmehr gezeich
Wie erzeugst du die Imgages? Wo rufst du die Methode auf?
|
Re: beim zweiten Aufruf der Procedure wird nichtmehr gezeich
@DeddyH: auf wessen Canvas?.. na ich sag ihm doch bei der Parameterübergabe, wie das Image heißt... Oder was muss ich da noch berücksichtigen? *komisch guck*
@mkinzle: Naja.. ich hab den Aufruf nicht als MEthode gespeichert, da ich 1. nur an einer Stelle brauche u. 2. nicht weiß wie das mache. :angel: Also erstell ich die neuen Images wie folgt:
Delphi-Quellcode:
Und die notenlinie_zeichnen Procedure rufe ich wie eine normale Procedure auf...
procedure TForm1.Button1Click(Sender: TObject);
var image_neu: Timage; begin image_neu:=Timage.Create(Self); with image_neu do begin Parent:=Form1; Left:=100; Top:=100; end; end; MfG Anna |
Re: beim zweiten Aufruf der Procedure wird nichtmehr gezeich
Und wo?
|
Re: beim zweiten Aufruf der Procedure wird nichtmehr gezeich
na im Hauptprogramm..unit1 beim Buttonclick..oder wie meisnt du das wo?
|
Re: beim zweiten Aufruf der Procedure wird nichtmehr gezeich
Versuch es mal mit
Delphi-Quellcode:
shape.Canvas.Brush.Color:=clblack;
shape.Canvas.PolyLine([Point(x1,y),Point(x2,y)]); |
Re: beim zweiten Aufruf der Procedure wird nichtmehr gezeich
Er möchte den Aufruf sehen. :zwinker:
|
Re: beim zweiten Aufruf der Procedure wird nichtmehr gezeich
Irgendwie hast du einen Instinkt dafür, das wichtige wegzulassen.
|
Re: beim zweiten Aufruf der Procedure wird nichtmehr gezeich
@mkinzler
*komisch guck*...
Delphi-Quellcode:
... sry... nur den aufruf finde ich nicht spektakulär... ich hab die werte eingesetzt...
with image_neu do
begin Parent:=ScrollBox1; Left:=image_alt.left; Top:=image_alt.Top+image_alt.Height+c_zwischen; width:=image_alt.Width; height:=image_alt.Height; end; image_alt:=image_neu; notenlinie_zeichnen(image_alt,c_abstand,canvas); with image2 do [b] notenlinie_zeichnen(image_alt,c_abstand,canvas)[/b] end; @DeddyH Das habe ich schon ausprobiert... zudem setzte ich im gesamtenprogramm, die Farbe nur auf Schwarz, aber nicht aud weiß... |
Re: beim zweiten Aufruf der Procedure wird nichtmehr gezeich
Auch wenn es mehr Schreibarbeit ist, mach das mal ohne with.
|
Re: beim zweiten Aufruf der Procedure wird nichtmehr gezeich
with image2 do notenlinie_zeichnen(image_alt,c_abstand,canvas) == notenlinie_zeichnen(image_alt,c_abstand,image2.canvas)
Da brauchste dich nicht wundern, warum auf den anderen Images nix gezeichnet wird. ;) |
Re: beim zweiten Aufruf der Procedure wird nichtmehr gezeich
ok.. dankö.. ich versuchs mal
|
Re: beim zweiten Aufruf der Procedure wird nichtmehr gezeich
ähn.. daran liegts nicht...
hat jemand ne andere idee? |
Re: beim zweiten Aufruf der Procedure wird nichtmehr gezeich
Für großartige Ideen kennen wir schlicht zu wenig Code. Falls die Unit überschaubar ist, poste sie mal komplett, ansonsten häng doch mal eine Zip des Projekts an.
|
Re: beim zweiten Aufruf der Procedure wird nichtmehr gezeich
Okay kann ich machen.. aber da sind noch ein paar weitere Fehler im Programm... als es ist noch nicht fertig...
Zum ausführen des Programms muss semi_a.txt auf C sein. Denn in der Datei sind die Daten drin, welche gezeichnet werden solln. Das Problem mit dem nicht zeichnen tritt auch bei der Procedure Zwischenstrich auf... |
Re: beim zweiten Aufruf der Procedure wird nichtmehr gezeich
Liste der Anhänge anzeigen (Anzahl: 1)
Okay kann ich machen.. aber da sind noch ein paar weitere Fehler im Programm... als es ist noch nicht fertig...
Zum ausführen des Programms muss semi_a.txt auf C sein. Denn in der Datei sind die Daten drin, welche gezeichnet werden solln. Das Problem mit dem nicht zeichnen tritt auch bei der Procedure Zwischenstrich auf... |
Re: beim zweiten Aufruf der Procedure wird nichtmehr gezeich
Direkt einen Fehler seh ich nicht. Aber bei der saumäßigen Code-Einrückung machst du es einem auch ziemlich schwer, da durchzublicken ... Sieht aus wie lieblos und unter hast hingeschmissen ...
Was ich komische finde ist, dass du am Anfang image1 auf image_alt zuweist und dann ständig "image_neu" erstellst, ohne das alte freizugeben und einfach über die Position des alten Image legst (Top, Left), dann weißt du image_neu wieder image_alt zu und überall arbeitest du nur mit image_alt, manchmal greifst du auch noch auf image1.left zu ... Ich glaube die Ursache für den Fehler ist bei deiner Logik und deren Umsetzung zu suchen, die sich irgendwo miteinander beissen. Achja, vielleicht hilft das ja weiter:
Delphi-Quellcode:
// Gewöhn dir OOP an!
procedure TMyClass.DrawSomething (Canvas: TCanvas); begin Canvas.MoveTo (10, 10); Canvas.LineTo (100, 10); // ... end; procedure TMyClass.ResetBitmap (Bitmap: TBitmap; Width, Height: Integer); begin Bitmap.Assign (nil); Bitmap.PixelFormat := pf24bit; Bitmap.Width := Width; Bitmap.Height := Height; end; procedure TMyClass.Draw (TargetImage: TImage); var TempBmp: TBitmap; begin TempBmp := TBitmap.Create; // Wir erstellen die Bitmap nur temporär in dieser Prozedur ... try ResetBitmap (Bitmap, 100, 100); // ... initialisieren DrawSomething (Bitmap.Canvas); // ... zeichnen TargetImage.Picture.Assign (nil); // ... altes Bild löschen TargetImage.Picture.Bitmap.Assign (TempBmp); // ... neues Bild zuweisen finally FreeAndNil (TempBmp); // ... reservierten Speicher wieder freigeben end; end; procedure TForm1.FormCreate (...); begin MyClass := TMyClass.Create; end; procedure TForm1.FormDestroy (...); begin FreeAndNil (MyClass); end; procedure TForm1.Button1Click (Sender: TObject); begin MyClass.Draw (Image1); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:53 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