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 Package compiliert nicht (https://www.delphipraxis.net/3781-package-compiliert-nicht.html)

Hansa 29. Mär 2003 18:06


Package compiliert nicht
 
Hi,

folgenden Code habe ich in ein Package einbauen wollen:

Code:
TDBLabeledEdit = class(TDBEdit)
  private
    { Private declarations }
    FDBfeldLabel : TLabel;
    procedure SetDBLabel (st : string);
  protected
    { Protected declarations }
  public
    { Public declarations }
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  published
    { Published declarations }
    property DBfeldLabel : TLabel read FDBfeldLabel write SetDBLabel;
  end;
Delphi stört sich an dem SetDBLabel. Aber warum ? Da steht nur folgendes drin:

Code:
procedure TDBLabeledEdit.SetDBLabel (st : string);
begin
  FDBfeldLabel.Caption := 'st';
end;
Fehlermeldung : "incompatible types"

Daniel B 29. Mär 2003 18:15

Re: Package compiliert nicht
 
Hallo Hansa,
Zitat:

Zitat von Hansa
Code:
  FDBfeldLabel.Caption := 'st';

Code:
  FDBfeldLabel.Caption := st;
Wäre vielleicht besser.

Grüsse, Daniel :hi:

mirage228 29. Mär 2003 18:16

muss das st nicht ohne die '' ?
Delphi-Quellcode:
procedure TDBLabeledEdit.SetDBLabel (st : string);
begin
  FDBfeldLabel.Caption := st; // ohne ''
end;

APP 29. Mär 2003 18:26

Hallo,

bin mir nicht sicher, aber hast Du im Objektinspektor
deiner Eigenschaft "DBfeldLabel" einen Label zugeordnet?

Könntest ja prüfen mit:
Delphi-Quellcode:
procedure TDBLabeledEdit.SetDBLabel (st : string);
IF Assigned(FDBfeldLabel) THEN
BEGIN
  FDBfeldLabel.Caption := st; // 'st'
END;
p.s.: ob 'st' oder st:String sollte keinen Fehler ausgeben, oder? (obwohl es nix bringt, 'st' zuzuweisen)

Hansa 29. Mär 2003 18:34

das Problem ist nicht das st, sondern daß nicht compiliert wird.

APP 29. Mär 2003 18:42

Hallo,
probier mal das:

Delphi-Quellcode:
procedure TDBLabeledEdit.SetDBLabel(Const st : TLabel);
IF Assigned(FDBfeldLabel) THEN
BEGIN
  FDBfeldLabel.Caption := st.Caption;
END;

Hansa 29. Mär 2003 18:50

nix.

Code:
property DBfeldLabel : TLabel read FDBfeldLabel write SetDBLabel;
kommentiere ich das
Code:
write SetDBLabel
aus, wird compliliert. Also nicht die ganze Zeile.

Hansa 29. Mär 2003 19:09

Code:
procedure TDBLabeledEdit.SetDBLabel(st : TLabel);
begin
  FDBfeldLabel.Caption := st.Caption;
END;
Tatsächlich wird jetzt compiliert. Aber warum :?: Im OI ist von der Sache trotzdem nichts zu sehen.

APP 29. Mär 2003 19:20

Naja,
weil Du im
Delphi-Quellcode:
property DBfeldLabel : TLabel read FDBfeldLabel write SetDBLabel;
DBfeldLabel als TLabel deklariert hast,
daher muß das Attribut
Delphi-Quellcode:
   FDBfeldLabel : TLabel;
und der Schreibzugriff
Delphi-Quellcode:
write SetDBLabel;
...
procedure TDBLabeledEdit.SetDBLabel(st : TLabel);
vom gleichem Typ sein.

Hansa 29. Mär 2003 19:29

Wo Du Recht hast, hast Du Recht. 8) 8) Jetzt wird compiliert. Da ist aber noch was : DBfeldLabel ist jetz im OI. Aber an Caption etc. vom Label komm ich nicht dran.

