Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Zugriffsverletzung bei zuweisung von Self (https://www.delphipraxis.net/102816-zugriffsverletzung-bei-zuweisung-von-self.html)

franktron 5. Nov 2007 13:44


Zugriffsverletzung bei zuweisung von Self
 
Delphi-Quellcode:
//Hier die Klasse
Tonl_kaltermin = class(TPanel)
   private
    Fuserid: Longint;
    Fvon: TDateTime;
    Fbis: TDateTime;
    Ftitle: String;
    procedure Setbis(const Value: TDateTime);
    procedure Setuserid(const Value: Longint);
    procedure Setvon(const Value: TDateTime);
    procedure Settitle(const Value: String);
   public
      { Public-Deklarationen }
      Constructor Create(AOwner: TComponent); override;
      Destructor Destroy; override;
   published
      property von      : TDateTime read Fvon write Setvon;
      property bis      : TDateTime read Fbis write Setbis;
      property userid : Longint read Fuserid write Setuserid;
      property title   : String read Ftitle write Settitle;

      property Width;
      property Height;
      property Top;
      property Left;
      property Visible;
      property Color;
   End;

//Hier der aufruf
FNewtermin:=Tonl_kaltermin.Create(Self);
      FNewtermin.Parent:=Self; <= Hier kommt immer ein Fehler (mit Nil gehts)
      FNewtermin.Color:=clBlack;
      FNewtermin.Left:=x;
      FNewtermin.Top:=y;
Also wenn ich den Code oben ausführe kommt immer eine Zugriffsverletzung 00000 x 00000 u.s.w.

was habe ich falsch gemacht (mit anderen Klassen gehts (z.b. TPainbox) nur mit der nicht mit TPanel gehts auch

Deep-Sea 5. Nov 2007 13:46

Re: Zugriffsverletzung bei zuweisung von Self
 
Ein Objekt kann nicht der Parent von sich selber sein ...
Oder wer ist in dem Fall Self? ^^

franktron 5. Nov 2007 13:48

Re: Zugriffsverletzung bei zuweisung von Self
 
Ist es ja auch nicht Self ist die Kombo in der ich das Panel erstellen will.
Habs schon mit Self.Name getestet

Deep-Sea 5. Nov 2007 13:51

Re: Zugriffsverletzung bei zuweisung von Self
 
Ja wo "drin" steht denn der betroffene Code? Zeig mal ein bisschen mehr ^^

franktron 5. Nov 2007 14:45

Re: Zugriffsverletzung bei zuweisung von Self
 
Delphi-Quellcode:
Tonl_kalender = class(TWinControl)
   private
    FHGColor: TColor;
      FDayColor: TColor;
    FNightColor: TColor;
    FFont: TFont;
    FOnChange: TOnChange;
      FDatum: TDate;
      FAnzTimes   : Integer;
    FHeaderHeigth : Longint;

      FPHeader   : TPanel;
      FTimeResult: TTimeResult;
      FTimeWidth    : Integer;
      FPaintda      : Boolean;
      FStartDay: TTime;
    FEndDay: TTime;
      FAktTime: TTime;
      FPaint   : TPaintBox;

      FS1,FS2   : TScrollBar;
    FHeaderColor: TColor;
    FJahr: Word;
    FUserWidth: Integer;
      FUsers: Tonl_kalusers;

      FZeitList   : TZeitList;

      FAnzTimeRec   : Longint;

      FDblBuffer   : graphics.TBitmap;
    FOnGetFeierTag: TOnGetFeierTag;
      FFeiertagFont: TFont;

      FXMark,FYMark   : Longint;
    FOnChangeTag: TOnChangeTag;
    FAktDayColor: TColor;
    FZK: TZk;
    FZKEffect: TzkEffekt;
      FTermine: Tonl_kaltermine;
      FCreateTermin: Boolean;
      FNewtermin: Tonl_kaltermin;

      procedure WMSize(var Message: TWMSize); message WM_SIZE;
      procedure WMPaint(var AMessage : TWMPaint); message wm_Paint;

    procedure SetDayColor(const Value: TColor);
    procedure SetFont(const Value: TFont);
    procedure SetHGColor(const Value: TColor);
    procedure SetNightColor(const Value: TColor);
    procedure SetOnChange(const Value: TOnChange);
      procedure SetDatum(const Value: TDate);

      Procedure SetAnzTimes;
    procedure SetTimeResult(const Value: TTimeResult);
    procedure SetEndDay(const Value: TTime);
    procedure SetStartDay(const Value: TTime);
      procedure SetAktTime(const Value: TTime);
      procedure SetOnGetFeierTag(const Value: TOnGetFeierTag);
      procedure SetFeiertagFont(const Value: TFont);

      Procedure CreateHeaders(C : TCanvas);
      Procedure CreateUsers(C : TCanvas);
      Procedure CreateView;

      procedure SetHeaderColor(const Value: TColor);
      function LinearBlendedColor(Color1, Color2: TColor; alpha: Integer): TColor;
    procedure SetUserWidth(const Value: Integer);
      procedure SetUsers(const Value: Tonl_kalusers);
      Procedure ZeichneKasten(x,y,w,h : Longint;C : TCanvas;Farbe : TColor;Style : TZk;effekt : TzkEffekt;Farbe1 : TColor=0);

      Procedure ScrollBar1Scroll(Sender: TObject; ScrollCode: TScrollCode;var ScrollPos: Integer);
      procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,   Y: Integer);
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);
    procedure FormMouseUp(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);

    procedure SetOnChangeTag(const Value: TOnChangeTag);
    procedure SetAktDayColor(const Value: TColor);
    procedure SetZK(const Value: TZk);
    procedure SetZKEffect(const Value: TzkEffekt);
    procedure SetTermine(const Value: Tonl_kaltermine);

      { Private-Deklarationen }
  protected
    { Protected-Deklarationen }
   public
      { Public-Deklarationen }
      Constructor Create(AOwner: TComponent); override;
      Destructor Destroy; override;

   published
      { Published-Deklarationen }
      property Align;

      Property HGColor      : TColor read FHGColor write SetHGColor;
      Property DayColor      : TColor read FDayColor write SetDayColor;
      Property NightColor   : TColor read FNightColor write SetNightColor;
      Property HeaderColor: TColor read FHeaderColor write SetHeaderColor;
      Property AktDayColor: TColor read FAktDayColor write SetAktDayColor;
      Property Font            : TFont read FFont write SetFont;
      Property FeiertagFont   : TFont read FFeiertagFont write SetFeiertagFont;
      Property Datum         : TDate read FDatum write SetDatum;
      Property TimeResult   : TTimeResult read FTimeResult write SetTimeResult;
      Property StartDay      : TTime read FStartDay write SetStartDay;
      Property EndDay         : TTime read FEndDay write SetEndDay;
      Property AktTime      : TTime read FAktTime write SetAktTime;
      Property Jahr            : Word read FJahr;
      Property UserWidth   : Integer read FUserWidth write SetUserWidth;
      Property ZK               : TZk read FZK write SetZK;
      Property ZKEffect      : TzkEffekt read FZKEffect write SetZKEffect;

      Property Users         : Tonl_kalusers read FUsers write SetUsers;
      Property Termine      : Tonl_kaltermine read FTermine write SetTermine;

      Property OnChange          : TOnChange read FOnChange write SetOnChange;
      Property OnGetFeierTag   : TOnGetFeierTag read FOnGetFeierTag write SetOnGetFeierTag;
      Property OnChangeTag      : TOnChangeTag read FOnChangeTag write SetOnChangeTag;

   end;


