Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Rahmen wieder löschen (https://www.delphipraxis.net/91587-rahmen-wieder-loeschen.html)

Luckie 7. Mai 2007 13:01


Rahmen wieder löschen
 
Folgende Situation: Dargestellt werden zwei Images neben einander. Der Benutzer soll nun per KLick auswählen köbnnen, mit welche er arbeiten will. Damit man sieht, welches Image das aktuelle ist, soll ein Rahmen um das Image gezeichnet werden. Und dieser soll natürlich auch wieder verschwinden, wenn man das andere Image auswählt. Bisher sieht mein Code so aus:
Delphi-Quellcode:
procedure TfrmMain.PageClick(Sender: TObject);
begin
  FotoBook.CurrentPage := TImageEnVect(Sender);
  FotoBook.DrawBorder;
end;
CurrentPage ist die Seite, die gerade angeklickt wurde.

Delphi-Quellcode:
procedure TFotoBook.DrawBorder;
begin
  // erst Rahmen entfernen
  if Assigned(LeftPage) then
  begin
    with LeftPage do
    begin
      IEBitmap.Canvas.Pen.Width := 3;
      IEBitmap.Canvas.Pen.Mode := pmNotXor;
      IEBitmap.Canvas.Pen.Style := psSolid;
      IEBitmap.Canvas.Pen.Color := clBlue;
      IEBitmap.Canvas.Rectangle(0, 0, Width, Height);
    end;
  end;
  if Assigned(Rightpage) then
  begin
    with RightPage do
    begin
      IEBitmap.Canvas.Pen.Width := 3;
      IEBitmap.Canvas.pen.Mode := pmNotXor;
      IEBitmap.Canvas.Pen.Style := psSolid;
      IEBitmap.Canvas.Pen.Color := clBlue;
      IEBitmap.Canvas.Rectangle(0, 0, Width, Height);
    end;
  end;

  with CurrentPage do
  begin
    IEBitmap.Canvas.Pen.Width := 3;
    IEBitmap.Canvas.pen.Mode := pmCopy;
    IEBitmap.Canvas.Pen.Style := psSolid;
    IEBitmap.Canvas.Pen.Color := clBlue;
    IEBitmap.Canvas.Rectangle(0, 0, Width, Height);
    Update;
  end;
end;
Mit dem ersten Teil des Codes, dachte ich, würde ich den Rahmen wieder löschen, aber leider ist das nicht der Fall. Wenn ich auf die andere Seite Klicke, bleibt der Rahmen auf der vorherigen Seite erhalten und wenn ich dann wieder auf die vorherige Seite klicke, "zwinkert" der Rahmen nur mal kurz.
Wichtig: Ich kann den Rahmen nicht mit einer festgelegten Farbe überzeichnen, da der Rahmen eventuell auf einem Bild gezeichnet wird.

uwewo 7. Mai 2007 13:11

Re: Rahmen wieder löschen
 
Hi Luckie,

irgendwie ist mir nicht klar was Du willst?

Eine alternative zu deinem Code, oder nur zeigen wie Du es machst.

Na ja

Hier eine alternative

Delphi-Quellcode:
procedure TForm1.Image1Click(Sender: TObject);
begin
  Image1.Canvas.DrawFocusRect(Image1.ClientRect);
end;

Luckie 7. Mai 2007 13:14

Re: Rahmen wieder löschen
 
Den Rahmen zeichnen ist ja kein Problem. Nur wie bekomme ich ihn wieder weg? Das ist mein Problem.

sirius 7. Mai 2007 13:20

Re: Rahmen wieder löschen
 
Zitat:

Wichtig: Ich kann den Rahmen nicht mit einer festgelegten Farbe überzeichnen, da der Rahmen eventuell auf einem Bild gezeichnet wird.
Wer soll denn noch wissen, wenn du mit pmCopy einen Strich zeichnest, was da vorher drunter war :gruebel:

Tormentor32 7. Mai 2007 13:22

Re: Rahmen wieder löschen
 
Vielleicht solltest du die beiden Bilder intern als Bitmap speichern, und diese Bitmaps nicht verändern. Dann kannst du jederzeit wieder den Originalzustand herstellen.

Edit: wider <> wieder :wall:

Luckie 7. Mai 2007 13:28

Re: Rahmen wieder löschen
 
Ok, dann will ich wieder einen weißen Rahmen:
Delphi-Quellcode:
procedure TFotoBook.DrawBorder;
begin
  // erst Rahmen entfernen
  if Assigned(LeftPage) then
  begin
    with LeftPage do
    begin
      IEBitmap.Canvas.Pen.Width := 3;
      IEBitmap.Canvas.Pen.Style := psSolid;
      IEBitmap.Canvas.Pen.Color := clWhite;
      IEBitmap.Canvas.Rectangle(0, 0, Width, Height);
    end;
  end;
  if Assigned(Rightpage) then
  begin
    with RightPage do
    begin
      IEBitmap.Canvas.Pen.Width := 3;
      IEBitmap.Canvas.Pen.Style := psSolid;
      IEBitmap.Canvas.Pen.Color := clWhite;
      IEBitmap.Canvas.Rectangle(0, 0, Width, Height);
    end;
  end;

  with CurrentPage.IEBitmap do
  begin
    Canvas.Pen.Width := 3;
    Canvas.Pen.Style := psSolid;
    Canvas.Pen.Color := clBlue;
    Canvas.Rectangle(0, 0, CurrentPage.Width, CurrentPage.Height);
  end;
end;
Aber da habe ich den gleichen "Zwinker"-Effekt, wie oben beschrieben.

uwewo 7. Mai 2007 13:49

Re: Rahmen wieder löschen
 
Du könntest es doch mit DrawFocusRect machen, oder willst Du eine durchgehende farbige Linie?

Delphi-Quellcode:
procedure TForm1.Image1Click(Sender: TObject);
begin
 (Sender as TImage).Canvas.DrawFocusRect((Sender as TImage).ClientRect);
end;
Müsstest Dir nur merken welches den Focus hat und die die Funktion ein zweites mal aufrufen.

erstes Mal markiert
zweites Mal demarkiert

Hawkeye219 7. Mai 2007 13:59

Re: Rahmen wieder löschen
 
Hallo,

wäre es nicht noch einfacher, TShapes hinter die Bilder zu legen? Die Shapes sollten dabei etwas größer als die Bilder sein, ihre Sichtbarkeit könnte man etwa so steuern:

Delphi-Quellcode:
LeftShape.Visible := Assigned(LeftPage) and (CurrentPage = LeftPage);
RightShape.Visible := Assigned(RightPage) and (CurrentPage = RightPage);
Rahmenfarbe und -dicke lassen sich über die Eigenschaften von TShape.Pen beeinflussen.

Gruß Hawkeye

Luckie 7. Mai 2007 14:01

Re: Rahmen wieder löschen
 
Ich wollte einen durchgehenden Rahmen, da man ihn besser sieht. Aber wo ist mein Denkfehler in meinem Code? Warum "zwinkert" der Rahmen und verschwindet nicht, obwohl ich doch beide Seiten erst mit einem weißen Rahmen übermale bevor ich den Rahmen für die aktuelle Seite male?

@Hawkeye: Das wäre auch eine Möglichkeit, muss ich mal drüber nachdenken.

Ich hab's, es hat ein Repaint gefehlt. :wall:


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:26 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