Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Repaint, Invalidate oder doch etwas anderes (https://www.delphipraxis.net/66523-repaint-invalidate-oder-doch-etwas-anderes.html)

Alter Mann 30. Mär 2006 20:55


Repaint, Invalidate oder doch etwas anderes
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Gemeinde,

im Zuge einer Gedankenumsetzung bzgl. einer Componente bin ich auf ein 'kleines' Problem
gestoßen. Da die Beschreibung des selben mir zuviel Schreibarbeit ist, schaut euch den Anhang an :wink: .

Das Problem äußert sich wie folgt: Anwendung starten, ComboBoxen auf dem Panel ablegen und anschließend
die Form vergrößern; Das Grid und die Verbindungslinen sind weg :? .

Ich möchte, das die Verbindunglinen zwischen den ComboBoxen dauerhaft bestehen bleiben und damit auch
das gelbe Grid(was aber nicht notwendig ist).

Repaint und Invalidate helfen nicht? weiter, oder wie geht es?

Danke für die Hilfe(n) und die Mühe.

Mfg

Alter Mann

Luckie 30. Mär 2006 21:09

Re: Repaint, Invalidate oder doch etwas anderes
 
Du musst das Raster auf ein Offline Bitmap zeichnen und bei Bedarf (auch im OnPaint) auf das Panel kopieren.

negaH 30. Mär 2006 22:30

Re: Repaint, Invalidate oder doch etwas anderes
 
TImage dahinter wäre dann einfacher.

Gruß hagen

Alter Mann 31. Mär 2006 06:28

Re: Repaint, Invalidate oder doch etwas anderes
 
Hallo,

wie geschrieben, es geht in erster Linie um die Verbindungslinien, nicht um das Raster.

So wie es aussieht, wird nach einer Größenanderung ein neuzeichnen veranlasst. Ich
möchte nun wissen wo ich ansetzen muss, da Repaint und Invalidate augenscheinlich nicht die
richtigen Stellen sind.

OnPaint - schau ich nach.

besten Dank bisher.


Alter Mann

Kroko1999 31. Mär 2006 07:00

Re: Repaint, Invalidate oder doch etwas anderes
 
Du überschreibst Repaint nimm Repaint und es klappt (getestet)!

marabu 31. Mär 2006 07:13

Re: Repaint, Invalidate oder doch etwas anderes
 
Guten Morgen.

Die Methode Repaint ruft ja die überschriebene Methode auf. Ich sehe das Problem eher darin, dass der Code fehlt, der die Methode aktiviert.

Delphi-Quellcode:
procedure TForm1.FormResize(Sender: TObject);
begin
  TP.RePaint;
end;
Grüße vom marabu

ChrisE 31. Mär 2006 09:01

Re: Repaint, Invalidate oder doch etwas anderes
 
Hallo,

es klappt zwar mit dem direkten Repaint aufruf, doch ich finde man sollte es eher so machen:

in der deklaration der Klasse
Delphi-Quellcode:
protected
  ...
  procedure Paint;override;
  ...
dann noch folgende Anpassungen:
Delphi-Quellcode:
procedure  TComboBoxPanel.DragDrop(Source: TObject; X, Y: Integer);
begin
  if (Source is TCustomComboBox) then
  begin
    Canvas.Brush.Color := Color;
    Canvas.FillRect(ClientRect);
    if FItemHeight < (Source as TCustomComboBox).Height then FItemHeight := (Source as TCustomComboBox).Height;
    if FItemList.IndexOf(Source) = -1 then begin // noch nicht in der Liste
      FItemList.Add(Source);
      TCustomComboBox(Source).Parent := Self;
    end;
    Repaint;  
  end;
end;
Delphi-Quellcode:
procedure  TComboBoxPanel.DrawItems;
var
  I, J, NL, NT : Integer;
  LineRect : TRect;
begin
  //for I := ControlCount -1 downto 0 do RemoveControl(Controls[I]);
  J := 0;
  for I := 0 to FItemList.Count -1 do
  begin
    // Position TCustomComboBox
    NL := FOffset * (i+1) + i * TCustomComboBox(FItemList[i]).Width;
    NT := FOffset * (i+1) + i * TCustomComboBox(FItemList[i]).Height;

    // Draw TCustomComboBox
    with TCustomComboBox(FItemList.Items[I]) do
    begin
      //Parent := Self;
      Left  := NL;
      Top   := NT;
    end;
    // Draw Link-Lines
    if J = 0 then
    begin
      LineRect.Left  := (NL + TCustomComboBox(FItemList.Items[I]).Width) - (FOffset * 2);
      LineRect.Top   := (NT + TCustomComboBox(FItemList.Items[I]).Height) + 2;
      Inc(J);
    end
    else
    begin
      LineRect.Right := NL;
      LineRect.Bottom := NT + (TCustomComboBox(FItemList.Items[I]).Height div 2);
      DrawLine(LineRect);
      LineRect.Left  := (LineRect.Right + TCustomComboBox(FItemList.Items[I]).Width) - (FOffset * 2);
      LineRect.Top   := LineRect.Bottom + FOffset + 3;
    end;
  end;
end;
Delphi-Quellcode:
procedure TComboBoxPanel.Paint;
begin
  inherited;
EDIT:
//  if FAutoSize then Height := GetNewHeight;
//  Das gehört hier sicher nicht rein
EDIT ENDE
  if FShowGrid then DrawGrid;
  DrawItems;
end;

procedure  TComboBoxPanel.RePaint;
begin
  inherited Repaint;
  if FAutoSize then Height := GetNewHeight;
end;
Das ist zwar etwas komplizierter als die Lösung von marabu, aber wer denkt bei der nutzung einer Komponente schon daran diese Per Repaint neu zu zeichnen. Somit sollte sie sich - so finde ich zumindest - selber neu zeichnen.

Gruß, Chris

Alter Mann 31. Mär 2006 16:30

Re: Repaint, Invalidate oder doch etwas anderes
 
Hallo,

ich danke für die Anregungen und versuche das Beste daraus zu machen.

GrisE: Die Linien sind da, aber die ComboBoxen nicht :wink:


Gruß

Alter Mann

ChrisE 1. Apr 2006 16:22

Re: Repaint, Invalidate oder doch etwas anderes
 
Hallo Alter Mann,

Zitat:

Zitat von Alter Mann
GrisE: Die Linien sind da, aber die ComboBoxen nicht :wink:

Bei mir hat der Quelltext so getan. Hast du die Zeile aus auskommentiert mit den
Delphi-Quellcode:
//for I := ControlCount -1 downto 0 do RemoveControl(Controls[I]);
aus der Methode DrawItems?

Bei mir ging das alles.


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