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 Komponente will sich nicht neu zeichnen (https://www.delphipraxis.net/4862-komponente-will-sich-nicht-neu-zeichnen.html)

phlux 14. Mai 2003 20:04


Komponente will sich nicht neu zeichnen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi
Folgendes Problem, ich hab jetzt ne Kompo geschrieben, die durch die Property Items: TStrings verschiedene Buttons anzeigt. Wenn ich jetzt im OI die Items ändere werden die Korrekte anzahl von buttons angezeigt, sobald ich jetzt jedoch mit
Delphi-Quellcode:
TControlTab.Items.Add('Eintrag');
während der laufzeit einen neuen Button hinzufügen will, wird dieser erst angezeigt wenn ich die Form vergrößer. Jedoch sollte die Kompo beim resizen der form und beim hinzufügen neuer Items sich neuzeichnen :|

Ich poste mal den Code: (Biete ihn doch zum DL an)

Sorry, für die vielen kommentierten Programmzeilen, aba so läuft die kompo!!

APP 14. Mai 2003 20:18

Hallo,

vielleicht tut es ein Repaint bei SetItems,
leider habe ich jetzt keinen Code mehr vor augen, da Du gerade Dein posting umgestellt hast :bounce1:

phlux 14. Mai 2003 20:20

Hi APP!
Die Mods meinten ich sollte es umstellen :firejump:
Ich probiere es mal mit Repaint. ;)

Edit: nein funzt leider nicht :cry:

APP 14. Mai 2003 20:45

Hallo,

Delphi-Quellcode:
PROCEDURE TControlTabs.SetItems(CONST Value: TStrings);
BEGIN
   FItems.Assign(Value);
   SetLength(FButtons, FItems.Count);
   INHERITED Paint; // <-- JETZT FUNKTS LEIDER NICHT
   Invalidate;
END;
[EDIT] SORRY, zu Früh gefreut :( [/EDIT]

phlux 14. Mai 2003 20:50

hmm, hast du noch etwas verändert?? also bei klappts nämlich immer noch nicht.
edit: *lol* ich habs auch grad gemerkt! ;)

APP 14. Mai 2003 20:59

Sorry, mir fällt im Moment auch nix mehr ein (war ein langer Tag),
aber es dürft wohl nur eine Kleinigkeit sein, da z.B.
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  ControlTabs1.Items.Add('Test');
  ControlTabs1.Repaint;
end;
funktioniert.

phlux 14. Mai 2003 21:12

Ja das es mit Repaint als nachträglicher Aufruf funktioniert, hab ich auch herausgefunden. Ich seh auch wahrscheinlich den Wald vor lauter Bäumen nicht mehr (ich saß den ganzen Tag schon davor :lol:). Falls dir noch etwas einfällt, schreibs mir ;)

Motzi 15. Mai 2003 07:54

Probier mal statt "inherited Paint" nur "Paint"...

phlux 15. Mai 2003 09:13

Guten Morgen Motzi!
Ich habe es jetztn so geschrieben:
Delphi-Quellcode:
procedure TControlTabs.SetItems(const Value: TStrings);
begin
  FItems.Assign(Value);
  SetLength(FButtons, FItems.Count);
  Paint;
end;
Leider kommt da wieder nichts bei rum :(

APP 15. Mai 2003 09:33

Hallo, ich habe heut leider nicht viel Zeit aber folgendes ist mit noch aufgefallen:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  ControlTabs1.Items.Add('Test');
end;
ruft in der Unit Classes

Delphi-Quellcode:
function TStrings.Add(const S: string): Integer;
begin
  Result := GetCount;
  Insert(Result, S);
end;
auf und nicht Deine Paintmethode, daher kommt es auch zu keinem Neuzeichnen der Controls.

Die Methode SetItems wird nicht durchlaufen, das kannst Du ganz leicht überprüfen:

einbinden von:
Delphi-Quellcode:
uses Dialogs;

Delphi-Quellcode:
PROCEDURE TControlTabs.SetItems(CONST Value: TStrings);
BEGIN
  FItems.Assign(Value);
  SetLength(FButtons, FItems.Count);
  ShowMessage(Value.Text);  <---- Sollte angezeit werden, tut es aber nicht!
  invalidate;
END;

phlux 15. Mai 2003 09:37

Okay danke für den Hinweis :thumb: dem werd ich mal nachgehen!!

APP 15. Mai 2003 11:05

Hallo,
wieder mal ganz kurz:
Ich Denke Du müßtest in Deiner Komponente eigene TString Klasse ableiten und benutzen, dort die Methode TSring.Add "Overriden" (ist virtuell) und dort die TControlTabs.Paint Methode ausführen...

Jens Schumann 15. Mai 2003 11:53

Hallo,
du musst im private Abschnitt deiner Komponente einen EventHandler für das OnChange Event von TStringList schreiben.
z.B.

Delphi-Quellcode:
private
  ...
  procedure ItemsChange(Sender : TObject);
  ...
Deinen constructor musst dann wie folgt erweitern:
Delphi-Quellcode:
constructor TControlTabs.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  ControlStyle := [csCaptureMouse, csClickEvents, csOpaque, csReplicatable, csMenuEvents];
  Align := alTop;
  Height := 24;
  FButtonGap := 3;
  FButtonHeight := 20;
  FIndent := 3;
  FItems := TStringList.Create;

  FItems.OnChange:=ItemsChange;

  fButtonColor := clSkyBlue;
  SetLength(FButtons, 0);
  FBackgroundColor := clSilver;
end;
ItemsChange könnte dann so aussehen:
Delphi-Quellcode:
procedure TControlTabs.ItemsChange(Sender : TObject);
begin
  Paint; oder Invalidate; aufrufen
end;
Jetzt wird ItemsChange aufgerufen, wenn Du ControlTabs1.Items.Add('Test'); verwendest.

phlux 15. Mai 2003 11:53

Hi App!
Ich veroflge auch grade den gedanken die klasse TStrings abzuleiten und dann die Methode Add zu "overriden", jedoch weiß ich jetzt nicht wie ich dann auf die Methode Paint zurückgreifen soll (TStrings hat kein Owner oder Parent). Ich wollte mir jetzt damit behelfen dem constructor noch eine Komponente (in dem Falle ein TControlTabs) zu übergeben, damit ich auf die Methode Paint zurückgreifen kann. Oder gibt es eine andere Möglichkeit???

[edit]Oder ich versuchs nach der Methode von Jens, die scheint einfacher zu sein ;)[/edit]

phlux 15. Mai 2003 12:14

:hello: Danke euch beiden, es klappt :thumb:


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