![]() |
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 |
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.
|
Re: Repaint, Invalidate oder doch etwas anderes
TImage dahinter wäre dann einfacher.
Gruß hagen |
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 |
Re: Repaint, Invalidate oder doch etwas anderes
Du überschreibst Repaint nimm Repaint und es klappt (getestet)!
|
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:
Grüße vom marabu
procedure TForm1.FormResize(Sender: TObject);
begin TP.RePaint; end; |
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:
dann noch folgende Anpassungen:
protected
... procedure Paint;override; ...
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:
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.
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; Gruß, Chris |
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 |
Re: Repaint, Invalidate oder doch etwas anderes
Hallo Alter Mann,
Zitat:
Delphi-Quellcode:
aus der Methode DrawItems?
//for I := ControlCount -1 downto 0 do RemoveControl(Controls[I]);
Bei mir ging das alles. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:35 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