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 Nicht visuelle Komponente instanzieren (https://www.delphipraxis.net/92962-nicht-visuelle-komponente-instanzieren.html)

Dawn87 29. Mai 2007 14:01


Nicht visuelle Komponente instanzieren
 
Hallo,

ich benutze eine nicht-visuelle Komponente names CPortLib um die serielle Schnittstelle anzusprechen. Diese Komponente zieht man auf ein Formular und kann diese dann mit Name.Methode() ansteuern.

Nun schreibe ich eine Klasse die einige Methoden aus meinem Programm sinnvoll kapseln soll und dabei möchte ich auch die angesprochene Komponente verwendet.

Meine Frage:
Wie kann ich diese Komponente ansprechen, ohne dass ich Sie dafür auf ein Formular ziehen und in der Klasse umständlich ansprechen muss (frmMain.ComPort.* z.B).

In Visual Basic ging das mit dem Schlüsselwort "new" in einer Deklarationsanweisung.

Ich habe die Suchfunktion genutzt, aber leider nichts für mich verwendbares gefunden. Mir fehlten glaub ich einfach die richtigen Suchbegriffe :wink:. Vielen Dank.

Grüße,
Stefan

Matze 29. Mai 2007 14:06

Re: Nicht visuelle Komponente instanzieren
 
Hi, nur Halb-Pseudocode:

Delphi-Quellcode:
MyComponent: TCOMPort;

MyComponent := TCOMPort.Create;
try
  MyComponent.Bla();
  // ...

finally
  FreeAndNil(MyComponent);
end;
Freigeben und Initialisieren geht natürlich auch im finalization bzw. initialization.

chrisw 29. Mai 2007 14:07

Re: Nicht visuelle Komponente instanzieren
 
in die uses Klausel mit aufnehmen

Delphi-Quellcode:
uses ... , NameDerUnit;
Variable für den Pointer auf das Objekt anlegen (global oder lokal in function oder prozedur
Delphi-Quellcode:

var MyComport : TComport; // oder im private bzw public Teil Deines Objektes (dann ohne var)
Objekt instanzieren und dann die Methoden und Variablen des Objekts nutzen
Delphi-Quellcode:
MyComport := TComport.Create; // evtl. mit Parametern wie z.Bsp. AOwner : TComponent
MyComport.Methode();

Freigeben wenn nicht mehr benötigt

Delphi-Quellcode:
MyComport.Free;
Hoffe ich konnte helfen.

CU
Chris

Dawn87 29. Mai 2007 14:13

Re: Nicht visuelle Komponente instanzieren
 
Hallo,

vielen Dank an euch Beide! Es funktioniert.

Noch eine Frage:
Wenn ich dieses Objekt erzeugen will, wenn jemand meine Klasse erzeugt, muss der Code in einen Constructor oder?

Wenn ich nun einen eigenen Constructor anlege, erwartet mich dann mehr Verantwortung als wenn ich den Constructor nutze den Delphi standardmäßig anlegt (TSonstwas.Create()). Ich habe in der Delphi-Hilfe etwas von Heap-Speicher-reservierung und co. gelesen?

Grüße
Stefan

chrisw 29. Mai 2007 14:18

Re: Nicht visuelle Komponente instanzieren
 
Richtig, Du musst einen constructor anlegen.

Dort den Comport instanzieren

Im destructor wieder freigeben.

Denk an override hinter der Deklaration und an inherited im constructor und im destructor.

Bsp.:

Delphi-Quellcode:
//TMyobject Deklaration
private
  ....
  MyComport : TComport;
public
  ....
  constructor Create; (Aowner:TComponent); override;
  destructor Destroy; override;


...
constructor TMyObject.Create(AOwner:TComponent);
begin
  inherited Create(AOwner); //ursprüngliche Instanzierung aufrufen
  MyComport := TComport.Create;
end;

destructor TMyObject.Destroy;
begin
  MyComport.Free;
  inherited; //ursprüngliches Destroy aufrufen
end;
//Edit : Hab noch mal drüber nachgedacht, ist natürlich gar nicht zwingend erforderlich, kannst Du aber so machen.
//Edit : Es geht genauso ohne constructor /destructor, Du musst nur sicherstellen, das du instanzierst, bevor der erste Zugriff auf
//Edit : das Objekt erfolgt.

Dawn87 29. Mai 2007 14:41

Re: Nicht visuelle Komponente instanzieren
 
Hallo,

vielen Dank.

Ich erhalte leider folgenden Fehler:
"Eine statische Methode kann nicht überschrieben werden".

Kann den Quellcode leider nicht hier einfügen, weil ich mit Cygwin im Internet bin :-/.


Grüße
Stefan

chrisw 29. Mai 2007 14:51

Re: Nicht visuelle Komponente instanzieren
 
OK, dann ist constructor oder destructor static deklariert, somit ist überschreiben nicht möglich.


Auf welcher Klasse basiert Deine neue Klasse ?

Dawn87 29. Mai 2007 15:04

Re: Nicht visuelle Komponente instanzieren
 
Hallo,

einfach auf TObject (die "Basisklasse"). Habe mir die ein oder andere Website zum Thema OOP durchgelesen und TObject gewählt, weil alle anderen Klassen (angeblich) darauf basieren.

Grüße
Stefan

uligerhardt 29. Mai 2007 15:05

Re: Nicht visuelle Komponente instanzieren
 
Zitat:

Zitat von Dawn87
Ich erhalte leider folgenden Fehler:
"Eine statische Methode kann nicht überschrieben werden".

Hast du deine Komponente auch von TComponent o.ä. abgeleitet?

//Edit: Wo bleibt der rote Kasten, wenn man ihn braucht? :)

Zum Thema: Komponenten solltest du von TComponent ableiten, so dir keine bessere Basisklasse findest. Sonst funktioniert das ganze visuelle Design im Formdesigner nicht.

HTH,
Uli.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:14 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