Einzelnen Beitrag anzeigen

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