Autor Beitrag
a.C.k
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 93

WIN 2000
Delphi 6 Enterprise ; Delphi 7 Studio
BeitragVerfasst: Fr 07.03.03 18:26 
Hallo,
ich möchte ein Frame bauen, welches sobald es geladen wird, einer Boolischen Variable einen Wert zuweist:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
puplic
  ...
  ...
  Active: boolean;
  constructor Create(AOwner: TComponent); override;
end;

...
...

constructor TFrame.Create(AOwner: TComponent);
begin
  Active := false;
  inherited;

end;


So weit so gut. Bis dahin klappt es auch.

Nur wenn ich nun den Wert meiner Variable später im Frame erfragen möchte, dann bekomme ich eine Exception: "Zugriffsverletzung an Speicherstelle ..... ".

Warum das? Ich habe schritt für schritt durchcompiliert. Der Constrictor springt an, sobalt das Formular auf dem mein Frame geladen. Die Variable "Active" bekommt den Wert false zugeschrieben... aber später ist nichts mehr da. Ich verstehe das nicht... Was mache ich falsch :( .

_________________
Wer nicht gerne denkt, sollte wenigstens von Zeit zu Zeit seine Vorurteile neu gruppieren.
MSCH
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1448
Erhaltene Danke: 3

W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
BeitragVerfasst: Fr 07.03.03 19:50 
Tausch mal die Reihenfolge in Create;
erst den Vorgänger aufrufen. Der sorgt für die korrekte Initialisierung. Dann die Variable setzen.
Nun sollten keine Fehler mehr auftauchen.
Grüße
MSCH

P.S. Active ist per se FALSE. Brauchste also eigentlich nicht setzen.
a.C.k Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 93

WIN 2000
Delphi 6 Enterprise ; Delphi 7 Studio
BeitragVerfasst: Mo 10.03.03 15:14 
Stimmt, da war ein denkfehler!

Aber leider bleibt das Problem trotzdem bestehen. Der Fehler ist noch immer der selbe :(

_________________
Wer nicht gerne denkt, sollte wenigstens von Zeit zu Zeit seine Vorurteile neu gruppieren.
Keldorn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: Mo 10.03.03 15:29 
Hallo

poste mal bitte mehr quelltext
- ist das der ganze constructor
- zeig mal, wie du den Frame erzeugst

Mfg Frank

_________________
Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
a.C.k Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 93

WIN 2000
Delphi 6 Enterprise ; Delphi 7 Studio
BeitragVerfasst: Mo 10.03.03 15:34 
OK, hier ist er:
ausblenden volle Höhe Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
unit frame_AnsprechpartnerListe;

interface

uses 
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Grids, TFlatStringGridUnit, ExtCtrls, StdCtrls, TFlatMemoUnit,
  TFlatButtonUnit, tools, st_Ansprech, konsts;

type
  TFrame_Ansprechpartner = class(TFrame)
    Panel7: TPanel;
    btnBearbeiten: TFlatButton;
    FlatButton2: TFlatButton;
    FlatButton3: TFlatButton;
    FlatMemo2: TFlatMemo;
    Splitter2: TSplitter;
    SG: TFlatStringGrid;
    Panel8: TPanel;
    Panel9: TPanel;
    FlatButton5: TFlatButton;
    FlatButton6: TFlatButton;
    Panel10: TPanel;
    FlatButton4: TFlatButton;
    FlatButton7: TFlatButton;
    procedure SGRowChange(Sender: TObject; row: Integer;
      var aColor: TColor);
    procedure btnBearbeitenClick(Sender: TObject);
  private
    { Private-Deklarationen }
    rs : TResultSet;
  public
    { Public-Deklarationen }
    Active: boolean;
    constructor Create(AOwner: TComponent); override;
    destructor destroy; override;
  end;

  var Frame_Ansprechpartner : TFrame_Ansprechpartner;

procedure LadeAnsprech(Kunde : Boolean; LNR : String);
implementation

uses st_Lieferant;
{$R *.dfm}
procedure LadeAnsprech(Kunde : Boolean; LNR : String);
begin
  With Frame_Ansprechpartner do
  begin
    If Active = false then
    begin
      rs := TResultSet.create(app);
      Active := true;
    end;

    rs.Open('select Nummer, lnr, Anrede=(case geschlecht when ''W'' then ''Frau'' else ''Herr'' end),Nachname=name,'+
                        ' Vorname=vorname, Telefon=telefon,Telefax=telefax, Email=email, Handy=handy, bemerkung '+
                        'from LAnsprec ' +
                        'where lnr='''+LNR+''' ORDER BY name, vorname',20);
    rs.MapToGrid(sg);
    FlatMemo2.Text := sg.Cells[9, sg.row]  ;
  end;
end;


constructor TFrame_Ansprechpartner.Create(AOwner: TComponent);
begin
  inherited;
  Active := false;
end;

end.

_________________
Wer nicht gerne denkt, sollte wenigstens von Zeit zu Zeit seine Vorurteile neu gruppieren.
Keldorn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: Mo 10.03.03 15:48 
und wo erzeugst du den frame?

_________________
Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
a.C.k Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 93

WIN 2000
Delphi 6 Enterprise ; Delphi 7 Studio
BeitragVerfasst: Mo 10.03.03 16:08 
Habe das in einem anderen Formular auf ein Pannel gesetzt.. mehr nicht. Muss ich das noch extra erzeugen?

_________________
Wer nicht gerne denkt, sollte wenigstens von Zeit zu Zeit seine Vorurteile neu gruppieren.
Keldorn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: Mo 10.03.03 17:37 
a.C.k hat folgendes geschrieben:
Habe das in einem anderen Formular auf ein Pannel gesetzt.. mehr nicht. Muss ich das noch extra erzeugen?


Zitat:

var Frame_Ansprechpartner : TFrame_Ansprechpartner;

hier ist Frame_ansprechpartner global angelegt. und ich gehe von dieser Deklaration davon aus, das du vorhast, den/die Frames erst zur Laufzeit zu erzeugen (kein Problem ,mach ich auch)
Zitat:

With Frame_Ansprechpartner do
begin
If Active = false then

hier greifst du auf diese globale Variable zu.
da ich hier aber ein Frame_ansprechpartner:=TFrame_Ansprechpartner.create und zuweisung mit Parent zu einem Formular vermisse, muß es krachen. es existiert ja keine Instanz vom Frame.
Zitat:

Habe das in einem anderen Formular auf ein Pannel gesetzt.. mehr nicht. Muss ich das noch extra erzeugen?

nein, aber du mußt dann auch auf diesen Frame zugreifen oder setzt du den iregndwo auf deine globale Variable?
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
implemention 
uses form2;

procedure LadeAnsprech(Kunde : Boolean; LNR : String); 
begin 
  With [b]Form2[/b].Frame_Ansprechpartner do 
  begin 
    If Active = false then


ich würd auch den aufbau des Frames ändern und deine Proc ladeansprech gleich mit aufnehmen(das ist ja grad das schöne an den Objekten), sonst verstreust du deine Methoden/Proceduren über deinen
ganzen Quelltext

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
unit Frame_unit
type 
  TFrame_Ansprechpartner = class(TFrame) Splitter2: TSplitter; 
 ....
  public 
    { Public-Deklarationen } 
    procedure LadeAnsprech(Kunde : Boolean; LNR : String); 
    ...
  end; 
...
procedure TFrame_Ansprechpartner.LadeAnsprech(Kunde : Boolean; LNR : String); 
begin 
    If Active = false then 
    begin 
      rs := TResultSet.create(app); 
      Active := true; 
    end; 

    rs.Open('select Nummer, lnr, Anrede=(case geschlecht when ''W'' then ''Frau'' else ''Herr'' end),Nachname=name,'+ 
                        ' Vorname=vorname, Telefon=telefon,Telefax=telefax, Email=email, Handy=handy, bemerkung '+ 
                        'from LAnsprec ' + 
                        'where lnr='''+LNR+''' ORDER BY name, vorname',20); 
    rs.MapToGrid(sg); 
    FlatMemo2.Text := sg.Cells[9, sg.row]  ; 
  end;



edit:

achso, nochwas
Zitat:

rs := TResultSet.create(app);

keine ahnung was resultset ist, aber ich würde dieses gleich im Constructor vom Frame erzeugen und im Destructor freigeben, da verlierst du nicht den überblick.

Mfg Frank

_________________
Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
a.C.k Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 93

WIN 2000
Delphi 6 Enterprise ; Delphi 7 Studio
BeitragVerfasst: Mo 10.03.03 17:47 
Vielen Dank, ich werde es gleich morgen probieren (habe schon feierabend ;)).

TResultset ist eine eigene Klasse in dem Programm. Da werden Tabelleninhalte reingeladen und datenbankzugriffe zu vermeiden, wenn sie nicht seinmüssen ;).

_________________
Wer nicht gerne denkt, sollte wenigstens von Zeit zu Zeit seine Vorurteile neu gruppieren.
a.C.k Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 93

WIN 2000
Delphi 6 Enterprise ; Delphi 7 Studio
BeitragVerfasst: Di 11.03.03 11:27 
hallo Keldorn,
vielen Dank noch einmal für deine Hilfe und vor allem für die Zeit, die du dir genommen hast mir zu helfen!

Ich habe jetzt meinen Denkfehler gefunden :oops: ...



Zitat:


Zitat:

var Frame_Ansprechpartner : TFrame_Ansprechpartner;


hier ist Frame_ansprechpartner global angelegt. und ich gehe von dieser Deklaration davon aus, das du vorhast, den/die Frames erst zur Laufzeit zu erzeugen (kein Problem ,mach ich auch)


Das war mein eigentlicher Fehler. Das Frame will ich eigentlich nicht zur Laufzeit erzeugen. Das ist dann wohl die macht der Gewohnheit. :evil: .

Naja, wie dem auch sei.. es läuft jetzt. Dabei habe ich aber "natürlich" auch gleuch deine Vorschläge zu Herzen Genommen und den Aufbau des Frames anders gestalltet.

Vielen Dank auf jeden Fall. Es ist immer wieder schön hier!

_________________
Wer nicht gerne denkt, sollte wenigstens von Zeit zu Zeit seine Vorurteile neu gruppieren.