![]() |
Leidiges EAccessViolation bei dynamischer TabSheet-Erzeugun
Salü,
folgender Code
Delphi-Quellcode:
Es geht also um dynamische TabSheet Erzeugung, in Abhängigkeit des Wertes von nTemp.
SetLength(TabSheetCCDiagramsArray, CD.nTemp);
SetLength(FrameCCDiagramArray, CD.nTemp); // create and setup diagrams For j:=0 To Pred(CD.nTemp) Do Begin // 1. create, setup tab sheet TabSheetCCDiagramsArray[j] := TTabSheet.Create(self); TabSheetCCDiagramsArray[j].PageControl := PageControlCCDiagrams; TabSheetCCDiagramsArray[j].Caption := CD.TempStr(j); TabSheetCCDiagramsArray[j].Name := 'TabSheet'+IntToStr(j); [...] PageControl ist ein normales Formularelement des Frames, in dem diese Prozedur stattfindet. Er wirft ein EAccessViolation Error. Ihm gefällt die Zuweisung des PageControlCCDiagrams als Parent für den TabSheet nicht. Woran könnte das liegen? |
Re: Leidiges EAccessViolation bei dynamischer TabSheet-Erze
Wo tritt der Fehler auf?
|
Re: Leidiges EAccessViolation bei dynamischer TabSheet-Erze
Er markiert diese Zeile
Delphi-Quellcode:
als Fehlerursache. Wenn ich sie auskommentiere, tritt der Fehler nicht auf.
TabSheetCCDiagramsArray[j].PageControl := PageControlCCDiagrams;
|
Re: Leidiges EAccessViolation bei dynamischer TabSheet-Erze
Zitat:
Mach mal vor der Zugeisung des PageControl noch folgendes:
Delphi-Quellcode:
TabSheetCCDiagramsArray[j].Parent := PageControlCCDiagrams;
|
Re: Leidiges EAccessViolation bei dynamischer TabSheet-Erze
Tat ich... jetzt frißt er ebendiese Zeile nicht:
Delphi-Quellcode:
TabSheetCCDiagramsArray[j].Parent := PageControlCCDiagrams;
|
Re: Leidiges EAccessViolation bei dynamischer TabSheet-Erze
An welcher Adresse kommt die AV? Ist es auch wirklich genau der Quellcode den du da gepostet hast? Könntest du eventuell die ganze Funktion posten?
|
Re: Leidiges EAccessViolation bei dynamischer TabSheet-Erze
Zitat:
Die Funktion:
Delphi-Quellcode:
Procedure TFrameCCDiagrams.AddTabSheets;
Var j:Integer; Begin // destroy greeting message; overlapped by diagrams { // dec. 14 objectExists := (LabelNoDataLoaded is TLabel); if objectExists then LabelNoDataLoaded.Free; } // setup array lengths, depending on no. of diff't temperatures SetLength(TabSheetCCDiagramsArray, CD.nTemp); SetLength(FrameCCDiagramArray, CD.nTemp); // create and setup diagrams For j:=0 To Pred(CD.nTemp) Do Begin // 1. create, setup tab sheet TabSheetCCDiagramsArray[j] := TTabSheet.Create(self); TabSheetCCDiagramsArray[j].Parent := PageControlCCDiagrams; TabSheetCCDiagramsArray[j].PageControl := PageControlCCDiagrams; TabSheetCCDiagramsArray[j].Caption := CD.TempStr(j); TabSheetCCDiagramsArray[j].Name := 'TabSheet'+IntToStr(j); // 2. create, setup CC container frame FrameCCDiagramArray[j] := TFrameCCDiagram.Create(Self); FrameCCDiagramArray[j].Parent := TabSheetCCDiagramsArray[j]; FrameCCDiagramArray[j].Name := 'CCFrame'+IntToStr(j); FrameCCDiagramArray[j].Top := 10; FrameCCDiagramArray[j].Left := 10; FrameCCDiagramArray[j].Height := TabSheetCCDiagramsArray[j].Height-5; FrameCCDiagramArray[j].Width := TabSheetCCDiagramsArray[j].Width -20; FrameCCDiagramArray[j].TIndex := j; // 3. create and setup diagrams within diagram container frames FrameCCDiagramArray[j].CreateDiagram; ShowData(j); // immer zuerst logarithmisch darstellen FrameCCDiagramArray[j].CCDiagram.AutoMinMax; FrameCCDiagramArray[j].CCDiagram.GF3 := False; FrameCCDiagramArray[j].CCDiagram.EpmLocked := False; FrameCCDiagramArray[j].CCDiagram.F1mLocked := False; FrameCCDiagramArray[j].CCDiagram.ValidResults := False; FrameCCDiagramArray[j].CCDiagram.Busy := False; FrameCCDiagramArray[j].CCDiagram.Abort := False; End; End; |
Re: Leidiges EAccessViolation bei dynamischer TabSheet-Erze
Dann würde ich doch mal spontan tippen das PageControlCCDiagrams zum Zeitpunkt der Zuweisung = nil ist
|
Re: Leidiges EAccessViolation bei dynamischer TabSheet-Erze
Der scheint tatsächlich
Delphi-Quellcode:
zu sein, zumindest versagt er bei
nil
Delphi-Quellcode:
Links in der IDE schreibt er für das ganze 'self' ebenfalls
writeln(PageControlCCDiagrams.Name);
Delphi-Quellcode:
, und für alle Objekte den Wert
nil
Delphi-Quellcode:
. Für den Schleifenzähler
^nicht verfügbarer Wert.
Delphi-Quellcode:
schreibt er 0.
j
|
Re: Leidiges EAccessViolation bei dynamischer TabSheet-Erze
Dieser Fehler wurde jetzt behoben. Es musste einfach eine "createte" Instanz vom Frame, das diese Funktion beherbergt, benutzt werden.
Die Jagd geht aber weiter ... diesmal nach einem EInvalidPointer :zwinker: |
Re: Leidiges EAccessViolation bei dynamischer TabSheet-Erze
Neue Frage -> Neuer Thread :-D
In der Erklärung des neuen Threads kannst du ja auf diesen hier verlinken damit die Leute wissen worum es geht. |
Re: Leidiges EAccessViolation bei dynamischer TabSheet-Erze
Hallo,
habe mir die ganze Sache mal durchgelesen. Ich habe auch große Probleme mit undefinierten Fehlermeldungen. Kann es sein, das Delphi 7 Probleme mit 'self' hat ? Ich Erzeuge auch einige Objekte mit dem Parameter 'self'. Ich bekomme bei einigen Kunden Fehlermeldungen beim Starten meines Progs. Wenn ich in Delphi zu der Adresse des Laufzeitfehlers gehe, springt er in die Unit System zur Procedure:
Delphi-Quellcode:
procedure TObject.Free;
begin if Self <> nil then Destroy; end; |
Re: Leidiges EAccessViolation bei dynamischer TabSheet-Erze
Die Frage hast du doch nun schon in einem anderen Thread gestellt :gruebel:
Grundlegend gibt es bei keiner Delphi Version die ich benutze/benutzt habe (D3, D4, D5, D6, D7 und D10) habe ich jemals Probleme mit Self gehabt. Wenn es eine AV in der von dir genannten Stelle gab, dann war immer eine ungültige Referenz der Auslöser. Entweder wurde ein Objekt freigegeben und die Instanzenvariable nicht Nil gesetzt (wie mkinzler im anderen Thread schon sagte). Eine andere Möglichkeit ist, die Instanz wurde in mehreren Variablen abgelegt und eine davon wurde freigegeben, damit wird die anderen unbemerkt ungültigt. Beispiel dazu:
Delphi-Quellcode:
Ein anderer Fall: Die Instanz wurde durch den Owner schon freigegeben: Beispiel: eine Variable TPanel welche ein Panel zugewiesen wurde und als Owner wurde eine Form übergeben. Wenn die Form freigegeben wird, gibt diese auch die TPanel Instanz frei und die Variable enthalt dann eine ungültige Instanz. Auch hier würde im besten Falle eine AV beim Free ausgelöst werden.
Var
lInstanz, lGleicheInstanz: TObject; Begin lInstanz := TObject.Create; lGleicheInstanz := lInstanz; // beide Variablen enthalten die gleiche Instanz und [b]keine Kopie[/b]! lInstanz.Free; // damit wird lGleicheInstanz automatisch mit ungültig! End; Grundlegend sollte Self immer gut sein. Wenn in einer Methode Self NIL ist, dann befindet man sich in einer Methode einer nicht instanziierten Klasse. Dieses kann auch leicht geschehen, wenn man einen virtuellen Constructor versteckt und einen neuen implementiert (Compiler Warnung kann ja mit ReIntroduce unterdrückt werden) und die Klasse aber über die Basisklasse instanziiert wird. |
Re: Leidiges EAccessViolation bei dynamischer TabSheet-Erze
Wenn im Constructor eine Exception fliegt wird die Klasse auch sofort wieder zerstört was erklären würde das du in der Methode "free" landest.
|
Re: Leidiges EAccessViolation bei dynamischer TabSheet-Erze
Zitat:
|
Re: Leidiges EAccessViolation bei dynamischer TabSheet-Erze
Sorry Leute. Ich habe festgestellt, das es an meiner Delphi Installation liegt.
Ich habe Delphi neu installiert. Wenn ich jetzt Delphi starte, habe ich keine Komponenten drin. Und wenn ich es dann beende, bekomme ich genau das Debug Fenster, wie meine Anwender auch... |
Re: Leidiges EAccessViolation bei dynamischer TabSheet-Erze
Keine Komponenten? Kann es sein, dass du Delphi unter einem anderen Benutzerkonto installiert hast als dem Konto in dem du es jetzt ausführst?
|
Re: Leidiges EAccessViolation bei dynamischer TabSheet-Erze
Ne. Hab ich nicht. Ich hatte Delphi installiert, und ohne es ein mal zu starten die Jedis installiert. Ich denke das der Fehler daher kommt.
Bin grade am neu installieren... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:14 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz