AGB  ·  Datenschutz  ·  Impressum  







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

AccessViolation bei TLabel.Create(nil)

Ein Thema von diComm · begonnen am 26. Aug 2009 · letzter Beitrag vom 1. Sep 2009
Antwort Antwort
Seite 1 von 2  1 2      
diComm

Registriert seit: 26. Jan 2005
68 Beiträge
 
#1

AccessViolation bei TLabel.Create(nil)

  Alt 26. Aug 2009, 08:48
Hallo

Vornweg, ich arbeite mit Delphi 2007 auf Windows XP.

Ich habe einen ziemlich eigenartigen Fehler und komme nicht weiter.
Ich fülle eine TScrollBox zur Laufzeit mit TPanels auf denen je 6 TLabels sind. Dies hat vor kurzem wunderbar geklappt (die letzten ca 3 Jahre...) doch seit einer Weile erhalte ich eine AccessViolation beim erstellen eines Labels.

Das intressante ist, es ist nicht immer dasselbe Label und bis jetzt nie schon beim ersten. Der Fehler kommt zB beim zweiten Label auf dem dritten Panel.

Ich habe es schon mit verschiedenen Owner probiert (nil, Self, das Panel, Application), habe diverse Application.ProcessMessages verteilt (hat den Fehler etwas nach hinten geschoben, aber nicht behoben...) und habe verschiedene Workarounds Probiert (DuplicateComponents aus der Unit uClone, ebenfalls seit Jahren erfolgreich im Einsatz, bei mir gibts jetzt aber einen Hänger, steht komplett still...)

Hat jemand schon mal sowas erlebt? Ich kann mir schonmal nicht vorstellen, wie ein TLabel.Create(nil) eine AccessViolation hervorruft...

Danke schonmal
Gruss
Tom
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.477 Beiträge
 
Delphi 12 Athens
 
#2

Re: AccessViolation bei TLabel.Create(nil)

  Alt 26. Aug 2009, 09:18
Das hört sich an, als wenn der Speichermanager an anderer Stelle zerschossen wurde.

Owner der Steuerelemente ist üblicherweise das Formular.
  Mit Zitat antworten Zitat
diComm

Registriert seit: 26. Jan 2005
68 Beiträge
 
#3

Re: AccessViolation bei TLabel.Create(nil)

  Alt 26. Aug 2009, 09:33
In meiner verzweiflung habe ich es mit verschiednen Owner probiert, das war das einzige wo ich mir eine accessViolation vorstellen konnte...

Wie könnte ich das mit dem Speichermanager prüfen? alles andere funktioniert, andere Forms, die über den Designer gestaltet sind und nicht mit eigenen Creates funktionieren ohne ersichtliche Fehler.
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.477 Beiträge
 
Delphi 12 Athens
 
#4

Re: AccessViolation bei TLabel.Create(nil)

  Alt 26. Aug 2009, 10:58
Leider gibt es dafür keine einfache Lösung, da hilft nur sauber zu Programmieren.
Beliebte Ursachen:
- Zugriffe über Arraygrenzen hinaus
- Pointer auf Arrayelemente und Änderung der Arraygröße
- Pointer auf Elemente die bereits freigegeben wurden
- Objektvariablen die auf Objekte verweisen die freigegeben wurden (insbesondere Elemente von TObjectList)
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: AccessViolation bei TLabel.Create(nil)

  Alt 26. Aug 2009, 11:02
Etwas Code würde die Fehleranalyse ungemein vereinfachen
Markus Kinzler
  Mit Zitat antworten Zitat
diComm

Registriert seit: 26. Jan 2005
68 Beiträge
 
#6

Re: AccessViolation bei TLabel.Create(nil)

  Alt 26. Aug 2009, 11:14
hmm... kann eigentlich alle 4 Punkte mit ziemlicher Sicherheit ausschliessen.
Würde dann der Fehler nicht sowieso beim Zugriff auf das nichtvorhandene Objekt auftreten?
Der Fehler kommt eben leider genau auf dem Create eines Labels, und dass, nachdem der Befehl vorher schon ein paarmal funktioniert hat in einer Schleife, wo auch alle andern Befehele vorher schon mehrmals ohne Fehler durchlaufen...

Aber danke trotzdem


Hier der Code

