Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi beim zweiten Aufruf der Procedure wird nichtmehr gezeichnet (https://www.delphipraxis.net/113979-beim-zweiten-aufruf-der-procedure-wird-nichtmehr-gezeichnet.html)

punker-lili 17. Mai 2008 17:33


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:
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;
Ich erstelle das zweite Image zwar dynamisch, aber acuh wenn ich ein zweites statisch erstelle, zfunktiniert nichts..*grumel*

HDanke schon einmal im voraus!

Anna

DeddyH 17. Mai 2008 17:35

Re: beim zweiten Aufruf der Procedure wird nichtmehr gezeich
 
Überleg Dir mal, auf wessen Canvas Du zeichnest.

mkinzler 17. Mai 2008 17:35

Re: beim zweiten Aufruf der Procedure wird nichtmehr gezeich
 
Wie erzeugst du die Imgages? Wo rufst du die Methode auf?

punker-lili 17. Mai 2008 17:42

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:
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;
Und die notenlinie_zeichnen Procedure rufe ich wie eine normale Procedure auf...

MfG Anna

mkinzler 17. Mai 2008 17:46

Re: beim zweiten Aufruf der Procedure wird nichtmehr gezeich
 
Und wo?

punker-lili 17. Mai 2008 17:48

Re: beim zweiten Aufruf der Procedure wird nichtmehr gezeich
 
na im Hauptprogramm..unit1 beim Buttonclick..oder wie meisnt du das wo?

DeddyH 17. Mai 2008 17:50

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)]);

Die Muhkuh 17. Mai 2008 17:50

Re: beim zweiten Aufruf der Procedure wird nichtmehr gezeich
 
Er möchte den Aufruf sehen. :zwinker:

mkinzler 17. Mai 2008 17:51

Re: beim zweiten Aufruf der Procedure wird nichtmehr gezeich
 
Irgendwie hast du einen Instinkt dafür, das wichtige wegzulassen.

punker-lili 17. Mai 2008 17:58

Re: beim zweiten Aufruf der Procedure wird nichtmehr gezeich
 
@mkinzler
*komisch guck*...
Delphi-Quellcode:
      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;
... sry... nur den aufruf finde ich nicht spektakulär... ich hab die werte eingesetzt...

@DeddyH
Das habe ich schon ausprobiert... zudem setzte ich im gesamtenprogramm, die Farbe nur auf Schwarz, aber nicht aud weiß...

DeddyH 17. Mai 2008 18:05

Re: beim zweiten Aufruf der Procedure wird nichtmehr gezeich
 
Auch wenn es mehr Schreibarbeit ist, mach das mal ohne with.

Nuclear-Ping 17. Mai 2008 18:14

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. ;)

punker-lili 17. Mai 2008 18:30

Re: beim zweiten Aufruf der Procedure wird nichtmehr gezeich
 
ok.. dankö.. ich versuchs mal

punker-lili 18. Mai 2008 09:53

Re: beim zweiten Aufruf der Procedure wird nichtmehr gezeich
 
ähn.. daran liegts nicht...
hat jemand ne andere idee?

DeddyH 18. Mai 2008 09:55

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.

punker-lili 18. Mai 2008 10:01

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...

punker-lili 18. Mai 2008 10:14

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...

Nuclear-Ping 18. Mai 2008 10:27

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 06:28 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