procedure Tonl_kalender.FormMouseDown(Sender: TObject;
   Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
Var
   xp,yp      : Longint;
begin
   xp:=(x-FUserWidth) DIV TimeWidth;
   yp:=(y-FHeaderHeigth) DIV TimeHeight;
   If (xp>=0) and (yp>=0) then
   Begin
      FCreateTermin:=True;
      FNewtermin:=Tonl_kaltermin.Create(Self);
      FNewtermin.Parent:=Self;
      FNewtermin.Color:=clBlack;
      FNewtermin.Left:=x;
      FNewtermin.Top:=y;
   End;
end;

constructor Tonl_kalender.Create(AOwner: TComponent);
begin
   inherited;
   FCreateTermin:=False;
   FZeitList:=TZeitList.Create;
   FPaintda:=False;
   FHGColor:=clBtnFace;
   FDayColor:=clCream;
   FNightColor:=clSkyBlue;
   FHeaderColor:=clBlue;
   FFont:=TFont.Create;
   FFont.Name:='Arial';
   FFont.Size:=10;
   FFont.Color:=clBlack;
   FFeiertagFont:=TFont.Create;
   FFeiertagFont.Name:='Arial';
   FFeiertagFont.Size:=10;
   FFeiertagFont.Color:=clRed;
  FAktDayColor:=clLime;
   FPHeader:=TPanel.Create(Self);
   FStartDay:=StrToTime('08:00');
   FEndDay:=StrToTime('18:00');
   FUserWidth:=60;
   FDatum:=Date;
   FAktTime:=Now;
   FJahr:=StrToInt(FormatDateTime('yyyy',FDatum));

   FAnzTimes:=0;
   FTimeWidth:=0;
   FTimeResult:=onltk_15min;

   With FPHeader do
   Begin
      Name:='p_header';
    Caption:='';
      Parent:=Self;<= Warum geht das hier
      Left:=0;
      Top:=0;
      Height:=20;
      Width:=Self.Width;
      Align:=alTop;
    Visible:=False;
   End;

   FS1:=TScrollBar.Create(Self);
   With FS1 do
   Begin
      Parent:=Self;
      Align:=alBottom;
      Visible:=False;
      Kind:=sbHorizontal;
    OnScroll:=ScrollBar1Scroll;
   End;

   FS2:=TScrollBar.Create(Self);
   With FS2 do
   Begin
      Parent:=Self;
      Align:=alRight;
      Visible:=False;
    Kind:=sbVertical;
   End;

   FPaint:=TPaintBox.Create(Self);
   With FPaint do
   Begin
    Parent:=Self;
      Align:=alClient;
      OnMouseMove:=FormMouseMove;
      OnMouseDown:=FormMouseDown;
    OnMouseUp:=FormMouseUp;
   End;

   FDblBuffer:=graphics.TBitmap.Create;

   FUsers:=Tonl_kalusers.Create;

    SetAnzTimes;
end;
Hier ist mehr :)