APP 29. Mär 2003 19:56

Hallo,
probier mal das:

Delphi-Quellcode:
UNIT CustEd;

INTERFACE

USES
   Windows,
   Messages,
   SysUtils,
   Classes,
   Graphics,
   Controls,
   Forms,
   Dialogs,
   StdCtrls;

TYPE
   TCustEd = CLASS(TEdit)
   PRIVATE
      FDBfeldLabel: TLabel;
      FWriteLabel: STRING;
      { Private-Deklarationen }
   PROTECTED
      { Protected-Deklarationen }
   PUBLIC
      PROCEDURE SetWriteLabel(CONST Value: STRING);
      { Public-Deklarationen }
   PUBLISHED
      PROPERTY DBfeldLabel: TLabel READ FDBfeldLabel WRITE FDBfeldLabel; // Jetzt kannst Du einen Label im OI einbinden
      PROPERTY WriteLabel: STRING READ FWriteLabel WRITE SetWriteLabel;
      { Published-Deklarationen }
   END;

PROCEDURE Register;

IMPLEMENTATION

PROCEDURE TCustEd.SetWriteLabel(CONST Value: STRING);
BEGIN
   IF Assigned(FDBfeldLabel) THEN
      BEGIN
         FDBfeldLabel.Caption := Value;
         FDBfeldLabel.Refresh;
      END;
END;

PROCEDURE Register;
BEGIN
   RegisterComponents('app', [TCustEd]);
END;

END.
Aufruf:
Delphi-Quellcode:
PROCEDURE TForm1.Button1Click(Sender: TObject);
BEGIN
   CustEd1.SetWriteLabel('fer');
END;
Ist vielleicht nicht ganz das was Du willst, aber ausbaufähig...

[edit=Daniel B]Tags korrigiert. MfG Daniel B.[/edit]

@Daniel, Danke!

Leider verschwand mein
[EDIT] Constructor Create ist unnötig! [/EDIT]

APP 29. Mär 2003 20:05

Noch ein Fehler von mir: :oops:

Delphi-Quellcode:
PROCEDURE TForm1.Button1Click(Sender: TObject);
BEGIN
   CustEd1.WriteLabel :='df'; //    .SetWriteLabel ('fer'); ist Blödsinn!!!!
END;

Hansa 29. Mär 2003 20:16

Nur keine Hektik. Geht sowieso noch nicht. Warum ? 8) Hmmm. Im OI ist jetzt wie gesagt das Feld drin, aber es müßte so laufen wie mit "Font" etc. Notfalls auf das + Klicken. Dann müßten die anderen Eigenschaften verfügbar sein. Das hab ich auch schon hingekriegt, muß anscheinend noch üben. Das Ganze ist etwas gewöhnungsbedürftig und entspricht nicht ganz der Pascal-Syntax. Aber Übung macht den Meister. Rentieren wird sich der Aufwand allemal.

APP 29. Mär 2003 21:02

Naja, viel Spaß dann noch :dancer:

Trotzdem, der Vollständigkeit halber:

Delphi-Quellcode:
...
TYPE
   TCustEd = CLASS(TEdit)
   PRIVATE
      FDBfeldLabel: TLabel;
      FWriteLabel: STRING;
      PROCEDURE SetWriteLabel(CONST Value: STRING);
      { Private-Deklarationen }
...
PROCEDURE SetWriteLabel(CONST Value: STRING);
sollte in PRIVATE stehen, dann passiert Dir mein Fauxpas von oben nicht mehr.



p.s. Zur Komponentenentwicklung habe ich schon mal was gepostet:
Creating Custom Delphi Components, Part I
Creating Custom Delphi Components, Part II
Creating Custom Delphi Components, Part III
Sind meiner Meinung nach die besten Tips im Netz!


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:30 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz