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 Objekt als Komponenteneigenschaft (https://www.delphipraxis.net/155157-objekt-als-komponenteneigenschaft.html)

blablab 11. Okt 2010 14:26


Objekt als Komponenteneigenschaft
 
Hallo!

Ich entwickel zur Zeit eine Komponente "SelDir" mit der man einen Ordner von der Festplatte auswählen kann. Jetzt möchte ich zu dieser Komponente eine neue Komponente "SelDirDialog" machen, die aus einem Fenster mit einer "SelDir" Komponente, einem OK- und Abbrechen-Knopf besteht. Das ganze sollte dann eine nicht-visuelle Komponente mit einer Execute-methode werden, wie die Dialog-Komponenten von Delphi.
Mein Problem ist nun, dass alle Optionen des Dialogs eigentlich schon in der "SelDir"-Komponente stecken. Zum Beispiel der ausgewählte Pfad ist eine Eigenschaft von "SelDir". Um darauf zugreifen zu können müsste ich also der "SelDirDialog"-Komponente eine Eigenschaft Pfad geben, die dann den Pfad von der "SelDir"-Komponente zurückgibt. Ich müsste also letztendlich fast alle Eigenschaften von "SelDir" in "SelDirDialog" reinkopieren.

Um das zu verhindern hab ich mir überlegt ich mach in "SelDirDialog" folgende Eigenschaft:
Delphi-Quellcode:
   published
      property SelDir: TSelDir read FSelDir;
Das Problem ist jetzt nur, dass die im Objektinspektor eingestellten Eigenschaften von SelDir keine Wirkung haben. Wenn ich die Komponente "SelDirDialog" zur Entwicklungszeit in mein Formular ziehe wird Create aufgerufen und eine "SelDir"-Komponente erzeugt. Sobald das Programm gestartet wird, passiert das gleiche nochmal und die "SelDir"-Komponente hat wieder Standardeinstellungen.

Ich steh wirklich aufm Schlauch und komm hier einfach nicht weiter. Alle Eigenschaften kopieren möchte ich wenns geht nicht, denn sobald ich eine Eigenschaft der "SelDir"-Komponente änder (die sich ja noch in der Entwicklung befindet) muss ich dieselbe Änderung auch an der "SelDirDialog"-Komponente vornehmen.

Habt ihr Ideen was ich hier (stattdessen) machen könnte?

Grüße
blablab

angos 11. Okt 2010 14:41

AW: Objekt also Komponenteneigenschaft
 
Hi,

das hört sich für mich stark danach an, dass du die SeldirDialog-Komponente auf Grundlage von Seldir machen solltest, also:

Delphi-Quellcode:
 TSeldirDialog= class(TSelDir)
Damit werden alle Eigenschaften von Seldir auch in SelDirDialog verfügbar und bei Änderungen an Seldir auch automatisch nach seldirdialog übertragen

Grüße

shmia 11. Okt 2010 14:54

AW: Objekt also Komponenteneigenschaft
 
Im Objektinspektor werden nur Objektproperties angezeigt, die lesbar und beschreibbar sind.
Dein Property ist nicht beschreibbar.
Delphi-Quellcode:
published
  property SelDir: TSelDir read FSelDir write SetSelDir;
                                        ^^^^^^^^^^^^^^^

Sir Rufo 11. Okt 2010 15:04

AW: Objekt als Komponenteneigenschaft
 
Ist das wirklich so?

Ich kenne Komponenten, die zeigen mir ihre Version im OI an, die ist aber Gray und kann ich definitiv nicht ändern

shmia 11. Okt 2010 15:08

AW: Objekt als Komponenteneigenschaft
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von blablab (Beitrag 1055080)
Ich entwickel zur Zeit eine Komponente "SelDir" mit der man einen Ordner von der Festplatte auswählen kann.

Da bist du nicht der Erste.
Schon vor 10 Jahren wurde so eine Komponente entwickelt.

blablab 11. Okt 2010 15:12

AW: Objekt als Komponenteneigenschaft
 
@angos:
Das hab ich auch ausprobiert, allerdings ist es dann keine nicht-visuelle Komponente mehr, da diese immer den Vorfahr TComponent haben müssen. (Korrigiert mich falls ich falsch liege).

@shmia:
Ich kann im Objektinspektor auf SelDir zugreifen. Mit Read kann ich den Zeiger auf SelDir auslesen und somit auf SelDir zugreifen und dessen Eigenschaften auch ändern. Write bewirkt nur, dass ich den zeiger auf SelDir auch ändern kann und somit meiner SelDirDialog-Komponente eine fremde SelDir-Komponente zuweisen kann. Das möchte ich aber nicht.

Das Probmlem ist ja gerade, dass wenn ich die Eigenschaften von SelDir im Objektinspektor ändere, das zwar Auswirkungen auf das SelDir zur Entwicklungszeit hat, aber nicht auf das SelDir zur Laufzeit.

shmia 11. Okt 2010 15:31

AW: Objekt als Komponenteneigenschaft
 
Zitat:

Zitat von Sir Rufo (Beitrag 1055086)
Ich kenne Komponenten, die zeigen mir ihre Version im OI an, die ist aber Gray und kann ich definitiv nicht ändern

Dann wurde das in höheren Delphi Versionen verbessert.
Bei Delphi 5 braucht man den Schreibzugriff auch wenn das so aussieht:
Delphi-Quellcode:
procedure TMeinKomponenten.SetVersion(const Value:string);
begin
  // nichts tun
end;

blablab 11. Okt 2010 16:01

AW: Objekt als Komponenteneigenschaft
 
Also so wie es aussieht kann das gar nicht gehen. Selbst wenn ich read und write verwende
Delphi-Quellcode:
published
  property SelDir: TSelDir read FSelDir write SetSelDir;
Speichert sich Delphi die Einstellungen die ich an SelDir vornehme gar nicht.

Das bedeutet ich muss wohl leider alle Eigenschaften und ihre Defaultwerte einzeln kopieren...

shmia 11. Okt 2010 16:10

AW: Objekt als Komponenteneigenschaft
 
Die Klasse TSelDir muss Folgendes erfüllen:
1.) von TPersistent direkt oder indirekt abgeleitet
2.) die Methode Assign muss überschrieben werden
Wenn man Assign nicht überschreibt, dann meldet Delphi beim Öffnen eines Formular mit deiner Komponente:
Code:
Klasse TSelDir kann nicht zu TSelDir zugewiesen werden
Die Methode SetSelDir muss so aussehen:
Delphi-Quellcode:
procedure TSelDirDialog.SetSelDir(const Value:SelDir);
begin
  FSelDir.Assign(Value);
end;


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