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 Brauche Hilfe bei Komponentenentwicklung allgemein (https://www.delphipraxis.net/50006-brauche-hilfe-bei-komponentenentwicklung-allgemein.html)

3_of_8 19. Jul 2005 16:16


Brauche Hilfe bei Komponentenentwicklung allgemein
 
Hallo.
Ich bin jetzt einmal in die Komponentenentwicklung eingestiegen, und Delphi dankt es mir mit AVs und regelmäßigen Abstürzen.

Das erste, das ich wissen muss, ist: Wie integriere ich eine protected Komponente in meine eigene Komponente? Z.B. ein Image, auf dessen Canvas ich zeichnen will? Die Deklaration habe ich so gemacht:

Delphi-Quellcode:
//...

interface

uses Classes, StdCtrls, Windows, SysUtils; //Sind nicht alle aufgeführt, aber im richtigen
  //Programm habe ich alle benötigten aufgeführt.

type
  TRobotPainter = class(TWinControl)
  protected
    Image: TImage;
  //...
  end;

implementation

constructor TRobot.Create(AOwner: TComponent);
begin
Image:=TImage.create(Self);
Image.Parent:=self;
image.rect(0,0,100,100);
end;

//...

end.
Das zweite ist: Wie integriere ich eine published Property (bsp: SynEdit), die nicht selbst erzeugt wird, sondern per Linkage mit TRobotPainter verknüpft wird? So in etwa, wie der Highlighter bei TCustomSynEdit?

Schonmal danke im Voraus.

DerDan 19. Jul 2005 16:39

Re: Brauche Hilfe bei Komponentenentwicklung allgemein
 
Kannst nicht deine Komponente von Timage ableiten?

3_of_8 20. Jul 2005 15:22

Re: Brauche Hilfe bei Komponentenentwicklung allgemein
 
:gruebel: Wäre eine Notlösung, aber ich würde gerne allgemein wissen, wie das geht.

barf00s 20. Jul 2005 15:24

Re: Brauche Hilfe bei Komponentenentwicklung allgemein
 
besser wärs vllt wenn du deine komponente von TGraphicControl ableistest und dann dessen

procedure Paint; "überschreibst"

dann kannst gleich auf dessen Canvas malern.

QuickAndDirty 21. Jul 2005 08:58

Re: Brauche Hilfe bei Komponentenentwicklung allgemein
 
Delphi-Quellcode:
//...

interface

uses Classes, StdCtrls, Windows, SysUtils; //Sind nicht alle aufgeführt, aber im richtigen
  //Programm habe ich alle benötigten aufgeführt.

type
  TRobotPainter = class(TWinControl)
  protected
    Image: TImage;
  //...
  end;

implementation

constructor TRobot.Create(AOwner: TComponent);
begin
Image:=TImage.create(Self);// das ist richtig
Image.Parent:=self; //das solltest du nicht hier machen. >> Fehler: bla... kein übergeordnetes fenster ..bla
(*Besser im SetParent(AWincontrol:Twincontrol);Override;*)
image.rect(0,0,100,100);// das solltest du auch in Setbounds(....);Override; machen
end;

//...

end.
Wozu die Image Komponente?

3_of_8 21. Jul 2005 13:09

Re: Brauche Hilfe bei Komponentenentwicklung allgemein
 
Es heißt natürlich nicht Image.rect, sondern image.canvas.rect(0,0,100,100);

Und das steht auch nicht in Create, sondern in Repaint.

Das mit SetParent versuche ich mal, wenn ich es verstanden habe.

Übrigens: Falls es übersehen wurde: Ich hatte noch eine Frage bezüglich untergeordneten Elementen als Property.

jfheins 21. Jul 2005 13:18

Re: Brauche Hilfe bei Komponentenentwicklung allgemein
 
Zur zweiten Frage: Ich glaube, du kannst einfach eine Property davon machen, und dann immer if FSynEdit <> nil then FSynedit.clear; oder so - probier's mal ;)

SirThornberry 21. Jul 2005 19:40

Re: Brauche Hilfe bei Komponentenentwicklung allgemein
 
also wenn ich den Constructor so ansehen vermisse ich da das inherited!! Das solltest du schleunigst einbauen ansonsten kannst du das ableiten auch gleich ganz lassen wenn du den ursprungsconstructor nicht aufrufst. (bei Destroy etc. gilt gleiches)

3_of_8 22. Jul 2005 16:49

Re: Brauche Hilfe bei Komponentenentwicklung allgemein
 
Das inherited steht ganz am Anfang, ich hab den Code hier aus dem Kopf getippt, also er ist nicht ganz der richtige.

@jfheins: Die Idee hatte ich auch schon, aber alles was ich kriege ist eine AV. Muss ich da noch einen Konstruktor aufrufen?

barf00s 22. Jul 2005 17:08

Re: Brauche Hilfe bei Komponentenentwicklung allgemein
 
Delphi-Quellcode:
constructor TFoobar.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  ...
end;

barf00s 22. Jul 2005 17:10

Re: Brauche Hilfe bei Komponentenentwicklung allgemein
 
und versuchs mal so wie ich dir bereits geraten habe deinen roboter zu "malen" in dem du die procedure Paint überschreibst, und nicht erst extra son olles TImage benützt

3_of_8 22. Jul 2005 17:21

Re: Brauche Hilfe bei Komponentenentwicklung allgemein
 
@barf00s:

1. Beitrag: Ich habe das inherited schon, ich meine, ob ich für die Property Synedit noch einen Konstruktor aufrufen muss.

2. Beitrag: Weil ich vor allem die Möglichkeiten einer WinControl brauche (Maus- und Tastaturereignisse). Die Procedures selber zu schreiben ist mehr Arbeit, als ein TImage einzubauen.

jfheins 22. Jul 2005 17:40

Re: Brauche Hilfe bei Komponentenentwicklung allgemein
 
Nein - aber vorher prüfen obs <> nil ist auf jeden Fall ...

SirThornberry 22. Jul 2005 18:04

Re: Brauche Hilfe bei Komponentenentwicklung allgemein
 
wenn du uns nicht deinen wirklichen Source postest sondern nur den ungefähren wird es schwer mit helfen. Wie du mitbekommen hast wurde ja das mit dem inherited geschrieben was ja aber im richtigen Source drin zu sein scheint. Und wenn du dich jetzt in unsere lage versetzt kannst du vielleicht auch verstehen das einem da etwas die lust zum helfen vergeht wenn jemand etwas anderes postest als womit er eigentlichen einen Fehler hat.
Desweiteren kann es ja gut möglich sein das du den eigentlichen Fehler gar nicht mit postest weil es ein tippfehler etc. ist und dann wird dieser fehler auch nicht gefunden.

3_of_8 24. Jul 2005 10:09

Re: Brauche Hilfe bei Komponentenentwicklung allgemein
 
Ein anderes Beispiel: Ich habe eine Komponente: (Ist wie gesagt nur ein Beispiel, das aber gut zeigt, was ich will.)

Delphi-Quellcode:
//...

type
  TCompo1 = class(TComponent)
  protected
    FTimer: TTimer;
  public
    constructor Create(AOwner: TComponent);
    destructor Destroy;
  published
    property Timer: TTimer read Timer write Timer;
  end;

//...

constructor TCompo1.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  //So, was jetzt? Wie kann ich auf Timer zugreifen, ohne eine AV zu verursachen?
  //Etwa FTimer:=TTimer.Create(AOwner)? Oder FTimer:=TTimer.Create(Self)? Oder gar nichts?
end;

destructor TCompo1.Destroy;
begin
  inherited Destroy;
  FTimer:=nil; //Ist das richtig so?
end;

end.

Khabarakh 24. Jul 2005 10:21

Re: Brauche Hilfe bei Komponentenentwicklung allgemein
 
Nach VCL-Standard sollte das etwa so aussehen:
Delphi-Quellcode:
TFoo = class(TComponent)
protected
  FTimer: TTimer;
  procedure SetTimer(AValue: TTimer);
public
  constructor Create(AOwner: TComponent);
  destructor Destroy; override;
  property Timer: TTimer read FTimer write SetTimer;
end;

[...]

implementation

constructor ...
begin
  inherited;
  FTimer := TTimer.Create(Self); // Hier musst du dich selbst um die Freigabe kümmern
  // FTimer := TTimer.Create(AOwner); // Hier kümmert sich das Formular/... darum
end;

destructor ...
begin
  FTimer.Free; // bei Create(Self)
  inherited;
end;

procedure SetTimer(AValue: TTimer);
begin
  FTimer.Assign(AValue);
end;

3_of_8 24. Jul 2005 10:30

Re: Brauche Hilfe bei Komponentenentwicklung allgemein
 
Juhuu!!! Endlich hat jemand verstanden, was ich wissen wollte!!!

Du kommst in die Credits. (Ich werde wohl dort der ganzen DP danken, aber manchen Leuten wohl ganz besonders.)

jfheins 24. Jul 2005 10:53

Re: Brauche Hilfe bei Komponentenentwicklung allgemein
 
So, hier eine einfache Kompo mit einem Timerfeld:

Soll heißen, ser wird nicht erstellt, sondern der User kann einen zuweisen, er kanns aber auch lassen ;)

