![]() |
AV bei frmSettings.ComponentCount
Ich bekomme eine AV in dieser Zeile:
Delphi-Quellcode:
Code:
for i := 0 to frmSettings.ComponentCount - 1 do begin
Delphi-Quellcode:
So sieht sie aus:
procedure TfrmSettings.FormCreate(Sender: TObject);
var Ini, Skin : TIniFile; s : String; BackgrndFade : TColor; i : Integer; begin Ini := TIniFile.Create(ExtractFilePath(application.exename) + 'settings.ini'); try s := Ini.ReadString('Settings', 'Skin', ExtractFilePath(Application.ExeName) + 'skins\blue.dpsf'); finally Ini.Free; end; if FileExists(s) then begin Skin := TIniFile.Create(s); try for i := 0 to frmSettings.ComponentCount - 1 do begin <:=-------- Diese Zeile if frmSettings.Components[i] is TXiPanel then begin (frmSettings.Components[i] as TXiPanel).ColorFace := StringToColor(Skin.ReadString('Backgrnd', 'Face', '$00FE9741')); if (frmSettings.Components[i] as TXiPanel).Name <> 'xiBg' then (frmSettings.Components[i] as TXiPanel).ColorGrad := StringToColor(Skin.ReadString('Backgrnd', 'Face', '$00FE9741')) else xiBg.ColorGrad := StringToColor(Skin.ReadString('Backgrnd', 'Grad', 'clSkyBlue')); end; end; { BackgrndFade := StringToColor(Skin.ReadString('Backgrnd', 'Face', '$00FE9741')); xiBg.ColorFace := BackgrndFade; // xiInUse.ColorFace := BackgrndFade; // xiInUse.ColorGrad := BackgrndFade; // xiSets.ColorFace := BackgrndFade; //xiSets.ColorGrad := BackgrndFade; xiBg.ColorGrad := StringToColor(Skin.ReadString('Backgrnd', 'Grad', 'clSkyBlue'));} lSkinName.Caption := Skin.ReadString('Skin', 'Name', '<unnamed>'); finally Skin.Free; end; eSkinPath.Text := s; end else begin lSkinName.Caption := 'Blue'; eSkinPath.Text := ExtractFilePath(Application.ExeName) + 'skins\blue.dpsf'; Showmessage('Skinfile not found!'); end; end;
Code:
---------------------------
Debugger Exception Notification --------------------------- Project DarkPlayerII.exe raised exception class EAccessViolation with message 'Access violation at address 0041A778 in module 'DarkPlayerII.exe'. Read of address 00000010'. Process stopped. Use Step or Run to continue. --------------------------- OK Help --------------------------- |
Re: AV bei frmSettings.ComponentCount
Hallo,
lass das frmSettings mal komplett weg. Wahrscheinlicb erzeugst du dein Formular ohne diese Variable. Die wäre dann NIL, und damit bekommst du dann deine Schutzverletzung. Heiko |
Re: AV bei frmSettings.ComponentCount
Zitat:
Delphi-Quellcode:
liegt das vielleicht daran?
with TfrmSettings.Create(self) do
[edit] Also so funktionierts (mit weglassen), aber warum funktionierts nicht andersherum?[/edit] |
Re: AV bei frmSettings.ComponentCount
Ja. Wenn dann Self.xyz, aber nicht aus der Klasse auf die globale Variable zugreifen, die eigentlich das Objekt selbst beinhalten sollte (oder es wie hier eben nicht tut ^^) ;)
@edit: weil du die globale Variable frmSetting nicht belegst, sondern nur den Konstruktor usführt, und du somit nur auf zwei Wege auf das Objekt zugreifen kannst: 1. innerhalb der Klasse z.B. mit Self und 2. innerhalb des with Blicks. |
Re: AV bei frmSettings.ComponentCount
Also statt self USettings.TfrmSettings ?
|
Re: AV bei frmSettings.ComponentCount
NEIN :wall:
Also: statt
Delphi-Quellcode:
das:
frmSettings.ComponentCount
Delphi-Quellcode:
da frmSettings nicht belegt ist. Da man das Self auch weglassen kann, geht es auch einfach so:
Self.ComponentCount
Delphi-Quellcode:
Jetzt alles ok?
ComponentCount
|
Re: AV bei frmSettings.ComponentCount
Ja das ist schon klar... Ich meinte beim Create!
|
Re: AV bei frmSettings.ComponentCount
Aso ... das ist ein anderes Paar Schuhe ...
wenn du es so erzeugst:
Delphi-Quellcode:
dann ist das Objekt, in dessen Methode dies geschieht, der Oner. der Owner gibt das Objekt wieder frei. Der Owner ist über die Property Owner abrufbar.
with TfrmSettings.Create(self) do
Die globale Variable frmSettings hat nix damit zu tun. Du könntest die Variable auch entfernen, dann hast du solche Probleme nichtmehr :stupid: |
Re: AV bei frmSettings.ComponentCount
Ich habe nur gefragt, weil es ja diese zuweisung bei "application.CreateForm(X,Y)" gibt. Aber okay :D Ich frag mich gerade wozu man die überhaupt braucht...
|
Re: AV bei frmSettings.ComponentCount
Hallo,
das Application.CreateForm erzeugt die Forms schon beim Start des Programms (FormCreate wird also für jedes Form schon erzeugt). Vorteil: Die Forms können mit FormVar.ShowModal oder .Show sofort (schnell) angelegt werden. Nachteil: Deer Start dauert länger, Ressourcen werden verbraten. Bei mir wird nur das Hauptform erzeugt. Die globalen FormVars lösche ich. Forms erzeuge ich immer in der folgenden Art:
Delphi-Quellcode:
Die Variable ist hier unnütz, aber oft übergebe ich den Forms ja noch was
procedure ExecuteForm_PEP__Main(AnOwner: TComponent);
var Form: TForm_PEP__Main; begin try Form:= TForm_PEP__Main.Create(AnOwner); try Form.ShowModal; finally Form.Free; end; except on E: Exception do MBError(E.message); end; end; und speichere das in einer internen Form-Variable. Heiko [edit=SirThornberry]Delphi-Tags ergänzt - nächstes mal bitte selbst machen - Mfg, SirThornberry[/edit] |
Re: AV bei frmSettings.ComponentCount
Zitat:
|
Re: AV bei frmSettings.ComponentCount
Zitat:
Delphi-Quellcode:
kann jederzeit verwendet werden und stellt normalerweise neben
Application.CreateForm(...)
Delphi-Quellcode:
die einzigste vernünftige Weise dar, eine Form auf eine normale Weise zu erstellen (d.h. auch füllen der Variable MeineForm, damit man über die den Zugriff drauf hat). Beide Befehle können aber jederzeit ausgeführt werden!
MeineForm := TMeinForm.Create(...)
|
Re: AV bei frmSettings.ComponentCount
Hi,
der Routine stammt ja aus der Unit mit dem frmSettings-Formular. D.h. er braucht das Formular nicht erzeugen. :zwinker: Das Problem ist vielmehr, dass du, xZise, im OnCreate auf die Komponenten zugreifen willst. Das kann schonmal nicht funktionieren, da ja beim Erzeugen des Formulars die ganzen Komponenten, die auf dem Formular liegen, noch gar nicht erzeugt sind. Lager das, was du jetzt im OnCreate stehen hast, in's OnShow aus und dann sollte es funktionieren. Chris |
Re: AV bei frmSettings.ComponentCount
Zitat:
|
Re: AV bei frmSettings.ComponentCount
Jap alias:
Alle Ereignisse in OI (OnCreate / OnShow/ OnChange/ OnMouseDown etc.) sind immer die letzten in der Schlange. D.h. davor wird alles andere nötige (createn, zeichen/anzeigen, ändern, kA ^^ etc.) ausgeführt... Du bist sozusagen letzter :D Wenn ich schon was vor dem create machen will dann muss ich das so machen:
Delphi-Quellcode:
{*} Es geht zwar auch ohne, also nur inherited, aber manchaml auch wieder nicht (*gg*)
contructor TfrmSettings.Create(AOwner : TComponent);
begin {do stuff} inherited Create(AOwner) {*} end; |
Re: AV bei frmSettings.ComponentCount
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:23 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