Panel oder Form neuzeichnen

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Reini
Beiträge: 2
Registriert: Mi 4. Jun 2014, 07:01

Panel oder Form neuzeichnen

Beitrag von Reini »

Hallo erst einmal,

Ich habe mich gerade neu angemeldet, da ich erst seid 7 Tagen lazarus verwende. Da ich schon ein älteres Semester bin, habe ich nur Erfahrung mit schon längst vergessenen Programmiersprachen ( Visual Basic, PHP,..). Leider habe ich noch keinerlei Erfahrung mit Lazarus oder Pascal.

Nun zu meinen Anfängerproblem.

Ich habe versucht auf eine Form ein Panel zu zeichnen. Darauf zeichne ich mit Canvas eine Linie. Über dieser Linie habe ich ein Label plaziert. nun möchte ich, wenn ich mit der Maus darauf komme, ein Panel aktivieren. Dies funktioniert alles. Beim Verlassen des Labels mit der Maus sollte das Panel wieder ausgeschaltet werden, uch das funktioniert. Jedoch wird mir jetzt die Linie (Canvas) gelöscht und nicht mehr angezeigt.

Nun habe ich ein bißchen gegoogelt und die Befehle Invalidate, Repaint, Update funktionieren bei mir nicht. Sie zeichnen zwar das Panel neu aber die Linie nicht.
Hier noch mein Code

