AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Zugriffsverletzung bei umgebogen Parent des Fensters
Thema durchsuchen
Ansicht
Themen-Optionen

Zugriffsverletzung bei umgebogen Parent des Fensters

Ein Thema von Piethan · begonnen am 24. Mär 2011 · letzter Beitrag vom 25. Mär 2011
Antwort Antwort
Piethan

Registriert seit: 2. Jun 2008
Ort: Köln
43 Beiträge
 
Delphi XE Architect
 
#1

Zugriffsverletzung bei umgebogen Parent des Fensters

  Alt 24. Mär 2011, 23:04
Delphi-Version: XE
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
Miniaturansicht angehängter Grafiken
unbenannt-3.jpg  
  Mit Zitat antworten Zitat
Benutzerbild von dataspider
dataspider

Registriert seit: 9. Nov 2003
Ort: 04539 Groitzsch
1.350 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Zugriffsverletzung bei umgebogen Parent des Fensters

  Alt 25. Mär 2011, 07:44
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
Frank Reim
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.136 Beiträge
 
Delphi 12 Athens
 
#3

AW: Zugriffsverletzung bei umgebogen Parent des Fensters

  Alt 25. Mär 2011, 08:05
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 Array of Tfrm_Test oder Array of TForm ?
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Piethan

Registriert seit: 2. Jun 2008
Ort: Köln
43 Beiträge
 
Delphi XE Architect
 
#4

AW: Zugriffsverletzung bei umgebogen Parent des Fensters

  Alt 25. Mär 2011, 15:19
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.
Angehängte Dateien
Dateityp: zip Project12.zip (552,7 KB, 0x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#5

AW: Zugriffsverletzung bei umgebogen Parent des Fensters

  Alt 25. Mär 2011, 16:28
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
Form15:= TForm15.Create(self);
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Piethan

Registriert seit: 2. Jun 2008
Ort: Köln
43 Beiträge
 
Delphi XE Architect
 
#6

AW: Zugriffsverletzung bei umgebogen Parent des Fensters

  Alt 25. Mär 2011, 20:46
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;
  Mit Zitat antworten Zitat
Antwort Antwort


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 17:09 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