Delphi-Quellcode:
function TLohnartsForm.PushPanel(AScrollBox : TScrollBox): TPanel;

  function getNewPanel(aParent : TScrollBox) : TPanel;
  var
    i : integer;
    aLabel : TLabel;
  begin
    Result := TPanel.Create(nil);
    With Result Do
    Begin
      Name := Format('Panel_%s_%d',[AScrollBox.Name,AScrollBox.ControlCount]);
      Caption := '';
      Parent := Self;
      Left := 8;
      Top := 312;
      Width := 425;
      Height := 25;
      TabOrder := 2;
      Visible := False;
    End; { With }
    For i := 0 To 5 Do
    Begin
      Try
        aLabel := TLabel.Create(Result);
      Except
        Break;
      End;

      With aLabel Do
      Begin
        Name := Format('Label_%s_%d_%d',[AScrollBox.Name,AScrollBox.ControlCount,i]);
        Left := getLeft(i);
        Top := 6;
        Width := 44;
        Height := 13;
        Parent := Result;
        If AScrollBox.ControlCount = 0 Then
        Begin
          Caption := getCaption(i);
          Font.Charset := DEFAULT_CHARSET;
          Font.Color := clWindowText;
          Font.Height := -11;
          Font.Name := 'Tahoma';
          Font.Style := [fsBold];
          ParentFont := False;
        End
        Else
        Begin
          Caption := '---';
        End; { If }
      End; { With }
    End; { For }
  end;

var
  I : Integer;
begin
  //Application.ProcessMessages;
  Result := getNewPanel(AScrollBox);

  With Result Do
  Begin
    Parent := AScrollBox;
    Height := Item_Height;
    Top := AScrollBox.ControlCount * Height;
    Align := alTop;
    Visible := True;
    ParentBackground := False;

    For I := 0 To Pred(ControlCount) Do
    Begin
      With Controls[I] Do
      Begin
        Top := (Result.Height - Controls[I].Height) Div 2;
        AutoSize := False;
        If I = 0 Then
        Begin
          Width := AScrollBox.ClientWidth - (5 *
            (Item_Text_Width + Item_Margin)) - (Item_Margin * 3);
          Anchors := [akTop,akLeft,akRight];
          Left := Item_Margin;
        End
        Else
        Begin
          Left := ((AScrollBox.ClientWidth - Item_Margin) -
            ((ControlCount - I) * (Item_Text_Width + Item_Margin)));
          Width := Item_Text_Width;
          Anchors := [akTop,akRight];
        End; { Else }
      End; { With }
    End; { For }
  End; { With }
end;
Die Methode wird in eriner Schleife aufgerufen.
Der Fehler tritt in der Zeile aLabel := TLabel.Create(Result); auf, allerdings nicht im ersten durchgeng der For schleife... und auch nciht, wenn ich die ganze Methode das erste mal aufrufe, erst im dritten mal.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: AccessViolation bei TLabel.Create(nil)

  Alt 26. Aug 2009, 11:16
Die geschachtelten withs sind m.E. sehr gefährlich
Markus Kinzler
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#8

Re: AccessViolation bei TLabel.Create(nil)

  Alt 26. Aug 2009, 11:19
Wie räumst du die Elemente wieder ab? Gibst du neben den Panels auch die darauf enthaltenen Labels einzeln frei?
  Mit Zitat antworten Zitat
diComm

Registriert seit: 26. Jan 2005
68 Beiträge
 
#9

Re: AccessViolation bei TLabel.Create(nil)

  Alt 26. Aug 2009, 11:27
Habs mal ohne die Geschlachteleten Withs probiert... selber Fehler, daran liegts nicht

Die Panels lösche ich so

Delphi-Quellcode:
procedure TLohnartsForm.DeletePanels(AScrollBox : TScrollBox);
begin
  While AScrollBox.ControlCount > 0 Do
  Begin
    AScrollBox.RemoveControl(AScrollBox.Controls[AScrollBox.ControlCount-1]);
  End; { While }
end;
Ich habs aich mit .Free probiert, aber eben, der Fehler kommt bevor ich diese Zeilen ausführen kann.

Die Labels räume ich nicht separat ab. Da ich als Owner den Panel habe, denke ich, das es ohne gehen sollte... aber soweit komme ich ja gar nicht.
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#10

Re: AccessViolation bei TLabel.Create(nil)

  Alt 26. Aug 2009, 11:35
Hallo,

ich würde erst mal das Result durch eine lokale Variable ersetzen,
und dann, du musst du leider durch

- alles auskommentieren, bis der Fehler nicht mehr kommt
vor allem auch nachfolgenden Code (For I := 0 To Pred(ControlCount) Do )
- schrittweise wieder reinnehmen
testen, testen ...


Heiko
Heiko
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 08:00 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