AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Platzieren der Komponente verweigern.

Ein Thema von Mystic · begonnen am 1. Nov 2004 · letzter Beitrag vom 1. Nov 2004
Antwort Antwort
Benutzerbild von Mystic
Mystic

Registriert seit: 18. Okt 2003
Ort: Flerzheim
420 Beiträge
 
Turbo Delphi für Win32
 
#1

Platzieren der Komponente verweigern.

  Alt 1. Nov 2004, 00:26
Ich bin gerade dabei eine Komponente zu programmieren.

Wenn die Komponente beim Platzieren nicht direkt auf das Formular kommt (Also das Formular nicht als Parent hat) oder wenn bereits eine Instanz dieser Komponente auf dem Formular existiert, soll es einen Fehler geben und die Komponente nicht platziert werden.

Wie mache ich das?
Jan Steffens
Der Fachwortgenerator - 100% Schwachsinn --- Der UPnP Router Manager - Kommentare erwünscht!
  Mit Zitat antworten Zitat
Benutzerbild von nailor
nailor

Registriert seit: 12. Dez 2002
Ort: Karlsruhe
1.989 Beiträge
 
#2

Re: Platzieren der Komponente verweigern.

  Alt 1. Nov 2004, 00:44
Teil 1: du kannst auch schon Code für die Design-Time haben. Benutz' mal die Suche, da wirst du hoffentlich was finden. Dann einfach testen, ob das Parent vom Typ TForm ist, und wenn nicht meckern.

Teil 2: Informier dich am besten über Singletons. Ich kenn die nur von anderen Sprachen, und weiß nicht, ob die in Delphi auch gehen, aber die sind genau das, was du willst (glaub ich).
Michael N.
http://nailor.devzero.de/code/sharpmath/testing/ --- Tests, Feedback, Anregungen, ... aller Art sehr willkommen!
::: don't try so hard - it'll happen for a reason :::
  Mit Zitat antworten Zitat
Benutzerbild von Mystic
Mystic

Registriert seit: 18. Okt 2003
Ort: Flerzheim
420 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Platzieren der Komponente verweigern.

  Alt 1. Nov 2004, 01:31
Hab das jetzt so realisiert:
Delphi-Quellcode:
constructor TLayeredForm.Create(AOwner: TComponent);
  var i: Word; c: TComponent;
begin
  inherited;
  if csDesigning in ComponentState then begin
    c := Owner;
    while not c.InheritsFrom(TCustomForm) do begin
      c := c.Owner;
      if c = nil then begin
        raise Exception.Create('The LayeredForm component must be put on a form!');
        self.Destroy;
        exit;
      end;
    end;
    Owner := c;
    for i := 0 to Owner.ComponentCount -1 do
      if (Owner.Components[i].InheritsFrom(TLayeredForm)) and (Owner.Components[i] <> self) then begin
        raise Exception.Create('There can be only one LayeredForm component on every form!');
        self.Destroy;
        exit;
      end;
  end;
end;
Jan Steffens
Der Fachwortgenerator - 100% Schwachsinn --- Der UPnP Router Manager - Kommentare erwünscht!
  Mit Zitat antworten Zitat
Benutzerbild von nailor
nailor

Registriert seit: 12. Dez 2002
Ort: Karlsruhe
1.989 Beiträge
 
#4

Re: Platzieren der Komponente verweigern.

  Alt 1. Nov 2004, 02:55
sieht gut aus, auf den ersten Blick. Aber ich glaube, du kannst zur Laufzeit noch weitere Instanzen auf dein Form klatschen.
Michael N.
http://nailor.devzero.de/code/sharpmath/testing/ --- Tests, Feedback, Anregungen, ... aller Art sehr willkommen!
::: don't try so hard - it'll happen for a reason :::
  Mit Zitat antworten Zitat
Benutzerbild von Mystic
Mystic

Registriert seit: 18. Okt 2003
Ort: Flerzheim
420 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Platzieren der Komponente verweigern.

  Alt 1. Nov 2004, 03:00
Zitat von nailor:
Aber ich glaube, du kannst zur Laufzeit noch weitere Instanzen auf dein Form klatschen.
Warum?

Owner war leider ReadOnly, deswegen sieht es jetzt so aus:
Delphi-Quellcode:
constructor TLayeredForm.Create(AOwner: TComponent);
  var i: Word;
begin
  inherited;
  if csDesigning in ComponentState then begin
    if not Owner.InheritsFrom(TForm) then begin
      raise Exception.Create('The LayeredForm component must be put on a form!');
      self.Destroy;
      exit;
    end;
    for i := 0 to Owner.ComponentCount -1 do
      if (Owner.Components[i].InheritsFrom(TLayeredForm)) and (Owner.Components[i] <> self) then begin
        raise Exception.Create('There can be only one LayeredForm component on every form!');
        self.Destroy;
        exit;
      end;
    (Owner as TForm).BorderStyle := bsNone;
  end else begin
    bf^.BlendOp := AC_SRC_OVER;
    bf^.BlendFlags := 0;
    bf^.SourceConstantAlpha := 0;
    bf^.AlphaFormat := AC_SRC_ALPHA;
    setWindowLong((Owner as TForm).Handle, GWL_EXSTYLE, getWindowLong((Owner as TForm).Handle, GWL_EXSTYLE) or WS_EX_LAYERED);
  end;
end;
Jan Steffens
Der Fachwortgenerator - 100% Schwachsinn --- Der UPnP Router Manager - Kommentare erwünscht!
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#6

Re: Platzieren der Komponente verweigern.

  Alt 1. Nov 2004, 08:44
Kein Self.Destroy aufrufen!
Wird eine Exception im Konstruktor ausgeloest, so wird automatisc der Destruktor aufgerufen.
Dort sollte man beim Aufraeumen beruecksichtigen, das einige Initialisierungen im Konstruktor moeglicherweise nicht aufgerufen wurden.

Die Source ist insofern falsch als weder Self.Destroy noch Exit je aufgerufen werden.
Die Exception bricht den Konstruktor sowieso unmittelbar ab.

Es ist anzumerken das die IDE gelegentlich sauer auf solche Exceptions reagiert.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:07 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