Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Komponente existiert bereits beim Öffnen des Projekts (https://www.delphipraxis.net/77139-komponente-existiert-bereits-beim-oeffnen-des-projekts.html)

MOCI 15. Sep 2006 08:00


Komponente existiert bereits beim Öffnen des Projekts
 
Hi Leute,

Ich hab ein Grid abgeleitet, beim Create hab ich inherited und dann frag ich ab csDesigning in ComponentState dann tu:
alle vorhandenden Columns löschen und erstelle 3 Columns mit dem Namen Self.Name + 'Clomun0' usw.

Daraus hab ich eine Komponente gemacht.
Wenn ich die Komponente compilier, installier und auf mein Formular ziehe, passt alles fein und läuft auch.
Schließ ich allerdings das Projekt und öffne es wieder, dann kommt die Meldung:

"Eine Komponente mit der Bezeichnung MeinGridColumn0 exisiert bereits."

Hat jemand von euch dazu eine Lösung?

danke
mfg MOCI

bernau 15. Sep 2006 09:04

Re: Komponente existiert bereits beim Öffnen des Projekts
 
Zitat:

Zitat von MOCI
alle vorhandenden Columns löschen und erstelle 3 Columns mit dem Namen Self.Name + 'Clomun0' usw.
......
"Eine Komponente mit der Bezeichnung MeinGridColumn0 exisiert bereits."

Ich tippe mal auf einen Tippfehler bei deiner Funktion um den Namen zuzuweisen.

Da der Fehler beim erzeugen des Formulares erscheint, vermute ich den Fehler im Constructor. Kannst du mal die Funktion create hier posten. Dort vermute ich den Fehler.



Gerd

MOCI 15. Sep 2006 09:18

Re: Komponente existiert bereits beim Öffnen des Projekts
 
Sorry, hab beim ersten Post verschrieben. Die Fehlermeldung kommt nicht bei den Columns sonder beim View:

Code:
  ViewVorhanden := False;

  for I := 0 to Self.ViewCount - 1 do
    if Self.Views[I] is TcxGridBandedTableView then
      if TcxGridBandedTableView(Self.Views[I]).Name = Self.Name + 'BandedTableView1' then
        ViewVorhanden := True;

  if not ViewVorhanden then begin
    //Löschen aller Views
    I := Self.ViewCount;
    for J := 0 to Self.ViewCount - 1 do
      Self.Views[0].Free;

    //Erstellen des neuen BandedTableViews
    NeuerView := Self.CreateView(TcxGridBandedTableView);
    NeuerView.Name := Self.Name + 'BandedTableView1';
    Self.ActiveLevel.GridView := TcxGridBandedTableView(NeuerView);

    //Band und Columns Createn und Standardwerte setzen
    StandardBandsCreaten(TcxGridBandedTableView(NeuerView));
    StandardColumnsCreaten(TcxGridBandedTableView(NeuerView));
    StandardWerteSetzen(TcxGridBandedTableView(NeuerView));
  end; // End If

bernau 15. Sep 2006 10:53

Re: Komponente existiert bereits beim Öffnen des Projekts
 
Ich kenne diese Komponente nicht, aber:

Zitat:

Zitat von MOCI
Code:
if not ViewVorhanden then begin
    //Löschen aller Views
    I := Self.ViewCount;
    for J := 0 to Self.ViewCount - 1 do
      Self.Views[0].Free;


Warum definierst du "I" wenn du diese Variable nicht verwendest ? (Nur interessehalber)

Warum Self.Views[0].Free in einer Schleife? Ich gehe davon aus, das Views in irgendeiner Form eine Objectliste ist. Mit free gibst du das Objekt frei aber views.count wird doch nicht reduziert. Schau doch mal was views.count nach dem Durchlauf der Schleife sagt.

Oder sollte es vieleicht so heissen:

Code:

 for J := 0 to Self.ViewCount - 1 do
    Self.Views[J].Free;
 Self.Views.clear;
Wie gesagt. Ich kenne die Komponente nicht. Ich mutmasse nur.

Zitat:

Zitat von MOCI
Code:
 
    NeuerView.Name := Self.Name + 'BandedTableView1';

Hier entsteht die Fehlermedung. Ein Anzeichen dafür, daß die Komponente mit dem Namen "BandedTableView1" in deiner Schleife, die vorher durchgelaufen ist, nicht freigegeben wurde.


Gerd

MOCI 15. Sep 2006 11:42

Re: Komponente existiert bereits beim Öffnen des Projekts
 
Zitat:

Warum definierst du "I" wenn du diese Variable nicht verwendest ? (Nur interessehalber)
Ich da was ausprobiert, deswegen hatte ich I definiert. hab es dann nicht gelöscht, weil es dann vergessen zu löschen.

Zitat:

Warum Self.Views[0].Free in einer Schleife? Ich gehe davon aus, das Views in irgendeiner Form eine Objectliste ist. Mit free gibst du das Objekt frei aber views.count wird doch nicht reduziert. Schau doch mal was views.count nach dem Durchlauf der Schleife sagt.
Wenn ich mit for J := 0 to Self.ViewCount - 1 durchgehe und den View[J], dann kommt eine
"Index außerhalb des maximalen Bereichs"-Meldung.
Ich könnte es auch mit downto machen, habs aber mal so probiert.

Views haltet alle einzelnen Views in einer Liste.
Allerdings gibt es hier keine clear -> leider. Aber es gibt bestimmt eine andere Möglichekeiten den View aus der Liste zu kicken.
Danke für den hinweis!!!

SirThornberry 15. Sep 2006 11:54

Re: Komponente existiert bereits beim Öffnen des Projekts
 
Dein Problem wird folgendes sein. Du erstellst die Columns im Constructor. Wenn du dein Projekt dann schließt werden diese Columns aber mit gespeichert. Beim öffnen des Projektes wird dann:
1.) wieder deine Komponente erzeugt
2.) Deine Komponente erzeugt die Columns
3.) die DFM wird ausgelesen udn es wird versucht die gespeicherten Columns zu laden -> Bumm

MOCI 15. Sep 2006 12:03

Re: Komponente existiert bereits beim Öffnen des Projekts
 
Wie kann ich dem Abspeichern umgehen?


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