Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Zugriffsverletzung bei umgebogen Parent des Fensters (https://www.delphipraxis.net/159370-zugriffsverletzung-bei-umgebogen-parent-des-fensters.html)

Piethan 24. Mär 2011 23:04

Delphi-Version: XE

Zugriffsverletzung bei umgebogen Parent des Fensters
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Zusammen,

ich erstelle z.Z. eine Anwendung, wo ich bei einem TForm ein TabSheet als Parent angegeben habe. So erhalte ich ein
Fenster welches sich innerhalb des TabSheet bewegen lässt.

Greife ich nun aber vom diesem Fenster auf ein Controll innerhalb des Tabsheets, welches eben falls aus einen TFrom besteht
zu, so erhalte ich eine Zugriffsverletzung, die Showmessage wird aber noch ausgeführt.

Code:
Exception-Klasse EAccessViolation mit Meldung 'Zugriffsverletzung bei Adresse 007569C4 in Modul 'client.exe'
Hier binde ich das erste TForm in das erste TabSheet ein.

Delphi-Quellcode:
unit mainfrm;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DBXDataSnap, DBXCommon, DB, SqlExpr, DBClient, DSConnect, Grids,
  DBGrids, midas, ExtCtrls, NxCollection, ComCtrls, Menus, VirtualTrees,
  frmgetGastroOrder, NxPageControl;

[...]

var
  Form14: TForm14;
  pagesArry: array of THandle;
implementation
uses dm_user, frmtest, dbselectfrm;

[...]

procedure TForm14.Btn1Click(Sender: TObject);
var
  frmmeintest: Tfrm_Test;
begin
  frmmeintest:= Tfrm_Test.Create(sheet1);
  frmmeintest.Parent:= sheet1;
  sheet1.Glyph.Assign(frmmeintest.Icon);
  sheet1.Caption:=frmmeintest.Caption;
  frmmeintest.Height:=sheet1.Height;
  frmmeintest.Width:= sheet1.Width;
  frmmeintest.Show;
  SetLength(pagesArry, pgcMain.PageCount);
  pagesArry[0]:=frmmeintest.Handle; // Wollte dort die Handle der Forms sammeln, um diese über das wm_close zu informieren
  pgcMain.ActivePageIndex:=0;
end;
Hier erstelle ich das zweite TForm, welches auch angezeigt wird

Delphi-Quellcode:
procedure Tfrm_Test.btnStartClick(Sender: TObject);
var
  dbselectevent: Tfrmdbselect;
begin
  inc(iw); //Zum zählen der vorhandenen Fenster
  dbselectevent:= Tfrmdbselect.Create(frm_Test);
  dbselectevent.Visible:=True;
  //dbselectevent.name := 'Select' +IntToStr(iw);
  dbselectevent.nxflpnl1.Caption:= 'Select (' + IntToStr(iw) + ')';
  dbselectevent.Parent:= sheetGetParams; //Ein Tabsheet
  dbselectevent.Left:=0;
  dbselectevent.Top:=200;
  dbselectevent.Show;
end;


function Tfrm_Test.addRow(NAME :string; EVNO: Integer; AKTIV: Boolean): Boolean;
begin

  ShowMessage(VANAME); //dient mir zur Kontrolle ob das zweite Fenster es bis hierhin schaft!
  with mtblSelVA do //TkbmMemTable
            begin
              Append;
              FieldByName('VAID').AsInteger:=EVNO;
              FieldByName('VANAME').AsString:= NAME;
              FieldByName('AKTIVE').AsBoolean:= AKTIV;
              Post;
            end;
end;
Der Zugriff auf das Parent Form
Delphi-Quellcode:
procedure Tfrmdbselect.btn1Click(Sender: TObject);
var
 intevno, I : Integer;
 ievbname: string;
begin
  if dbgrdEvents.SelectedCount > 0 then
      for I := 0 to dbgrdEvents.RowCount -1 do
       if dbgrdEvents.Selected[i] then
        begin
           frm_Test.addRow(dbgrdEvents.CellField[1,i].AsString,
                  dbgrdEvents.CellField[0,i].AsInteger, TRUE);
        end;

end;
Ich verstehe ehrlich gesagt gerade nicht wo mein Fehler liegt! Hat einer von euch einen Tipp!

Danke
Dirk

dataspider 25. Mär 2011 07:44

AW: Zugriffsverletzung bei umgebogen Parent des Fensters
 
Hm...

ist nicht einfach, alles zu erkennen.
Was mir auffällt:

Code:
frm_Test.addRow(dbgrdEvents.CellField[1,i].AsString,
                dbgrdEvents.CellField[0,i].AsInteger, TRUE);
Ich kann nirgends erkennen, das die Variable frm_Test tatsächlich auf eine Instanz eines Forms zeigt.
Zumindest in den Codeschnipseln steht nirgendwo: frm_Test := Tfrm_Test...

Frank

himitsu 25. Mär 2011 08:05

AW: Zugriffsverletzung bei umgebogen Parent des Fensters
 
Wo tritt denn nun diese Exception auf?

Und wie wäre es mit MDI, anstatt dieser "umgebodenen" TForm?

Zitat:

Wollte dort die Handle der Forms sammeln, um diese über das wm_close zu informieren
Warum nicht .Close und ein
Delphi-Quellcode:
Array of Tfrm_Test
oder
Delphi-Quellcode:
Array of TForm
?

Piethan 25. Mär 2011 15:19

AW: Zugriffsverletzung bei umgebogen Parent des Fensters
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,

ich habe versucht die Komplexität zu reduzieren und beschränke mich auf drei Forms.
Form14 erzeugt Form15 und dieses Form16.

Form15 kann auf Form14 zugreifen, Form16 jedoch nicht auf Form15. Form15 und Form16
wurden nach dem gleichen Prinzip erzeugt. Auch das Auskommentieren der Änderung
des Parent bei Form15 half nicht, ich erhalte eine Zugriffsverletzung.

Da liegt bestimmt ein Denkfehler vor!

LG
Dirk

Delphi-Quellcode:
unit Unit14;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls;

type
  TForm14 = class(TForm)
    btn1: TButton;
    lbl1: TLabel;
    pgc1: TPageControl;
    ts1: TTabSheet;
    procedure btn1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form14: TForm14;

implementation
uses Unit15;
{$R *.dfm}

procedure TForm14.btn1Click(Sender: TObject);
var
test: TForm15;
begin
   test:= TForm15.Create(self);
   test.Parent:= ts1;
   test.Show;
end;

end.
Delphi-Quellcode:
unit Unit15;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Unit14, StdCtrls;

type
  TForm15 = class(TForm)
    btn1: TButton;
    btn2: TButton;
    procedure btn1Click(Sender: TObject);
    procedure btn2Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form15: TForm15;

implementation
uses Unit16;
{$R *.dfm}

procedure TForm15.btn1Click(Sender: TObject);
begin
  Form14.lbl1.Caption:='Test';
  Form14.Caption:= 'Test';
end;

procedure TForm15.btn2Click(Sender: TObject);
var
test2: TForm16;
begin
  test2:= TForm16.Create(self);
  test2.Show;
end;

end.
Delphi-Quellcode:
unit Unit16;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm16 = class(TForm)
    btn1: TButton;
    procedure btn1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form16: TForm16;

implementation
uses Unit15;
{$R *.dfm}

procedure TForm16.btn1Click(Sender: TObject);
begin
   Form15.Caption:='Test'; //löst keinen Fehler aus, macht aber nichts!
   Form15.btn2.Caption:='Test'; //hier bekomme ich eine Zugriffsverletzung
end;

end.

Bummi 25. Mär 2011 16:28

AW: Zugriffsverletzung bei umgebogen Parent des Fensters
 
das
Delphi-Quellcode:
var
test: TForm15;
begin
   test:= TForm15.Create(self);
ist der Grund an 2 Stellen...

Der Zugriff über Form15.Caption kann so nicht funktionieren, da Form15 ja gar nichts zugewiesen wurde, in Deinem Fall
Delphi-Quellcode:
Form15:= TForm15.Create(self);

Piethan 25. Mär 2011 20:46

AW: Zugriffsverletzung bei umgebogen Parent des Fensters
 
Danke Euch, das war es!

Delphi-Quellcode:
procedure TForm14.Btn1Click(Sender: TObject);
begin
  frm_Test:= Tfrm_Test.Create(self);
  frm_Test.Parent:= sheet1;
  sheet1.Glyph.Assign(frm_Test.Icon);
  sheet1.Caption:=frm_Test.Caption;
  frm_Test.Height:=sheet1.Height;
  frm_Test.Width:= sheet1.Width;
  frm_Test.Show;
  SetLength(pagesArry, pgcMain.PageCount);
  pagesArry[0]:=frm_Test.Handle;
  pgcMain.ActivePageIndex:=0;
end;
Delphi-Quellcode:
procedure Tfrm_Test.btnStartClick(Sender: TObject);
begin
  frmdbselect:= Tfrmdbselect.Create(frm_Test);
  frmdbselect.Visible:=True;
  frmdbselect.nxflpnl1.Caption:= 'Select';
  frmdbselect.Parent:= sheetGetParams;
  frmdbselect.Left:=0;
  frmdbselect.Top:=200;
  frmdbselect.Show;
end;


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