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 TCategoryPanel Anzeige-Bug? (https://www.delphipraxis.net/211785-tcategorypanel-anzeige-bug.html)

Alex_ITA01 2. Nov 2022 13:08

TCategoryPanel Anzeige-Bug?
 
Liste der Anhänge anzeigen (Anzahl: 4)
Hallo zusammen,
ich habe eine TCategoryPanelGroup mit 3 TCategoryPanel darauf.
In jedem TCategoryPanel sind testweise ein Memo, 2 Panels und ein Button.
Das dritte TCategoryPanel ist ausgeklappt.
Wenn ich die Anwendung starte, sieht alles normal aus.
Wenn ich danach allerdings auf das zweite TCategoryPanel klicke, wird das dritte TCategoryPanel natürlich nach unten verschoben aber mein Button ist halb abgeschnitten. Klicke ich nochmal auf das zweite TCategoryPanel, wird dieses eingeklappt und das dritte TCategoryPanel sollte so aussehen wie nach Anwendungsstart. Tut es aber nicht.
Habe schon mit Repaint versucht irgendwas zu machen aber keine Besserung.
Habt ihr eine Idee dazu?

Alex_ITA01 4. Nov 2022 05:57

AW: TCategoryPanel Anzeige-Bug?
 
*push* Irgendjemand eine Idee oder benutzt ihr diese Komponente nicht? Wenn nicht, welche nutzt ihr dann um sowas darzustellen?

LoZe 4. Nov 2022 07:14

AW: TCategoryPanel Anzeige-Bug?
 
Hallo, ich benutze die Komponente nicht aber kannst du vielleicht ein redraw Triggern?
ich muss dass bei meinen TStringgrids auch immer wieder mal machen wenn sich das Fenster ändert (onResize, onScroll z.b.)

Gausi 4. Nov 2022 07:22

AW: TCategoryPanel Anzeige-Bug?
 
Ich benutze die Komponente, und habe gelegentlich ähnliche Probleme. Edit-Felder werden z.B. auch nicht zuverlässig aktualisiert. Hinzu kommen so Späße, dass eine deaktivierte Komponente auf einem CategoryPanel auch in der IDE deaktiviert (d.h. nicht mehr anklickbar) ist.

Eine direkte Lösung habe ich nicht. Eine Verbesserung tritt bei mir ein, wenn ich im OnCollapse und OnExpand die enthaltenen Elemente neu zeichne (Repaint). Evtl. ist das aber zu früh. Triggern des Repaint per PostMessage könnte funktionieren, oder halt Quick&Dirty über einen Timer, der im OnExpand/OnCollapse gestartet wird.

Michael II 5. Nov 2022 16:25

AW: TCategoryPanel Anzeige-Bug?
 
Ich verwende das Ding nicht (wusste nicht mal, dass es sowas gibt), kann aber das Verhalten (dein Projekt) bestätigen.

Wenn ich einen Haltepunkt bei procedure TCustomCategoryPanelGroup.WMPaint() setze, dann sehe ich, dass der Button zu früh gesetzt wird (die eine Hälfte) - und später wird dann die andere Hälfte gemalt (jene, welche du nach Abschluss der Malarbeiten siehst).

Das scheint nicht sauber programmiert zu sein.

Michael II 5. Nov 2022 17:38

AW: TCategoryPanel Anzeige-Bug?
 
Du solltest dieses Problem melden.

Als Workaround schlage ich dir vor, die Kinder selber neu zu malen.

Zum Beispiel so:

Delphi-Quellcode:
procedure RepaintChildren(Parent: TWinControl);
var
  i: Integer;
  Child: TControl;
begin
  for i := 0 to Parent.ControlCount-1 do
  begin
    Child := Parent.Controls[i];
    if Child is TWinControl then
    begin
      Child.Repaint;
      RepaintChildren(TWinControl(Child));
    end;
  end;
end;

Aufruf:
Auf die Ereignisse OnCollapse und OnExpand von cpSprache reagierst du mit NeuMalen aller Kinder und Kindeskinder von CategoryPanelGroup1. (CategoryPanelGroup1.Repaint oder Panel2.Repaint funktionieren nicht, da du damit wieder in den programmierten Mist reingerätst.)

Delphi-Quellcode:
procedure TForm3.cpSprache2Expand(Sender: TObject);
begin
   RepaintChildren(CategoryPanelGroup1);
end;

Michael II 6. Nov 2022 22:44

AW: TCategoryPanel Anzeige-Bug?
 
Ich hab's nochmals angeschaut. Leider sehe ich immer noch nicht, wieso hier beim Malen eine falsche Updateregion verwendet wird.

Du könntest das Problem wahrscheinlich lösen, indem du eine Kopie von Vcl.ExtCtrls in deinen Projektordner kopierst und in
procedure TCustomCategoryPanel.Expand;
procedure TCustomCategoryPanel.Collapse;
jeweils vor der Zeile if assigned die Zeile
RepaintChildren(FPanelGroup); einfügst.
Anstatt Repaint; (in RepaintChildren) könntest du Invalidate; aufrufen.

Nach dieser Änderung musst du im eigenen Code keine Anpassungen vornehmen.
Hoffentlich klappt's.

himitsu 6. Nov 2022 23:50

AW: TCategoryPanel Anzeige-Bug?
 
Eigentlich hätte ich gefragt, wieso jeder denkt das kopieren ganzer Units ist die Lösung.

Nja, diese Komponente ist ja ein Designfail nach dem Anderen
* warum sind Collapse und und Expand nicht virtual?
* und/oder warum ist der Aufruf von FOnExpand und FOnCollapsed nicht in einer virtuellen Methode gekapselt?

Das csDesigning wird nicht an TCategoryPanelSurface weitergegeben.
Enthaltene Komponenten haben nicht das Panel als Parent, sondern den PanelSurface und daher denken sie, sie wären auch nicht im DesignModus.

......

Alex_ITA01 7. Nov 2022 06:07

AW: TCategoryPanel Anzeige-Bug?
 
Ok, die Komponente ist anscheinend nicht ausgereift und wird auch nicht weiter bearbeitet von Seiten Idera/Embarcadero/Borland...
Gemeldete Bugs bringen ja leider nur etwas, wenn sie auch gevotet werden und da die Komponente nicht großartig benutzt wird (sonst hätten andere ja auch die Probleme), mache ich mir die Arbeit nicht (sorry, das Voting System um Fehler zu beheben find ich Banane, aber ist nur meine Meinung und dient keiner weiteren Diskussion).

Geholfen habe ich mir jetzt einfach so, dass ich im OnExpand und OnCollapsed die Width von der CategoryPanelGroup einmal um 1 erhöhe und dann wieder sofort reduziere. Das löst anscheinend die "richtigen" Zeichenfunktionen aus.

Danke aber für eure Anregungen bzw Bestätigungen des Fehlers


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