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 Eigene Komponente "vergißt" OI-Einstellung (https://www.delphipraxis.net/83670-eigene-komponente-vergisst-oi-einstellung.html)

freejay 5. Jan 2007 16:04


Eigene Komponente "vergißt" OI-Einstellung
 
Hallo,

ich habe mir eine von TSTringGrid abgeleitete Komponente geschaffen, der ich nun noch die Möglichkeit geben wollte, im Objektinspektor die Spaltenüberschriften (ColumnHeader) eingeben zu können.

Das klappt auch alles. Die Daten werden auch im DFM-File gespeichert. Dummerweise werden die Spaltenüberschriften aber nicht wieder in das Formular geladen, wenn man das Projekt geschlossen hatte und wieder neu öffnet. Die Daten stehen zwar im OI, aber erst wenn man sie neu bestätigt, werden sie auch in das Grid geschrieben.

Was fehlt mir da noch oder was mache ich falsch?

Danke im Voraus!

Freejay

Hier der relevante Code:

Delphi-Quellcode:
  TMyStringGrid = class(TStringGrid)
  private
    FColumnHeader: TStrings;
    procedure SetColumnHeader(Value: TStrings);
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  published
    property ColumnHeader: TStrings read FColumnHeader write SetColumnHeader;
  end;

constructor TMyStringGrid.Create(AOwner: TComponent);
begin
    inherited create(AOwner);
    FColumnHeader := TStringList.Create;
end;

destructor TMyStringGrid.Destroy;
begin
    FColumnHeader.Free;
    inherited destroy;
end;

procedure TMyStringGrid.SetColumnHeader(Value: TStrings);
var
    iCol: integer;
begin
    FColumnHeader.Assign(Value);

    for iCol := 0 to ColCount - 1 do

        if iCol < FColumnHeader.Count then
            Cells[iCol,0] := FColumnHeader[iCol]
        else
            Cells[iCol,0] := '';
end;

mkinzler 5. Jan 2007 16:37

Re: Eigene Komponente "vergißt" OI-Einstellungen
 
Du hast die Properties auch nicht für die Persistenz konfiguriert (stored)

freejay 5. Jan 2007 16:43

Re: Eigene Komponente "vergißt" OI-Einstellung
 
Was bedeutet das oder was muss ich konkret anders machen (neue/erweiterte Komponenten sind nicht gerade mein "täglich Brot"...)?

Ghostwalker 5. Jan 2007 16:48

Re: Eigene Komponente "vergißt" OI-Einstellung
 
Also ich würde am Ende der Routine SetColumnHeader noch einen Aufruf der geerbten Methode update einfügen, so das die Komponente neu gezeichnet wird und die Spaltenüberschriften entsprechend gezeichnet werden können.

mkinzler 5. Jan 2007 16:50

Re: Eigene Komponente "vergißt" OI-Einstellung
 
Delphi-Quellcode:
property ColumnHeader: TStrings read FColumnHeader write SetColumnHeader stored True;

freejay 5. Jan 2007 16:57

Re: Eigene Komponente "vergißt" OI-Einstellung
 
Zitat:

Zitat von mkinzler
Delphi-Quellcode:
property ColumnHeader: TStrings read FColumnHeader write SetColumnHeader stored True;

Hilft leider nix. Die Daten wurden bereits vorher brav im dfm-File abgelegt. Nur geladen werden sie wohl nicht.

Nachtrag: Außerdem kann man "stored true" weglassen (ist der Default-Wert), wie ich gerade in der Hilfe entdeckt habe.

oki 5. Jan 2007 17:05

Re: Eigene Komponente "vergißt" OI-Einstellung
 
Hi,

wie bereits vorher von Ghostwalker gesagt. In der SetColumnHeader-Methode zum schluß ein Invalidate. Dann wird nach dem setzen der eigenschaft die Kompo neu gezeichnet und alles ist ok.

Stored stellt nur sicher, dass die Werte in der dfm abgelegt werden.

Gruß oki

freejay 5. Jan 2007 17:11

Re: Eigene Komponente "vergißt" OI-Einstellung
 
Ich habe das ausprobiert. Leider bringt ein Invalidate oder auch ein Repaint, und was es da alles noch so gibt, nichts.
Die Daten werden ja auch problemlos übernommen und angezeigt, wenn ich sie im OI bearbeitet und dann mit OK bestätigt habe.

oki 5. Jan 2007 17:15

Re: Eigene Komponente "vergißt" OI-Einstellung
 
Dann sind beim Laden der form und lesen der Titel die Columbs noch nicht da. Rufe nach dem Erstellen der Kompo explizit das Laden der titel auf.

So nach dem Motto, Titeltexte sind vor den Spalten da, also nach erstellung spalten kein Laden der schon vorhandenen titel. Sorry muß jetzt mal weg, deshalb so kurz.

gruß oki

freejay 6. Jan 2007 18:09

Re: Eigene Komponente "vergißt" OI-Einstellung
 
OK, werde ich am Montag probieren.

SirThornberry 6. Jan 2007 18:12

Re: Eigene Komponente "vergißt" OI-Einstellung
 
ich würde einfach zusätzlich noch das OnChange der Stringlist belegen. Denn man ist nicht gezwungen eine komplette Stringlist zu zuweisen sondern kann auch einfach über Stringlist.Strings etc. den Inhalt ändern und dann passiert bei deiner Komponente rein gar nix.

freejay 9. Jan 2007 13:00

Re: Eigene Komponente "vergißt" OI-Einstellung
 
Hallo Leute,

leider bin ich noch keinen Schritt weiter gekommen. Das von mir hinzugefügte Feld FColumnHeader ist während des Create-Ereignisses noch nicht gefüllt (die Daten aus dem dfm-File stehen noch nicht drin): Ist ja auch logisch, da wird das Feld ja auch erst erzeugt (siehe Code oben). Wenn das Programm, in dem ich diese Komponente verwende läuft, kann ich aber den Inhalt von ColumnHeader auslesen und er ist auch korrekt. Erkenntnis: Der Code meiner Zuweisungsroutine SetColumnHeader wird beim Programmstart nicht durchlaufen, das Feld FColumnHeader aber trotzdem gefüllt!

Die gut gemeinten Ratschläge an allen möglichen Stellen Repaint, Invalidate oder Ähnliches einzufügen, können also nichts bewirken, da die Zuweisungsroutine selbst offenbar nicht aufgerufen wird.

Müsste die nicht von der IDE bzw. der VCL aufgerufen werden, wenn die Daten aus dem OI in die Komponente übertragen werden?

:cry:

SirThornberry 9. Jan 2007 13:12

Re: Eigene Komponente "vergißt" OI-Einstellung
 
hast du das von mir geschriebene beachtet? Im Moment rufst du SetColumnHeader schließlich nur auf wenn direkt eine Stringliste zugewiesen wird aber nicht wenn die Stringliste einfach geändert wird.

Jens Schumann 9. Jan 2007 13:14

Re: Eigene Komponente "vergißt" OI-Einstellung
 
Hallo,
Du musst die Loaded Methode überschreiben. Die Direktive stored bewirkt lediglich, dass die property auch gespeichert wird
wenn sie den Defaultwert enthält.
Delphi-Quellcode:
TMyStringGrid = class(TStringGrid)
  private
    FColumnHeader: TStrings;
    procedure SetColumnHeader(Value: TStrings);
    procedure FillHeader;
  protected
    procedure Loaded; override;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  published
    property ColumnHeader: TStrings read FColumnHeader write SetColumnHeader;
  end;

constructor TMyStringGrid.Create(AOwner: TComponent);
begin
    inherited create(AOwner);
    FColumnHeader := TStringList.Create;
end;

destructor TMyStringGrid.Destroy;
begin
    FColumnHeader.Free;
    inherited destroy;
end;

procedure TMyStringGrid.SetColumnHeader(Value: TStrings);

begin
    FColumnHeader.Assign(Value);
    FillHeader;
end;

procedure TMyStringGrid.Loaded;
begin
  inherited Loaded;
  FillHeader;
end;

procedure TMyStringGrid.FillHeader;
var
    iCol: integer;
begin


    for iCol := 0 to ColCount - 1 do

        if iCol < FColumnHeader.Count then
            Cells[iCol,0] := FColumnHeader[iCol]
        else
            Cells[iCol,0] := '';
end;

freejay 9. Jan 2007 13:25

Re: Eigene Komponente "vergißt" OI-Einstellung
 
Yes! Vielen Dank für den Tip!

Das Überschreiben von "Loaded" lädt mir die Spaltenüberschriften jetzt beim Starten des Programms.

Aber leider werden die Spaltenüberschriften nach dem Neu-Laden des Projektes nach wie vor nicht angezeigt :cry:

NACHTRAG: Funktioniert jetzt doch "in allen Lebenslagen" (hatte vergessen mein Package zu aktualisieren...).

Vielen Dank noch mal!

Freejay


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