AGB  ·  Datenschutz  ·  Impressum  







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

Komponenten löschen > Abstracter Fehler

Ein Thema von mimi · begonnen am 26. Aug 2006 · letzter Beitrag vom 28. Aug 2006
Antwort Antwort
Seite 2 von 2     12   
Jürgen Thomas

Registriert seit: 13. Jul 2006
Ort: Berlin
750 Beiträge
 
#11

Re: Komponenten löschen > Abstracter Fehler

  Alt 28. Aug 2006, 10:22
Hallo Michael,
Zitat von mimi:
1. kam eine fehlermeldung vom complier das
Zitat:
[Fehler] Unit1.pas(332): E2010 Inkompatible Typen: 'TWinControl' und 'TControl'
OK, Du hast recht - ich war zu schnell. Die entsprechende Zeile in #9 müsste bei mir lauten:
ctl := test.Controls[i] as TWinControl; // damit auf ctl noch später zugegriffen werden kann Aber das würde, wie Du feststellen musstest, weiterhin zu einem Laufzeitfehler führen; ich nehme an, ebenfalls mit einem Hinweis auf Inkompatible Typen: 'TWinControl' und 'TControl'.

Zu Deiner Version: Du darfst nicht darauf verzichten, jedes angelegte Control ausdrücklich freizugeben! Ich habe mir den Quelltext von RemoveControl in controls.pas angesehen (er ist auf mehrere Prozeduren aufgeteilt, deshalb zitiere ich ihn hier nicht - wenn Du es über PN wünschst, stelle ich ihn Dir trotz Lizenzproblemen zur Verfügung): es werden Handle freigegeben, und das Control wird aus Listen entfernt, aber niemals gelöscht! Das musst Du zusätzlich machen!!!

Den dadurch auftretenden Fehler kannst Du selbst suchen.
1. Stelle fest, wo genau es knallt; das zeigt Dir der Laufzeitfehler vermutlich exakt an.
2. Ergänze den Quelltext an dieser Stelle wie folgt durch Fehlerprüfung (ich habe meinen vorherigen Text kopiert und nur neue Änderungen gekennzeichnet):
Delphi-Quellcode:
procedure TForm1.PanelFree(Sender:Tobject);
var
  test:TWinControl;
  ctl: TWinControl;
  MenuItem:TMenuItem;
  i:Integer;
begin
  test:=TJvCaptionPanel((Sender as TWinControl).Parent);
  TMenuItem(form1.FindComponent('MenuItem' +InTTostr(test.tag))).Destroy;
  form1.ActiveControl:=niL;
  for i:=test.ControlCount-1 downto 0 do
  begin
    if test.Controls[i] <> NIL then
    begin
      try // ich nehme an, hier knallt es, also prüfen
        ctl := test.Controls[i];
        test.RemoveControl(test.Controls[i]);
        ctl.Free;
      except
        on e:exception
        do ShowMessage(e.Message);
        // ich nehme an, dass Du durch die Meldung genau die betroffene
        // Komponente genannt bekommst
      end;
    end;
  end;
  test.free;
end;
3. Untersuche diese Komponente, z.B. Delphi-Referenz durchsuchenTLabel und untersuche die Hierarchie, was sie zu TWinControl und TControl sagt. (Ich hoffe jedenfalls, dass die Hierarchie in Deiner PE-Hilfe angezeigt wird; andernfalls müssen wir danach weitersuchen.)
4. Ändere die Typen von Variablen und Befehlszeilen, soweit erforderlich.

Alternativ kannst Du natürlich auch mit einem Haltepunkt arbeiten. Das genügt, wenn der Fehler im 2. oder 3. Durchlauf der Schleife auftritt; aber es ist lästig, wenn es erst beim 37. Durchlauf knallt.

Genereller Hinweis zu diesen Typen (das bezieht sich auch auf meinen früheren Hinweis in #5 zu var test: TJvCaptionPanel): Es empfiehlt sich immer, möglichst weit weg von TObject zu gehen, und zwar soweit, wie alle benötigten Eigenschaften direkt zur Verfügung stehen. Beispiele:

a. TLabel hat eine Eigenschaft Alignment, aber TControl nicht. Wenn Du mit dieser Eigenschaft arbeiten willst, solltest Du nicht TControl, sondern TLabel verwenden (sonst musst Du immer wieder 'as TLabel' einfügen.)

b. TWinControl enthält Controls, TControl nicht. Deshalb ist die Deklaration von test als TWinControl nicht zu beanstanden. (Wenn Du in einer anderen Situation auf eine spezielle Eigenschaft von TJvCaptionPanel zugreifen willst, solltest Du test unbedingt auch so deklarieren.)

Zusammenfassung: In der konkreten Situation ist die Deklaration von test als TWinControl ausreichend. Die Deklaration von ctl als TWinControl führte zu dem Fehler.

Alles klar? Jürgen
#D mit C# für NET, dazu Firebird
früher: Delphi 5 Pro, Delphi 2005 Pro mit C# (also NET 1.1)
Bitte nicht sauer sein, wenn ich mich bei Delphi-Schreibweisen verhaue; ich bin inzwischen an C# gewöhnt.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 22:59 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