Reihenfolge beim Property laden

Rund um die LCL und andere Komponenten
Antworten
Lorca
Beiträge: 196
Registriert: Di 3. Nov 2020, 12:25

Reihenfolge beim Property laden

Beitrag von Lorca »

Hi

Wie kann ich die Reihenfolge beim Laden von Property's beeinflussen?

Ich habe mir eine Komponente (LINK_TreeView) vom Typ TCOMPONENT gebaut.
Hier habe ich nun zwei Property's im Published Bereich :
- Property LNK_Treeview : TTreeView
READ mo_LNK_TreeView
WRITE SET_TreeView
- Property Root_Text : String
READ mv_RootText : String
WRITE SET_RootText;

Während der Design Phase ist alles OK.
Starte ich jedoch das Programm für einen Testlauf, wird jedoch immer erst die Methode: SET_RootText aufgerufen.
Innerhalb der Methode beende ich jedoch den Durchlauf, wenn TreeView nicht verlinkt ist, da ich sonst den
Root-Node auf einen NIL Pointer anlege, was natürlich zu einem Fehler führt.

Deshalb benötige ich zuerst den Aufruf der Methode: SET_TreeView welche das verlinken durchführt,
Ich habe bereits die Property's innerhalb des Published Bereiches vertauscht. Das hat aber nichts geholfen.
Gibt es da überhaupt eine Möglichkeit für den Entwickler, die Reihenfolge der Property Laderoutinen zu beeinflussen?

Kann jemand helfen?


Gruß
Lorca

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Reihenfolge beim Property laden

Beitrag von wp_xyz »

Wenn es auf die Reihenfolge beim Laden ankommt, dann führe während des Ladens, also wenn "csLoading in ComponentState" ist, gar keine Aktionen aus, sondern erledige alles in der Loaded-Methode, dann in der richtigen Reihenfolge.

Sieben
Beiträge: 202
Registriert: Mo 24. Aug 2020, 14:16
OS, Lazarus, FPC: Ubuntu Xenial 32, Lazarus 2.2.0, FPC 3.2.2
CPU-Target: i386

Re: Reihenfolge beim Property laden

Beitrag von Sieben »

Du kannst dir bei TShellTreeView abschauen, wie man vorgehen könnte. In der Methode SetRoot, die natürlich auch beim Laden der Properties aufgerufen wird, wird der in die *.lfm geschriebene Wert zunächst in FInitialRoot zwischengespeichert:

Code: Alles auswählen

procedure TCustomShellTreeView.SetRoot(const AValue: string);
var
  RootNode: TTreeNode;
begin
  if FRoot=AValue then exit;
  if (csLoading in ComponentState) then
  begin
    FInitialRoot := AValue;
    Exit;
  end;
  //...
und erst in Loaded tatsächlich gesetzt:

Code: Alles auswählen

procedure TCustomShellTreeView.Loaded;
begin
  inherited Loaded;
  if (FInitialRoot = '') then
    PopulateWithBaseFiles()
  else
    SetRoot(FInitialRoot);
end;

PascalDragon
Beiträge: 825
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: Reihenfolge beim Property laden

Beitrag von PascalDragon »

Lorca hat geschrieben:
Do 3. Mär 2022, 10:58
Wie kann ich die Reihenfolge beim Laden von Property's beeinflussen?
Nein. Die Reihenfolge ist Implementation Defined und prinzipiell beliebig. Wie wp_xyz und Sieben geschrieben haben solltest du csLoading in ComponentState korrekt behandeln und die Loaded-Methode überschreiben, dafür ist das ganze ja schließlich da...
FPC Compiler Entwickler

Lorca
Beiträge: 196
Registriert: Di 3. Nov 2020, 12:25

Re: Reihenfolge beim Property laden

Beitrag von Lorca »

Hi,

ok, herzlichen Dank für eure Antworten :)

Danke schön
Lorca

Antworten