mkinzler 5. Nov 2007 14:51

Re: Zugriffsverletzung bei zuweisung von Self
 
Wie gesagt eine Komponente kann nicht ihr eigener Parent sein!
Genauso wenig wie du dein eigener Vater sein kannst.

OldGrumpy 5. Nov 2007 15:06

Re: Zugriffsverletzung bei zuweisung von Self
 
IMHO ein schönes Beispiel dafür wie man mit WITH..DO sehr ordentliches Chaos verursachen kann.

Zitat:

Zitat von franktron
Delphi-Quellcode:
With FPHeader do
Begin
  Name:='p_header';
  Caption:='';
  Parent:=Self;<= Warum geht das hier
  Left:=0;
  Top:=0;
  Height:=20;
  Width:=Self.Width;
  Align:=alTop;
  Visible:=False;
End;

Ohne das WITH..DO sähen die ersten paar Zeilen so aus:

Delphi-Quellcode:
FPHeader.Name:='p_header';
FPHeader.Caption:='';
FPHeader.Parent:=FPHeader.Self; //KABOOM durch PICNIC ;)
[...]

franktron 5. Nov 2007 15:09

Re: Zugriffsverletzung bei zuweisung von Self
 
Zitat:

Zitat von mkinzler
Wie gesagt eine Komponente kann nicht ihr eigener Parent sein!
Genauso wenig wie du dein eigener Vater sein kannst.

Komm ich nun ducheinander ??

Also mein denken.

Ich habe ein Kombo z.b. TMutter in der Erstelle ich TKind dann muss der Parent von TKind doch TMutter sein und nicht TGrossmutter oder ??

Deep-Sea 5. Nov 2007 15:10

Re: Zugriffsverletzung bei zuweisung von Self
 
Zitat:

Zitat von OldGrumpy
IMHO ein schönes Beispiel dafür wie man mit WITH..DO sehr ordentliches Chaos verursachen kann.

Zitat:

Zitat von franktron
Delphi-Quellcode:
With FPHeader do
Begin
  Name:='p_header';
  Caption:='';
  Parent:=Self;<= Warum geht das hier
  Left:=0;
  Top:=0;
  Height:=20;
  Width:=Self.Width;
  Align:=alTop;
  Visible:=False;
End;

Ohne das WITH..DO sähen die ersten paar Zeilen so aus:

Delphi-Quellcode:
FPHeader.Name:='p_header';
FPHeader.Caption:='';
FPHeader.Parent:=FPHeader.Self; //KABOOM durch PICNIC ;)
[...]

