Einzelnen Beitrag anzeigen

mrmoe

Registriert seit: 15. Jul 2005
13 Beiträge
 
#2

Re: Access Violation beim Entfernen aus verketteter Liste

  Alt 17. Aug 2005, 11:12
ich habs (hoffe ich zumindest ) falsch gedacht s. unten

der fehler lag beim anlegen der objekte(panels), dies geschah über eine onClick-Routine einer comboBox:

Delphi-Quellcode:
procedure TForm2.ComboBox1Click(Sender: TObject);
var lab: TLabel;
    cb: mycb;
    pan: myPanel;
    img: myImg;
begin
 lab:=TLabel.create(Form1);
 cb:=mycb.Create(Form1);
 pan:=myPanel.Create(Form1);
 img:=myImg.Create(Form1);

 pan.Visible:=true; pan.Color:= clSilver;
 pan.Width:=350;
 pan.Height:=40;
 pan.Left:=20;
 pan.BevelInner:=bvRaised;
 pan.BevelOuter:=bvLowered;

 // erstes erzeugen ------------
 if form1.letztes=nil then begin
  pan.parentPanel:=nil;
  pan.childPanel:=nil;
  form1.letztes:=pan;
  pan.Top:=50;
 end
 // weitere erzeugen -----------
 else begin
   pan.parentPanel:=form1.letztes;
   pan.childPanel:=nil;
   form1.letztes.childPanel:=pan;
   pan.Top:=form1.letztes.Top+form1.letztes.height+10;
   form1.letztes:=pan;
 end;

/// schnipp - etc. ...
end;
es muss aber lauten:

lab:=TLabel.create(self);
cb:=mycb.Create(self);
pan:=myPanel.Create(self);
img:=myImg.Create(self);

ich dachte das in Klammern hinter Create steht für das Parent-Objekt, und da die Panels auf Form1 kommen sollen hatte ich eben Form1 statt self drinstehn. ich sag nur:

naja jetzt gehts wie gesagt, viell. hilfts ja mal jemanden weiter


///////////////////////-----------------/////////////////////
mist Doch zu früh gefreut, jetzt bekomme ich immer nachdem ich mehr als 10 elemente aus der liste lösche bei einigen einen EAbstract Error der vorher nicht kam.
Ich hab schonmal danach gegoogelt und alles was ich finden konnte war dass der auftritt wenn man abstrakte methoden verwendet. bloss bitt wo mach ich das (der abstrakte fehler kommt immer beim self.destroy des panels)

hier nochmal der angepasste Quelltext
Delphi-Quellcode:
procedure myPanel.remove_it();
begin
         //einziges Element ?
         if (self.parentPanel = nil) and (self.childPanel = nil) then
         begin
          form1.letztes:=nil;
          self.move(self.Height*(-1)-10);
         end
         //erstes Element ?
         else if self.parentPanel=nil then
         begin
          self.childPanel.parentPanel:=nil;
          self.childPanel.move(self.Height*(-1)-10);
         end
         //letztes Element ?
         else if self.childPanel=nil then
         begin
          self.parentPanel.childPanel:=nil;
          form1.letztes:=self.parentPanel;
          self.move(self.Height*(-1)-10);
         end
         //mittel Element ?
         else if (self.childPanel <> nil) and (self.parentPanel <> nil) then
         begin
          self.parentPanel.childPanel:=self.childPanel;
          self.childPanel.parentPanel:=self.parentPanel;
          self.childPanel.move(self.Height*(-1)-10);
         end;

       self.comboBox.Items.Add(self.filterName);
       if self.comboBox.Items.count=1 then self.combobox.visible:=true;
       self.destroy; <------ hier kommt der fehler (aber nicht bei allen)
end;
Ich hab auch mal in den definitionen der geerbten TPanel-Klasse nachgeschaut und auch in der TCustomControl noch eine Ebene höher, aber nirgends eine abstrakte Methode zu finden die ich erst überschreiben müsste...

kann irgendwer helfen ????
  Mit Zitat antworten Zitat