Schwierigkeiten mit Delphi Komponente



  • Hi.

    Ich habe eine Delphi 1 Komponente und würde diese gerne in CBuilder5pro eintragen,
    jedoch meldet er mir das BPL installiert wurde aber das Package ist leer (keine Komponente eingetragen)

    Ich gehe Komponente->Komponente installieren->Neues Package und wähle die PAS Datei aus und gebe dem Package einen Namen und eine Beschreibung. Drücke OK und compiliere, worauf er nur sagt BPL installiert.

    In Projekte->Optionen...->Packages steht sie drin. Wähle ich sie aus und drücke auf den Komponenten Button ist die dortige Liste leer.

    Was mache ich falsch?

    Hier die Komponente und die Quellseite
    http://www.leif-bruder.de/download.htm#TSlSaver

    unit SlSaver;
    
    interface
    
    uses Classes;
    
    type
    
    {------------------------------------------------------------------------------}
    
       TSlSaver = class(TComponent)
       public
          constructor Create(Owner: TComponent); override;
          destructor Destroy; override;
       protected
          FLines: TStringList;
          procedure SetLines(slNew: TStringList);
       published
          property Lines: TStringList read FLines write SetLines;
       end;
    
    {------------------------------------------------------------------------------}
    
       THashSaver = class(TSlSaver)
       public
          function GetValue(sHash: string): string;
          procedure SetValue(sHash, sValue: string);
       protected
          function FindIndex(sHash: string): LongInt;
       published
          property Lines;
       end;
    
    {------------------------------------------------------------------------------}
    
    procedure Register;
    
    implementation
    
    {##############################################################################}
    
    procedure Register;
    begin
       RegisterComponents('Lb', [TSlSaver, THashSaver]);
    end;
    
    {##############################################################################}
    {#                                                                            #}
    {#  SlSaver                                                                   #}
    {#                                                                            #}
    {##############################################################################}
    
    constructor TSlSaver.Create(Owner: TComponent);
    begin
       inherited Create(Owner);
       FLines := TStringList.Create;
    end;
    
    {##############################################################################}
    
    destructor TSlSaver.Destroy;
    begin
       FLines.Free;
       inherited Destroy;
    end;
    
    {##############################################################################}
    
    procedure TSlSaver.SetLines(slNew: TStringList);
    begin
       FLines.Assign(slNew);
    end;
    
    {##############################################################################}
    {#                                                                            #}
    {#  HashSaver                                                                 #}
    {#                                                                            #}
    {##############################################################################}
    
    function THashSaver.FindIndex(sHash: string): LongInt;
    var
       lHash: LongInt;
    
    begin
       lHash := 0;
       Result := -1;
       while lHash < FLines.Count do
       begin
          if copy(FLines[lHash], 1, length(sHash)+1) = sHash + '=' then
          begin
             Result := lHash;
             break;
          end;
          inc(lHash);
       end;
    end;
    
    {##############################################################################}
    
    function THashSaver.GetValue(sHash: string): string;
    var
       lHash: LongInt;
    
    begin
       lHash := FindIndex(sHash);
       if lHash = -1 then Result := '' else Result := copy(FLines[lHash], length(sHash)+2, length(FLines[lHash]));
    end;
    
    {##############################################################################}
    
    procedure THashSaver.SetValue(sHash, sValue: string);
    var
       lHash: LongInt;
    
    begin
       lHash := FindIndex(sHash);
       if lHash = -1 then
       begin
          FLines.Add(sHash + '=' + sValue);
       end
       else
       begin
          if sValue = '' then FLines.Delete(lHash) else FLines[lHash] := sHash + '=' + sValue;
       end;
    end;
    
    {##############################################################################}
    
    end.
    


  • Funktioniert einwandfrei. Es sind zwei Komponenten vorhanden.

    Das Problem hatte ich aber auch einmal. Ich habe die Komponente deinstalliert. Danach alle erstellten Files ausser der PAS-Datei gelöscht. Dann den Vorgang wiederholen. Es hilft evtl. wenn man auch die PAS-Datei umbenennt und neu installiert. Vor der Installation evtl. noch vorhandene BPL-Dateien mit dem Namen löschen.

    Warum das so war. Keine Ahnung.



  • Super Statement Michael! Und danke für die Frage delio *gg*
    War schon am Verzweifeln und habe angefangen an der Borland C++ / Delphi Kompatibilität zu zweifeln.
    Um auch noch anderen mit diesem Problem womöglich zu helfen; ich glaube, die Fehlerquelle (benutze Borland C++ 6.0) gefunden zu haben:

    Die Package Datei (.bpk) die erstellt wird (und die man angeben muss) darf nicht den selben Namen wie die pas-Datei bekommen !

    Ich frage mich gerade: Braucht man immer den Pascal Quellcode (.pas) um die Delphi-Komponente einzufügen? Oder gibt es auch eine Möglichkeit, wenn man "nur" die folgenden Dateien besitzt:
    bpl (Library), dcu (kompilierte Unit-Datei), dpk (Package Datei), res (Ressourcen-Datei) ??

    Na werde noch fleißig Kompenenteneinfügen rumprobieren ... und sicherlich noch auf die ein oder andere Schwierigkeit stoßen, die ich hier vermutlich dann schildern werde 😋

    Gruss,
    Clemens



  • Wäre ja blöd für die kommerziellen Komponentenentwickler, wenn sie immer den Source rausgeben müßten -)
    Na klar, du kannst auch einfach die .dcu-Dateien einbinden (diese müssen nur zu der Delphi-Version bzw. der C++ Builder-Version kompatibel sein, d.h. die Delphi 1 Dateien werden nicht funktionieren, da brauchst du schon den Source).


Anmelden zum Antworten