An der Stelle geht es ja. FPHeader.Self gibt es nicht. Und Self ist auch nicht FPHeader ...

franktron 5. Nov 2007 15:14

Re: Zugriffsverletzung bei zuweisung von Self
 
Die stelle geht doch das ist ja gerade das lustige.

Aber wenn ich

Delphi-Quellcode:
FNewtermin:=Tonl_kaltermin.Create(Self);
      FNewtermin.Parent:=Self;
Mach dann knalltes

Deep-Sea 5. Nov 2007 15:17

Re: Zugriffsverletzung bei zuweisung von Self
 
Vlt. klappt schon das Create nicht, und Delphi zeigt fälschlicher Weise auf die nächste Zeile (ich kenn sowas zu genüge) ?!
Ansonsten wie immer: Nimm immer mehr raus, bis du den Fehler findest

Nuclear-Ping 5. Nov 2007 15:18

Re: Zugriffsverletzung bei zuweisung von Self
 
Das ist die Stelle, wo er einen neuen Termin anlegt:
Delphi-Quellcode:
procedure Tonl_kalender.FormMouseDown(Sender: TObject;
   Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
Var
   xp,yp     : Longint;
begin
   xp:=(x-FUserWidth) DIV TimeWidth;
   yp:=(y-FHeaderHeigth) DIV TimeHeight;
   If (xp>=0) and (yp>=0) then
   Begin
      FCreateTermin:=True;
      FNewtermin:=Tonl_kaltermin.Create(Self);
      FNewtermin.Parent:=Self;
      FNewtermin.Color:=clBlack;
      FNewtermin.Left:=x;
      FNewtermin.Top:=y;
   End;
end;
Das Self bezieht sich hier auf Tonl_kalender, er hat auch kein with ... do drin. Ich vermute der Fehler kommt daher, weil Tonl_kalender vom Typ TWinControl ist. Warum kann ich nicht sagen, ist aber so beim drüberblicken das einzig nachvollziehbare. Warum leitest du von TWinControl ab?

DeddyH 5. Nov 2007 15:19

Re: Zugriffsverletzung bei zuweisung von Self
 
Was ist denn Tonl_kaltermin für ein Objekt?

Deep-Sea 5. Nov 2007 15:20

Re: Zugriffsverletzung bei zuweisung von Self
 
Zitat:

Zitat von DeddyH
Was ist denn Tonl_kaltermin für ein Objekt?

Delphi-Quellcode:
Tonl_kaltermin = class(TPanel)
Siehe erstes Post ;)

franktron 5. Nov 2007 15:23

Re: Zugriffsverletzung bei zuweisung von Self
 
Zitat:

Zitat von DeddyH
Was ist denn Tonl_kaltermin für ein Objekt?

Steht im 1. Thread

Ich hab jetzt mal zum testen TOnl_kalender von TCostumPanel abgeleitet, gleicher Effect es muss amTonl_termin liegen mit TPanel gehts nämlich.

Aber was ????


P.S. ich hasse Kombo Entwicklung :wall:

mkinzler 5. Nov 2007 15:28

Re: Zugriffsverletzung bei zuweisung von Self
 
IMHO hat ein TWinControl keinen Parent

franktron 5. Nov 2007 15:47

Re: Zugriffsverletzung bei zuweisung von Self
 
Ich habs

Delphi-Quellcode:
constructor Tonl_kaltermin.Create(AOwner: TComponent);
begin
   inherited; << Das wahr nicht da :wall:  :wall:  :wall:  :wall:
   //
end;

Nuclear-Ping 5. Nov 2007 15:48

Re: Zugriffsverletzung bei zuweisung von Self
 
Hihi :thumb: Das sind immer die geilsten Fehler ...

Deep-Sea 5. Nov 2007 15:50

Re: Zugriffsverletzung bei zuweisung von Self
 
Zitat:

Zitat von franktron
Ich habs

Delphi-Quellcode:
constructor Tonl_kaltermin.Create(AOwner: TComponent);
begin
   inherited; << Das wahr nicht da :wall:  :wall:  :wall:  :wall:
   //
end;

Hab ich's nicht gesagt? :P


Zitat:

Zitat von mkinzler
IMHO hat ein TWinControl keinen Parent

Das wäre ja schrecklich, wenn es so wäre :shock:


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:16 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