Einzelnen Beitrag anzeigen

oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#4

Re: RuntimePackage laden/verwenden

  Alt 12. Mär 2009, 19:31
Hi schmia,

der Weg der Vererbung der Formulare ist erst mal der, den ich eingeschlagen habe. In der Regel liegen kaum weitere Komponenten auf den Basisformularen. Sie dienen eigentlich als spezialisierte Vorlagen, um das Erstellen von Anwendungen einfacher zu gestalten und ein durchgängiges Grunddesign sicher zu stellen. Natürlich neben weiteren Grundfunktionalitäten.

Für andere Techniken bin ich immer offen. Ich fand halt keine passenden für die gewünschten Anforderungen. Für den Bereich der Vererbung von Formularen gebe ich dir vollkommen recht. Damit muss ich leben.

Das aktuelle Problem kommt eigentlich aus einer anderen Ecke. Ich will für den internen Gebrauch ein Tool erstellen, in das man die spezialisierten Packages laden kann. Das Basispackage soll eigentlich nicht mehr verändert werden. Damit ich das Tool nicht jedesmal neu kompilieren muss wenn ein neues Package vorliegt will ich diese nachladen können. Dabei muss ich aber über die Klasseninformationen gehen.

Beispiel. Ein neues Formular liegt im neuen Spezialpackage vor, das ein Nachfahre vom BaseForm in Basepackage ist. Wenn ich dieses in meinem Tool creieren und anzeigen will mache ich folgendes:

Delphi-Quellcode:
procedure TSettingsMainForm.TATBPLFormsLoad;
var
  AFormClass: TPersistentClass; // hier könnte man auch TFormClass nehmen, spaart man weiter unten das Casten
  AForm : TForm;
  FormList: TStringList;
  Counter: Integer;
begin
  if FBPLModule <> 0 then
    TATBPLFormsUnload;
  if not FileExists(FSettingsProject.TATBPLName) then
    Exit;
  FBPLModule := LoadPackage(FSettingsProject.TATBPLName);
  if FBPLModule <> 0 then begin
    @GetBPLFormClasses := GetProcAddress(FBPLModule, 'GetBPLFormClasses');
    if @GetBPLFormClasses = nil then
      Exit;
    try
      FormList := TStringList.Create;
      GetBPLFormClasses(FormList); // Liste aller Formularklassen aus dem Package holen
      for Counter := 0 to FormList.Count - 1 do begin
        AFormClass := GetClass(FormList.Strings[Counter]);
        if Assigned(AFormClass) then begin
          Application.CreateForm(TComponentClass(AFormClass), AForm);
          AForm.Show;
        end;
      end;
    finally
      FreeAndNil(FormList);
    end;
  end;
end;
Entladen wird das Package an anderer Stelle.

Also, wenn du andere Ideen hast, gerne her damit. Sollte mein Anwendungsfall nicht verständlich genug sein, liefer ich mehr.

Da das mit dem den Laufzeitpackages jetzt aber wohl klar ist und die Sache prinzipiell klappen müßte, würde ich das auf diesem Weg schon gerne hin bekommen.

Gruß oki
42
  Mit Zitat antworten Zitat