Code: Alles auswählen

 
unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  ExtCtrls;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Button1: TButton;
    InfoPanelGleisLabelInfo: TLabel;
    Panel1: TPanel;
    InfoPanelGleis: TPanel;
    procedure Button1Click(Sender: TObject);
    procedure BezeichnungsLabelMouseMove(Sender: TObject; Shift: TShiftState;
      X, Y: Integer);
    procedure BezeichnungsLabelMouseLeave(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.Button1Click(Sender: TObject);
var
  BezeichnungsLabel: TLabel;
begin
   Panel1.Visible:=true;
 
     Panel1.Canvas.Pen.Color:=clred;   // Linie Rot
     Panel1.Canvas.Pen.Width:=5;      //Größe der Linie
     Panel1.Canvas.Line(5,5,200,100);
   Panel1.Canvas.Line(10,10,10,30);
   BezeichnungsLabel:= TLabel.Create(self);
   BezeichnungsLabel.name :='Name';
   BezeichnungsLabel.caption := 'Caption';
   BezeichnungsLabel.left := 12;
   BezeichnungsLabel.top:= 8;
   BezeichnungsLabel.AutoSize:=true;
   BezeichnungsLabel.Color := clWhite;
  BezeichnungsLabel.visible := true;
   Bezeichnungslabel.OnMouseMove:=@BezeichnungsLabelMouseMove;
   Bezeichnungslabel.OnMouseLeave:=@BezeichnungsLabelMouseLeave;
   BezeichnungsLabel.parent := Panel1;
end;
 
procedure TForm1.BezeichnungsLabelMouseMove(Sender: TObject;
  Shift: TShiftState; X, Y: Integer);
begin
  begin
       if Sender is TLabel then
             begin
             //InfoPanel Gleis
             InfoPanelGleisLabelInfo.Caption:='testlabel';
             InfoPanelGleis.Visible:=true;
             InfoPanelGleis.Left:= 12;
             InfoPanelGleis.Top:= 8;
 
             end;
 
 
 
            end;
end;
 
procedure TForm1.BezeichnungsLabelMouseLeave(Sender: TObject);
begin
  InfoPanelGleis.Visible:=false;
  form1.panel1.u
 
end;
 
end.
 
 

Benutzeravatar
theo
Beiträge: 11005
Registriert: Mo 11. Sep 2006, 19:01

Re: Panel oder Form neuzeichnen

Beitrag von theo »

Reini hat geschrieben: schon längst vergessenen Programmiersprachen ( Visual Basic, PHP,..).
:shock: Seit wann ist PHP "längst vergessen"? Habe ich was verpasst?

Zu deiner Frage: Das Formular hat keinen Grafikpuffer. Gezeichnet soll immer nur im "OnPaint" Ereignis werden.
Manche Betriebssysteme lassen gar nichts anderes zu.
OnPaint wird immer dann automatisch ausgelöst, wenn es nötig ist, d.h. wenn das Fenster z.B. durch ein Anderes verdeckt wurde, und nun wieder sichtbar ist.
Der Aufruf von "Invalidate" löst auch ein Neuzeichnen gezielt aus.

Siehe allg. auch http://wiki.freepascal.org/Developing_with_Graphics/de

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: Panel oder Form neuzeichnen

Beitrag von Christian »

PHP vergessen *träum*
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Reini
Beiträge: 2
Registriert: Mi 4. Jun 2014, 07:01

Re: Panel oder Form neuzeichnen

Beitrag von Reini »

Danke ersteinmal für die Antwort.

Das vergessen des PHP bezog sich nur auf mich. Natürlich ist PHP nicht vergessen. Während ich ab und zu noch in Visual Basic etwas programmiere, habe ich in PHP schon lange nichts mehr gemacht. :(

Zu Lazarus und der OnPaint Funktion.
Ich habe nur ein Ereignis in der Form gefunden. Ist das die richtige? Was muss ich dann in dieses Ereignis schreiben?
Kopiere ich

Code: Alles auswählen

 
Panel1.Canvas.Pen.Color:=clred;   // Linie Rot
     Panel1.Canvas.Pen.Width:=5;      //Größe der Linie
     Panel1.Canvas.Line(5,5,200,100);
BezeichnungsLabel:= TLabel.Create(self);
   BezeichnungsLabel.name :='Name';
   BezeichnungsLabel.caption := 'Caption';
   BezeichnungsLabel.left := 12;
   BezeichnungsLabel.top:= 8;
   BezeichnungsLabel.AutoSize:=true;
   BezeichnungsLabel.Color := clWhite;
  BezeichnungsLabel.visible := true;
   Bezeichnungslabel.OnMouseMove:=@BezeichnungsLabelMouseMove;
   Bezeichnungslabel.OnMouseLeave:=@BezeichnungsLabelMouseLeave;
   BezeichnungsLabel.parent := Form1
 
den Code in das OnPaint Ereignis flimmert der Bildschirm und ich bekomme bei dem Code

Code: Alles auswählen

 
BezeichnungsLabel:= TLabel.Create(self);
   BezeichnungsLabel.name :='Name';
   BezeichnungsLabel.caption := 'Caption'; 
eine Fehlermeldung. Weil ich ja ein doppeltes Label erstelle.

Ich habs nicht verstanden.

Benutzeravatar
theo
Beiträge: 11005
Registriert: Mo 11. Sep 2006, 19:01

Re: Panel oder Form neuzeichnen

Beitrag von theo »

Reini hat geschrieben:Was muss ich dann in dieses Ereignis schreiben?
Nur das, was immer wieder auf den Canvas zeichnen soll. Den Rest nat. nicht.

Code: Alles auswählen

 
procedure TForm1.FormPaint(Sender: TObject);
begin
 Canvas.Pen.Color:=clred;   // Linie Rot
 Canvas.Pen.Width:=5;      //Größe der Linie
 Canvas.Line(5,5,200,100);
end;
 
Ein Panel ist nicht zum draufzeichnen gedacht. Wenn du das brauchst, dann nimm eine TPaintBox und deren OnPaint Ereignis

Code: Alles auswählen

procedure TForm1.PaintBox1Paint(Sender: TObject);
begin
 PaintBox1.Canvas.Pen.Color:=clred;   // Linie Rot
 PaintBox1.Canvas.Pen.Width:=5;      //Größe der Linie
 PaintBox1.Canvas.Line(5,5,200,100);
end;   

Antworten