Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#7

AW: Datenkomponenten verlieren Datasource

  Alt 15. Dez 2016, 15:54
Welchen Fehler ich mit Datenmodulen oft habe:
* im FormDesigner sieht man die Komponente eines Datenmoduls nicht (das Feld im Objektinspector ist leer)
* ABER, wenn man den Fokus in dieses Property stellt,dann ist das plötzlich doch da
> also der FieldEditor (EditText) findet die Komponente und kann den Namen auflösen, aber der DisplayText schafft das nicht.



Es gibt noch zwei Dinge, die man tun kann.

Das Datenmodul in ein Designtime-Package und das in der IDE installieren, damit das Datenmodul permanent geladen ist.
Eigentlich machen das TDataModule von selber, aber funktioniert nicht immer, bzw. die IDE schafft es manchmal nicht das DataModul zu laden oder findet die PAS nicht, wenn das Modul nötig wäre, weil es in einem Property verlinkt wurde ... darum auch der Vorschlag diese DataModul-Unit vorher selber zu öffnen.
Wenn man mit einer Projektgrupper und mehreren Projekten arbeitet, dann das Datenmodul in jedes Projekt aufnehmen. (wenn man gegen Packages kompiliert, wird das dann beim Kompilieren "hoffentlich" wieder aufgelöst und nur einmal einkompiliert)

Und wenn dass auch noch nicht hilft, dann selber dieses Modul als "globale" Variable registrieren.
Delphi-Quellcode:
...

procedure register;

implementation

{$R *.dfm}

class function TIDEHelperModul.FindGlobalModules(const Name: string): TComponent;
begin
  Result := nil;
  if SameText(Name, 'DM1') then Result := UDM1.DM1;
  if SameText(Name, 'DMSys') then Result := USysModule.DMSys;
end;

procedure register;
begin
  RegisterFindGlobalComponentProc(TIDEHelperModul.FindGlobalModules);
end;

initialization

finalization
  UnregisterFindGlobalComponentProc(TIDEHelperModul.FindGlobalModules);

end.
Das war für die Suche in der IDE/FormDesigner.

Und falls das Problem auch zur Laufzeit auftritt (im DFM-Loader), dann kann man dort ebenfalls ein RegisterFindGlobalComponentProc(FindGlobalModules); in den Programmstart einbauen.
$2B or not $2B

Geändert von himitsu (15. Dez 2016 um 16:05 Uhr)
  Mit Zitat antworten Zitat