Sinn macht das z.B. mit einem Memo, wo du z.B. reinschreibst, was gerade gemacht wird ;)
Delphi-Quellcode:
unit Unit2;

interface

uses
   Classes, ExtCtrls;

type
   TCompo1 = class(TComponent)
   protected
      FTimer: TTimer;
   public
      constructor Create (AOwner: TComponent); override;
      destructor Destroy; override;

      function GetInterval: Integer;
   published
      property Timer: TTimer read FTimer write FTimer;
   end;

   procedure Register;

implementation

{ TCompo1 }

procedure Register;
begin
   RegisterComponents('Eigene Komponenten', [TCompo1]);
end;

constructor TCompo1.Create (AOwner: TComponent);
begin
   inherited;
end;

destructor TCompo1.Destroy;
begin
   inherited;
end;

function TCompo1.GetInterval: Integer;
begin
   if Timer <> nil then
      Result := Timer.Interval
   else
      Result := -1;
end;

end.
P.S. Nein, der rote Kasten war tot, und ja, ich habe eine Zeit gebraucht, bis ich auf "Antworten" geklickt habe ...

3_of_8 24. Jul 2005 11:23

Re: Brauche Hilfe bei Komponentenentwicklung allgemein
 
?

Sowas in der Art habe ich auch gemacht, und alles was ich bekommen habe war eine *TROMMELWIRBEL*

AV!!!

Ich werde bald mal etwas Source posten, dann sehen wir weiter.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:28 Uhr.

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