komponente droppable , Duplikat, nur 1 Instanz

Rund um die LCL und andere Komponenten
pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: komponente droppable , Duplikat, nur 1 Instanz

Beitrag von pluto »

dass nur eine Instanz einer KLASSE erstellt werden kann
Dann habe ich ihn falsch verstanden. Das wäre eigentlich auch kein Problem.

Meine Idee wäre: Jede Klasse meldet sich an einer Liste an. Gibt es schon ein Eintrag, wird die Klasse wieder frei gegeben oder erst gar nicht Installisiert.
MFG
Michael Springwald

arturx
Beiträge: 140
Registriert: Fr 21. Nov 2008, 11:29
OS, Lazarus, FPC: Winux (L 1.0.6.xy FPC 2.6.z)
CPU-Target: 32/64Bit

Re: komponente droppable , Duplikat, nur 1 Instanz

Beitrag von arturx »

m.fuchs hat geschrieben:Ich hab arturx so verstanden, dass nur eine Instanz einer KLASSE erstellt werden kann.Michael
So ist es.
Der Singleton-link (s.o:) zeigt genau das...

(Eine Liste oder eine Var. zu erstellen wäre natürlich die Voraussetzung zur Erkennung.
Mein Problem war, dass mein Versuch, einfach "abort" in den 2.Aufruf des constructors zu schreiben, nicht funktionierte)

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: komponente droppable , Duplikat, nur 1 Instanz

Beitrag von pluto »

Mein Problem war, dass mein Versuch, einfach "abort" in den 2.Aufruf des constructors zu schreiben, nicht funktionierte)
Nein ! Du kannst ja auch nicht in ein onShow gleich ein Hide rein schreiben. D.H. Bevor du in die Liste einfügst prüfst du ob es bereits eine entsprechende Klasse gibt. Wenn nicht: Erstelle, wenn ja: Lass es.
MFG
Michael Springwald

arturx
Beiträge: 140
Registriert: Fr 21. Nov 2008, 11:29
OS, Lazarus, FPC: Winux (L 1.0.6.xy FPC 2.6.z)
CPU-Target: 32/64Bit

Re: komponente droppable , Duplikat, nur 1 Instanz

Beitrag von arturx »

Hallo Michael,
Jetzt hab ich mir Dein Singleton-Beispiel nocheinmal genau angesehen:
Das Erkennen einer Mehrfachinstanz ist natürlich kein Problem, aber :
Da die komponente zur designtime durch die IDE created wird,
kann ich leider nicht dafür sorgen, dass die getinstance (klassen)-methode zuerst aufgerufen wird.
Wo ist der Mechanismus der IDE, in den man eingreifen kann ?
Grüße Rainer

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2822
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: komponente droppable , Duplikat, nur 1 Instanz

Beitrag von m.fuchs »

arturx hat geschrieben:Da die komponente zur designtime durch die IDE created wird, kann ich leider nicht dafür sorgen, dass die getinstance (klassen)-methode zuerst aufgerufen wird.
Wo ist der Mechanismus der IDE, in den man eingreifen kann ?
Keine Ahnung, da weiß ich leider gar nicht Bescheid. Wird denn beim erstellen einer Komponente zur Designzeit tatsächlich der Konstruktor aufgerufen? Wenn ja könnte man es vielleicht folgendermaßen machen:

Du baust das Singleton als ganz normale Klasse (nicht als Komponente), nennen wir es mal TMySingleton. Und du baust dir die Komponente, die eine Variable vom Typ TMySingleton enthält. Und im Konstruktor deiner Komponente wird diese Variable mit dem Rückgabewert von TMySingleton.GetInstance gefüllt.
Dann kannst du mehrere Komponenten haben, die aber alle die gleiche Instanz von TMySingleton nutzen. Die entsprechenden Properties vom Singleton über dein Komponente nach außen durchzureichen sollte ja recht einfach sein.

Das ist aber alles nur geraten.

mfg
Micha
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

arturx
Beiträge: 140
Registriert: Fr 21. Nov 2008, 11:29
OS, Lazarus, FPC: Winux (L 1.0.6.xy FPC 2.6.z)
CPU-Target: 32/64Bit

Re: komponente droppable , Duplikat, nur 1 Instanz

Beitrag von arturx »

Hey Micha,
1.der Constructor wird tatsächlich aufgerufen, Das macht ja den Charme aus ! teste mal:

Code: Alles auswählen

constructor tcomponent(aowner : tcomponent);
   begin inherited;
             beep; // <-- das hört man, wenn man die Komponente aufs Formular legt  !!!!
   end;
// Natürlich muss die componente noch registiert und installiert werden !
eine weitere Möglichkeit, zur designtime aktiv zu werden, hat man in den propeditors usw......

2.Es scheint zu funktionieren mit folgendem Code :

Code: Alles auswählen

constructor tcomponent(aowner : tcomponent);
   begin If not firsttime
               then exit 
            inherited;
   end;
Es kommt lediglich eine Fehlermeldung :"the component of type..... failed to set its owner to form1:tform1°
und das Komponenten-Icon der Werkzeugleiste muss durch Drücken auf den Pfeil manuell "entschärft" werden.
Das Verhalten ist jedoch so, wie man möchte.... :)

arturx
Beiträge: 140
Registriert: Fr 21. Nov 2008, 11:29
OS, Lazarus, FPC: Winux (L 1.0.6.xy FPC 2.6.z)
CPU-Target: 32/64Bit

Re: komponente droppable , Duplikat, nur 1 Instanz

Beitrag von arturx »

Nun habe ich eine Lösung für das singleton object :
// ....

Code: Alles auswählen

protected 
   class function NewInstance : tobject;     override;
 // ....
  end.
 
class function trainDbZentral.NewInstance: tobject;
begin
    If assigned(vdbzentralInstance) then
       begin result := nil;
             beep;
             raise exception.create('only 1 instance allowed per project');
       end;
    Result := inherited NewInstance;
end;
// vzentralinstance muss natürlich im constructor :=self und im destructor :=Nil getsetzt werden...
Das einzige Manko, mit dem ich (problemlos) weiter leben muss :
In der Werkzeugpalette bleibt die komponente gedrückt und muss per Hand abgewählt werden.

Vielleicht hat ja noch irgendjemand eine Idee zu diesem letzten Schönheitsfehler....

Antworten